diff options
Diffstat (limited to 'packages/migrations/artifacts/2.0.0/Forwarder.json')
-rw-r--r-- | packages/migrations/artifacts/2.0.0/Forwarder.json | 341 |
1 files changed, 158 insertions, 183 deletions
diff --git a/packages/migrations/artifacts/2.0.0/Forwarder.json b/packages/migrations/artifacts/2.0.0/Forwarder.json index acfc3b83b..479f9d2eb 100644 --- a/packages/migrations/artifacts/2.0.0/Forwarder.json +++ b/packages/migrations/artifacts/2.0.0/Forwarder.json @@ -297,20 +297,6 @@ "type": "function" }, { - "constant": true, - "inputs": [], - "name": "ERC20_DATA_ID", - "outputs": [ - { - "name": "", - "type": "bytes4" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { "constant": false, "inputs": [ { @@ -474,11 +460,11 @@ { "constant": true, "inputs": [], - "name": "owner", + "name": "PERCENTAGE_DENOMINATOR", "outputs": [ { "name": "", - "type": "address" + "type": "uint16" } ], "payable": false, @@ -488,7 +474,7 @@ { "constant": true, "inputs": [], - "name": "PERCENTAGE_DENOMINATOR", + "name": "MAX_FEE", "outputs": [ { "name": "", @@ -501,12 +487,89 @@ }, { "constant": true, - "inputs": [], - "name": "MAX_FEE", + "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": "takerAssetFillAmount", + "type": "uint256" + } + ], + "name": "calculateMarketSellResults", "outputs": [ { - "name": "", - "type": "uint16" + "components": [ + { + "name": "makerAssetFilledAmount", + "type": "uint256" + }, + { + "name": "takerAssetFilledAmount", + "type": "uint256" + }, + { + "name": "makerFeePaid", + "type": "uint256" + }, + { + "name": "takerFeePaid", + "type": "uint256" + } + ], + "name": "totalFillResults", + "type": "tuple" } ], "payable": false, @@ -632,48 +695,6 @@ "type": "function" }, { - "constant": false, - "inputs": [ - { - "name": "erc20AssetProxyId", - "type": "bytes4" - } - ], - "name": "setERC20ProxyApproval", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "ERC721_DATA_ID", - "outputs": [ - { - "name": "", - "type": "bytes4" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { "inputs": [ { "name": "_exchange", @@ -688,10 +709,6 @@ "type": "address" }, { - "name": "_erc20AssetProxyId", - "type": "bytes4" - }, - { "name": "_zrxAssetData", "type": "bytes" }, @@ -713,15 +730,15 @@ "evm": { "bytecode": { "linkReferences": {}, - "object": "0x60806040526000196006553480156200001757600080fd5b5060405162003c7238038062003c7283398101806040526200003d919081019062000494565b6000805433600160a060020a031991821617909155600180548216600160a060020a038981169190911790915560028054831688831617905560038054909216908616179055815186908690869085908590620000a290600490602085019062000339565b508051620000b890600590602084019062000339565b505050505050620000d883620000e4640100000000026401000000009004565b505050505050620006cf565b60008054600160a060020a0316331462000135576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200012c9062000605565b60405180910390fd5b6001546040517f60704108000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063607041089062000180908590600401620005ef565b602060405180830381600087803b1580156200019b57600080fd5b505af1158015620001b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001d691908101906200046b565b9050600160a060020a0381161562000335576002546006546040517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a039092169163095ea7b3916200023791859190600401620005d0565b602060405180830381600087803b1580156200025257600080fd5b505af115801562000267573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200028d919081019062000558565b506003546006546040517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a039092169163095ea7b391620002dd91859190600401620005d0565b602060405180830381600087803b158015620002f857600080fd5b505af11580156200030d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000333919081019062000558565b505b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200037c57805160ff1916838001178555620003ac565b82800160010185558215620003ac579182015b82811115620003ac5782518255916020019190600101906200038f565b50620003ba929150620003be565b5090565b620003db91905b80821115620003ba5760008155600101620003c5565b90565b6000620003ec825162000666565b9392505050565b6000620003ec825162000697565b6000620003ec825162000672565b6000601f820183136200042157600080fd5b81516200043862000432826200063e565b62000617565b915080825260208301602083018583830111156200045557600080fd5b620004628382846200069c565b50505092915050565b6000602082840312156200047e57600080fd5b60006200048c8484620003de565b949350505050565b60008060008060008060c08789031215620004ae57600080fd5b6000620004bc8989620003de565b9650506020620004cf89828a01620003de565b9550506040620004e289828a01620003de565b9450506060620004f589828a0162000401565b93505060808701516001604060020a038111156200051257600080fd5b6200052089828a016200040f565b92505060a08701516001604060020a038111156200053d57600080fd5b6200054b89828a016200040f565b9150509295509295509295565b6000602082840312156200056b57600080fd5b60006200048c8484620003f3565b620005848162000666565b82525050565b620005848162000672565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b6200058481620003db565b60408101620005e0828562000579565b620003ec6020830184620005c5565b60208101620005ff82846200058a565b92915050565b60208082528101620005ff8162000595565b6040518181016001604060020a03811182821017156200063657600080fd5b604052919050565b60006001604060020a038211156200065557600080fd5b506020601f91909101601f19160190565b600160a060020a031690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b151590565b60005b83811015620006b95781810151838201526020016200069f565b83811115620006c9576000848401525b50505050565b61359380620006df6000396000f3006080604052600436106100cf5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663150b7a02811461012b578063169645f2146101615780631c5b1ec41461018157806320472cf7146101a15780634a00f7d5146101c3578063725cef06146101d85780638da5cb5b146101eb578063b3cd42541461020d578063bc063e1a14610222578063e58e9c1614610237578063f0b9e5ba14610257578063f2afd85a14610277578063f2fde38b14610297578063fb4f9087146102b7575b60025473ffffffffffffffffffffffffffffffffffffffff163314610129576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610120906132e1565b60405180910390fd5b005b34801561013757600080fd5b5061014b6101463660046128b0565b6102cc565b60405161015891906132d3565b60405180910390f35b61017461016f36600461298e565b61032c565b60405161015891906133a1565b34801561018d57600080fd5b5061017461019c366004612b6f565b6105f8565b3480156101ad57600080fd5b506101b66106be565b60405161015891906133f2565b3480156101cf57600080fd5b5061014b6106c4565b6101746101e6366004612a74565b6106f9565b3480156101f757600080fd5b50610200610ac7565b60405161015891906131fb565b34801561021957600080fd5b506101b6610ae3565b34801561022e57600080fd5b506101b6610ae9565b34801561024357600080fd5b50610174610252366004612b6f565b610aef565b34801561026357600080fd5b5061014b610272366004612929565b610bec565b34801561028357600080fd5b50610129610292366004612bde565b610c4c565b3480156102a357600080fd5b506101296102b2366004612874565b610ec3565b3480156102c357600080fd5b5061014b610f74565b604080517f6f6e455243373231526563656976656428616464726573732c6164647265737381527f2c75696e743235362c62797465732900000000000000000000000000000000006020820152905190819003602f019020949350505050565b6103346124b3565b3460008080808411610372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613311565b61037d848888610fcf565b9250610389848461109d565b9150600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561041157600080fd5b505af1158015610425573d6000803e3d6000fd5b50505050506104528b600081518110151561043c57fe5b90602001906020020151610140015160106110b4565b60058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529394508301828280156104f85780601f106104cd576101008083540402835291602001916104f8565b820191906000526020600020905b8154815290600101906020018083116104db57829003601f168201915b50505050508b600081518110151561050c57fe5b60209081029091010151610160015260035473ffffffffffffffffffffffffffffffffffffffff82811691161415610550576105498b8b84611115565b9450610560565b61055d8b8b8b8b8661122f565b94505b602085015184101561059e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610120906132f1565b602085015182146105db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613351565b6105ea813387600001516113b7565b505050509695505050505050565b6106006124b3565b600080600061060d6124b3565b600093505b86518410156106b45761062986866000015161109d565b925061066c878581518110151561063c57fe5b9060200190602002015160a00151888681518110151561065857fe5b906020019060200201516080015185611591565b915061068f878581518110151561067f57fe5b90602001906020020151836115ae565b905061069b85826116fc565b84518614156106a9576106b4565b600190930192610612565b5050505092915050565b61251c81565b604080517f4552433230546f6b656e286164647265737329000000000000000000000000008152905190819003601301902081565b6107016124b3565b34600080821161073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613311565b60008611610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613311565b61079f8a600081518110151561078957fe5b906020019060200201516101400151600061175e565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190209091507fffffffff00000000000000000000000000000000000000000000000000000000808316911614806108815750604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff000000000000000000000000000000000000000000000000000000008281169116145b15156108b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613381565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561093f57600080fd5b505af1158015610953573d6000803e3d6000fd5b5050604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190207fffffffff000000000000000000000000000000000000000000000000000000008581169116141592506109cc915050576109c58a8a8a8a8a6117cb565b9250610a5f565b604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff0000000000000000000000000000000000000000000000000000000082811691161415610a5f57610a5c8a8a8a8a611b22565b92505b6020830151821015610a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610120906132f1565b610aba610aae83856020015161109d565b84602001518787611e24565b5050979650505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b61271081565b6103e881565b610af76124b3565b6000806000610b046124b3565b600093505b86518410156106b457610b2086866000015161109d565b9250610b878785815181101515610b3357fe5b9060200190602002015160a00151610b818987815181101515610b5257fe5b90602001906020020151608001518a88815181101515610b6e57fe5b9060200190602002015160e0015161109d565b85611591565b9150610bb48785815181101515610b9a57fe5b90602001906020020151610baf846001611f11565b6115ae565b9050610bc88160000151826060015161109d565b8152610bd485826116fc565b84518611610be1576106b4565b600190930192610b09565b604080517f6f6e455243373231526563656976656428616464726573732c75696e7432353681527f2c62797465732900000000000000000000000000000000000000000000000000602082015290519081900360270190205b9392505050565b6000805473ffffffffffffffffffffffffffffffffffffffff163314610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613361565b6001546040517f6070410800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690636070410890610cf49085906004016132d3565b602060405180830381600087803b158015610d0e57600080fd5b505af1158015610d22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d469190810190612892565b905073ffffffffffffffffffffffffffffffffffffffff811615610ebf576002546006546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9092169163095ea7b391610dbe9185919060040161324d565b602060405180830381600087803b158015610dd857600080fd5b505af1158015610dec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e109190810190612bc0565b506003546006546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9092169163095ea7b391610e6b9185919060040161324d565b602060405180830381600087803b158015610e8557600080fd5b505af1158015610e99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ebd9190810190612bc0565b505b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613361565b73ffffffffffffffffffffffffffffffffffffffff811615610f7157600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f73290000000000000000000000000000000000000000000000000000000000006020820152905190819003602201902081565b6000808361ffff16118015610ff9575073ffffffffffffffffffffffffffffffffffffffff821615155b15610c45576103e861ffff8416111561103e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613331565b61104f61ffff841661271086611591565b60405190915073ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015611095573d6000803e3d6000fd5b509392505050565b6000828211156110a957fe5b508082035b92915050565b6000816014018351101515156110f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613371565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b61111d6124b3565b6001546040517f7e1d980800000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff1690637e1d980890611178908890879089906004016132a1565b608060405180830381600087803b15801561119257600080fd5b505af11580156111a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111ca9190810190612bfc565b91506111de8260000151836060015161109d565b90506111ee826000015182611f20565b1515611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613351565b81529392505050565b6112376124b3565b60006112416124b3565b6112496124b3565b6112516124b3565b85935061125e8a87611f3d565b92506000836060015111156112f25761127c88888560600151611fa7565b91506112958661129088856020015161109d565b611f20565b15156112cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613351565b6112db84836020015161109d565b606080840151908701526020808401519087015293505b6001546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d98089061134c908d9088908e906004016132a1565b608060405180830381600087803b15801561136657600080fd5b505af115801561137a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061139e9190810190612bfc565b90506113aa85826116fc565b5050505095945050505050565b604080517f7472616e7366657228616464726573732c75696e7432353629000000000000008152905190819003601901812060009173ffffffffffffffffffffffffffffffffffffffff86169190611415908690869060240161324d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931783525181519192909182919080838360005b838110156114b95781810151838201526020016114a1565b50505050905090810190601f1680156114e65780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af192505050801515611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613341565b3d15611552575060003d602014156115525760206000803e506000515b80151561158b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613341565b50505050565b60006115a66115a085846122e0565b84612304565b949350505050565b6115b66124b3565b6115be6124dc565b6001546040517fc75e0a81000000000000000000000000000000000000000000000000000000008152600091829173ffffffffffffffffffffffffffffffffffffffff9091169063c75e0a81906116199089906004016133af565b606060405180830381600087803b15801561163357600080fd5b505af1158015611647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061166b9190810190612c1a565b805190935060ff1660031461167f576116f3565b6116918660a00151846040015161109d565b915061169d858361231b565b9050808460200181815250506116bc818760a001518860800151611591565b845260a086015160c08701516116d3918391611591565b604085015260a086015160e08701516116ed918391611591565b60608501525b50505092915050565b8151815161170a9190611f11565b8252602080830151908201516117209190611f11565b6020830152604080830151908201516117399190611f11565b6040830152606080830151908201516117529190611f11565b60609092019190915250565b6000816004018351101515156117a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613391565b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6117d36124b3565b60006117dd6124b3565b6117e56124b3565b6117ed6124b3565b6117ff8a600081518110151561043c57fe5b60058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529397508301828280156118a55780601f1061187a576101008083540402835291602001916118a5565b820191906000526020600020905b81548152906001019060200180831161188857829003601f168201915b50505050508a60008151811015156118b957fe5b60209081029091010151610160015260035473ffffffffffffffffffffffffffffffffffffffff85811691161415611997576118f68a8a88611fa7565b8051909350861115611934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613351565b61193e85846116fc565b61195a61195386600001518760600151611f11565b8651611f20565b1515611992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613351565b611b13565b6119a18a876105f8565b91506000826060015111156119d6576119bf88888460600151611fa7565b602080820151908701526060808201519087015290505b6001546040517fe5fa431b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e5fa431b90611a30908d908a908e906004016132a1565b608060405180830381600087803b158015611a4a57600080fd5b505af1158015611a5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a829190810190612bfc565b80519093508614611abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613351565b611ac985846116fc565b611adb85602001518460200151611f20565b1515611b13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613351565b6113aa843385600001516113b7565b611b2a6124b3565b60008060606000611b396124b3565b611b416124b3565b8a51945084604051908082528060200260200182016040528015611b6f578160200160208202803883390190505b509350600092505b84831015611cab57611ba4868c85815181101515611b9157fe5b9060200190602002015160e00151611f11565b60058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152939950830182828015611c4a5780601f10611c1f57610100808354040283529160200191611c4a565b820191906000526020600020905b815481529060010190602001808311611c2d57829003601f168201915b50505050508b84815181101515611c5d57fe5b6020908102909101015161016001528a518b9084908110611c7a57fe5b9060200190602002015160a001518484815181101515611c9657fe5b60209081029091010152600190920191611b77565b6000861115611cd657611cbf898988611fa7565b606080820151908901526020808201519089015291505b6001546040517f4d0ae54600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690634d0ae54690611d30908e9088908f90600401613268565b608060405180830381600087803b158015611d4a57600080fd5b505af1158015611d5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d829190810190612bfc565b9050611d8e87826116fc565b611da087602001518260200151611f20565b1515611dd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613351565b600092505b84831015611e1657611e0b8b84815181101515611df657fe5b90602001906020020151610140015133612331565b600190920191611ddd565b505050505050949350505050565b6000806000861115611f09576002546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90611e86908990600401613400565b600060405180830381600087803b158015611ea057600080fd5b505af1158015611eb4573d6000803e3d6000fd5b50505050611ec3858585610fcf565b9150611ecf868361109d565b90506000811115611f0957604051339082156108fc029083906000818181858888f19350505050158015611f07573d6000803e3d6000fd5b505b505050505050565b600082820183811015610c4557fe5b600080611f3261251c61271086611591565b909210159392505050565b611f456124b3565b600080611f506124b3565b600092505b85518310156116f357611f6c85856020015161109d565b9150611f7f868481518110151561067f57fe5b9050611f8b84826116fc565b8484602001511415611f9c576116f3565b600190920191611f55565b611faf6124b3565b6000806000611fbc6124b3565b600093505b87518410156122d5576004805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561206e5780601f106120435761010080835404028352916020019161206e565b820191906000526020600020905b81548152906001019060200180831161205157829003601f168201915b5050505050888581518110151561208157fe5b602090810290910181015161014001919091526005805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001871615020190941693909304928301859004850281018501909152818152928301828280156121365780601f1061210b57610100808354040283529160200191612136565b820191906000526020600020905b81548152906001019060200180831161211957829003601f168201915b5050505050888581518110151561214957fe5b602090810290910101516101600152845161216590879061109d565b92506121b3888581518110151561217857fe5b9060200190602002015160a00151610b818a8781518110151561219757fe5b90602001906020020151608001518b88815181101515610b6e57fe5b600154895191935073ffffffffffffffffffffffffffffffffffffffff169063b4be83d5908a90879081106121e457fe5b906020019060200201516121f9856001611f11565b8a8881518110151561220757fe5b906020019060200201516040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161224b939291906133c0565b608060405180830381600087803b15801561226557600080fd5b505af1158015612279573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061229d9190810190612bfc565b90506122b18160000151826060015161109d565b81526122bd85826116fc565b845186116122ca576122d5565b600190930192611fc1565b505050509392505050565b60008282028315806122fc57508284828115156122f957fe5b04145b1515610c4557fe5b600080828481151561231257fe5b04949350505050565b600081831061232a5781610c45565b5090919050565b600080606061234785601063ffffffff6110b416565b925061235a85602463ffffffff61240116565b915061236d85606463ffffffff61240d16565b6040517fb88d4fde00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff84169063b88d4fde906123c8903090889087908790600401613209565b600060405180830381600087803b1580156123e257600080fd5b505af11580156123f6573d6000803e3d6000fd5b505050505050505050565b6000610c458383612468565b6060600061241b8484612401565b9050602083019250808301845110151515612462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613301565b50500190565b6000816020018351101515156124aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613321565b50016020015190565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610c4582356134a6565b6000610c4582516134a6565b6000601f8201831361252557600080fd5b813561253861253382613435565b61340e565b81815260209384019390925082018360005b838110156106b4578135860161256088826125f7565b845250602092830192919091019060010161254a565b6000601f8201831361258757600080fd5b813561259561253382613435565b81815260209384019390925082018360005b838110156106b457813586016125bd8882612707565b84525060209283019291909101906001016125a7565b6000610c4582516134ee565b6000610c4582516134eb565b6000610c4582356134bf565b6000601f8201831361260857600080fd5b813561261661253382613456565b9150808252602083016020830185838301111561263257600080fd5b6116f38382846134f9565b60006080828403121561264f57600080fd5b612659608061340e565b9050600061266784846125df565b8252506020612678848483016125df565b602083015250604061268c848285016125df565b60408301525060606126a0848285016125df565b60608301525092915050565b6000606082840312156126be57600080fd5b6126c8606061340e565b905060006126d68484612868565b82525060206126e7848483016125df565b60208301525060406126fb848285016125df565b60408301525092915050565b6000610180828403121561271a57600080fd5b61272561018061340e565b9050600061273384846124fc565b8252506020612744848483016124fc565b6020830152506040612758848285016124fc565b604083015250606061276c848285016124fc565b60608301525060806127808482850161285c565b60808301525060a06127948482850161285c565b60a08301525060c06127a88482850161285c565b60c08301525060e06127bc8482850161285c565b60e0830152506101006127d18482850161285c565b610100830152506101206127e78482850161285c565b6101208301525061014082013567ffffffffffffffff81111561280957600080fd5b612815848285016125f7565b6101408301525061016082013567ffffffffffffffff81111561283757600080fd5b612843848285016125f7565b6101608301525092915050565b6000610c4582356134e4565b6000610c4582356134eb565b6000610c4582516134f3565b60006020828403121561288657600080fd5b60006115a684846124fc565b6000602082840312156128a457600080fd5b60006115a68484612508565b600080600080608085870312156128c657600080fd5b60006128d287876124fc565b94505060206128e3878288016124fc565b93505060406128f48782880161285c565b925050606085013567ffffffffffffffff81111561291157600080fd5b61291d878288016125f7565b91505092959194509250565b60008060006060848603121561293e57600080fd5b600061294a86866124fc565b935050602061295b8682870161285c565b925050604084013567ffffffffffffffff81111561297857600080fd5b612984868287016125f7565b9150509250925092565b60008060008060008060c087890312156129a757600080fd5b863567ffffffffffffffff8111156129be57600080fd5b6129ca89828a01612576565b965050602087013567ffffffffffffffff8111156129e757600080fd5b6129f389828a01612514565b955050604087013567ffffffffffffffff811115612a1057600080fd5b612a1c89828a01612576565b945050606087013567ffffffffffffffff811115612a3957600080fd5b612a4589828a01612514565b9350506080612a5689828a01612850565b92505060a0612a6789828a016124fc565b9150509295509295509295565b600080600080600080600060e0888a031215612a8f57600080fd5b873567ffffffffffffffff811115612aa657600080fd5b612ab28a828b01612576565b975050602088013567ffffffffffffffff811115612acf57600080fd5b612adb8a828b01612514565b965050604088013567ffffffffffffffff811115612af857600080fd5b612b048a828b01612576565b955050606088013567ffffffffffffffff811115612b2157600080fd5b612b2d8a828b01612514565b9450506080612b3e8a828b0161285c565b93505060a0612b4f8a828b01612850565b92505060c0612b608a828b016124fc565b91505092959891949750929550565b60008060408385031215612b8257600080fd5b823567ffffffffffffffff811115612b9957600080fd5b612ba585828601612576565b9250506020612bb68582860161285c565b9150509250929050565b600060208284031215612bd257600080fd5b60006115a684846125d3565b600060208284031215612bf057600080fd5b60006115a684846125eb565b600060808284031215612c0e57600080fd5b60006115a6848461263d565b600060608284031215612c2c57600080fd5b60006115a684846126ac565b612c41816134a6565b82525050565b6000612c52826134a2565b80845260208401935083602082028501612c6b8561349c565b60005b84811015612ca2578383038852612c86838351612d69565b9250612c918261349c565b602098909801979150600101612c6e565b50909695505050505050565b6000612cb9826134a2565b80845260208401935083602082028501612cd28561349c565b60005b84811015612ca2578383038852612ced8383516130e6565b9250612cf88261349c565b602098909801979150600101612cd5565b6000612d14826134a2565b808452602084019350612d268361349c565b60005b82811015612d5657612d3c8683516131f2565b612d458261349c565b602096909601959150600101612d29565b5093949350505050565b612c41816134bf565b6000612d74826134a2565b808452612d88816020860160208601613505565b612d9181613531565b9093016020019392505050565b602381527f44454641554c545f46554e4354494f4e5f574554485f434f4e54524143545f4f60208201527f4e4c590000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f494e56414c49445f4d53475f56414c5545000000000000000000000000000000602082015260400190565b603081527f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455360208201527f5f4c454e4754485f524551554952454400000000000000000000000000000000604082015260600190565b601781527f56414c55455f475245415445525f5448414e5f5a45524f000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601881527f4645455f50524f504f5254494f4e5f544f4f5f4c415247450000000000000000602082015260400190565b600f81527f5452414e534645525f4641494c45440000000000000000000000000000000000602082015260400190565b601681527f554e41434345505441424c455f5448524553484f4c4400000000000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601781527f554e535550504f525445445f544f4b454e5f50524f5859000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b805160808301906130ad84826131f2565b5060208201516130c060208501826131f2565b5060408201516130d360408501826131f2565b50606082015161158b60608501826131f2565b80516000906101808401906130fb8582612c38565b50602083015161310e6020860182612c38565b5060408301516131216040860182612c38565b5060608301516131346060860182612c38565b50608083015161314760808601826131f2565b5060a083015161315a60a08601826131f2565b5060c083015161316d60c08601826131f2565b5060e083015161318060e08601826131f2565b506101008301516131956101008601826131f2565b506101208301516131aa6101208601826131f2565b506101408301518482036101408601526131c48282612d69565b9150506101608301518482036101608601526131e08282612d69565b95945050505050565b612c41816134e4565b612c41816134eb565b602081016110ae8284612c38565b608081016132178287612c38565b6132246020830186612c38565b61323160408301856131f2565b81810360608301526132438184612d69565b9695505050505050565b6040810161325b8285612c38565b610c4560208301846131f2565b606080825281016132798186612cae565b9050818103602083015261328d8185612d09565b905081810360408301526131e08184612c47565b606080825281016132b28186612cae565b90506132c160208301856131f2565b81810360408301526131e08184612c47565b602081016110ae8284612d60565b602080825281016110ae81612d9e565b602080825281016110ae81612df4565b602080825281016110ae81612e24565b602080825281016110ae81612e7a565b602080825281016110ae81612eaa565b602080825281016110ae81612f00565b602080825281016110ae81612f30565b602080825281016110ae81612f60565b602080825281016110ae81612f90565b602080825281016110ae81612fc0565b602080825281016110ae81613016565b602080825281016110ae81613046565b608081016110ae828461309c565b60208082528101610c4581846130e6565b606080825281016133d181866130e6565b90506133e060208301856131f2565b81810360408301526131e08184612d69565b602081016110ae82846131e9565b602081016110ae82846131f2565b60405181810167ffffffffffffffff8111828210171561342d57600080fd5b604052919050565b600067ffffffffffffffff82111561344c57600080fd5b5060209081020190565b600067ffffffffffffffff82111561346d57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b61ffff1690565b90565b151590565b60ff1690565b82818337506000910152565b60005b83811015613520578181015183820152602001613508565b8381111561158b5750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820f84428674a7a1b076ea035cdfa190e912ba3c094f209cbddcd831d7362003d456c6578706572696d656e74616cf50037", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 NOT PUSH1 0x6 SSTORE CALLVALUE DUP1 ISZERO PUSH3 0x17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x3C72 CODESIZE SUB DUP1 PUSH3 0x3C72 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x3D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x494 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD DUP3 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x2 DUP1 SLOAD DUP4 AND DUP9 DUP4 AND OR SWAP1 SSTORE PUSH1 0x3 DUP1 SLOAD SWAP1 SWAP3 AND SWAP1 DUP7 AND OR SWAP1 SSTORE DUP2 MLOAD DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH3 0xA2 SWAP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH3 0x339 JUMP JUMPDEST POP DUP1 MLOAD PUSH3 0xB8 SWAP1 PUSH1 0x5 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH3 0x339 JUMP JUMPDEST POP POP POP POP POP POP PUSH3 0xD8 DUP4 PUSH3 0xE4 PUSH5 0x100000000 MUL PUSH5 0x100000000 SWAP1 DIV JUMP JUMPDEST POP POP POP POP POP POP PUSH3 0x6CF JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH3 0x135 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x12C SWAP1 PUSH3 0x605 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x6070410800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x60704108 SWAP1 PUSH3 0x180 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH3 0x5EF JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x19B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x1B0 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 PUSH3 0x1D6 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x46B JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH3 0x335 JUMPI PUSH1 0x2 SLOAD PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x95EA7B3 SWAP2 PUSH3 0x237 SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH3 0x5D0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x252 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x267 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 PUSH3 0x28D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x558 JUMP JUMPDEST POP PUSH1 0x3 SLOAD PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x95EA7B3 SWAP2 PUSH3 0x2DD SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH3 0x5D0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x2F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x30D 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 PUSH3 0x333 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x558 JUMP JUMPDEST POP JUMPDEST POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x37C JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x3AC JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x3AC JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x3AC JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x38F JUMP JUMPDEST POP PUSH3 0x3BA SWAP3 SWAP2 POP PUSH3 0x3BE JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x3DB SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x3BA JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x3C5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x3EC DUP3 MLOAD PUSH3 0x666 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x3EC DUP3 MLOAD PUSH3 0x697 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x3EC DUP3 MLOAD PUSH3 0x672 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0x421 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x438 PUSH3 0x432 DUP3 PUSH3 0x63E JUMP JUMPDEST PUSH3 0x617 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0x455 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x462 DUP4 DUP3 DUP5 PUSH3 0x69C JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x47E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x48C DUP5 DUP5 PUSH3 0x3DE JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH3 0x4AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x4BC DUP10 DUP10 PUSH3 0x3DE JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH3 0x4CF DUP10 DUP3 DUP11 ADD PUSH3 0x3DE JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 PUSH3 0x4E2 DUP10 DUP3 DUP11 ADD PUSH3 0x3DE JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 PUSH3 0x4F5 DUP10 DUP3 DUP11 ADD PUSH3 0x401 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 DUP8 ADD MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x512 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x520 DUP10 DUP3 DUP11 ADD PUSH3 0x40F JUMP JUMPDEST SWAP3 POP POP PUSH1 0xA0 DUP8 ADD MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x53D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x54B DUP10 DUP3 DUP11 ADD PUSH3 0x40F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x56B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x48C DUP5 DUP5 PUSH3 0x3F3 JUMP JUMPDEST PUSH3 0x584 DUP2 PUSH3 0x666 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH3 0x584 DUP2 PUSH3 0x672 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH3 0x584 DUP2 PUSH3 0x3DB JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH3 0x5E0 DUP3 DUP6 PUSH3 0x579 JUMP JUMPDEST PUSH3 0x3EC PUSH1 0x20 DUP4 ADD DUP5 PUSH3 0x5C5 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH3 0x5FF DUP3 DUP5 PUSH3 0x58A JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH3 0x5FF DUP2 PUSH3 0x595 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x636 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP3 GT ISZERO PUSH3 0x655 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x6B9 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x69F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x6C9 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x3593 DUP1 PUSH3 0x6DF PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xCF JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x150B7A02 DUP2 EQ PUSH2 0x12B JUMPI DUP1 PUSH4 0x169645F2 EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0x1C5B1EC4 EQ PUSH2 0x181 JUMPI DUP1 PUSH4 0x20472CF7 EQ PUSH2 0x1A1 JUMPI DUP1 PUSH4 0x4A00F7D5 EQ PUSH2 0x1C3 JUMPI DUP1 PUSH4 0x725CEF06 EQ PUSH2 0x1D8 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1EB JUMPI DUP1 PUSH4 0xB3CD4254 EQ PUSH2 0x20D JUMPI DUP1 PUSH4 0xBC063E1A EQ PUSH2 0x222 JUMPI DUP1 PUSH4 0xE58E9C16 EQ PUSH2 0x237 JUMPI DUP1 PUSH4 0xF0B9E5BA EQ PUSH2 0x257 JUMPI DUP1 PUSH4 0xF2AFD85A EQ PUSH2 0x277 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x297 JUMPI DUP1 PUSH4 0xFB4F9087 EQ PUSH2 0x2B7 JUMPI JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x129 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x32E1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x137 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x14B PUSH2 0x146 CALLDATASIZE PUSH1 0x4 PUSH2 0x28B0 JUMP JUMPDEST PUSH2 0x2CC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x158 SWAP2 SWAP1 PUSH2 0x32D3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x174 PUSH2 0x16F CALLDATASIZE PUSH1 0x4 PUSH2 0x298E JUMP JUMPDEST PUSH2 0x32C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x158 SWAP2 SWAP1 PUSH2 0x33A1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x174 PUSH2 0x19C CALLDATASIZE PUSH1 0x4 PUSH2 0x2B6F JUMP JUMPDEST PUSH2 0x5F8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B6 PUSH2 0x6BE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x158 SWAP2 SWAP1 PUSH2 0x33F2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x14B PUSH2 0x6C4 JUMP JUMPDEST PUSH2 0x174 PUSH2 0x1E6 CALLDATASIZE PUSH1 0x4 PUSH2 0x2A74 JUMP JUMPDEST PUSH2 0x6F9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x200 PUSH2 0xAC7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x158 SWAP2 SWAP1 PUSH2 0x31FB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x219 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B6 PUSH2 0xAE3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x22E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B6 PUSH2 0xAE9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x243 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x174 PUSH2 0x252 CALLDATASIZE PUSH1 0x4 PUSH2 0x2B6F JUMP JUMPDEST PUSH2 0xAEF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x14B PUSH2 0x272 CALLDATASIZE PUSH1 0x4 PUSH2 0x2929 JUMP JUMPDEST PUSH2 0xBEC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x283 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x129 PUSH2 0x292 CALLDATASIZE PUSH1 0x4 PUSH2 0x2BDE JUMP JUMPDEST PUSH2 0xC4C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x129 PUSH2 0x2B2 CALLDATASIZE PUSH1 0x4 PUSH2 0x2874 JUMP JUMPDEST PUSH2 0xEC3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x14B PUSH2 0xF74 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C61646472657373 DUP2 MSTORE PUSH32 0x2C75696E743235362C6279746573290000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x2F ADD SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x334 PUSH2 0x24B3 JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP1 DUP1 DUP5 GT PUSH2 0x372 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3311 JUMP JUMPDEST PUSH2 0x37D DUP5 DUP9 DUP9 PUSH2 0xFCF JUMP JUMPDEST SWAP3 POP PUSH2 0x389 DUP5 DUP5 PUSH2 0x109D JUMP JUMPDEST SWAP2 POP PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x411 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x425 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0x452 DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x43C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x10 PUSH2 0x10B4 JUMP JUMPDEST PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP5 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x4F8 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x4CD JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x4F8 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x4DB JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x50C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x550 JUMPI PUSH2 0x549 DUP12 DUP12 DUP5 PUSH2 0x1115 JUMP JUMPDEST SWAP5 POP PUSH2 0x560 JUMP JUMPDEST PUSH2 0x55D DUP12 DUP12 DUP12 DUP12 DUP7 PUSH2 0x122F JUMP JUMPDEST SWAP5 POP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP5 LT ISZERO PUSH2 0x59E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x32F1 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP3 EQ PUSH2 0x5DB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3351 JUMP JUMPDEST PUSH2 0x5EA DUP2 CALLER DUP8 PUSH1 0x0 ADD MLOAD PUSH2 0x13B7 JUMP JUMPDEST POP POP POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x600 PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x60D PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x6B4 JUMPI PUSH2 0x629 DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST SWAP3 POP PUSH2 0x66C DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x63C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x658 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x1591 JUMP JUMPDEST SWAP2 POP PUSH2 0x68F DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x67F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 PUSH2 0x15AE JUMP JUMPDEST SWAP1 POP PUSH2 0x69B DUP6 DUP3 PUSH2 0x16FC JUMP JUMPDEST DUP5 MLOAD DUP7 EQ ISZERO PUSH2 0x6A9 JUMPI PUSH2 0x6B4 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x612 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x251C DUP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 DUP2 JUMP JUMPDEST PUSH2 0x701 PUSH2 0x24B3 JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x73D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3311 JUMP JUMPDEST PUSH1 0x0 DUP7 GT PUSH2 0x777 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3311 JUMP JUMPDEST PUSH2 0x79F DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x789 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x0 PUSH2 0x175E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 SWAP1 SWAP2 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP4 AND SWAP2 AND EQ DUP1 PUSH2 0x881 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x8B9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3381 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x93F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x953 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 DUP2 AND SWAP2 AND EQ ISZERO SWAP3 POP PUSH2 0x9CC SWAP2 POP POP JUMPI PUSH2 0x9C5 DUP11 DUP11 DUP11 DUP11 DUP11 PUSH2 0x17CB JUMP JUMPDEST SWAP3 POP PUSH2 0xA5F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0xA5F JUMPI PUSH2 0xA5C DUP11 DUP11 DUP11 DUP11 PUSH2 0x1B22 JUMP JUMPDEST SWAP3 POP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD DUP3 LT ISZERO PUSH2 0xA9D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x32F1 JUMP JUMPDEST PUSH2 0xABA PUSH2 0xAAE DUP4 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP8 DUP8 PUSH2 0x1E24 JUMP JUMPDEST POP POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x2710 DUP2 JUMP JUMPDEST PUSH2 0x3E8 DUP2 JUMP JUMPDEST PUSH2 0xAF7 PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xB04 PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x6B4 JUMPI PUSH2 0xB20 DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST SWAP3 POP PUSH2 0xB87 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB33 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB81 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB52 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB6E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST DUP6 PUSH2 0x1591 JUMP JUMPDEST SWAP2 POP PUSH2 0xBB4 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB9A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xBAF DUP5 PUSH1 0x1 PUSH2 0x1F11 JUMP JUMPDEST PUSH2 0x15AE JUMP JUMPDEST SWAP1 POP PUSH2 0xBC8 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST DUP2 MSTORE PUSH2 0xBD4 DUP6 DUP3 PUSH2 0x16FC JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0xBE1 JUMPI PUSH2 0x6B4 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0xB09 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C75696E74323536 DUP2 MSTORE PUSH32 0x2C62797465732900000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x27 ADD SWAP1 KECCAK256 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xC9E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3361 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x6070410800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x60704108 SWAP1 PUSH2 0xCF4 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x32D3 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD0E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD22 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 0xD46 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2892 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xEBF JUMPI PUSH1 0x2 SLOAD PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 PUSH4 0x95EA7B3 SWAP2 PUSH2 0xDBE SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x324D JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xDEC 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 0xE10 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2BC0 JUMP JUMPDEST POP PUSH1 0x3 SLOAD PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 PUSH4 0x95EA7B3 SWAP2 PUSH2 0xE6B SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x324D JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xE99 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 0xEBD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2BC0 JUMP JUMPDEST POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xF14 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3361 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xF71 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH2 0xFFFF AND GT DUP1 ISZERO PUSH2 0xFF9 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xC45 JUMPI PUSH2 0x3E8 PUSH2 0xFFFF DUP5 AND GT ISZERO PUSH2 0x103E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3331 JUMP JUMPDEST PUSH2 0x104F PUSH2 0xFFFF DUP5 AND PUSH2 0x2710 DUP7 PUSH2 0x1591 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1095 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x10A9 JUMPI INVALID JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x10F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3371 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x111D PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0x1178 SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x32A1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1192 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x11A6 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 0x11CA SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2BFC JUMP JUMPDEST SWAP2 POP PUSH2 0x11DE DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x60 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST SWAP1 POP PUSH2 0x11EE DUP3 PUSH1 0x0 ADD MLOAD DUP3 PUSH2 0x1F20 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1226 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3351 JUMP JUMPDEST DUP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1237 PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1241 PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x1249 PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x1251 PUSH2 0x24B3 JUMP JUMPDEST DUP6 SWAP4 POP PUSH2 0x125E DUP11 DUP8 PUSH2 0x1F3D JUMP JUMPDEST SWAP3 POP PUSH1 0x0 DUP4 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0x12F2 JUMPI PUSH2 0x127C DUP9 DUP9 DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x1FA7 JUMP JUMPDEST SWAP2 POP PUSH2 0x1295 DUP7 PUSH2 0x1290 DUP9 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST PUSH2 0x1F20 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x12CD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3351 JUMP JUMPDEST PUSH2 0x12DB DUP5 DUP4 PUSH1 0x20 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST PUSH1 0x60 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x20 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP4 POP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0x134C SWAP1 DUP14 SWAP1 DUP9 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x32A1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1366 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x137A 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 0x139E SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2BFC JUMP JUMPDEST SWAP1 POP PUSH2 0x13AA DUP6 DUP3 PUSH2 0x16FC JUMP JUMPDEST POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x7472616E7366657228616464726573732C75696E743235362900000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x19 ADD DUP2 KECCAK256 PUSH1 0x0 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP2 SWAP1 PUSH2 0x1415 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x24 ADD PUSH2 0x324D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 MSTORE MLOAD DUP2 MLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x14B9 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x14A1 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x14E6 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP3 POP POP POP DUP1 ISZERO ISZERO PUSH2 0x1535 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3341 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x1552 JUMPI POP PUSH1 0x0 RETURNDATASIZE PUSH1 0x20 EQ ISZERO PUSH2 0x1552 JUMPI PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD JUMPDEST DUP1 ISZERO ISZERO PUSH2 0x158B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3341 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15A6 PUSH2 0x15A0 DUP6 DUP5 PUSH2 0x22E0 JUMP JUMPDEST DUP5 PUSH2 0x2304 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x15B6 PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x15BE PUSH2 0x24DC JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xC75E0A8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP2 DUP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xC75E0A81 SWAP1 PUSH2 0x1619 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x33AF JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1633 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1647 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 0x166B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2C1A JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x167F JUMPI PUSH2 0x16F3 JUMP JUMPDEST PUSH2 0x1691 DUP7 PUSH1 0xA0 ADD MLOAD DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST SWAP2 POP PUSH2 0x169D DUP6 DUP4 PUSH2 0x231B JUMP JUMPDEST SWAP1 POP DUP1 DUP5 PUSH1 0x20 ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x16BC DUP2 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x1591 JUMP JUMPDEST DUP5 MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x16D3 SWAP2 DUP4 SWAP2 PUSH2 0x1591 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x16ED SWAP2 DUP4 SWAP2 PUSH2 0x1591 JUMP JUMPDEST PUSH1 0x60 DUP6 ADD MSTORE JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x170A SWAP2 SWAP1 PUSH2 0x1F11 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1720 SWAP2 SWAP1 PUSH2 0x1F11 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1739 SWAP2 SWAP1 PUSH2 0x1F11 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1752 SWAP2 SWAP1 PUSH2 0x1F11 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x17A0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3391 JUMP JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0x17D3 PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x17DD PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x17E5 PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x17ED PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x17FF DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x43C JUMPI INVALID JUMPDEST PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP8 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x18A5 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x187A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x18A5 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1888 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18B9 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x1997 JUMPI PUSH2 0x18F6 DUP11 DUP11 DUP9 PUSH2 0x1FA7 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 GT ISZERO PUSH2 0x1934 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3351 JUMP JUMPDEST PUSH2 0x193E DUP6 DUP5 PUSH2 0x16FC JUMP JUMPDEST PUSH2 0x195A PUSH2 0x1953 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1F11 JUMP JUMPDEST DUP7 MLOAD PUSH2 0x1F20 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1992 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3351 JUMP JUMPDEST PUSH2 0x1B13 JUMP JUMPDEST PUSH2 0x19A1 DUP11 DUP8 PUSH2 0x5F8 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 DUP3 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0x19D6 JUMPI PUSH2 0x19BF DUP9 DUP9 DUP5 PUSH1 0x60 ADD MLOAD PUSH2 0x1FA7 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP1 POP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xE5FA431B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xE5FA431B SWAP1 PUSH2 0x1A30 SWAP1 DUP14 SWAP1 DUP11 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x32A1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A5E 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 0x1A82 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2BFC JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 EQ PUSH2 0x1ABF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3351 JUMP JUMPDEST PUSH2 0x1AC9 DUP6 DUP5 PUSH2 0x16FC JUMP JUMPDEST PUSH2 0x1ADB DUP6 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0x1F20 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1B13 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3351 JUMP JUMPDEST PUSH2 0x13AA DUP5 CALLER DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0x13B7 JUMP JUMPDEST PUSH2 0x1B2A PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH1 0x0 PUSH2 0x1B39 PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x1B41 PUSH2 0x24B3 JUMP JUMPDEST DUP11 MLOAD SWAP5 POP DUP5 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1B6F JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x1CAB JUMPI PUSH2 0x1BA4 DUP7 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1B91 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0x1F11 JUMP JUMPDEST PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP10 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1C4A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1C1F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1C4A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1C2D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C5D JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP11 MLOAD DUP12 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x1C7A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C96 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1B77 JUMP JUMPDEST PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1CD6 JUMPI PUSH2 0x1CBF DUP10 DUP10 DUP9 PUSH2 0x1FA7 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE SWAP2 POP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x4D0AE54600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x4D0AE546 SWAP1 PUSH2 0x1D30 SWAP1 DUP15 SWAP1 DUP9 SWAP1 DUP16 SWAP1 PUSH1 0x4 ADD PUSH2 0x3268 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D5E 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 0x1D82 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2BFC JUMP JUMPDEST SWAP1 POP PUSH2 0x1D8E DUP8 DUP3 PUSH2 0x16FC JUMP JUMPDEST PUSH2 0x1DA0 DUP8 PUSH1 0x20 ADD MLOAD DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x1F20 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1DD8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3351 JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x1E16 JUMPI PUSH2 0x1E0B DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1DF6 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD CALLER PUSH2 0x2331 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1DDD JUMP JUMPDEST POP POP POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1F09 JUMPI PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x1E86 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x3400 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1EA0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1EB4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x1EC3 DUP6 DUP6 DUP6 PUSH2 0xFCF JUMP JUMPDEST SWAP2 POP PUSH2 0x1ECF DUP7 DUP4 PUSH2 0x109D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT ISZERO PUSH2 0x1F09 JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1F07 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xC45 JUMPI INVALID JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1F32 PUSH2 0x251C PUSH2 0x2710 DUP7 PUSH2 0x1591 JUMP JUMPDEST SWAP1 SWAP3 LT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1F45 PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1F50 PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP6 MLOAD DUP4 LT ISZERO PUSH2 0x16F3 JUMPI PUSH2 0x1F6C DUP6 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST SWAP2 POP PUSH2 0x1F7F DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x67F JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x1F8B DUP5 DUP3 PUSH2 0x16FC JUMP JUMPDEST DUP5 DUP5 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x1F9C JUMPI PUSH2 0x16F3 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1F55 JUMP JUMPDEST PUSH2 0x1FAF PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1FBC PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP8 MLOAD DUP5 LT ISZERO PUSH2 0x22D5 JUMPI PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x206E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2043 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x206E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2051 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2081 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP2 MSTORE DUP2 DUP2 MSTORE SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2136 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x210B JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2136 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2119 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2149 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP5 MLOAD PUSH2 0x2165 SWAP1 DUP8 SWAP1 PUSH2 0x109D JUMP JUMPDEST SWAP3 POP PUSH2 0x21B3 DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2178 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB81 DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2197 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP12 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB6E JUMPI INVALID JUMPDEST PUSH1 0x1 SLOAD DUP10 MLOAD SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB4BE83D5 SWAP1 DUP11 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0x21E4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x21F9 DUP6 PUSH1 0x1 PUSH2 0x1F11 JUMP JUMPDEST DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2207 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x224B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x33C0 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2265 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2279 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 0x229D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2BFC JUMP JUMPDEST SWAP1 POP PUSH2 0x22B1 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST DUP2 MSTORE PUSH2 0x22BD DUP6 DUP3 PUSH2 0x16FC JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0x22CA JUMPI PUSH2 0x22D5 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x1FC1 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MUL DUP4 ISZERO DUP1 PUSH2 0x22FC JUMPI POP DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x22F9 JUMPI INVALID JUMPDEST DIV EQ JUMPDEST ISZERO ISZERO PUSH2 0xC45 JUMPI INVALID JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x2312 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x232A JUMPI DUP2 PUSH2 0xC45 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x2347 DUP6 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x10B4 AND JUMP JUMPDEST SWAP3 POP PUSH2 0x235A DUP6 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x2401 AND JUMP JUMPDEST SWAP2 POP PUSH2 0x236D DUP6 PUSH1 0x64 PUSH4 0xFFFFFFFF PUSH2 0x240D AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0x23C8 SWAP1 ADDRESS SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x3209 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x23E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x23F6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC45 DUP4 DUP4 PUSH2 0x2468 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x241B DUP5 DUP5 PUSH2 0x2401 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2462 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3301 JUMP JUMPDEST POP POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x24AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3321 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD 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 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 0x0 PUSH2 0xC45 DUP3 CALLDATALOAD PUSH2 0x34A6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC45 DUP3 MLOAD PUSH2 0x34A6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x2525 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2538 PUSH2 0x2533 DUP3 PUSH2 0x3435 JUMP JUMPDEST PUSH2 0x340E 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 0x6B4 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x2560 DUP9 DUP3 PUSH2 0x25F7 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x254A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x2587 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2595 PUSH2 0x2533 DUP3 PUSH2 0x3435 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 0x6B4 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x25BD DUP9 DUP3 PUSH2 0x2707 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x25A7 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC45 DUP3 MLOAD PUSH2 0x34EE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC45 DUP3 MLOAD PUSH2 0x34EB JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC45 DUP3 CALLDATALOAD PUSH2 0x34BF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x2608 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2616 PUSH2 0x2533 DUP3 PUSH2 0x3456 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x2632 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x16F3 DUP4 DUP3 DUP5 PUSH2 0x34F9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x264F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2659 PUSH1 0x80 PUSH2 0x340E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2667 DUP5 DUP5 PUSH2 0x25DF JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x2678 DUP5 DUP5 DUP4 ADD PUSH2 0x25DF JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x268C DUP5 DUP3 DUP6 ADD PUSH2 0x25DF JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x26A0 DUP5 DUP3 DUP6 ADD PUSH2 0x25DF JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x26BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26C8 PUSH1 0x60 PUSH2 0x340E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x26D6 DUP5 DUP5 PUSH2 0x2868 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x26E7 DUP5 DUP5 DUP4 ADD PUSH2 0x25DF JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x26FB DUP5 DUP3 DUP6 ADD PUSH2 0x25DF JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x271A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2725 PUSH2 0x180 PUSH2 0x340E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2733 DUP5 DUP5 PUSH2 0x24FC JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x2744 DUP5 DUP5 DUP4 ADD PUSH2 0x24FC JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x2758 DUP5 DUP3 DUP6 ADD PUSH2 0x24FC JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x276C DUP5 DUP3 DUP6 ADD PUSH2 0x24FC JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x2780 DUP5 DUP3 DUP6 ADD PUSH2 0x285C JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x2794 DUP5 DUP3 DUP6 ADD PUSH2 0x285C JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x27A8 DUP5 DUP3 DUP6 ADD PUSH2 0x285C JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x27BC DUP5 DUP3 DUP6 ADD PUSH2 0x285C JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x27D1 DUP5 DUP3 DUP6 ADD PUSH2 0x285C JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x27E7 DUP5 DUP3 DUP6 ADD PUSH2 0x285C JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2809 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2815 DUP5 DUP3 DUP6 ADD PUSH2 0x25F7 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2837 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2843 DUP5 DUP3 DUP6 ADD PUSH2 0x25F7 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC45 DUP3 CALLDATALOAD PUSH2 0x34E4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC45 DUP3 CALLDATALOAD PUSH2 0x34EB JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC45 DUP3 MLOAD PUSH2 0x34F3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2886 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x15A6 DUP5 DUP5 PUSH2 0x24FC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x28A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x15A6 DUP5 DUP5 PUSH2 0x2508 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x28C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x28D2 DUP8 DUP8 PUSH2 0x24FC JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x28E3 DUP8 DUP3 DUP9 ADD PUSH2 0x24FC JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x28F4 DUP8 DUP3 DUP9 ADD PUSH2 0x285C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2911 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x291D DUP8 DUP3 DUP9 ADD PUSH2 0x25F7 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x293E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x294A DUP7 DUP7 PUSH2 0x24FC JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x295B DUP7 DUP3 DUP8 ADD PUSH2 0x285C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2978 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2984 DUP7 DUP3 DUP8 ADD PUSH2 0x25F7 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x29A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x29BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x29CA DUP10 DUP3 DUP11 ADD PUSH2 0x2576 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x29E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x29F3 DUP10 DUP3 DUP11 ADD PUSH2 0x2514 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2A10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2A1C DUP10 DUP3 DUP11 ADD PUSH2 0x2576 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2A39 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2A45 DUP10 DUP3 DUP11 ADD PUSH2 0x2514 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 PUSH2 0x2A56 DUP10 DUP3 DUP11 ADD PUSH2 0x2850 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xA0 PUSH2 0x2A67 DUP10 DUP3 DUP11 ADD PUSH2 0x24FC JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x2A8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2AA6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2AB2 DUP11 DUP3 DUP12 ADD PUSH2 0x2576 JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2ACF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2ADB DUP11 DUP3 DUP12 ADD PUSH2 0x2514 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2AF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2B04 DUP11 DUP3 DUP12 ADD PUSH2 0x2576 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2B21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2B2D DUP11 DUP3 DUP12 ADD PUSH2 0x2514 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 PUSH2 0x2B3E DUP11 DUP3 DUP12 ADD PUSH2 0x285C JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH2 0x2B4F DUP11 DUP3 DUP12 ADD PUSH2 0x2850 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH2 0x2B60 DUP11 DUP3 DUP12 ADD PUSH2 0x24FC JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2B82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2B99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2BA5 DUP6 DUP3 DUP7 ADD PUSH2 0x2576 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x2BB6 DUP6 DUP3 DUP7 ADD PUSH2 0x285C JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2BD2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x15A6 DUP5 DUP5 PUSH2 0x25D3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2BF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x15A6 DUP5 DUP5 PUSH2 0x25EB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2C0E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x15A6 DUP5 DUP5 PUSH2 0x263D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2C2C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x15A6 DUP5 DUP5 PUSH2 0x26AC JUMP JUMPDEST PUSH2 0x2C41 DUP2 PUSH2 0x34A6 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2C52 DUP3 PUSH2 0x34A2 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2C6B DUP6 PUSH2 0x349C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2CA2 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2C86 DUP4 DUP4 MLOAD PUSH2 0x2D69 JUMP JUMPDEST SWAP3 POP PUSH2 0x2C91 DUP3 PUSH2 0x349C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x2C6E JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2CB9 DUP3 PUSH2 0x34A2 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2CD2 DUP6 PUSH2 0x349C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2CA2 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2CED DUP4 DUP4 MLOAD PUSH2 0x30E6 JUMP JUMPDEST SWAP3 POP PUSH2 0x2CF8 DUP3 PUSH2 0x349C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x2CD5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D14 DUP3 PUSH2 0x34A2 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x2D26 DUP4 PUSH2 0x349C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x2D56 JUMPI PUSH2 0x2D3C DUP7 DUP4 MLOAD PUSH2 0x31F2 JUMP JUMPDEST PUSH2 0x2D45 DUP3 PUSH2 0x349C JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x2D29 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x2C41 DUP2 PUSH2 0x34BF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D74 DUP3 PUSH2 0x34A2 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x2D88 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x3505 JUMP JUMPDEST PUSH2 0x2D91 DUP2 PUSH2 0x3531 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x44454641554C545F46554E4354494F4E5F574554485F434F4E54524143545F4F PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4E4C590000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F4D53475F56414C5545000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x30 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x56414C55455F475245415445525F5448414E5F5A45524F000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 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 0x18 DUP2 MSTORE PUSH32 0x4645455F50524F504F5254494F4E5F544F4F5F4C415247450000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x16 DUP2 MSTORE PUSH32 0x554E41434345505441424C455F5448524553484F4C4400000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 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 0x17 DUP2 MSTORE PUSH32 0x554E535550504F525445445F544F4B454E5F50524F5859000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 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 0x80 DUP4 ADD SWAP1 PUSH2 0x30AD DUP5 DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x30C0 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x30D3 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x158B PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x30FB DUP6 DUP3 PUSH2 0x2C38 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x310E PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x2C38 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x3121 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x2C38 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x3134 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x2C38 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x3147 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x315A PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x316D PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x3180 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x3195 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x31AA PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x31C4 DUP3 DUP3 PUSH2 0x2D69 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x31E0 DUP3 DUP3 PUSH2 0x2D69 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2C41 DUP2 PUSH2 0x34E4 JUMP JUMPDEST PUSH2 0x2C41 DUP2 PUSH2 0x34EB JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x10AE DUP3 DUP5 PUSH2 0x2C38 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x3217 DUP3 DUP8 PUSH2 0x2C38 JUMP JUMPDEST PUSH2 0x3224 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x2C38 JUMP JUMPDEST PUSH2 0x3231 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x31F2 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x3243 DUP2 DUP5 PUSH2 0x2D69 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x325B DUP3 DUP6 PUSH2 0x2C38 JUMP JUMPDEST PUSH2 0xC45 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x31F2 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x3279 DUP2 DUP7 PUSH2 0x2CAE JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x328D DUP2 DUP6 PUSH2 0x2D09 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x31E0 DUP2 DUP5 PUSH2 0x2C47 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x32B2 DUP2 DUP7 PUSH2 0x2CAE JUMP JUMPDEST SWAP1 POP PUSH2 0x32C1 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x31F2 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x31E0 DUP2 DUP5 PUSH2 0x2C47 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x10AE DUP3 DUP5 PUSH2 0x2D60 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2D9E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2DF4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2E24 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2E7A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2EAA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2F00 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2F30 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2F60 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2F90 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2FC0 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x3016 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x3046 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x10AE DUP3 DUP5 PUSH2 0x309C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC45 DUP2 DUP5 PUSH2 0x30E6 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x33D1 DUP2 DUP7 PUSH2 0x30E6 JUMP JUMPDEST SWAP1 POP PUSH2 0x33E0 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x31F2 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x31E0 DUP2 DUP5 PUSH2 0x2D69 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x10AE DUP3 DUP5 PUSH2 0x31E9 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x10AE DUP3 DUP5 PUSH2 0x31F2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x342D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x344C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x346D 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 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3520 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3508 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x158B JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xf8 DIFFICULTY 0x28 PUSH8 0x4A7A1B076EA035CD STATICCALL NOT 0xe SWAP2 0x2b LOG3 0xc0 SWAP5 CALLCODE MULMOD 0xcb 0xdd 0xcd DUP4 SAR PUSH20 0x62003D456C6578706572696D656E74616CF50037 ", - "sourceMap": "816:1324:0:-;;;-1:-1:-1;;971:29:0;;1007:464;8:9:-1;5:2;;;30:1;27;20:12;5:2;1007:464:0;;;;;;;;;;;;;;;;;;;;;;;;363:5:41;:18;;371:10;-1:-1:-1;;;;;;363:18:41;;;;;;;-1:-1:-1;1130:30:1;;;;-1:-1:-1;;;;;1130:30:1;;;;;;;;;;1170:11;:37;;;;;;;;;;1217:9;:34;;;;;;;;;;;1261:30;;1130;;1170:37;;1217:34;;1261:30;;1384:14:0;;1261:30:1;;:14;;:30;;;;;:::i;:::-;-1:-1:-1;1301:32:1;;;;:15;;:32;;;;;:::i;:::-;;926:414;;;;;1423:41:0;1445:18;1423:21;;;:41;;;:::i;:::-;1007:464;;;;;;816:1324;;1799:339;1903:20;460:5:41;;-1:-1:-1;;;;;460:5:41;446:10;:19;425:85;;;;;;;;;;;;;;;;;;;;;;1926:8:0;;:41;;;;;-1:-1:-1;;;;;1926:8:0;;;;:22;;:41;;1949:17;;1926:41;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1926:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1926:41: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;1926:41:0;;;;;;;;;1903:64;-1:-1:-1;;;;;;1981:26:0;;;1977:155;;2023:11;;2057:8;;2023:43;;;;;-1:-1:-1;;;;;2023:11:0;;;;:19;;:43;;2043:12;;2057:8;2023:43;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2023:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2023:43: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;2023:43:0;;;;;;;;;-1:-1:-1;2080:9:0;;2112:8;;2080:41;;;;;-1:-1:-1;;;;;2080:9:0;;;;:17;;:41;;2098:12;;2112:8;2080:41;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2080:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2080:41: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;2080:41:0;;;;;;;;;;1977:155;1799:339;;:::o;816:1324::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;816:1324:0;;;-1:-1:-1;816:1324:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;5:122:-1:-;;83:39;114:6;108:13;83:39;;;74:48;68:59;-1:-1;;;68:59;134:116;;209:36;237:6;231:13;209:36;;257:120;;334:38;364:6;358:13;334:38;;385:442;;490:4;478:17;;474:27;-1:-1;464:2;;515:1;512;505:12;464:2;545:6;539:13;567:64;582:48;623:6;582:48;;;567:64;;;558:73;;651:6;644:5;637:21;687:4;679:6;675:17;720:4;713:5;709:16;755:3;746:6;741:3;737:16;734:25;731:2;;;772:1;769;762:12;731:2;782:39;814:6;809:3;804;782:39;;;457:370;;;;;;;;835:263;;950:2;938:9;929:7;925:23;921:32;918:2;;;966:1;963;956:12;918:2;1001:1;1018:64;1074:7;1054:9;1018:64;;;1008:74;912:186;-1:-1;;;;912:186;1105:1138;;;;;;;1322:3;1310:9;1301:7;1297:23;1293:33;1290:2;;;1339:1;1336;1329:12;1290:2;1374:1;1391:64;1447:7;1427:9;1391:64;;;1381:74;;1353:108;1492:2;1510:64;1566:7;1557:6;1546:9;1542:22;1510:64;;;1500:74;;1471:109;1611:2;1629:64;1685:7;1676:6;1665:9;1661:22;1629:64;;;1619:74;;1590:109;1730:2;1748:63;1803:7;1794:6;1783:9;1779:22;1748:63;;;1738:73;;1709:108;1869:3;1858:9;1854:19;1848:26;-1:-1;;;;;1886:6;1883:30;1880:2;;;1926:1;1923;1916:12;1880:2;1946:73;2011:7;2002:6;1991:9;1987:22;1946:73;;;1936:83;;1827:198;2077:3;2066:9;2062:19;2056:26;-1:-1;;;;;2094:6;2091:30;2088:2;;;2134:1;2131;2124:12;2088:2;2154:73;2219:7;2210:6;2199:9;2195:22;2154:73;;;2144:83;;2035:198;1284:959;;;;;;;;;2250:257;;2362:2;2350:9;2341:7;2337:23;2333:32;2330:2;;;2378:1;2375;2368:12;2330:2;2413:1;2430:61;2483:7;2463:9;2430:61;;2514:110;2587:31;2612:5;2587:31;;;2582:3;2575:44;2569:55;;;2631:107;2702:30;2726:5;2702:30;;2746:296;2901:2;2889:15;;2938:66;2933:2;2924:12;;2917:88;3033:2;3024:12;;2882:160;3050:110;3123:31;3148:5;3123:31;;3167:294;3303:2;3288:18;;3317:61;3292:9;3351:6;3317:61;;;3389:62;3447:2;3436:9;3432:18;3423:6;3389:62;;3468:189;3574:2;3559:18;;3588:59;3563:9;3620:6;3588:59;;;3545:112;;;;;3664:387;3845:2;3859:47;;;3830:18;;3920:121;3830:18;3920:121;;4058:256;4120:2;4114:9;4146:17;;;-1:-1;;;;;4206:34;;4242:22;;;4203:62;4200:2;;;4278:1;4275;4268:12;4200:2;4294;4287:22;4098:216;;-1:-1;4098:216;4321:258;;-1:-1;;;;;4456:6;4453:30;4450:2;;;4496:1;4493;4486:12;4450:2;-1:-1;4569:4;4540;4517:17;;;;-1:-1;;4513:33;4559:15;;4387:192;4586:128;-1:-1;;;;;4655:54;;4638:76;4721:151;4800:66;4789:78;;4772:100;5100:92;5173:13;5166:21;;5149:43;5358:268;5423:1;5430:101;5444:6;5441:1;5438:13;5430:101;;;5511:11;;;5505:18;5492:11;;;5485:39;5466:2;5459:10;5430:101;;;5546:6;5543:1;5540:13;5537:2;;;5611:1;5602:6;5597:3;5593:16;5586:27;5537:2;5407:219;;;;;;816:1324:0;;;;;;" + "object": "0x60806040523480156200001157600080fd5b506040516200374638038062003746833981018060405262000037919081019062000433565b60008054600160a060020a03808816600160a060020a03199283161783556001805482891690841617905560028054918716919092161790558251869086908690869086906200008f906003906020850190620002e6565b508051620000a5906004906020840190620002e6565b5050600054604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130181207f60704108000000000000000000000000000000000000000000000000000000008252600160a060020a039092169550636070410894506200012593509091506004016200054a565b602060405180830381600087803b1580156200014057600080fd5b505af115801562000155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200017b91908101906200040a565b9050600160a060020a03811615620002da576001546040517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063095ea7b390620001dc908490600019906004016200052b565b602060405180830381600087803b158015620001f757600080fd5b505af11580156200020c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002329190810190620004e3565b506002546040517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063095ea7b39062000282908490600019906004016200052b565b602060405180830381600087803b1580156200029d57600080fd5b505af1158015620002b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002d89190810190620004e3565b505b50505050505062000618565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200032957805160ff191683800117855562000359565b8280016001018555821562000359579182015b82811115620003595782518255916020019190600101906200033c565b50620003679291506200036b565b5090565b6200038891905b8082111562000367576000815560010162000372565b90565b6000620003998251620005af565b9392505050565b6000620003998251620005e0565b6000601f82018313620003c057600080fd5b8151620003d7620003d18262000587565b62000560565b91508082526020830160208301858383011115620003f457600080fd5b62000401838284620005e5565b50505092915050565b6000602082840312156200041d57600080fd5b60006200042b84846200038b565b949350505050565b600080600080600060a086880312156200044c57600080fd5b60006200045a88886200038b565b95505060206200046d888289016200038b565b945050604062000480888289016200038b565b93505060608601516001604060020a038111156200049d57600080fd5b620004ab88828901620003ae565b92505060808601516001604060020a03811115620004c857600080fd5b620004d688828901620003ae565b9150509295509295909350565b600060208284031215620004f657600080fd5b60006200042b8484620003a0565b6200050f81620005af565b82525050565b6200050f81620005bb565b6200050f8162000388565b604081016200053b828562000504565b62000399602083018462000520565b602081016200055a828462000515565b92915050565b6040518181016001604060020a03811182821017156200057f57600080fd5b604052919050565b60006001604060020a038211156200059e57600080fd5b506020601f91909101601f19160190565b600160a060020a031690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b151590565b60005b8381101562000602578181015183820152602001620005e8565b8381111562000612576000848401525b50505050565b61311e80620006286000396000f3006080604052600436106100a35763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663150b7a0281146100ff578063169645f2146101355780631c5b1ec41461015557806320472cf714610175578063725cef0614610197578063b3cd4254146101aa578063bc063e1a146101bf578063c5e6e6ac146101d4578063e58e9c16146101f4578063f0b9e5ba14610214575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e71565b60405180910390fd5b005b34801561010b57600080fd5b5061011f61011a36600461248a565b610234565b60405161012c9190612e63565b60405180910390f35b610148610143366004612568565b610294565b60405161012c9190612f31565b34801561016157600080fd5b50610148610170366004612749565b610560565b34801561018157600080fd5b5061018a610626565b60405161012c9190612f82565b6101486101a536600461264e565b61062c565b3480156101b657600080fd5b5061018a6109fa565b3480156101cb57600080fd5b5061018a610a00565b3480156101e057600080fd5b506101486101ef366004612749565b610a06565b34801561020057600080fd5b5061014861020f366004612749565b610a79565b34801561022057600080fd5b5061011f61022f366004612503565b610b76565b604080517f6f6e455243373231526563656976656428616464726573732c6164647265737381527f2c75696e743235362c62797465732900000000000000000000000000000000006020820152905190819003602f019020949350505050565b61029c6120ed565b34600080808084116102da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b6102e5848888610bd6565b92506102f18484610ca4565b9150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561037957600080fd5b505af115801561038d573d6000803e3d6000fd5b50505050506103ba8b60008151811015156103a457fe5b9060200190602002015161014001516010610ceb565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529394508301828280156104605780601f1061043557610100808354040283529160200191610460565b820191906000526020600020905b81548152906001019060200180831161044357829003601f168201915b50505050508b600081518110151561047457fe5b60209081029091010151610160015260025473ffffffffffffffffffffffffffffffffffffffff828116911614156104b8576104b18b8b84610d4c565b94506104c8565b6104c58b8b8b8b86610e66565b94505b6020850151841015610506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e81565b60208501518214610543576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b61055281338760000151610fee565b505050509695505050505050565b6105686120ed565b60008060006105756120ed565b600093505b865184101561061c57610591868660000151610ca4565b92506105d487858151811015156105a457fe5b9060200190602002015160a0015188868151811015156105c057fe5b9060200190602002015160800151856111c8565b91506105f787858151811015156105e757fe5b90602001906020020151836111e5565b9050610603858261132e565b84518614156106115761061c565b60019093019261057a565b5050505092915050565b61251c81565b6106346120ed565b346000808211610670576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b600086116106aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b6106d28a60008151811015156106bc57fe5b9060200190602002015161014001516000611390565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190209091507fffffffff00000000000000000000000000000000000000000000000000000000808316911614806107b45750604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff000000000000000000000000000000000000000000000000000000008281169116145b15156107ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f11565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b5050604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190207fffffffff000000000000000000000000000000000000000000000000000000008581169116141592506108ff915050576108f88a8a8a8a8a6113fd565b9250610992565b604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff00000000000000000000000000000000000000000000000000000000828116911614156109925761098f8a8a8a8a611754565b92505b60208301518210156109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e81565b6109ed6109e1838560200151610ca4565b84602001518787611a56565b5050979650505050505050565b61271081565b6103e881565b610a0e6120ed565b600080610a196120ed565b600092505b8551831015610a7057610a35858560200151610ca4565b9150610a4886848151811015156105e757fe5b9050610a54848261132e565b8484602001511415610a6557610a70565b600190920191610a1e565b50505092915050565b610a816120ed565b6000806000610a8e6120ed565b600093505b865184101561061c57610aaa868660000151610ca4565b9250610b118785815181101515610abd57fe5b9060200190602002015160a00151610b0b8987815181101515610adc57fe5b90602001906020020151608001518a88815181101515610af857fe5b9060200190602002015160e00151610ca4565b856111c8565b9150610b3e8785815181101515610b2457fe5b90602001906020020151610b39846001611b43565b6111e5565b9050610b5281600001518260600151610ca4565b8152610b5e858261132e565b84518611610b6b5761061c565b600190930192610a93565b604080517f6f6e455243373231526563656976656428616464726573732c75696e7432353681527f2c62797465732900000000000000000000000000000000000000000000000000602082015290519081900360270190205b9392505050565b6000808361ffff16118015610c00575073ffffffffffffffffffffffffffffffffffffffff821615155b15610bcf576103e861ffff84161115610c45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ed1565b610c5661ffff8416612710866111c8565b60405190915073ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610c9c573d6000803e3d6000fd5b509392505050565b600082821115610ce0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b508082035b92915050565b600081601401835110151515610d2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f01565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b610d546120ed565b600080546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d980890610daf90889087908990600401612e31565b608060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e01919081019061279a565b9150610e1582600001518360600151610ca4565b9050610e25826000015182611b8d565b1515610e5d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b81529392505050565b610e6e6120ed565b6000610e786120ed565b610e806120ed565b610e886120ed565b859350610e958a87610a06565b9250600083606001511115610f2957610eb388888560600151611baa565b9150610ecc86610ec7888560200151610ca4565b611b8d565b1515610f04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b610f12848360200151610ca4565b606080840151908701526020808401519087015293505b6000546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d980890610f83908d9088908e90600401612e31565b608060405180830381600087803b158015610f9d57600080fd5b505af1158015610fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fd5919081019061279a565b9050610fe1858261132e565b5050505095945050505050565b604080517f7472616e7366657228616464726573732c75696e7432353629000000000000008152905190819003601901812060009173ffffffffffffffffffffffffffffffffffffffff8616919061104c9086908690602401612ddd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931783525181519192909182919080838360005b838110156110f05781810151838201526020016110d8565b50505050905090810190601f16801561111d5780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af19250505080151561116c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ee1565b3d15611189575060003d602014156111895760206000803e506000515b8015156111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ee1565b50505050565b60006111dd6111d78584611ee3565b84611f3e565b949350505050565b6111ed6120ed565b6111f5612116565b600080546040517fc75e0a81000000000000000000000000000000000000000000000000000000008152829173ffffffffffffffffffffffffffffffffffffffff169063c75e0a819061124c908990600401612f3f565b606060405180830381600087803b15801561126657600080fd5b505af115801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061129e91908101906127b8565b805190935060ff166003146112b257610a70565b6112c48660a001518460400151610ca4565b91506112d08583611f55565b9050808460200181815250506112ef818760a0015188608001516111c8565b845260a086015160c08701516113069183916111c8565b604085015260a086015160e08701516113209183916111c8565b606085015250505092915050565b8151815161133c9190611b43565b8252602080830151908201516113529190611b43565b60208301526040808301519082015161136b9190611b43565b6040830152606080830151908201516113849190611b43565b60609092019190915250565b6000816004018351101515156113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f21565b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6114056120ed565b600061140f6120ed565b6114176120ed565b61141f6120ed565b6114318a60008151811015156103a457fe5b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529397508301828280156114d75780601f106114ac576101008083540402835291602001916114d7565b820191906000526020600020905b8154815290600101906020018083116114ba57829003601f168201915b50505050508a60008151811015156114eb57fe5b60209081029091010151610160015260025473ffffffffffffffffffffffffffffffffffffffff858116911614156115c9576115288a8a88611baa565b8051909350861115611566576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b611570858461132e565b61158c61158586600001518760600151611b43565b8651611b8d565b15156115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b611745565b6115d38a87610560565b9150600082606001511115611608576115f188888460600151611baa565b602080820151908701526060808201519087015290505b6000546040517fe5fa431b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e5fa431b90611662908d908a908e90600401612e31565b608060405180830381600087803b15801561167c57600080fd5b505af1158015611690573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116b4919081019061279a565b805190935086146116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b6116fb858461132e565b61170d85602001518460200151611b8d565b1515611745576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b610fe184338560000151610fee565b61175c6120ed565b6000806060600061176b6120ed565b6117736120ed565b8a519450846040519080825280602002602001820160405280156117a1578160200160208202803883390190505b509350600092505b848310156118dd576117d6868c858151811015156117c357fe5b9060200190602002015160e00151611b43565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815293995083018282801561187c5780601f106118515761010080835404028352916020019161187c565b820191906000526020600020905b81548152906001019060200180831161185f57829003601f168201915b50505050508b8481518110151561188f57fe5b6020908102909101015161016001528a518b90849081106118ac57fe5b9060200190602002015160a0015184848151811015156118c857fe5b602090810290910101526001909201916117a9565b6000861115611908576118f1898988611baa565b606080820151908901526020808201519089015291505b6000546040517f4d0ae54600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690634d0ae54690611962908e9088908f90600401612df8565b608060405180830381600087803b15801561197c57600080fd5b505af1158015611990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119b4919081019061279a565b90506119c0878261132e565b6119d287602001518260200151611b8d565b1515611a0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b600092505b84831015611a4857611a3d8b84815181101515611a2857fe5b90602001906020020151610140015133611f6b565b600190920191611a0f565b505050505050949350505050565b6000806000861115611b3b576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90611ab8908990600401612f90565b600060405180830381600087803b158015611ad257600080fd5b505af1158015611ae6573d6000803e3d6000fd5b50505050611af5858585610bd6565b9150611b018683610ca4565b90506000811115611b3b57604051339082156108fc029083906000818181858888f19350505050158015611b39573d6000803e3d6000fd5b505b505050505050565b600082820183811015611b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b8091505b5092915050565b600080611b9f61251c612710866111c8565b909210159392505050565b611bb26120ed565b6000806000611bbf6120ed565b600093505b8751841015611ed8576003805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015611c715780601f10611c4657610100808354040283529160200191611c71565b820191906000526020600020905b815481529060010190602001808311611c5457829003601f168201915b50505050508885815181101515611c8457fe5b602090810290910181015161014001919091526004805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600187161502019094169390930492830185900485028101850190915281815292830182828015611d395780601f10611d0e57610100808354040283529160200191611d39565b820191906000526020600020905b815481529060010190602001808311611d1c57829003601f168201915b50505050508885815181101515611d4c57fe5b6020908102909101015161016001528451611d68908790610ca4565b9250611db68885815181101515611d7b57fe5b9060200190602002015160a00151610b0b8a87815181101515611d9a57fe5b90602001906020020151608001518b88815181101515610af857fe5b600054895191935073ffffffffffffffffffffffffffffffffffffffff169063b4be83d5908a9087908110611de757fe5b90602001906020020151611dfc856001611b43565b8a88815181101515611e0a57fe5b906020019060200201516040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611e4e93929190612f50565b608060405180830381600087803b158015611e6857600080fd5b505af1158015611e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ea0919081019061279a565b9050611eb481600001518260600151610ca4565b8152611ec0858261132e565b84518611611ecd57611ed8565b600190930192611bc4565b505050509392505050565b600080831515611ef65760009150611b86565b50828202828482811515611f0657fe5b0414611b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b6000808284811515611f4c57fe5b04949350505050565b6000818310611f645781610bcf565b5090919050565b6000806060611f8185601063ffffffff610ceb16565b9250611f9485602463ffffffff61203b16565b9150611fa785606463ffffffff61204716565b6040517fb88d4fde00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff84169063b88d4fde90612002903090889087908790600401612d99565b600060405180830381600087803b15801561201c57600080fd5b505af1158015612030573d6000803e3d6000fd5b505050505050505050565b6000610bcf83836120a2565b60606000612055848461203b565b905060208301925080830184511015151561209c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e91565b50500190565b6000816020018351101515156120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612eb1565b50016020015190565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610bcf8235613036565b6000601f8201831361215357600080fd5b813561216661216182612fc5565b612f9e565b81815260209384019390925082018360005b8381101561061c578135860161218e888261220d565b8452506020928301929190910190600101612178565b6000601f820183136121b557600080fd5b81356121c361216182612fc5565b81815260209384019390925082018360005b8381101561061c57813586016121eb888261231d565b84525060209283019291909101906001016121d5565b6000610bcf825161307b565b6000601f8201831361221e57600080fd5b813561222c61216182612fe6565b9150808252602083016020830185838301111561224857600080fd5b610a70838284613084565b60006080828403121561226557600080fd5b61226f6080612f9e565b9050600061227d8484612201565b825250602061228e84848301612201565b60208301525060406122a284828501612201565b60408301525060606122b684828501612201565b60608301525092915050565b6000606082840312156122d457600080fd5b6122de6060612f9e565b905060006122ec848461247e565b82525060206122fd84848301612201565b602083015250604061231184828501612201565b60408301525092915050565b6000610180828403121561233057600080fd5b61233b610180612f9e565b905060006123498484612136565b825250602061235a84848301612136565b602083015250604061236e84828501612136565b604083015250606061238284828501612136565b606083015250608061239684828501612472565b60808301525060a06123aa84828501612472565b60a08301525060c06123be84828501612472565b60c08301525060e06123d284828501612472565b60e0830152506101006123e784828501612472565b610100830152506101206123fd84828501612472565b6101208301525061014082013567ffffffffffffffff81111561241f57600080fd5b61242b8482850161220d565b6101408301525061016082013567ffffffffffffffff81111561244d57600080fd5b6124598482850161220d565b6101608301525092915050565b6000610bcf8235613074565b6000610bcf823561307b565b6000610bcf825161307e565b600080600080608085870312156124a057600080fd5b60006124ac8787612136565b94505060206124bd87828801612136565b93505060406124ce87828801612472565b925050606085013567ffffffffffffffff8111156124eb57600080fd5b6124f78782880161220d565b91505092959194509250565b60008060006060848603121561251857600080fd5b60006125248686612136565b935050602061253586828701612472565b925050604084013567ffffffffffffffff81111561255257600080fd5b61255e8682870161220d565b9150509250925092565b60008060008060008060c0878903121561258157600080fd5b863567ffffffffffffffff81111561259857600080fd5b6125a489828a016121a4565b965050602087013567ffffffffffffffff8111156125c157600080fd5b6125cd89828a01612142565b955050604087013567ffffffffffffffff8111156125ea57600080fd5b6125f689828a016121a4565b945050606087013567ffffffffffffffff81111561261357600080fd5b61261f89828a01612142565b935050608061263089828a01612466565b92505060a061264189828a01612136565b9150509295509295509295565b600080600080600080600060e0888a03121561266957600080fd5b873567ffffffffffffffff81111561268057600080fd5b61268c8a828b016121a4565b975050602088013567ffffffffffffffff8111156126a957600080fd5b6126b58a828b01612142565b965050604088013567ffffffffffffffff8111156126d257600080fd5b6126de8a828b016121a4565b955050606088013567ffffffffffffffff8111156126fb57600080fd5b6127078a828b01612142565b94505060806127188a828b01612472565b93505060a06127298a828b01612466565b92505060c061273a8a828b01612136565b91505092959891949750929550565b6000806040838503121561275c57600080fd5b823567ffffffffffffffff81111561277357600080fd5b61277f858286016121a4565b925050602061279085828601612472565b9150509250929050565b6000608082840312156127ac57600080fd5b60006111dd8484612253565b6000606082840312156127ca57600080fd5b60006111dd84846122c2565b6127df81613036565b82525050565b60006127f082613032565b808452602084019350836020820285016128098561302c565b60005b84811015612840578383038852612824838351612907565b925061282f8261302c565b60209890980197915060010161280c565b50909695505050505050565b600061285782613032565b808452602084019350836020820285016128708561302c565b60005b8481101561284057838303885261288b838351612c84565b92506128968261302c565b602098909801979150600101612873565b60006128b282613032565b8084526020840193506128c48361302c565b60005b828110156128f4576128da868351612d90565b6128e38261302c565b6020969096019591506001016128c7565b5093949350505050565b6127df8161304f565b600061291282613032565b808452612926816020860160208601613090565b61292f816130bc565b9093016020019392505050565b602381527f44454641554c545f46554e4354494f4e5f574554485f434f4e54524143545f4f60208201527f4e4c590000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f494e56414c49445f4d53475f56414c5545000000000000000000000000000000602082015260400190565b603081527f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455360208201527f5f4c454e4754485f524551554952454400000000000000000000000000000000604082015260600190565b601781527f56414c55455f475245415445525f5448414e5f5a45524f000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b601881527f4645455f50524f504f5254494f4e5f544f4f5f4c415247450000000000000000602082015260400190565b600f81527f5452414e534645525f4641494c45440000000000000000000000000000000000602082015260400190565b601681527f554e41434345505441424c455f5448524553484f4c4400000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601781527f554e535550504f525445445f544f4b454e5f50524f5859000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b80516080830190612c4b8482612d90565b506020820151612c5e6020850182612d90565b506040820151612c716040850182612d90565b5060608201516111c26060850182612d90565b8051600090610180840190612c9985826127d6565b506020830151612cac60208601826127d6565b506040830151612cbf60408601826127d6565b506060830151612cd260608601826127d6565b506080830151612ce56080860182612d90565b5060a0830151612cf860a0860182612d90565b5060c0830151612d0b60c0860182612d90565b5060e0830151612d1e60e0860182612d90565b50610100830151612d33610100860182612d90565b50610120830151612d48610120860182612d90565b50610140830151848203610140860152612d628282612907565b915050610160830151848203610160860152612d7e8282612907565b95945050505050565b6127df81613074565b6127df8161307b565b60808101612da782876127d6565b612db460208301866127d6565b612dc16040830185612d90565b8181036060830152612dd38184612907565b9695505050505050565b60408101612deb82856127d6565b610bcf6020830184612d90565b60608082528101612e09818661284c565b90508181036020830152612e1d81856128a7565b90508181036040830152612d7e81846127e5565b60608082528101612e42818661284c565b9050612e516020830185612d90565b8181036040830152612d7e81846127e5565b60208101610ce582846128fe565b60208082528101610ce58161293c565b60208082528101610ce581612992565b60208082528101610ce5816129c2565b60208082528101610ce581612a18565b60208082528101610ce581612a48565b60208082528101610ce581612a9e565b60208082528101610ce581612ace565b60208082528101610ce581612afe565b60208082528101610ce581612b2e565b60208082528101610ce581612b5e565b60208082528101610ce581612bb4565b60208082528101610ce581612be4565b60808101610ce58284612c3a565b60208082528101610bcf8184612c84565b60608082528101612f618186612c84565b9050612f706020830185612d90565b8181036040830152612d7e8184612907565b60208101610ce58284612d87565b60208101610ce58284612d90565b60405181810167ffffffffffffffff81118282101715612fbd57600080fd5b604052919050565b600067ffffffffffffffff821115612fdc57600080fd5b5060209081020190565b600067ffffffffffffffff821115612ffd57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b61ffff1690565b90565b60ff1690565b82818337506000910152565b60005b838110156130ab578181015183820152602001613093565b838111156111c25750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820ff5c1e325698909ffd3590166bdff6a2f31ff4394822a4e1b9ea119a6a813e6c6c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x3746 CODESIZE SUB DUP1 PUSH3 0x3746 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x37 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x433 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP9 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP3 DUP4 AND OR DUP4 SSTORE PUSH1 0x1 DUP1 SLOAD DUP3 DUP10 AND SWAP1 DUP5 AND OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP2 DUP8 AND SWAP2 SWAP1 SWAP3 AND OR SWAP1 SSTORE DUP3 MLOAD DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH3 0x8F SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH3 0x2E6 JUMP JUMPDEST POP DUP1 MLOAD PUSH3 0xA5 SWAP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH3 0x2E6 JUMP JUMPDEST POP POP PUSH1 0x0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD DUP2 KECCAK256 PUSH32 0x6070410800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP6 POP PUSH4 0x60704108 SWAP5 POP PUSH3 0x125 SWAP4 POP SWAP1 SWAP2 POP PUSH1 0x4 ADD PUSH3 0x54A JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x140 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x155 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 PUSH3 0x17B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x40A JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH3 0x2DA JUMPI PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x95EA7B3 SWAP1 PUSH3 0x1DC SWAP1 DUP5 SWAP1 PUSH1 0x0 NOT SWAP1 PUSH1 0x4 ADD PUSH3 0x52B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x1F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x20C 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 PUSH3 0x232 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x4E3 JUMP JUMPDEST POP PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x95EA7B3 SWAP1 PUSH3 0x282 SWAP1 DUP5 SWAP1 PUSH1 0x0 NOT SWAP1 PUSH1 0x4 ADD PUSH3 0x52B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x29D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x2B2 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 PUSH3 0x2D8 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x4E3 JUMP JUMPDEST POP JUMPDEST POP POP POP POP POP POP PUSH3 0x618 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x329 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x359 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x359 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x359 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x33C JUMP JUMPDEST POP PUSH3 0x367 SWAP3 SWAP2 POP PUSH3 0x36B JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x388 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x367 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x372 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x399 DUP3 MLOAD PUSH3 0x5AF JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x399 DUP3 MLOAD PUSH3 0x5E0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0x3C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x3D7 PUSH3 0x3D1 DUP3 PUSH3 0x587 JUMP JUMPDEST PUSH3 0x560 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0x3F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x401 DUP4 DUP3 DUP5 PUSH3 0x5E5 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x41D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x42B DUP5 DUP5 PUSH3 0x38B JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH3 0x44C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x45A DUP9 DUP9 PUSH3 0x38B JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH3 0x46D DUP9 DUP3 DUP10 ADD PUSH3 0x38B JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH3 0x480 DUP9 DUP3 DUP10 ADD PUSH3 0x38B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x49D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x4AB DUP9 DUP3 DUP10 ADD PUSH3 0x3AE JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x4C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x4D6 DUP9 DUP3 DUP10 ADD PUSH3 0x3AE JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x4F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x42B DUP5 DUP5 PUSH3 0x3A0 JUMP JUMPDEST PUSH3 0x50F DUP2 PUSH3 0x5AF JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH3 0x50F DUP2 PUSH3 0x5BB JUMP JUMPDEST PUSH3 0x50F DUP2 PUSH3 0x388 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH3 0x53B DUP3 DUP6 PUSH3 0x504 JUMP JUMPDEST PUSH3 0x399 PUSH1 0x20 DUP4 ADD DUP5 PUSH3 0x520 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH3 0x55A DUP3 DUP5 PUSH3 0x515 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x57F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP3 GT ISZERO PUSH3 0x59E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x602 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x5E8 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x612 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x311E DUP1 PUSH3 0x628 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x150B7A02 DUP2 EQ PUSH2 0xFF JUMPI DUP1 PUSH4 0x169645F2 EQ PUSH2 0x135 JUMPI DUP1 PUSH4 0x1C5B1EC4 EQ PUSH2 0x155 JUMPI DUP1 PUSH4 0x20472CF7 EQ PUSH2 0x175 JUMPI DUP1 PUSH4 0x725CEF06 EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0xB3CD4254 EQ PUSH2 0x1AA JUMPI DUP1 PUSH4 0xBC063E1A EQ PUSH2 0x1BF JUMPI DUP1 PUSH4 0xC5E6E6AC EQ PUSH2 0x1D4 JUMPI DUP1 PUSH4 0xE58E9C16 EQ PUSH2 0x1F4 JUMPI DUP1 PUSH4 0xF0B9E5BA EQ PUSH2 0x214 JUMPI JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xFD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E71 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11F PUSH2 0x11A CALLDATASIZE PUSH1 0x4 PUSH2 0x248A JUMP JUMPDEST PUSH2 0x234 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2E63 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x148 PUSH2 0x143 CALLDATASIZE PUSH1 0x4 PUSH2 0x2568 JUMP JUMPDEST PUSH2 0x294 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2F31 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x161 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x170 CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0x560 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x181 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0x626 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2F82 JUMP JUMPDEST PUSH2 0x148 PUSH2 0x1A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x264E JUMP JUMPDEST PUSH2 0x62C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0x9FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0xA00 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x1EF CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0xA06 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x200 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x20F CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0xA79 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x220 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11F PUSH2 0x22F CALLDATASIZE PUSH1 0x4 PUSH2 0x2503 JUMP JUMPDEST PUSH2 0xB76 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C61646472657373 DUP2 MSTORE PUSH32 0x2C75696E743235362C6279746573290000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x2F ADD SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x29C PUSH2 0x20ED JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP1 DUP1 DUP5 GT PUSH2 0x2DA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH2 0x2E5 DUP5 DUP9 DUP9 PUSH2 0xBD6 JUMP JUMPDEST SWAP3 POP PUSH2 0x2F1 DUP5 DUP5 PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x379 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x38D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0x3BA DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3A4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x10 PUSH2 0xCEB JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP5 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x460 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x435 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x460 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x443 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x474 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x4B8 JUMPI PUSH2 0x4B1 DUP12 DUP12 DUP5 PUSH2 0xD4C JUMP JUMPDEST SWAP5 POP PUSH2 0x4C8 JUMP JUMPDEST PUSH2 0x4C5 DUP12 DUP12 DUP12 DUP12 DUP7 PUSH2 0xE66 JUMP JUMPDEST SWAP5 POP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP5 LT ISZERO PUSH2 0x506 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E81 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP3 EQ PUSH2 0x543 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x552 DUP2 CALLER DUP8 PUSH1 0x0 ADD MLOAD PUSH2 0xFEE JUMP JUMPDEST POP POP POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x568 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x575 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x61C JUMPI PUSH2 0x591 DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0x5D4 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5A4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5C0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x11C8 JUMP JUMPDEST SWAP2 POP PUSH2 0x5F7 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5E7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 PUSH2 0x11E5 JUMP JUMPDEST SWAP1 POP PUSH2 0x603 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 EQ ISZERO PUSH2 0x611 JUMPI PUSH2 0x61C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x57A JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x251C DUP2 JUMP JUMPDEST PUSH2 0x634 PUSH2 0x20ED JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x670 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH1 0x0 DUP7 GT PUSH2 0x6AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH2 0x6D2 DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6BC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x0 PUSH2 0x1390 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 SWAP1 SWAP2 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP4 AND SWAP2 AND EQ DUP1 PUSH2 0x7B4 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x7EC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F11 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x872 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x886 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 DUP2 AND SWAP2 AND EQ ISZERO SWAP3 POP PUSH2 0x8FF SWAP2 POP POP JUMPI PUSH2 0x8F8 DUP11 DUP11 DUP11 DUP11 DUP11 PUSH2 0x13FD JUMP JUMPDEST SWAP3 POP PUSH2 0x992 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x992 JUMPI PUSH2 0x98F DUP11 DUP11 DUP11 DUP11 PUSH2 0x1754 JUMP JUMPDEST SWAP3 POP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD DUP3 LT ISZERO PUSH2 0x9D0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E81 JUMP JUMPDEST PUSH2 0x9ED PUSH2 0x9E1 DUP4 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP8 DUP8 PUSH2 0x1A56 JUMP JUMPDEST POP POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2710 DUP2 JUMP JUMPDEST PUSH2 0x3E8 DUP2 JUMP JUMPDEST PUSH2 0xA0E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xA19 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP6 MLOAD DUP4 LT ISZERO PUSH2 0xA70 JUMPI PUSH2 0xA35 DUP6 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH2 0xA48 DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5E7 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xA54 DUP5 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 DUP5 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0xA65 JUMPI PUSH2 0xA70 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0xA1E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xA81 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xA8E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x61C JUMPI PUSH2 0xAAA DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0xB11 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xABD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB0B DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xADC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAF8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP6 PUSH2 0x11C8 JUMP JUMPDEST SWAP2 POP PUSH2 0xB3E DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB24 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xB39 DUP5 PUSH1 0x1 PUSH2 0x1B43 JUMP JUMPDEST PUSH2 0x11E5 JUMP JUMPDEST SWAP1 POP PUSH2 0xB52 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP2 MSTORE PUSH2 0xB5E DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0xB6B JUMPI PUSH2 0x61C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0xA93 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C75696E74323536 DUP2 MSTORE PUSH32 0x2C62797465732900000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x27 ADD SWAP1 KECCAK256 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH2 0xFFFF AND GT DUP1 ISZERO PUSH2 0xC00 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xBCF JUMPI PUSH2 0x3E8 PUSH2 0xFFFF DUP5 AND GT ISZERO PUSH2 0xC45 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2ED1 JUMP JUMPDEST PUSH2 0xC56 PUSH2 0xFFFF DUP5 AND PUSH2 0x2710 DUP7 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xC9C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xCE0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0xD2D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F01 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xD54 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0xDAF SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDC9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xDDD 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 0xE01 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP2 POP PUSH2 0xE15 DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP1 POP PUSH2 0xE25 DUP3 PUSH1 0x0 ADD MLOAD DUP3 PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xE5D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST DUP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xE6E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE78 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0xE80 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0xE88 PUSH2 0x20ED JUMP JUMPDEST DUP6 SWAP4 POP PUSH2 0xE95 DUP11 DUP8 PUSH2 0xA06 JUMP JUMPDEST SWAP3 POP PUSH1 0x0 DUP4 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0xF29 JUMPI PUSH2 0xEB3 DUP9 DUP9 DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x1BAA JUMP JUMPDEST SWAP2 POP PUSH2 0xECC DUP7 PUSH2 0xEC7 DUP9 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xF04 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0xF12 DUP5 DUP4 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x20 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP4 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0xF83 SWAP1 DUP14 SWAP1 DUP9 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xFB1 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 0xFD5 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0xFE1 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x7472616E7366657228616464726573732C75696E743235362900000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x19 ADD DUP2 KECCAK256 PUSH1 0x0 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP2 SWAP1 PUSH2 0x104C SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x24 ADD PUSH2 0x2DDD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 MSTORE MLOAD DUP2 MLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x10F0 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x10D8 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x111D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP3 POP POP POP DUP1 ISZERO ISZERO PUSH2 0x116C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EE1 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x1189 JUMPI POP PUSH1 0x0 RETURNDATASIZE PUSH1 0x20 EQ ISZERO PUSH2 0x1189 JUMPI PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD JUMPDEST DUP1 ISZERO ISZERO PUSH2 0x11C2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EE1 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11DD PUSH2 0x11D7 DUP6 DUP5 PUSH2 0x1EE3 JUMP JUMPDEST DUP5 PUSH2 0x1F3E JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x11ED PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x11F5 PUSH2 0x2116 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xC75E0A8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xC75E0A81 SWAP1 PUSH2 0x124C SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F3F JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1266 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x127A 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 0x129E SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x27B8 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x12B2 JUMPI PUSH2 0xA70 JUMP JUMPDEST PUSH2 0x12C4 DUP7 PUSH1 0xA0 ADD MLOAD DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH2 0x12D0 DUP6 DUP4 PUSH2 0x1F55 JUMP JUMPDEST SWAP1 POP DUP1 DUP5 PUSH1 0x20 ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x12EF DUP2 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x11C8 JUMP JUMPDEST DUP5 MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x1306 SWAP2 DUP4 SWAP2 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x1320 SWAP2 DUP4 SWAP2 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x60 DUP6 ADD MSTORE POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x133C SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1352 SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x136B SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1384 SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x13D2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F21 JUMP JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0x1405 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140F PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1417 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x141F PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1431 DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3A4 JUMPI INVALID JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP8 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x14D7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14AC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x14D7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14BA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x14EB JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x15C9 JUMPI PUSH2 0x1528 DUP11 DUP11 DUP9 PUSH2 0x1BAA JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 GT ISZERO PUSH2 0x1566 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x1570 DUP6 DUP5 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x158C PUSH2 0x1585 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1B43 JUMP JUMPDEST DUP7 MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x15C4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x1745 JUMP JUMPDEST PUSH2 0x15D3 DUP11 DUP8 PUSH2 0x560 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 DUP3 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0x1608 JUMPI PUSH2 0x15F1 DUP9 DUP9 DUP5 PUSH1 0x60 ADD MLOAD PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP1 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0xE5FA431B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xE5FA431B SWAP1 PUSH2 0x1662 SWAP1 DUP14 SWAP1 DUP11 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x167C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1690 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 0x16B4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 EQ PUSH2 0x16F1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x16FB DUP6 DUP5 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x170D DUP6 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1745 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0xFE1 DUP5 CALLER DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0xFEE JUMP JUMPDEST PUSH2 0x175C PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH1 0x0 PUSH2 0x176B PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1773 PUSH2 0x20ED JUMP JUMPDEST DUP11 MLOAD SWAP5 POP DUP5 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x17A1 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x18DD JUMPI PUSH2 0x17D6 DUP7 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17C3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP10 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x187C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1851 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x187C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x185F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x188F JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP11 MLOAD DUP12 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x18AC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18C8 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x17A9 JUMP JUMPDEST PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1908 JUMPI PUSH2 0x18F1 DUP10 DUP10 DUP9 PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE SWAP2 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x4D0AE54600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x4D0AE546 SWAP1 PUSH2 0x1962 SWAP1 DUP15 SWAP1 DUP9 SWAP1 DUP16 SWAP1 PUSH1 0x4 ADD PUSH2 0x2DF8 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x197C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1990 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 0x19B4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0x19C0 DUP8 DUP3 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x19D2 DUP8 PUSH1 0x20 ADD MLOAD DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1A0A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x1A48 JUMPI PUSH2 0x1A3D DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A28 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD CALLER PUSH2 0x1F6B JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1A0F JUMP JUMPDEST POP POP POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1B3B JUMPI PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x1AB8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F90 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AD2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1AE6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x1AF5 DUP6 DUP6 DUP6 PUSH2 0xBD6 JUMP JUMPDEST SWAP2 POP PUSH2 0x1B01 DUP7 DUP4 PUSH2 0xCA4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT ISZERO PUSH2 0x1B3B JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1B39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1B82 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1B9F PUSH2 0x251C PUSH2 0x2710 DUP7 PUSH2 0x11C8 JUMP JUMPDEST SWAP1 SWAP3 LT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1BB2 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1BBF PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP8 MLOAD DUP5 LT ISZERO PUSH2 0x1ED8 JUMPI PUSH1 0x3 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1C71 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1C46 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1C71 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1C54 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C84 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP2 MSTORE DUP2 DUP2 MSTORE SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1D39 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1D0E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1D39 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1D1C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D4C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP5 MLOAD PUSH2 0x1D68 SWAP1 DUP8 SWAP1 PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0x1DB6 DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D7B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB0B DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D9A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP12 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAF8 JUMPI INVALID JUMPDEST PUSH1 0x0 SLOAD DUP10 MLOAD SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB4BE83D5 SWAP1 DUP11 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0x1DE7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1DFC DUP6 PUSH1 0x1 PUSH2 0x1B43 JUMP JUMPDEST DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1E0A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1E4E SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2F50 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E7C 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 0x1EA0 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0x1EB4 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x1EC0 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0x1ECD JUMPI PUSH2 0x1ED8 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x1BC4 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x1EF6 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x1B86 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x1F06 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1B82 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x1F4C JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1F64 JUMPI DUP2 PUSH2 0xBCF JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x1F81 DUP6 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0xCEB AND JUMP JUMPDEST SWAP3 POP PUSH2 0x1F94 DUP6 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x203B AND JUMP JUMPDEST SWAP2 POP PUSH2 0x1FA7 DUP6 PUSH1 0x64 PUSH4 0xFFFFFFFF PUSH2 0x2047 AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0x2002 SWAP1 ADDRESS SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x2D99 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x201C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2030 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP4 DUP4 PUSH2 0x20A2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x2055 DUP5 DUP5 PUSH2 0x203B JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x209C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E91 JUMP JUMPDEST POP POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x20E4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EB1 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD 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 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 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x3036 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x2153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2166 PUSH2 0x2161 DUP3 PUSH2 0x2FC5 JUMP JUMPDEST PUSH2 0x2F9E 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 0x61C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x218E DUP9 DUP3 PUSH2 0x220D JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2178 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x21B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x21C3 PUSH2 0x2161 DUP3 PUSH2 0x2FC5 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 0x61C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x21EB DUP9 DUP3 PUSH2 0x231D JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x21D5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 MLOAD PUSH2 0x307B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x221E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x222C PUSH2 0x2161 DUP3 PUSH2 0x2FE6 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x2248 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA70 DUP4 DUP3 DUP5 PUSH2 0x3084 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2265 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x226F PUSH1 0x80 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x227D DUP5 DUP5 PUSH2 0x2201 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x228E DUP5 DUP5 DUP4 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x22A2 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x22B6 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x22D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x22DE PUSH1 0x60 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x22EC DUP5 DUP5 PUSH2 0x247E JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x22FD DUP5 DUP5 DUP4 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x2311 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2330 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x233B PUSH2 0x180 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2349 DUP5 DUP5 PUSH2 0x2136 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x235A DUP5 DUP5 DUP4 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x236E DUP5 DUP3 DUP6 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x2382 DUP5 DUP3 DUP6 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x2396 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x23AA DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x23BE DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x23D2 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x23E7 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x23FD DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x241F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x242B DUP5 DUP3 DUP6 ADD PUSH2 0x220D JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x244D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2459 DUP5 DUP3 DUP6 ADD PUSH2 0x220D JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x3074 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x307B JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 MLOAD PUSH2 0x307E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x24A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x24AC DUP8 DUP8 PUSH2 0x2136 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x24BD DUP8 DUP3 DUP9 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x24CE DUP8 DUP3 DUP9 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x24EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x24F7 DUP8 DUP3 DUP9 ADD PUSH2 0x220D JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2518 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2524 DUP7 DUP7 PUSH2 0x2136 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x2535 DUP7 DUP3 DUP8 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2552 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x255E DUP7 DUP3 DUP8 ADD PUSH2 0x220D JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x2581 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2598 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25A4 DUP10 DUP3 DUP11 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x25C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25CD DUP10 DUP3 DUP11 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x25EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25F6 DUP10 DUP3 DUP11 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2613 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x261F DUP10 DUP3 DUP11 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 PUSH2 0x2630 DUP10 DUP3 DUP11 ADD PUSH2 0x2466 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xA0 PUSH2 0x2641 DUP10 DUP3 DUP11 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x2669 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2680 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x268C DUP11 DUP3 DUP12 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26B5 DUP11 DUP3 DUP12 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26DE DUP11 DUP3 DUP12 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2707 DUP11 DUP3 DUP12 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 PUSH2 0x2718 DUP11 DUP3 DUP12 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH2 0x2729 DUP11 DUP3 DUP12 ADD PUSH2 0x2466 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH2 0x273A DUP11 DUP3 DUP12 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x275C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2773 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x277F DUP6 DUP3 DUP7 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x2790 DUP6 DUP3 DUP7 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x27AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11DD DUP5 DUP5 PUSH2 0x2253 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x27CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11DD DUP5 DUP5 PUSH2 0x22C2 JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x3036 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27F0 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2809 DUP6 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2840 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2824 DUP4 DUP4 MLOAD PUSH2 0x2907 JUMP JUMPDEST SWAP3 POP PUSH2 0x282F DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x280C JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2857 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2870 DUP6 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2840 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x288B DUP4 DUP4 MLOAD PUSH2 0x2C84 JUMP JUMPDEST SWAP3 POP PUSH2 0x2896 DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x2873 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28B2 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x28C4 DUP4 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x28F4 JUMPI PUSH2 0x28DA DUP7 DUP4 MLOAD PUSH2 0x2D90 JUMP JUMPDEST PUSH2 0x28E3 DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x28C7 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x304F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2912 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x2926 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x3090 JUMP JUMPDEST PUSH2 0x292F DUP2 PUSH2 0x30BC JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x44454641554C545F46554E4354494F4E5F574554485F434F4E54524143545F4F PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4E4C590000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F4D53475F56414C5545000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x30 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x56414C55455F475245415445525F5448414E5F5A45524F000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 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 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4645455F50524F504F5254494F4E5F544F4F5F4C415247450000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x16 DUP2 MSTORE PUSH32 0x554E41434345505441424C455F5448524553484F4C4400000000000000000000 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 0x17 DUP2 MSTORE PUSH32 0x554E535550504F525445445F544F4B454E5F50524F5859000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 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 0x80 DUP4 ADD SWAP1 PUSH2 0x2C4B DUP5 DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x2C5E PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2C71 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x11C2 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x2C99 DUP6 DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x2CAC PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x2CBF PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x2CD2 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x2CE5 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x2CF8 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x2D0B PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x2D1E PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x2D33 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x2D48 PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x2D62 DUP3 DUP3 PUSH2 0x2907 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x2D7E DUP3 DUP3 PUSH2 0x2907 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x3074 JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x307B JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x2DA7 DUP3 DUP8 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0x2DB4 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0x2DC1 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x2DD3 DUP2 DUP5 PUSH2 0x2907 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x2DEB DUP3 DUP6 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0xBCF PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2E09 DUP2 DUP7 PUSH2 0x284C JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2E1D DUP2 DUP6 PUSH2 0x28A7 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x27E5 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2E42 DUP2 DUP7 PUSH2 0x284C JUMP JUMPDEST SWAP1 POP PUSH2 0x2E51 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x27E5 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x28FE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x293C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2992 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x29C2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A18 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A48 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A9E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2AFE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2B2E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2B5E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2BB4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2BE4 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2C3A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBCF DUP2 DUP5 PUSH2 0x2C84 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2F61 DUP2 DUP7 PUSH2 0x2C84 JUMP JUMPDEST SWAP1 POP PUSH2 0x2F70 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x2907 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2D87 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x2FBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2FDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2FFD 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 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x30AB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3093 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x11C2 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 SELFDESTRUCT 0x5c 0x1e ORIGIN JUMP SWAP9 SWAP1 SWAP16 REVERT CALLDATALOAD SWAP1 AND PUSH12 0xDFF6A2F31FF4394822A4E1B9 0xea GT SWAP11 PUSH11 0x813E6C6C6578706572696D PUSH6 0x6E74616CF500 CALLDATACOPY ", + "sourceMap": "834:541:0:-;;;989:384;8:9:-1;5:2;;;30:1;27;20:12;5:2;989:384:0;;;;;;;;;;;;;;;;;;;;;;;;1444:20:4;894:31:1;;-1:-1:-1;;;;;894:31:1;;;-1:-1:-1;;;;;;894:31:1;;;;;;;935:38;;;;;;;;;;;983:9;:34;;;;;;;;;;;;1027:30;;1215:9:0;;1238:11;;1263:9;;1286:13;;1313:14;;1027:30:1;;:14;;:30;;;;;:::i;:::-;-1:-1:-1;1067:32:1;;;;:15;;:32;;;;;:::i;:::-;-1:-1:-1;;1467:8:4;;1204:32;;;;;;;;;;;;;;;;1467:37;;;-1:-1:-1;;;;;1467:8:4;;;;-1:-1:-1;1467:22:4;;-1:-1:-1;1467:37:4;;-1:-1:-1;1204:32:4;;-1:-1:-1;1467:37:4;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1467:37:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1467:37:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1467:37:4;;;;;;;;;1444:60;-1:-1:-1;;;;;;1518:26:4;;;1514:155;;1560:11;;:43;;;;;-1:-1:-1;;;;;1560:11:4;;;;:19;;:43;;1580:12;;-1:-1:-1;;1383:10:4;1560:43;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1560:43:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1560:43:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1560:43:4;;;;;;;;;-1:-1:-1;1617:9:4;;:41;;;;;-1:-1:-1;;;;;1617:9:4;;;;:17;;:41;;1635:12;;-1:-1:-1;;1383:10:4;1617:41;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1617:41:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1617:41:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1617:41:4;;;;;;;;;;1514:155;1400:275;989:384:0;;;;;834:541;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;834:541:0;;;-1:-1:-1;834:541:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;5:122:-1:-;;83:39;114:6;108:13;83:39;;;74:48;68:59;-1:-1;;;68:59;134:116;;209:36;237:6;231:13;209:36;;258:442;;363:4;351:17;;347:27;-1:-1;337:2;;388:1;385;378:12;337:2;418:6;412:13;440:64;455:48;496:6;455:48;;;440:64;;;431:73;;524:6;517:5;510:21;560:4;552:6;548:17;593:4;586:5;582:16;628:3;619:6;614:3;610:16;607:25;604:2;;;645:1;642;635:12;604:2;655:39;687:6;682:3;677;655:39;;;330:370;;;;;;;;708:263;;823:2;811:9;802:7;798:23;794:32;791:2;;;839:1;836;829:12;791:2;874:1;891:64;947:7;927:9;891:64;;;881:74;785:186;-1:-1;;;;785:186;978:1003;;;;;;1179:3;1167:9;1158:7;1154:23;1150:33;1147:2;;;1196:1;1193;1186:12;1147:2;1231:1;1248:64;1304:7;1284:9;1248:64;;;1238:74;;1210:108;1349:2;1367:64;1423:7;1414:6;1403:9;1399:22;1367:64;;;1357:74;;1328:109;1468:2;1486:64;1542:7;1533:6;1522:9;1518:22;1486:64;;;1476:74;;1447:109;1608:2;1597:9;1593:18;1587:25;-1:-1;;;;;1624:6;1621:30;1618:2;;;1664:1;1661;1654:12;1618:2;1684:73;1749:7;1740:6;1729:9;1725:22;1684:73;;;1674:83;;1566:197;1815:3;1804:9;1800:19;1794:26;-1:-1;;;;;1832:6;1829:30;1826:2;;;1872:1;1869;1862:12;1826:2;1892:73;1957:7;1948:6;1937:9;1933:22;1892:73;;;1882:83;;1773:198;1141:840;;;;;;;;;1988:257;;2100:2;2088:9;2079:7;2075:23;2071:32;2068:2;;;2116:1;2113;2106:12;2068:2;2151:1;2168:61;2221:7;2201:9;2168:61;;2252:110;2325:31;2350:5;2325:31;;;2320:3;2313:44;2307:55;;;2369:107;2440:30;2464:5;2440:30;;2483:110;2556:31;2581:5;2556:31;;2600:294;2736:2;2721:18;;2750:61;2725:9;2784:6;2750:61;;;2822:62;2880:2;2869:9;2865:18;2856:6;2822:62;;2901:189;3007:2;2992:18;;3021:59;2996:9;3053:6;3021:59;;;2978:112;;;;;3097:256;3159:2;3153:9;3185:17;;;-1:-1;;;;;3245:34;;3281:22;;;3242:62;3239:2;;;3317:1;3314;3307:12;3239:2;3333;3326:22;3137:216;;-1:-1;3137:216;3360:258;;-1:-1;;;;;3495:6;3492:30;3489:2;;;3535:1;3532;3525:12;3489:2;-1:-1;3608:4;3579;3556:17;;;;-1:-1;;3552:33;3598:15;;3426:192;3625:128;-1:-1;;;;;3694:54;;3677:76;3760:151;3839:66;3828:78;;3811:100;4139:92;4212:13;4205:21;;4188:43;4239:268;4304:1;4311:101;4325:6;4322:1;4319:13;4311:101;;;4392:11;;;4386:18;4373:11;;;4366:39;4347:2;4340:10;4311:101;;;4427:6;4424:1;4421:13;4418:2;;;4492:1;4483:6;4478:3;4474:16;4467:27;4418:2;4288:219;;;;;;834:541:0;;;;;;" }, "deployedBytecode": { "linkReferences": {}, - "object": "0x6080604052600436106100cf5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663150b7a02811461012b578063169645f2146101615780631c5b1ec41461018157806320472cf7146101a15780634a00f7d5146101c3578063725cef06146101d85780638da5cb5b146101eb578063b3cd42541461020d578063bc063e1a14610222578063e58e9c1614610237578063f0b9e5ba14610257578063f2afd85a14610277578063f2fde38b14610297578063fb4f9087146102b7575b60025473ffffffffffffffffffffffffffffffffffffffff163314610129576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610120906132e1565b60405180910390fd5b005b34801561013757600080fd5b5061014b6101463660046128b0565b6102cc565b60405161015891906132d3565b60405180910390f35b61017461016f36600461298e565b61032c565b60405161015891906133a1565b34801561018d57600080fd5b5061017461019c366004612b6f565b6105f8565b3480156101ad57600080fd5b506101b66106be565b60405161015891906133f2565b3480156101cf57600080fd5b5061014b6106c4565b6101746101e6366004612a74565b6106f9565b3480156101f757600080fd5b50610200610ac7565b60405161015891906131fb565b34801561021957600080fd5b506101b6610ae3565b34801561022e57600080fd5b506101b6610ae9565b34801561024357600080fd5b50610174610252366004612b6f565b610aef565b34801561026357600080fd5b5061014b610272366004612929565b610bec565b34801561028357600080fd5b50610129610292366004612bde565b610c4c565b3480156102a357600080fd5b506101296102b2366004612874565b610ec3565b3480156102c357600080fd5b5061014b610f74565b604080517f6f6e455243373231526563656976656428616464726573732c6164647265737381527f2c75696e743235362c62797465732900000000000000000000000000000000006020820152905190819003602f019020949350505050565b6103346124b3565b3460008080808411610372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613311565b61037d848888610fcf565b9250610389848461109d565b9150600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561041157600080fd5b505af1158015610425573d6000803e3d6000fd5b50505050506104528b600081518110151561043c57fe5b90602001906020020151610140015160106110b4565b60058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529394508301828280156104f85780601f106104cd576101008083540402835291602001916104f8565b820191906000526020600020905b8154815290600101906020018083116104db57829003601f168201915b50505050508b600081518110151561050c57fe5b60209081029091010151610160015260035473ffffffffffffffffffffffffffffffffffffffff82811691161415610550576105498b8b84611115565b9450610560565b61055d8b8b8b8b8661122f565b94505b602085015184101561059e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610120906132f1565b602085015182146105db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613351565b6105ea813387600001516113b7565b505050509695505050505050565b6106006124b3565b600080600061060d6124b3565b600093505b86518410156106b45761062986866000015161109d565b925061066c878581518110151561063c57fe5b9060200190602002015160a00151888681518110151561065857fe5b906020019060200201516080015185611591565b915061068f878581518110151561067f57fe5b90602001906020020151836115ae565b905061069b85826116fc565b84518614156106a9576106b4565b600190930192610612565b5050505092915050565b61251c81565b604080517f4552433230546f6b656e286164647265737329000000000000000000000000008152905190819003601301902081565b6107016124b3565b34600080821161073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613311565b60008611610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613311565b61079f8a600081518110151561078957fe5b906020019060200201516101400151600061175e565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190209091507fffffffff00000000000000000000000000000000000000000000000000000000808316911614806108815750604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff000000000000000000000000000000000000000000000000000000008281169116145b15156108b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613381565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561093f57600080fd5b505af1158015610953573d6000803e3d6000fd5b5050604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190207fffffffff000000000000000000000000000000000000000000000000000000008581169116141592506109cc915050576109c58a8a8a8a8a6117cb565b9250610a5f565b604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff0000000000000000000000000000000000000000000000000000000082811691161415610a5f57610a5c8a8a8a8a611b22565b92505b6020830151821015610a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610120906132f1565b610aba610aae83856020015161109d565b84602001518787611e24565b5050979650505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b61271081565b6103e881565b610af76124b3565b6000806000610b046124b3565b600093505b86518410156106b457610b2086866000015161109d565b9250610b878785815181101515610b3357fe5b9060200190602002015160a00151610b818987815181101515610b5257fe5b90602001906020020151608001518a88815181101515610b6e57fe5b9060200190602002015160e0015161109d565b85611591565b9150610bb48785815181101515610b9a57fe5b90602001906020020151610baf846001611f11565b6115ae565b9050610bc88160000151826060015161109d565b8152610bd485826116fc565b84518611610be1576106b4565b600190930192610b09565b604080517f6f6e455243373231526563656976656428616464726573732c75696e7432353681527f2c62797465732900000000000000000000000000000000000000000000000000602082015290519081900360270190205b9392505050565b6000805473ffffffffffffffffffffffffffffffffffffffff163314610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613361565b6001546040517f6070410800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690636070410890610cf49085906004016132d3565b602060405180830381600087803b158015610d0e57600080fd5b505af1158015610d22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d469190810190612892565b905073ffffffffffffffffffffffffffffffffffffffff811615610ebf576002546006546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9092169163095ea7b391610dbe9185919060040161324d565b602060405180830381600087803b158015610dd857600080fd5b505af1158015610dec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e109190810190612bc0565b506003546006546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9092169163095ea7b391610e6b9185919060040161324d565b602060405180830381600087803b158015610e8557600080fd5b505af1158015610e99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ebd9190810190612bc0565b505b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613361565b73ffffffffffffffffffffffffffffffffffffffff811615610f7157600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f73290000000000000000000000000000000000000000000000000000000000006020820152905190819003602201902081565b6000808361ffff16118015610ff9575073ffffffffffffffffffffffffffffffffffffffff821615155b15610c45576103e861ffff8416111561103e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613331565b61104f61ffff841661271086611591565b60405190915073ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015611095573d6000803e3d6000fd5b509392505050565b6000828211156110a957fe5b508082035b92915050565b6000816014018351101515156110f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613371565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b61111d6124b3565b6001546040517f7e1d980800000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff1690637e1d980890611178908890879089906004016132a1565b608060405180830381600087803b15801561119257600080fd5b505af11580156111a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111ca9190810190612bfc565b91506111de8260000151836060015161109d565b90506111ee826000015182611f20565b1515611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613351565b81529392505050565b6112376124b3565b60006112416124b3565b6112496124b3565b6112516124b3565b85935061125e8a87611f3d565b92506000836060015111156112f25761127c88888560600151611fa7565b91506112958661129088856020015161109d565b611f20565b15156112cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613351565b6112db84836020015161109d565b606080840151908701526020808401519087015293505b6001546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d98089061134c908d9088908e906004016132a1565b608060405180830381600087803b15801561136657600080fd5b505af115801561137a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061139e9190810190612bfc565b90506113aa85826116fc565b5050505095945050505050565b604080517f7472616e7366657228616464726573732c75696e7432353629000000000000008152905190819003601901812060009173ffffffffffffffffffffffffffffffffffffffff86169190611415908690869060240161324d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931783525181519192909182919080838360005b838110156114b95781810151838201526020016114a1565b50505050905090810190601f1680156114e65780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af192505050801515611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613341565b3d15611552575060003d602014156115525760206000803e506000515b80151561158b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613341565b50505050565b60006115a66115a085846122e0565b84612304565b949350505050565b6115b66124b3565b6115be6124dc565b6001546040517fc75e0a81000000000000000000000000000000000000000000000000000000008152600091829173ffffffffffffffffffffffffffffffffffffffff9091169063c75e0a81906116199089906004016133af565b606060405180830381600087803b15801561163357600080fd5b505af1158015611647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061166b9190810190612c1a565b805190935060ff1660031461167f576116f3565b6116918660a00151846040015161109d565b915061169d858361231b565b9050808460200181815250506116bc818760a001518860800151611591565b845260a086015160c08701516116d3918391611591565b604085015260a086015160e08701516116ed918391611591565b60608501525b50505092915050565b8151815161170a9190611f11565b8252602080830151908201516117209190611f11565b6020830152604080830151908201516117399190611f11565b6040830152606080830151908201516117529190611f11565b60609092019190915250565b6000816004018351101515156117a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613391565b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6117d36124b3565b60006117dd6124b3565b6117e56124b3565b6117ed6124b3565b6117ff8a600081518110151561043c57fe5b60058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529397508301828280156118a55780601f1061187a576101008083540402835291602001916118a5565b820191906000526020600020905b81548152906001019060200180831161188857829003601f168201915b50505050508a60008151811015156118b957fe5b60209081029091010151610160015260035473ffffffffffffffffffffffffffffffffffffffff85811691161415611997576118f68a8a88611fa7565b8051909350861115611934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613351565b61193e85846116fc565b61195a61195386600001518760600151611f11565b8651611f20565b1515611992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613351565b611b13565b6119a18a876105f8565b91506000826060015111156119d6576119bf88888460600151611fa7565b602080820151908701526060808201519087015290505b6001546040517fe5fa431b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e5fa431b90611a30908d908a908e906004016132a1565b608060405180830381600087803b158015611a4a57600080fd5b505af1158015611a5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a829190810190612bfc565b80519093508614611abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613351565b611ac985846116fc565b611adb85602001518460200151611f20565b1515611b13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613351565b6113aa843385600001516113b7565b611b2a6124b3565b60008060606000611b396124b3565b611b416124b3565b8a51945084604051908082528060200260200182016040528015611b6f578160200160208202803883390190505b509350600092505b84831015611cab57611ba4868c85815181101515611b9157fe5b9060200190602002015160e00151611f11565b60058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152939950830182828015611c4a5780601f10611c1f57610100808354040283529160200191611c4a565b820191906000526020600020905b815481529060010190602001808311611c2d57829003601f168201915b50505050508b84815181101515611c5d57fe5b6020908102909101015161016001528a518b9084908110611c7a57fe5b9060200190602002015160a001518484815181101515611c9657fe5b60209081029091010152600190920191611b77565b6000861115611cd657611cbf898988611fa7565b606080820151908901526020808201519089015291505b6001546040517f4d0ae54600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690634d0ae54690611d30908e9088908f90600401613268565b608060405180830381600087803b158015611d4a57600080fd5b505af1158015611d5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d829190810190612bfc565b9050611d8e87826116fc565b611da087602001518260200151611f20565b1515611dd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613351565b600092505b84831015611e1657611e0b8b84815181101515611df657fe5b90602001906020020151610140015133612331565b600190920191611ddd565b505050505050949350505050565b6000806000861115611f09576002546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90611e86908990600401613400565b600060405180830381600087803b158015611ea057600080fd5b505af1158015611eb4573d6000803e3d6000fd5b50505050611ec3858585610fcf565b9150611ecf868361109d565b90506000811115611f0957604051339082156108fc029083906000818181858888f19350505050158015611f07573d6000803e3d6000fd5b505b505050505050565b600082820183811015610c4557fe5b600080611f3261251c61271086611591565b909210159392505050565b611f456124b3565b600080611f506124b3565b600092505b85518310156116f357611f6c85856020015161109d565b9150611f7f868481518110151561067f57fe5b9050611f8b84826116fc565b8484602001511415611f9c576116f3565b600190920191611f55565b611faf6124b3565b6000806000611fbc6124b3565b600093505b87518410156122d5576004805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561206e5780601f106120435761010080835404028352916020019161206e565b820191906000526020600020905b81548152906001019060200180831161205157829003601f168201915b5050505050888581518110151561208157fe5b602090810290910181015161014001919091526005805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001871615020190941693909304928301859004850281018501909152818152928301828280156121365780601f1061210b57610100808354040283529160200191612136565b820191906000526020600020905b81548152906001019060200180831161211957829003601f168201915b5050505050888581518110151561214957fe5b602090810290910101516101600152845161216590879061109d565b92506121b3888581518110151561217857fe5b9060200190602002015160a00151610b818a8781518110151561219757fe5b90602001906020020151608001518b88815181101515610b6e57fe5b600154895191935073ffffffffffffffffffffffffffffffffffffffff169063b4be83d5908a90879081106121e457fe5b906020019060200201516121f9856001611f11565b8a8881518110151561220757fe5b906020019060200201516040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161224b939291906133c0565b608060405180830381600087803b15801561226557600080fd5b505af1158015612279573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061229d9190810190612bfc565b90506122b18160000151826060015161109d565b81526122bd85826116fc565b845186116122ca576122d5565b600190930192611fc1565b505050509392505050565b60008282028315806122fc57508284828115156122f957fe5b04145b1515610c4557fe5b600080828481151561231257fe5b04949350505050565b600081831061232a5781610c45565b5090919050565b600080606061234785601063ffffffff6110b416565b925061235a85602463ffffffff61240116565b915061236d85606463ffffffff61240d16565b6040517fb88d4fde00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff84169063b88d4fde906123c8903090889087908790600401613209565b600060405180830381600087803b1580156123e257600080fd5b505af11580156123f6573d6000803e3d6000fd5b505050505050505050565b6000610c458383612468565b6060600061241b8484612401565b9050602083019250808301845110151515612462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613301565b50500190565b6000816020018351101515156124aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012090613321565b50016020015190565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610c4582356134a6565b6000610c4582516134a6565b6000601f8201831361252557600080fd5b813561253861253382613435565b61340e565b81815260209384019390925082018360005b838110156106b4578135860161256088826125f7565b845250602092830192919091019060010161254a565b6000601f8201831361258757600080fd5b813561259561253382613435565b81815260209384019390925082018360005b838110156106b457813586016125bd8882612707565b84525060209283019291909101906001016125a7565b6000610c4582516134ee565b6000610c4582516134eb565b6000610c4582356134bf565b6000601f8201831361260857600080fd5b813561261661253382613456565b9150808252602083016020830185838301111561263257600080fd5b6116f38382846134f9565b60006080828403121561264f57600080fd5b612659608061340e565b9050600061266784846125df565b8252506020612678848483016125df565b602083015250604061268c848285016125df565b60408301525060606126a0848285016125df565b60608301525092915050565b6000606082840312156126be57600080fd5b6126c8606061340e565b905060006126d68484612868565b82525060206126e7848483016125df565b60208301525060406126fb848285016125df565b60408301525092915050565b6000610180828403121561271a57600080fd5b61272561018061340e565b9050600061273384846124fc565b8252506020612744848483016124fc565b6020830152506040612758848285016124fc565b604083015250606061276c848285016124fc565b60608301525060806127808482850161285c565b60808301525060a06127948482850161285c565b60a08301525060c06127a88482850161285c565b60c08301525060e06127bc8482850161285c565b60e0830152506101006127d18482850161285c565b610100830152506101206127e78482850161285c565b6101208301525061014082013567ffffffffffffffff81111561280957600080fd5b612815848285016125f7565b6101408301525061016082013567ffffffffffffffff81111561283757600080fd5b612843848285016125f7565b6101608301525092915050565b6000610c4582356134e4565b6000610c4582356134eb565b6000610c4582516134f3565b60006020828403121561288657600080fd5b60006115a684846124fc565b6000602082840312156128a457600080fd5b60006115a68484612508565b600080600080608085870312156128c657600080fd5b60006128d287876124fc565b94505060206128e3878288016124fc565b93505060406128f48782880161285c565b925050606085013567ffffffffffffffff81111561291157600080fd5b61291d878288016125f7565b91505092959194509250565b60008060006060848603121561293e57600080fd5b600061294a86866124fc565b935050602061295b8682870161285c565b925050604084013567ffffffffffffffff81111561297857600080fd5b612984868287016125f7565b9150509250925092565b60008060008060008060c087890312156129a757600080fd5b863567ffffffffffffffff8111156129be57600080fd5b6129ca89828a01612576565b965050602087013567ffffffffffffffff8111156129e757600080fd5b6129f389828a01612514565b955050604087013567ffffffffffffffff811115612a1057600080fd5b612a1c89828a01612576565b945050606087013567ffffffffffffffff811115612a3957600080fd5b612a4589828a01612514565b9350506080612a5689828a01612850565b92505060a0612a6789828a016124fc565b9150509295509295509295565b600080600080600080600060e0888a031215612a8f57600080fd5b873567ffffffffffffffff811115612aa657600080fd5b612ab28a828b01612576565b975050602088013567ffffffffffffffff811115612acf57600080fd5b612adb8a828b01612514565b965050604088013567ffffffffffffffff811115612af857600080fd5b612b048a828b01612576565b955050606088013567ffffffffffffffff811115612b2157600080fd5b612b2d8a828b01612514565b9450506080612b3e8a828b0161285c565b93505060a0612b4f8a828b01612850565b92505060c0612b608a828b016124fc565b91505092959891949750929550565b60008060408385031215612b8257600080fd5b823567ffffffffffffffff811115612b9957600080fd5b612ba585828601612576565b9250506020612bb68582860161285c565b9150509250929050565b600060208284031215612bd257600080fd5b60006115a684846125d3565b600060208284031215612bf057600080fd5b60006115a684846125eb565b600060808284031215612c0e57600080fd5b60006115a6848461263d565b600060608284031215612c2c57600080fd5b60006115a684846126ac565b612c41816134a6565b82525050565b6000612c52826134a2565b80845260208401935083602082028501612c6b8561349c565b60005b84811015612ca2578383038852612c86838351612d69565b9250612c918261349c565b602098909801979150600101612c6e565b50909695505050505050565b6000612cb9826134a2565b80845260208401935083602082028501612cd28561349c565b60005b84811015612ca2578383038852612ced8383516130e6565b9250612cf88261349c565b602098909801979150600101612cd5565b6000612d14826134a2565b808452602084019350612d268361349c565b60005b82811015612d5657612d3c8683516131f2565b612d458261349c565b602096909601959150600101612d29565b5093949350505050565b612c41816134bf565b6000612d74826134a2565b808452612d88816020860160208601613505565b612d9181613531565b9093016020019392505050565b602381527f44454641554c545f46554e4354494f4e5f574554485f434f4e54524143545f4f60208201527f4e4c590000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f494e56414c49445f4d53475f56414c5545000000000000000000000000000000602082015260400190565b603081527f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455360208201527f5f4c454e4754485f524551554952454400000000000000000000000000000000604082015260600190565b601781527f56414c55455f475245415445525f5448414e5f5a45524f000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601881527f4645455f50524f504f5254494f4e5f544f4f5f4c415247450000000000000000602082015260400190565b600f81527f5452414e534645525f4641494c45440000000000000000000000000000000000602082015260400190565b601681527f554e41434345505441424c455f5448524553484f4c4400000000000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601781527f554e535550504f525445445f544f4b454e5f50524f5859000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b805160808301906130ad84826131f2565b5060208201516130c060208501826131f2565b5060408201516130d360408501826131f2565b50606082015161158b60608501826131f2565b80516000906101808401906130fb8582612c38565b50602083015161310e6020860182612c38565b5060408301516131216040860182612c38565b5060608301516131346060860182612c38565b50608083015161314760808601826131f2565b5060a083015161315a60a08601826131f2565b5060c083015161316d60c08601826131f2565b5060e083015161318060e08601826131f2565b506101008301516131956101008601826131f2565b506101208301516131aa6101208601826131f2565b506101408301518482036101408601526131c48282612d69565b9150506101608301518482036101608601526131e08282612d69565b95945050505050565b612c41816134e4565b612c41816134eb565b602081016110ae8284612c38565b608081016132178287612c38565b6132246020830186612c38565b61323160408301856131f2565b81810360608301526132438184612d69565b9695505050505050565b6040810161325b8285612c38565b610c4560208301846131f2565b606080825281016132798186612cae565b9050818103602083015261328d8185612d09565b905081810360408301526131e08184612c47565b606080825281016132b28186612cae565b90506132c160208301856131f2565b81810360408301526131e08184612c47565b602081016110ae8284612d60565b602080825281016110ae81612d9e565b602080825281016110ae81612df4565b602080825281016110ae81612e24565b602080825281016110ae81612e7a565b602080825281016110ae81612eaa565b602080825281016110ae81612f00565b602080825281016110ae81612f30565b602080825281016110ae81612f60565b602080825281016110ae81612f90565b602080825281016110ae81612fc0565b602080825281016110ae81613016565b602080825281016110ae81613046565b608081016110ae828461309c565b60208082528101610c4581846130e6565b606080825281016133d181866130e6565b90506133e060208301856131f2565b81810360408301526131e08184612d69565b602081016110ae82846131e9565b602081016110ae82846131f2565b60405181810167ffffffffffffffff8111828210171561342d57600080fd5b604052919050565b600067ffffffffffffffff82111561344c57600080fd5b5060209081020190565b600067ffffffffffffffff82111561346d57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b61ffff1690565b90565b151590565b60ff1690565b82818337506000910152565b60005b83811015613520578181015183820152602001613508565b8381111561158b5750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820f84428674a7a1b076ea035cdfa190e912ba3c094f209cbddcd831d7362003d456c6578706572696d656e74616cf50037", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xCF JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x150B7A02 DUP2 EQ PUSH2 0x12B JUMPI DUP1 PUSH4 0x169645F2 EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0x1C5B1EC4 EQ PUSH2 0x181 JUMPI DUP1 PUSH4 0x20472CF7 EQ PUSH2 0x1A1 JUMPI DUP1 PUSH4 0x4A00F7D5 EQ PUSH2 0x1C3 JUMPI DUP1 PUSH4 0x725CEF06 EQ PUSH2 0x1D8 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1EB JUMPI DUP1 PUSH4 0xB3CD4254 EQ PUSH2 0x20D JUMPI DUP1 PUSH4 0xBC063E1A EQ PUSH2 0x222 JUMPI DUP1 PUSH4 0xE58E9C16 EQ PUSH2 0x237 JUMPI DUP1 PUSH4 0xF0B9E5BA EQ PUSH2 0x257 JUMPI DUP1 PUSH4 0xF2AFD85A EQ PUSH2 0x277 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x297 JUMPI DUP1 PUSH4 0xFB4F9087 EQ PUSH2 0x2B7 JUMPI JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x129 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x32E1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x137 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x14B PUSH2 0x146 CALLDATASIZE PUSH1 0x4 PUSH2 0x28B0 JUMP JUMPDEST PUSH2 0x2CC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x158 SWAP2 SWAP1 PUSH2 0x32D3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x174 PUSH2 0x16F CALLDATASIZE PUSH1 0x4 PUSH2 0x298E JUMP JUMPDEST PUSH2 0x32C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x158 SWAP2 SWAP1 PUSH2 0x33A1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x174 PUSH2 0x19C CALLDATASIZE PUSH1 0x4 PUSH2 0x2B6F JUMP JUMPDEST PUSH2 0x5F8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B6 PUSH2 0x6BE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x158 SWAP2 SWAP1 PUSH2 0x33F2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x14B PUSH2 0x6C4 JUMP JUMPDEST PUSH2 0x174 PUSH2 0x1E6 CALLDATASIZE PUSH1 0x4 PUSH2 0x2A74 JUMP JUMPDEST PUSH2 0x6F9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x200 PUSH2 0xAC7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x158 SWAP2 SWAP1 PUSH2 0x31FB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x219 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B6 PUSH2 0xAE3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x22E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B6 PUSH2 0xAE9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x243 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x174 PUSH2 0x252 CALLDATASIZE PUSH1 0x4 PUSH2 0x2B6F JUMP JUMPDEST PUSH2 0xAEF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x14B PUSH2 0x272 CALLDATASIZE PUSH1 0x4 PUSH2 0x2929 JUMP JUMPDEST PUSH2 0xBEC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x283 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x129 PUSH2 0x292 CALLDATASIZE PUSH1 0x4 PUSH2 0x2BDE JUMP JUMPDEST PUSH2 0xC4C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x129 PUSH2 0x2B2 CALLDATASIZE PUSH1 0x4 PUSH2 0x2874 JUMP JUMPDEST PUSH2 0xEC3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x14B PUSH2 0xF74 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C61646472657373 DUP2 MSTORE PUSH32 0x2C75696E743235362C6279746573290000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x2F ADD SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x334 PUSH2 0x24B3 JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP1 DUP1 DUP5 GT PUSH2 0x372 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3311 JUMP JUMPDEST PUSH2 0x37D DUP5 DUP9 DUP9 PUSH2 0xFCF JUMP JUMPDEST SWAP3 POP PUSH2 0x389 DUP5 DUP5 PUSH2 0x109D JUMP JUMPDEST SWAP2 POP PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x411 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x425 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0x452 DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x43C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x10 PUSH2 0x10B4 JUMP JUMPDEST PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP5 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x4F8 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x4CD JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x4F8 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x4DB JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x50C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x550 JUMPI PUSH2 0x549 DUP12 DUP12 DUP5 PUSH2 0x1115 JUMP JUMPDEST SWAP5 POP PUSH2 0x560 JUMP JUMPDEST PUSH2 0x55D DUP12 DUP12 DUP12 DUP12 DUP7 PUSH2 0x122F JUMP JUMPDEST SWAP5 POP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP5 LT ISZERO PUSH2 0x59E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x32F1 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP3 EQ PUSH2 0x5DB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3351 JUMP JUMPDEST PUSH2 0x5EA DUP2 CALLER DUP8 PUSH1 0x0 ADD MLOAD PUSH2 0x13B7 JUMP JUMPDEST POP POP POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x600 PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x60D PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x6B4 JUMPI PUSH2 0x629 DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST SWAP3 POP PUSH2 0x66C DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x63C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x658 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x1591 JUMP JUMPDEST SWAP2 POP PUSH2 0x68F DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x67F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 PUSH2 0x15AE JUMP JUMPDEST SWAP1 POP PUSH2 0x69B DUP6 DUP3 PUSH2 0x16FC JUMP JUMPDEST DUP5 MLOAD DUP7 EQ ISZERO PUSH2 0x6A9 JUMPI PUSH2 0x6B4 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x612 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x251C DUP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 DUP2 JUMP JUMPDEST PUSH2 0x701 PUSH2 0x24B3 JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x73D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3311 JUMP JUMPDEST PUSH1 0x0 DUP7 GT PUSH2 0x777 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3311 JUMP JUMPDEST PUSH2 0x79F DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x789 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x0 PUSH2 0x175E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 SWAP1 SWAP2 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP4 AND SWAP2 AND EQ DUP1 PUSH2 0x881 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x8B9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3381 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x93F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x953 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 DUP2 AND SWAP2 AND EQ ISZERO SWAP3 POP PUSH2 0x9CC SWAP2 POP POP JUMPI PUSH2 0x9C5 DUP11 DUP11 DUP11 DUP11 DUP11 PUSH2 0x17CB JUMP JUMPDEST SWAP3 POP PUSH2 0xA5F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0xA5F JUMPI PUSH2 0xA5C DUP11 DUP11 DUP11 DUP11 PUSH2 0x1B22 JUMP JUMPDEST SWAP3 POP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD DUP3 LT ISZERO PUSH2 0xA9D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x32F1 JUMP JUMPDEST PUSH2 0xABA PUSH2 0xAAE DUP4 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP8 DUP8 PUSH2 0x1E24 JUMP JUMPDEST POP POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x2710 DUP2 JUMP JUMPDEST PUSH2 0x3E8 DUP2 JUMP JUMPDEST PUSH2 0xAF7 PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xB04 PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x6B4 JUMPI PUSH2 0xB20 DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST SWAP3 POP PUSH2 0xB87 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB33 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB81 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB52 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB6E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST DUP6 PUSH2 0x1591 JUMP JUMPDEST SWAP2 POP PUSH2 0xBB4 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB9A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xBAF DUP5 PUSH1 0x1 PUSH2 0x1F11 JUMP JUMPDEST PUSH2 0x15AE JUMP JUMPDEST SWAP1 POP PUSH2 0xBC8 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST DUP2 MSTORE PUSH2 0xBD4 DUP6 DUP3 PUSH2 0x16FC JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0xBE1 JUMPI PUSH2 0x6B4 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0xB09 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C75696E74323536 DUP2 MSTORE PUSH32 0x2C62797465732900000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x27 ADD SWAP1 KECCAK256 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xC9E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3361 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x6070410800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x60704108 SWAP1 PUSH2 0xCF4 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x32D3 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD0E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD22 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 0xD46 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2892 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xEBF JUMPI PUSH1 0x2 SLOAD PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 PUSH4 0x95EA7B3 SWAP2 PUSH2 0xDBE SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x324D JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xDEC 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 0xE10 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2BC0 JUMP JUMPDEST POP PUSH1 0x3 SLOAD PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 PUSH4 0x95EA7B3 SWAP2 PUSH2 0xE6B SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x324D JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xE99 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 0xEBD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2BC0 JUMP JUMPDEST POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xF14 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3361 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xF71 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH2 0xFFFF AND GT DUP1 ISZERO PUSH2 0xFF9 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xC45 JUMPI PUSH2 0x3E8 PUSH2 0xFFFF DUP5 AND GT ISZERO PUSH2 0x103E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3331 JUMP JUMPDEST PUSH2 0x104F PUSH2 0xFFFF DUP5 AND PUSH2 0x2710 DUP7 PUSH2 0x1591 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1095 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x10A9 JUMPI INVALID JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x10F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3371 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x111D PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0x1178 SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x32A1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1192 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x11A6 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 0x11CA SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2BFC JUMP JUMPDEST SWAP2 POP PUSH2 0x11DE DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x60 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST SWAP1 POP PUSH2 0x11EE DUP3 PUSH1 0x0 ADD MLOAD DUP3 PUSH2 0x1F20 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1226 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3351 JUMP JUMPDEST DUP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1237 PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1241 PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x1249 PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x1251 PUSH2 0x24B3 JUMP JUMPDEST DUP6 SWAP4 POP PUSH2 0x125E DUP11 DUP8 PUSH2 0x1F3D JUMP JUMPDEST SWAP3 POP PUSH1 0x0 DUP4 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0x12F2 JUMPI PUSH2 0x127C DUP9 DUP9 DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x1FA7 JUMP JUMPDEST SWAP2 POP PUSH2 0x1295 DUP7 PUSH2 0x1290 DUP9 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST PUSH2 0x1F20 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x12CD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3351 JUMP JUMPDEST PUSH2 0x12DB DUP5 DUP4 PUSH1 0x20 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST PUSH1 0x60 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x20 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP4 POP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0x134C SWAP1 DUP14 SWAP1 DUP9 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x32A1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1366 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x137A 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 0x139E SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2BFC JUMP JUMPDEST SWAP1 POP PUSH2 0x13AA DUP6 DUP3 PUSH2 0x16FC JUMP JUMPDEST POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x7472616E7366657228616464726573732C75696E743235362900000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x19 ADD DUP2 KECCAK256 PUSH1 0x0 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP2 SWAP1 PUSH2 0x1415 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x24 ADD PUSH2 0x324D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 MSTORE MLOAD DUP2 MLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x14B9 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x14A1 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x14E6 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP3 POP POP POP DUP1 ISZERO ISZERO PUSH2 0x1535 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3341 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x1552 JUMPI POP PUSH1 0x0 RETURNDATASIZE PUSH1 0x20 EQ ISZERO PUSH2 0x1552 JUMPI PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD JUMPDEST DUP1 ISZERO ISZERO PUSH2 0x158B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3341 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15A6 PUSH2 0x15A0 DUP6 DUP5 PUSH2 0x22E0 JUMP JUMPDEST DUP5 PUSH2 0x2304 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x15B6 PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x15BE PUSH2 0x24DC JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xC75E0A8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP2 DUP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xC75E0A81 SWAP1 PUSH2 0x1619 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x33AF JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1633 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1647 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 0x166B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2C1A JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x167F JUMPI PUSH2 0x16F3 JUMP JUMPDEST PUSH2 0x1691 DUP7 PUSH1 0xA0 ADD MLOAD DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST SWAP2 POP PUSH2 0x169D DUP6 DUP4 PUSH2 0x231B JUMP JUMPDEST SWAP1 POP DUP1 DUP5 PUSH1 0x20 ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x16BC DUP2 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x1591 JUMP JUMPDEST DUP5 MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x16D3 SWAP2 DUP4 SWAP2 PUSH2 0x1591 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x16ED SWAP2 DUP4 SWAP2 PUSH2 0x1591 JUMP JUMPDEST PUSH1 0x60 DUP6 ADD MSTORE JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x170A SWAP2 SWAP1 PUSH2 0x1F11 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1720 SWAP2 SWAP1 PUSH2 0x1F11 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1739 SWAP2 SWAP1 PUSH2 0x1F11 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1752 SWAP2 SWAP1 PUSH2 0x1F11 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x17A0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3391 JUMP JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0x17D3 PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x17DD PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x17E5 PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x17ED PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x17FF DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x43C JUMPI INVALID JUMPDEST PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP8 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x18A5 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x187A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x18A5 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1888 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18B9 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x1997 JUMPI PUSH2 0x18F6 DUP11 DUP11 DUP9 PUSH2 0x1FA7 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 GT ISZERO PUSH2 0x1934 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3351 JUMP JUMPDEST PUSH2 0x193E DUP6 DUP5 PUSH2 0x16FC JUMP JUMPDEST PUSH2 0x195A PUSH2 0x1953 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1F11 JUMP JUMPDEST DUP7 MLOAD PUSH2 0x1F20 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1992 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3351 JUMP JUMPDEST PUSH2 0x1B13 JUMP JUMPDEST PUSH2 0x19A1 DUP11 DUP8 PUSH2 0x5F8 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 DUP3 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0x19D6 JUMPI PUSH2 0x19BF DUP9 DUP9 DUP5 PUSH1 0x60 ADD MLOAD PUSH2 0x1FA7 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP1 POP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xE5FA431B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xE5FA431B SWAP1 PUSH2 0x1A30 SWAP1 DUP14 SWAP1 DUP11 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x32A1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A5E 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 0x1A82 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2BFC JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 EQ PUSH2 0x1ABF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3351 JUMP JUMPDEST PUSH2 0x1AC9 DUP6 DUP5 PUSH2 0x16FC JUMP JUMPDEST PUSH2 0x1ADB DUP6 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0x1F20 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1B13 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3351 JUMP JUMPDEST PUSH2 0x13AA DUP5 CALLER DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0x13B7 JUMP JUMPDEST PUSH2 0x1B2A PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH1 0x0 PUSH2 0x1B39 PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x1B41 PUSH2 0x24B3 JUMP JUMPDEST DUP11 MLOAD SWAP5 POP DUP5 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1B6F JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x1CAB JUMPI PUSH2 0x1BA4 DUP7 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1B91 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0x1F11 JUMP JUMPDEST PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP10 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1C4A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1C1F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1C4A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1C2D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C5D JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP11 MLOAD DUP12 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x1C7A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C96 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1B77 JUMP JUMPDEST PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1CD6 JUMPI PUSH2 0x1CBF DUP10 DUP10 DUP9 PUSH2 0x1FA7 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE SWAP2 POP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x4D0AE54600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x4D0AE546 SWAP1 PUSH2 0x1D30 SWAP1 DUP15 SWAP1 DUP9 SWAP1 DUP16 SWAP1 PUSH1 0x4 ADD PUSH2 0x3268 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D5E 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 0x1D82 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2BFC JUMP JUMPDEST SWAP1 POP PUSH2 0x1D8E DUP8 DUP3 PUSH2 0x16FC JUMP JUMPDEST PUSH2 0x1DA0 DUP8 PUSH1 0x20 ADD MLOAD DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x1F20 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1DD8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3351 JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x1E16 JUMPI PUSH2 0x1E0B DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1DF6 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD CALLER PUSH2 0x2331 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1DDD JUMP JUMPDEST POP POP POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1F09 JUMPI PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x1E86 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x3400 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1EA0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1EB4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x1EC3 DUP6 DUP6 DUP6 PUSH2 0xFCF JUMP JUMPDEST SWAP2 POP PUSH2 0x1ECF DUP7 DUP4 PUSH2 0x109D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT ISZERO PUSH2 0x1F09 JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1F07 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xC45 JUMPI INVALID JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1F32 PUSH2 0x251C PUSH2 0x2710 DUP7 PUSH2 0x1591 JUMP JUMPDEST SWAP1 SWAP3 LT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1F45 PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1F50 PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP6 MLOAD DUP4 LT ISZERO PUSH2 0x16F3 JUMPI PUSH2 0x1F6C DUP6 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST SWAP2 POP PUSH2 0x1F7F DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x67F JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x1F8B DUP5 DUP3 PUSH2 0x16FC JUMP JUMPDEST DUP5 DUP5 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x1F9C JUMPI PUSH2 0x16F3 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1F55 JUMP JUMPDEST PUSH2 0x1FAF PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1FBC PUSH2 0x24B3 JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP8 MLOAD DUP5 LT ISZERO PUSH2 0x22D5 JUMPI PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x206E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2043 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x206E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2051 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2081 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP2 MSTORE DUP2 DUP2 MSTORE SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2136 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x210B JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2136 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2119 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2149 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP5 MLOAD PUSH2 0x2165 SWAP1 DUP8 SWAP1 PUSH2 0x109D JUMP JUMPDEST SWAP3 POP PUSH2 0x21B3 DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2178 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB81 DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2197 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP12 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB6E JUMPI INVALID JUMPDEST PUSH1 0x1 SLOAD DUP10 MLOAD SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB4BE83D5 SWAP1 DUP11 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0x21E4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x21F9 DUP6 PUSH1 0x1 PUSH2 0x1F11 JUMP JUMPDEST DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2207 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x224B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x33C0 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2265 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2279 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 0x229D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2BFC JUMP JUMPDEST SWAP1 POP PUSH2 0x22B1 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0x109D JUMP JUMPDEST DUP2 MSTORE PUSH2 0x22BD DUP6 DUP3 PUSH2 0x16FC JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0x22CA JUMPI PUSH2 0x22D5 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x1FC1 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MUL DUP4 ISZERO DUP1 PUSH2 0x22FC JUMPI POP DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x22F9 JUMPI INVALID JUMPDEST DIV EQ JUMPDEST ISZERO ISZERO PUSH2 0xC45 JUMPI INVALID JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x2312 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x232A JUMPI DUP2 PUSH2 0xC45 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x2347 DUP6 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x10B4 AND JUMP JUMPDEST SWAP3 POP PUSH2 0x235A DUP6 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x2401 AND JUMP JUMPDEST SWAP2 POP PUSH2 0x236D DUP6 PUSH1 0x64 PUSH4 0xFFFFFFFF PUSH2 0x240D AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0x23C8 SWAP1 ADDRESS SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x3209 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x23E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x23F6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC45 DUP4 DUP4 PUSH2 0x2468 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x241B DUP5 DUP5 PUSH2 0x2401 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2462 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3301 JUMP JUMPDEST POP POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x24AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120 SWAP1 PUSH2 0x3321 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD 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 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 0x0 PUSH2 0xC45 DUP3 CALLDATALOAD PUSH2 0x34A6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC45 DUP3 MLOAD PUSH2 0x34A6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x2525 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2538 PUSH2 0x2533 DUP3 PUSH2 0x3435 JUMP JUMPDEST PUSH2 0x340E 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 0x6B4 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x2560 DUP9 DUP3 PUSH2 0x25F7 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x254A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x2587 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2595 PUSH2 0x2533 DUP3 PUSH2 0x3435 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 0x6B4 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x25BD DUP9 DUP3 PUSH2 0x2707 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x25A7 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC45 DUP3 MLOAD PUSH2 0x34EE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC45 DUP3 MLOAD PUSH2 0x34EB JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC45 DUP3 CALLDATALOAD PUSH2 0x34BF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x2608 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2616 PUSH2 0x2533 DUP3 PUSH2 0x3456 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x2632 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x16F3 DUP4 DUP3 DUP5 PUSH2 0x34F9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x264F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2659 PUSH1 0x80 PUSH2 0x340E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2667 DUP5 DUP5 PUSH2 0x25DF JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x2678 DUP5 DUP5 DUP4 ADD PUSH2 0x25DF JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x268C DUP5 DUP3 DUP6 ADD PUSH2 0x25DF JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x26A0 DUP5 DUP3 DUP6 ADD PUSH2 0x25DF JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x26BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26C8 PUSH1 0x60 PUSH2 0x340E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x26D6 DUP5 DUP5 PUSH2 0x2868 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x26E7 DUP5 DUP5 DUP4 ADD PUSH2 0x25DF JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x26FB DUP5 DUP3 DUP6 ADD PUSH2 0x25DF JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x271A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2725 PUSH2 0x180 PUSH2 0x340E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2733 DUP5 DUP5 PUSH2 0x24FC JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x2744 DUP5 DUP5 DUP4 ADD PUSH2 0x24FC JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x2758 DUP5 DUP3 DUP6 ADD PUSH2 0x24FC JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x276C DUP5 DUP3 DUP6 ADD PUSH2 0x24FC JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x2780 DUP5 DUP3 DUP6 ADD PUSH2 0x285C JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x2794 DUP5 DUP3 DUP6 ADD PUSH2 0x285C JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x27A8 DUP5 DUP3 DUP6 ADD PUSH2 0x285C JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x27BC DUP5 DUP3 DUP6 ADD PUSH2 0x285C JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x27D1 DUP5 DUP3 DUP6 ADD PUSH2 0x285C JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x27E7 DUP5 DUP3 DUP6 ADD PUSH2 0x285C JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2809 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2815 DUP5 DUP3 DUP6 ADD PUSH2 0x25F7 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2837 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2843 DUP5 DUP3 DUP6 ADD PUSH2 0x25F7 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC45 DUP3 CALLDATALOAD PUSH2 0x34E4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC45 DUP3 CALLDATALOAD PUSH2 0x34EB JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC45 DUP3 MLOAD PUSH2 0x34F3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2886 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x15A6 DUP5 DUP5 PUSH2 0x24FC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x28A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x15A6 DUP5 DUP5 PUSH2 0x2508 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x28C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x28D2 DUP8 DUP8 PUSH2 0x24FC JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x28E3 DUP8 DUP3 DUP9 ADD PUSH2 0x24FC JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x28F4 DUP8 DUP3 DUP9 ADD PUSH2 0x285C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2911 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x291D DUP8 DUP3 DUP9 ADD PUSH2 0x25F7 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x293E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x294A DUP7 DUP7 PUSH2 0x24FC JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x295B DUP7 DUP3 DUP8 ADD PUSH2 0x285C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2978 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2984 DUP7 DUP3 DUP8 ADD PUSH2 0x25F7 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x29A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x29BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x29CA DUP10 DUP3 DUP11 ADD PUSH2 0x2576 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x29E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x29F3 DUP10 DUP3 DUP11 ADD PUSH2 0x2514 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2A10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2A1C DUP10 DUP3 DUP11 ADD PUSH2 0x2576 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2A39 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2A45 DUP10 DUP3 DUP11 ADD PUSH2 0x2514 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 PUSH2 0x2A56 DUP10 DUP3 DUP11 ADD PUSH2 0x2850 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xA0 PUSH2 0x2A67 DUP10 DUP3 DUP11 ADD PUSH2 0x24FC JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x2A8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2AA6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2AB2 DUP11 DUP3 DUP12 ADD PUSH2 0x2576 JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2ACF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2ADB DUP11 DUP3 DUP12 ADD PUSH2 0x2514 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2AF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2B04 DUP11 DUP3 DUP12 ADD PUSH2 0x2576 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2B21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2B2D DUP11 DUP3 DUP12 ADD PUSH2 0x2514 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 PUSH2 0x2B3E DUP11 DUP3 DUP12 ADD PUSH2 0x285C JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH2 0x2B4F DUP11 DUP3 DUP12 ADD PUSH2 0x2850 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH2 0x2B60 DUP11 DUP3 DUP12 ADD PUSH2 0x24FC JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2B82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2B99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2BA5 DUP6 DUP3 DUP7 ADD PUSH2 0x2576 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x2BB6 DUP6 DUP3 DUP7 ADD PUSH2 0x285C JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2BD2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x15A6 DUP5 DUP5 PUSH2 0x25D3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2BF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x15A6 DUP5 DUP5 PUSH2 0x25EB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2C0E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x15A6 DUP5 DUP5 PUSH2 0x263D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2C2C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x15A6 DUP5 DUP5 PUSH2 0x26AC JUMP JUMPDEST PUSH2 0x2C41 DUP2 PUSH2 0x34A6 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2C52 DUP3 PUSH2 0x34A2 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2C6B DUP6 PUSH2 0x349C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2CA2 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2C86 DUP4 DUP4 MLOAD PUSH2 0x2D69 JUMP JUMPDEST SWAP3 POP PUSH2 0x2C91 DUP3 PUSH2 0x349C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x2C6E JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2CB9 DUP3 PUSH2 0x34A2 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2CD2 DUP6 PUSH2 0x349C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2CA2 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2CED DUP4 DUP4 MLOAD PUSH2 0x30E6 JUMP JUMPDEST SWAP3 POP PUSH2 0x2CF8 DUP3 PUSH2 0x349C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x2CD5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D14 DUP3 PUSH2 0x34A2 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x2D26 DUP4 PUSH2 0x349C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x2D56 JUMPI PUSH2 0x2D3C DUP7 DUP4 MLOAD PUSH2 0x31F2 JUMP JUMPDEST PUSH2 0x2D45 DUP3 PUSH2 0x349C JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x2D29 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x2C41 DUP2 PUSH2 0x34BF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D74 DUP3 PUSH2 0x34A2 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x2D88 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x3505 JUMP JUMPDEST PUSH2 0x2D91 DUP2 PUSH2 0x3531 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x44454641554C545F46554E4354494F4E5F574554485F434F4E54524143545F4F PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4E4C590000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F4D53475F56414C5545000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x30 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x56414C55455F475245415445525F5448414E5F5A45524F000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 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 0x18 DUP2 MSTORE PUSH32 0x4645455F50524F504F5254494F4E5F544F4F5F4C415247450000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x16 DUP2 MSTORE PUSH32 0x554E41434345505441424C455F5448524553484F4C4400000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 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 0x17 DUP2 MSTORE PUSH32 0x554E535550504F525445445F544F4B454E5F50524F5859000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 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 0x80 DUP4 ADD SWAP1 PUSH2 0x30AD DUP5 DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x30C0 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x30D3 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x158B PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x30FB DUP6 DUP3 PUSH2 0x2C38 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x310E PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x2C38 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x3121 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x2C38 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x3134 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x2C38 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x3147 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x315A PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x316D PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x3180 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x3195 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x31AA PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x31F2 JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x31C4 DUP3 DUP3 PUSH2 0x2D69 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x31E0 DUP3 DUP3 PUSH2 0x2D69 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2C41 DUP2 PUSH2 0x34E4 JUMP JUMPDEST PUSH2 0x2C41 DUP2 PUSH2 0x34EB JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x10AE DUP3 DUP5 PUSH2 0x2C38 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x3217 DUP3 DUP8 PUSH2 0x2C38 JUMP JUMPDEST PUSH2 0x3224 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x2C38 JUMP JUMPDEST PUSH2 0x3231 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x31F2 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x3243 DUP2 DUP5 PUSH2 0x2D69 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x325B DUP3 DUP6 PUSH2 0x2C38 JUMP JUMPDEST PUSH2 0xC45 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x31F2 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x3279 DUP2 DUP7 PUSH2 0x2CAE JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x328D DUP2 DUP6 PUSH2 0x2D09 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x31E0 DUP2 DUP5 PUSH2 0x2C47 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x32B2 DUP2 DUP7 PUSH2 0x2CAE JUMP JUMPDEST SWAP1 POP PUSH2 0x32C1 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x31F2 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x31E0 DUP2 DUP5 PUSH2 0x2C47 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x10AE DUP3 DUP5 PUSH2 0x2D60 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2D9E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2DF4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2E24 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2E7A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2EAA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2F00 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2F30 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2F60 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2F90 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x2FC0 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x3016 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10AE DUP2 PUSH2 0x3046 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x10AE DUP3 DUP5 PUSH2 0x309C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC45 DUP2 DUP5 PUSH2 0x30E6 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x33D1 DUP2 DUP7 PUSH2 0x30E6 JUMP JUMPDEST SWAP1 POP PUSH2 0x33E0 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x31F2 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x31E0 DUP2 DUP5 PUSH2 0x2D69 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x10AE DUP3 DUP5 PUSH2 0x31E9 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x10AE DUP3 DUP5 PUSH2 0x31F2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x342D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x344C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x346D 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 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3520 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3508 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x158B JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xf8 DIFFICULTY 0x28 PUSH8 0x4A7A1B076EA035CD STATICCALL NOT 0xe SWAP2 0x2b LOG3 0xc0 SWAP5 CALLCODE MULMOD 0xcb 0xdd 0xcd DUP4 SAR PUSH20 0x62003D456C6578706572696D656E74616CF50037 ", - "sourceMap": "816:1324:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1649:11;;;;1627:10;:34;1606:116;;;;;;;;;;;;;;;;;;;;;;816:1324;1166:171:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1166:171:3;;;;;;;;;;;;;;;;;;;;;;;;;2306:2403:7;;;;;;;;;;;;;;;;;;4077:950:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4077:950:4;;;;;;;;;991:60:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;991:60:8;;;;;;;;;;;;1077:79:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1077:79:5;;;;2616:1894;;;;;;;;;;292:20:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;292:20:41;;;;;;;;;;;;850:54:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;850:54:8;;;;940:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;940:38:8;;;;5436:1414:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5436:1414:4;;;;;;;;;1007:153:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1007:153:3;;;;;;;;;1799:339:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1799:339:0;;;;;;;;;534:167:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;534:167:41;;;;;;;;;1162:95:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1162:95:5;;;;1166:171:3;939:60;;;;;;;;;;;;;;;;;;;;;1166:171;;;;;;:::o;2306:2403:7:-;2608:35;;:::i;:::-;2684:9;2659:22;;;2724:18;;;2703:88;;;;;;;;;;;;;;2887:100;2910:14;2938:13;2965:12;2887:9;:100::i;:::-;2864:123;;3022:37;3030:14;3046:12;3022:7;:37::i;:::-;2997:62;;3126:11;;;;;;;;;;;:19;;;3152:14;3126:43;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3126:43:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3126:43:7;;;;;3363:50;3384:6;3391:1;3384:9;;;;;;;;;;;;;;;;;;:24;;;3410:2;3363:20;:50::i;:::-;3450:15;3423:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3335:78;;-1:-1:-1;3423:42:7;;3450:15;3423:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;3430:1;3423:9;;;;;;;;;;;;;;;;;;;:24;;:42;3508:9;;;3479:39;;;3508:9;;3479:39;3475:614;;;3718:125;3763:6;3787:10;3815:14;3718:27;:125::i;:::-;3699:144;;3475:614;;;3893:185;3940:6;3964:10;3992:9;4019:13;4050:14;3893:29;:185::i;:::-;3874:204;;3475:614;4214:39;;;;4196:57;;;4175:121;;;;;;;;;;;;;;4396:39;;;;4378:57;;4357:126;;;;;;;;;;;;;;4538:131;4565:17;4596:10;4620:16;:39;;;4538:13;:131::i;:::-;2306:2403;;;;;;;;;;;;:::o;4077:950:4:-;4241:35;;:::i;:::-;4297:9;4350:37;4474;4693:35;;:::i;:::-;4309:1;4297:13;;4292:696;4316:6;:13;4312:1;:17;4292:696;;;4390:70;4398:20;4420:16;:39;;;4390:7;:70::i;:::-;4350:110;;4514:165;4548:6;4555:1;4548:9;;;;;;;;;;;;;;;;;;:26;;;4592:6;4599:1;4592:9;;;;;;;;;;;;;;;;;;:26;;;4636:29;4514:16;:165::i;:::-;4474:205;;4731:62;4752:6;4759:1;4752:9;;;;;;;;;;;;;;;;;;4763:29;4731:20;:62::i;:::-;4693:100;;4807:50;4822:16;4840;4807:14;:50::i;:::-;4875:39;;:63;;4871:107;;;4958:5;;4871:107;4331:3;;;;;4292:696;;;4077:950;;;;;;;;:::o;991:60:8:-;1047:4;991:60;:::o;1077:79:5:-;1123:32;;;;;;;;;;;;;;;;1077:79;:::o;2616:1894::-;2957:35;;:::i;:::-;3033:9;3008:22;3073:18;;;3052:88;;;;;;;;;;;;;;3194:1;3171:24;;3150:94;;;;;;;;;;;;;;3275:48;3295:6;3302:1;3295:9;;;;;;;;;;;;;;;;;;:24;;;3321:1;3275:19;:48::i;:::-;1123:32;;;;;;;;;;;;;;;;3254:69;;-1:-1:-1;3354:28:5;;;;;;;;:61;;-1:-1:-1;1209:47:5;;;;;;;;;;;;;;;;;;;;;3386:29;;;;;;;3354:61;3333:131;;;;;;;;;;;;;;;;3475:11;;;;;;;;;;;:19;;;3501:14;3475:43;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3475:43:5;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;1123:32:5;;;;;;;;;;;;;;;;3532:28;;;;;;;3528:505;;-1:-1:-1;3528:505:5;;-1:-1:-1;;3528:505:5;3595:190;3641:6;3665:10;3693:9;3720:13;3751:20;3595:28;:190::i;:::-;3576:209;;3528:505;;;1209:47;;;;;;;;;;;;;;;;;;;;;3806:29;;;;;;;3802:231;;;3870:152;3916:6;3940:10;3968:9;3995:13;3870:28;:152::i;:::-;3851:171;;3802:231;4158:39;;;;4140:57;;;4119:121;;;;;;;;;;;;;;4250:220;4290:64;4298:14;4314:16;:39;;;4290:7;:64::i;:::-;4368:16;:39;;;4421:13;4448:12;4250:26;:220::i;:::-;2616:1894;;;;;;;;;;;:::o;292:20:41:-;;;;;;:::o;850:54:8:-;899:5;850:54;:::o;940:38::-;974:4;940:38;:::o;5436:1414:4:-;5596:35;;:::i;:::-;5652:9;5705:30;5996:31;6264:35;;:::i;:::-;5664:1;5652:13;;5647:1164;5671:6;:13;5667:1;:17;5647:1164;;;5738:63;5746:13;5761:16;:39;;;5738:7;:63::i;:::-;5705:96;;6030:220;6064:6;6071:1;6064:9;;;;;;;;;;;;;;;;;;:26;;;6108:55;6116:6;6123:1;6116:9;;;;;;;;;;;;;;;;;;:26;;;6144:6;6151:1;6144:9;;;;;;;;;;;;;;;;;;:18;;;6108:7;:55::i;:::-;6214:22;6030:16;:220::i;:::-;5996:254;;6302:68;6323:6;6330:1;6323:9;;;;;;;;;;;;;;;;;;6334:35;6342:23;6367:1;6334:7;:35::i;:::-;6302:20;:68::i;:::-;6264:106;;6427:79;6435:16;:39;;;6476:16;:29;;;6427:7;:79::i;:::-;6385:121;;6520:50;6535:16;6385;6520:14;:50::i;:::-;6705:39;;:56;-1:-1:-1;6701:100:4;;6781:5;;6701:100;5686:3;;;;;5647:1164;;1007:153:3;830:52;;;;;;;;;;;;;;;;;;;;;1007:153;;;;;;:::o;1799:339:0:-;1903:20;460:5:41;;;;446:10;:19;425:85;;;;;;;;;;;;;;1926:8:0;;:41;;;;;:8;;;;;:22;;:41;;1949:17;;1926:41;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1926:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1926:41: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;1926:41:0;;;;;;;;;1903:64;-1:-1:-1;1981:26:0;;;;1977:155;;2023:11;;2057:8;;2023:43;;;;;:11;;;;;:19;;:43;;2043:12;;2057:8;2023:43;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2023:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2023:43: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;2023:43:0;;;;;;;;;-1:-1:-1;2080:9:0;;2112:8;;2080:41;;;;;:9;;;;;:17;;:41;;2098:12;;2112:8;2080:41;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2080:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2080:41: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;2080:41:0;;;;;;;;;;1977:155;1799:339;;:::o;534:167:41:-;460:5;;;;446:10;:19;425:85;;;;;;;;;;;;;;630:22;;;;626:69;;668:5;:16;;;;;;;;;;626:69;534:167;:::o;1162:95:5:-;1209:47;;;;;;;;;;;;;;;;;;;;;1162:95;:::o;1453:695:8:-;1604:20;1660:1;1644:13;:17;;;:47;;;;-1:-1:-1;1665:26:8;;;;;1644:47;1640:473;;;974:4;1732:24;;;;;1707:107;;;;;;;;;;;;;;1920:133;;;;899:5;2025:14;1920:16;:133::i;:::-;2067:35;;1905:148;;-1:-1:-1;2067:21:8;;;;:35;;;;;1905:148;;2067:35;;;;1905:148;2067:21;:35;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2067:35:8;1453:695;;;;;:::o;418:146:42:-;498:7;528:6;;;;521:14;;;;-1:-1:-1;552:5:42;;;418:146;;;;;:::o;10073:886:39:-;10194:14;10257:5;10265:2;10257:10;10245:1;:8;:22;;10224:135;;;;;;;;;;;;;;;;-1:-1:-1;10861:13:39;10606:2;10861:13;10855:20;10877:42;10851:69;;10073:886::o;7513:994:7:-;7697:35;;:::i;:::-;7854:8;;:107;;;;;8137:23;;7854:8;;;:25;;:107;;7893:6;;7913:14;;7941:10;;7854:107;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7854:107:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7854:107:7;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;7854:107:7;;;;;;;;;7835:126;;8163:79;8171:16;:39;;;8212:16;:29;;;8163:7;:79::i;:::-;8137:105;;8273:79;8295:16;:39;;;8336:15;8273:21;:79::i;:::-;8252:148;;;;;;;;;;;;;;;;8410:57;;;7513:994;-1:-1:-1;;;7513:994:7:o;5257:1906::-;5524:35;;:::i;:::-;5575:31;5633:46;;:::i;:::-;5903:35;;:::i;:::-;6836:41;;:::i;:::-;5609:14;5575:48;;5682:50;5709:6;5717:14;5682:26;:50::i;:::-;5633:99;;5789:1;5746:27;:40;;;:44;5742:998;;;5941:150;5979:9;6006:13;6037:27;:40;;;5941:20;:150::i;:::-;5903:188;;6229:161;6272:14;6308:64;6316:14;6332:16;:39;;;6308:7;:64::i;:::-;6229:21;:161::i;:::-;6204:242;;;;;;;;;;;;;;;;6486:73;6494:23;6519:16;:39;;;6486:7;:73::i;:::-;6605:29;;;;;6573;;;:61;6690:39;;;;;6648;;;:81;6460:99;-1:-1:-1;5742:998:7;6880:8;;:116;;;;;:8;;;;;:25;;:116;;6919:6;;6939:23;;6976:10;;6880:116;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6880:116:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6880:116:7;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;6880:116:7;;;;;;;;;6836:160;;7067:56;7082:16;7100:22;7067:14;:56::i;:::-;5257:1906;;;;;;;;;;;:::o;825:1219:2:-;779:38;;;;;;;;;;;;;;;;1078:12;;1093:10;;;;779:38;1104:105;;1177:2;;1193:6;;1104:105;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1104:105:2;;;49:4:-1;25:18;;61:17;;1104:105:2;182:15:-1;1104:105:2;;;;179:29:-1;;;;160:49;;1093:117:2;;;1104:105;;1093:117;;;;25:18:-1;1093:117:2;;25:18:-1;-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1093:117:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1220:69:2;;;;;;;;;;;;;;;;;1668:14;1665:2;;;-1:-1:-1;1712:1:2;1736:14;1752:2;1733:22;1730:2;;;1874;1871:1;1868;1853:24;-1:-1:-1;1915:1:2;1909:8;1730:2;1989:7;1968:69;;;;;;;;;;;;;;;;825:1219;;;;:::o;937:326:29:-;1091:21;1144:82;1165:26;1173:9;1184:6;1165:7;:26::i;:::-;1205:11;1144:7;:82::i;:::-;1128:98;937:326;-1:-1:-1;;;;937:326:29:o;1312:1215:4:-;1470:30;;:::i;:::-;1516:35;;:::i;:::-;1554:8;;:28;;;;;1711:33;;;;1554:8;;;;;:21;;:28;;1576:5;;1554:28;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1554:28:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1554:28:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1554:28:4;;;;;;;;;1596:21;;1516:66;;-1:-1:-1;1596:61:4;;1627:29;1596:61;1592:110;;1673:18;;1592:110;1747:70;1755:5;:22;;;1779:9;:37;;;1747:7;:70::i;:::-;1711:106;;1860:55;1867:20;1889:25;1860:6;:55::i;:::-;1827:88;;1963:22;1926:11;:34;;:59;;;;;2032:134;2062:22;2098:5;:22;;;2134:5;:22;;;2032:16;:134::i;:::-;1995:171;;2269:22;;;;2305:14;;;;2203:126;;2233:22;;2203:16;:126::i;:::-;2176:24;;;:153;2432:22;;;;2468:14;;;;2366:126;;2396:22;;2366:16;:126::i;:::-;2339:24;;;:153;1312:1215;;;;;;;;:::o;1772:648:28:-;1965:39;;2006:40;;1957:90;;1965:39;1957:7;:90::i;:::-;1915:132;;2107:39;;;;;2148:40;;;;2099:90;;2107:39;2099:7;:90::i;:::-;2057:39;;;:132;2239:29;;;;;2270:30;;;;2231:70;;2239:29;2231:7;:70::i;:::-;2199:29;;;:102;2351:29;;;;;2382:30;;;;2343:70;;2351:29;2343:7;:70::i;:::-;2311:29;;;;:102;;;;-1:-1:-1;1772:648:28:o;15327:554:39:-;15442:13;15504:5;15512:1;15504:9;15492:1;:8;:21;;15471:105;;;;;;;;;;;;;;;;-1:-1:-1;;15632:2:39;15625:10;15619:17;15775:66;15763:79;;15327:554::o;5119:3574:5:-;5390:35;;:::i;:::-;5536:25;6109:35;;:::i;:::-;7033:45;;:::i;:::-;7318:38;;:::i;:::-;5564:50;5585:6;5592:1;5585:9;;;;;;;;;5564:50;5856:15;5829:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5536:78;;-1:-1:-1;5829:42:5;;5856:15;5829:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;5836:1;5829:9;;;;;;;;;;;;;;;;;;;:24;;:42;6187:9;;;6158:39;;;6187:9;;6158:39;6154:2304;;;6232:124;6270:6;6294:10;6322:20;6232;:124::i;:::-;6480:39;;6213:143;;-1:-1:-1;6480:63:5;-1:-1:-1;6480:63:5;6455:144;;;;;;;;;;;;;;6613:50;6628:16;6646;6613:14;:50::i;:::-;6702:244;6745:79;6753:16;:39;;;6794:16;:29;;;6745:7;:79::i;:::-;6859:39;;6702:21;:244::i;:::-;6677:325;;;;;;;;;;;;;;;;6154:2304;;;7081:55;7107:6;7115:20;7081:25;:55::i;:::-;7033:103;;7196:1;7154:26;:39;;;:43;7150:573;;;7359:165;7401:9;7432:13;7467:26;:39;;;7359:20;:165::i;:::-;7584:42;;;;;7542:39;;;:84;7676:32;;;;;7644:29;;;:64;7318:206;-1:-1:-1;7150:573:5;7841:8;;:128;;;;;:8;;;;;:24;;:128;;7883:6;;7907:20;;7945:10;;7841:128;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7841:128:5;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7841:128:5;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;7841:128:5;;;;;;;;;8008:39;;7822:147;;-1:-1:-1;8008:63:5;;7983:144;;;;;;;;;;;;;;8141:50;8156:16;8174;8141:14;:50::i;:::-;8230:161;8273:16;:39;;;8334:16;:39;;;8230:21;:161::i;:::-;8205:242;;;;;;;;;;;;;;;;8522:131;8549:17;8580:10;8604:16;:39;;;8522:13;:131::i;9238:2212::-;9471:35;;:::i;:::-;9522:25;9557:20;9603:38;9686:9;10365:38;;:::i;:::-;10729:35;;:::i;:::-;9580:6;:13;9557:36;;9658:12;9644:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;9644:27:5;;9603:68;;9698:1;9686:13;;9681:543;9705:12;9701:1;:16;9681:543;;;9791:46;9799:17;9818:6;9825:1;9818:9;;;;;;;;;;;;;;;;;;:18;;;9791:7;:46::i;:::-;10065:15;10038:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9771:66;;-1:-1:-1;10038:42:5;;10065:15;10038:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;10045:1;10038:9;;;;;;;;;;;;;;;;;;;:24;;:42;10187:9;;:6;;10194:1;;10187:9;;;;;;;;;;;;;;:26;;;10160:21;10182:1;10160:24;;;;;;;;;;;;;;;;;;:53;9719:3;;;;;9681:543;;;10257:1;10237:17;:21;10233:487;;;10406:127;10444:9;10471:13;10502:17;10406:20;:127::i;:::-;10579:32;;;;;10547:29;;;:64;10667:42;;;;;10625:39;;;:84;10365:168;-1:-1:-1;10233:487:5;10767:8;;:119;;;;;:8;;;;;:30;;:119;;10811:6;;10831:21;;10866:10;;10767:119;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10767:119:5;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10767:119:5;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;10767:119:5;;;;;;;;;10729:157;;10896:50;10911:16;10929;10896:14;:50::i;:::-;10977:149;11016:16;:39;;;11073:16;:39;;;10977:21;:149::i;:::-;10956:218;;;;;;;;;;;;;;;;11257:1;11253:5;;11248:163;11264:12;11260:1;:16;11248:163;;;11297:103;11334:6;11341:1;11334:9;;;;;;;;;;;;;;;;;;:24;;;11376:10;11297:19;:103::i;:::-;11278:3;;;;;11248:163;;;9238:2212;;;;;;;;;;;;:::o;2769:777:8:-;3200:20;3353:24;3076:1;3056:17;:21;3052:488;;;3093:11;;:39;;;;;:11;;;;;:20;;:39;;3114:17;;3093:39;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3093:39:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3093:39:8;;;;3223:116;3250:14;3282:13;3313:12;3223:9;:116::i;:::-;3200:139;;3380:40;3388:17;3407:12;3380:7;:40::i;:::-;3353:67;;3457:1;3438:16;:20;3434:96;;;3478:37;;:10;;:37;;;;;3498:16;;3478:37;;;;3498:16;3478:10;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3478:37:8;3434:96;2769:777;;;;;;:::o;570:166:42:-;650:7;682:5;;;704:6;;;;697:14;;;4159:384:8;4291:4;;4342:138;1047:4;899:5;4451:19;4342:16;:138::i;:::-;4497:39;;;;;4159:384;-1:-1:-1;;;4159:384:8:o;2936:734:4:-;3103:35;;:::i;:::-;3159:9;3212:37;3336:35;;:::i;:::-;3171:1;3159:13;;3154:477;3178:6;:13;3174:1;:17;3154:477;;;3252:70;3260:20;3282:16;:39;;;3252:7;:70::i;:::-;3212:110;;3374:62;3395:6;3402:1;3395:9;;;;;;;;;3374:62;3336:100;;3450:50;3465:16;3483;3450:14;:50::i;:::-;3561:20;3518:16;:39;;;:63;3514:107;;;3601:5;;3514:107;3193:3;;;;;3154:477;;1819:2046:6;1994:35;;:::i;:::-;2050:9;2374:29;2663:31;3083:35;;:::i;:::-;2062:1;2050:13;;2045:1781;2069:6;:13;2065:1;:17;2045:1781;;;2223:14;2196:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2223:14;2196:41;;2223:14;2196:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;2203:1;2196:9;;;;;;;;;;;;;;;;;;;;:24;;:41;;;;2278:15;2251:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2278:15;2251:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;2258:1;2251:9;;;;;;;;;;;;;;;;;;;:24;;:42;2428:39;;2406:62;;2414:12;;2406:7;:62::i;:::-;2374:94;;2697:219;2731:6;2738:1;2731:9;;;;;;;;;;;;;;;;;;:26;;;2775:55;2783:6;2790:1;2783:9;;;;;;;;;;;;;;;;;;:26;;;2811:6;2818:1;2811:9;;;;;;;;;2697:219;3121:8;;3157:9;;2663:253;;-1:-1:-1;3121:8:6;;;:18;;3157:6;;3164:1;;3157:9;;;;;;;;;;;;;;3184:35;3192:23;3217:1;3184:7;:35::i;:::-;3237:10;3248:1;3237:13;;;;;;;;;;;;;;;;;;3121:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3121:143:6;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3121:143:6;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3121:143:6;;;;;;;;;3083:181;;3409:79;3417:16;:39;;;3458:16;:29;;;3409:7;:79::i;:::-;3367:121;;3572:50;3587:16;3367;3572:14;:50::i;:::-;3721:39;;:55;-1:-1:-1;3717:99:6;;3796:5;;3717:99;2084:3;;;;;2045:1781;;;1819:2046;;;;;;;;;:::o;84:180:42:-;164:7;196:5;;;218:6;;;:20;;;237:1;232;228;:5;;;;;;;;:10;218:20;211:28;;;;;270:142;350:7;373:6;386:1;382;:5;;;;;;;;;270:142;-1:-1:-1;;;;270:142:42:o;1161:135::-;1246:7;1280:1;1276;:5;:13;;1288:1;1276:13;;;-1:-1:-1;1284:1:42;;1269:20;-1:-1:-1;1161:135:42:o;1343:467:3:-;1491:13;;1595:25;1507;:9;1529:2;1507:25;:21;:25;:::i;:::-;1491:41;-1:-1:-1;1560:25:3;:9;1582:2;1560:25;:21;:25;:::i;:::-;1542:43;-1:-1:-1;1623:34:3;:9;1653:3;1623:34;:29;:34;:::i;:::-;1667:136;;;;;1595:62;;-1:-1:-1;1667:36:3;;;;;;:136;;1725:4;;1744:2;;1760:7;;1595:62;;1667:136;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1667:136:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1667:136:3;;;;1343:467;;;;;:::o;14467:195:39:-;14588:14;14633:21;14645:1;14648:5;14633:11;:21::i;16204:672::-;16333:19;16407:25;16435:21;16447:1;16450:5;16435:11;:21::i;:::-;16407:49;;16475:2;16466:11;;;;16611:17;16603:5;:25;16591:1;:8;:37;;16570:132;;;;;;;;;;;;;;;;-1:-1:-1;;16824:13:39;;16204:672::o;13049:490::-;13170:14;13233:5;13241:2;13233:10;13221:1;:8;:22;;13200:107;;;;;;;;;;;;;;;;-1:-1:-1;13486:13:39;13388:2;13486:13;13480:20;;13049:490::o;816:1324:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;816:1324:0;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;130:122;;208:39;239:6;233:13;208:39;;275:693;;390:4;378:17;;374:27;-1:-1;364:2;;415:1;412;405:12;364:2;452:6;439:20;474:85;489:69;551:6;489:69;;;474:85;;;587:21;;;631:4;619:17;;;;465:94;;-1:-1;644:14;;619:17;739:1;724:238;749:6;746:1;743:13;724:238;;;832:3;819:17;811:6;807:30;856:42;894:3;882:10;856:42;;;844:55;;-1:-1;922:4;913:14;;;;941;;;;;771:1;764:9;724:238;;1008:735;;1137:4;1125:17;;1121:27;-1:-1;1111:2;;1162:1;1159;1152:12;1111:2;1199:6;1186:20;1221:99;1236:83;1312:6;1236:83;;1221:99;1348:21;;;1392:4;1380:17;;;;1212:108;;-1:-1;1405:14;;1380:17;1500:1;1485:252;1510:6;1507:1;1504:13;1485:252;;;1593:3;1580:17;1572:6;1568:30;1617:56;1669:3;1657:10;1617:56;;;1605:69;;-1:-1;1697:4;1688:14;;;;1716;;;;;1532:1;1525:9;1485:252;;1751:116;;1826:36;1854:6;1848:13;1826:36;;1874:122;;1952:39;1983:6;1977:13;1952:39;;2003:116;;2069:45;2106:6;2093:20;2069:45;;2127:432;;2217:4;2205:17;;2201:27;-1:-1;2191:2;;2242:1;2239;2232:12;2191:2;2279:6;2266:20;2301:60;2316:44;2353:6;2316:44;;2301:60;2292:69;;2381:6;2374:5;2367:21;2417:4;2409:6;2405:17;2450:4;2443:5;2439:16;2485:3;2476:6;2471:3;2467:16;2464:25;2461:2;;;2502:1;2499;2492:12;2461:2;2512:41;2546:6;2541:3;2536;2512:41;;3056:865;;3185:4;3173:9;3168:3;3164:19;3160:30;3157:2;;;3203:1;3200;3193:12;3157:2;3221:20;3236:4;3221:20;;;3212:29;-1:-1;3309:1;3340:60;3396:3;3376:9;3340:60;;;3316:85;;-1:-1;3480:2;3513:60;3569:3;3545:22;;;3513:60;;;3506:4;3499:5;3495:16;3488:86;3422:163;3643:2;3676:60;3732:3;3723:6;3712:9;3708:22;3676:60;;;3669:4;3662:5;3658:16;3651:86;3595:153;3806:2;3839:60;3895:3;3886:6;3875:9;3871:22;3839:60;;;3832:4;3825:5;3821:16;3814:86;3758:153;3151:770;;;;;3960:689;;4087:4;4075:9;4070:3;4066:19;4062:30;4059:2;;;4105:1;4102;4095:12;4059:2;4123:20;4138:4;4123:20;;;4114:29;-1:-1;4200:1;4231:58;4285:3;4265:9;4231:58;;;4207:83;;-1:-1;4356:2;4389:60;4445:3;4421:22;;;4389:60;;;4382:4;4375:5;4371:16;4364:86;4311:150;4534:2;4567:60;4623:3;4614:6;4603:9;4599:22;4567:60;;;4560:4;4553:5;4549:16;4542:86;4471:168;4053:596;;;;;4684:2205;;4792:5;4780:9;4775:3;4771:19;4767:31;4764:2;;;4811:1;4808;4801:12;4764:2;4829:21;4844:5;4829:21;;;4820:30;-1:-1;4908:1;4939:49;4984:3;4964:9;4939:49;;;4915:74;;-1:-1;5058:2;5091:49;5136:3;5112:22;;;5091:49;;;5084:4;5077:5;5073:16;5066:75;5010:142;5217:2;5250:49;5295:3;5286:6;5275:9;5271:22;5250:49;;;5243:4;5236:5;5232:16;5225:75;5162:149;5370:2;5403:49;5448:3;5439:6;5428:9;5424:22;5403:49;;;5396:4;5389:5;5385:16;5378:75;5321:143;5526:3;5560:49;5605:3;5596:6;5585:9;5581:22;5560:49;;;5553:4;5546:5;5542:16;5535:75;5474:147;5683:3;5717:49;5762:3;5753:6;5742:9;5738:22;5717:49;;;5710:4;5703:5;5699:16;5692:75;5631:147;5832:3;5866:49;5911:3;5902:6;5891:9;5887:22;5866:49;;;5859:4;5852:5;5848:16;5841:75;5788:139;5981:3;6015:49;6060:3;6051:6;6040:9;6036:22;6015:49;;;6008:4;6001:5;5997:16;5990:75;5937:139;6143:3;6178:49;6223:3;6214:6;6203:9;6199:22;6178:49;;;6170:5;6163;6159:17;6152:76;6086:153;6289:3;6324:49;6369:3;6360:6;6349:9;6345:22;6324:49;;;6316:5;6309;6305:17;6298:76;6249:136;6473:3;6462:9;6458:19;6445:33;6498:18;6490:6;6487:30;6484:2;;;6530:1;6527;6520:12;6484:2;6566:54;6616:3;6607:6;6596:9;6592:22;6566:54;;;6558:5;6551;6547:17;6540:81;6395:237;6720:3;6709:9;6705:19;6692:33;6745:18;6737:6;6734:30;6731:2;;;6777:1;6774;6767:12;6731:2;6813:54;6863:3;6854:6;6843:9;6839:22;6813:54;;;6805:5;6798;6794:17;6787:81;6642:237;4758:2131;;;;;6896:116;;6962:45;6999:6;6986:20;6962:45;;7019:118;;7086:46;7124:6;7111:20;7086:46;;7273:118;;7349:37;7378:6;7372:13;7349:37;;7398:241;;7502:2;7490:9;7481:7;7477:23;7473:32;7470:2;;;7518:1;7515;7508:12;7470:2;7553:1;7570:53;7615:7;7595:9;7570:53;;7646:263;;7761:2;7749:9;7740:7;7736:23;7732:32;7729:2;;;7777:1;7774;7767:12;7729:2;7812:1;7829:64;7885:7;7865:9;7829:64;;7916:721;;;;;8080:3;8068:9;8059:7;8055:23;8051:33;8048:2;;;8097:1;8094;8087:12;8048:2;8132:1;8149:53;8194:7;8174:9;8149:53;;;8139:63;;8111:97;8239:2;8257:53;8302:7;8293:6;8282:9;8278:22;8257:53;;;8247:63;;8218:98;8347:2;8365:53;8410:7;8401:6;8390:9;8386:22;8365:53;;;8355:63;;8326:98;8483:2;8472:9;8468:18;8455:32;8507:18;8499:6;8496:30;8493:2;;;8539:1;8536;8529:12;8493:2;8559:62;8613:7;8604:6;8593:9;8589:22;8559:62;;;8549:72;;8434:193;8042:595;;;;;;;;8644;;;;8791:2;8779:9;8770:7;8766:23;8762:32;8759:2;;;8807:1;8804;8797:12;8759:2;8842:1;8859:53;8904:7;8884:9;8859:53;;;8849:63;;8821:97;8949:2;8967:53;9012:7;9003:6;8992:9;8988:22;8967:53;;;8957:63;;8928:98;9085:2;9074:9;9070:18;9057:32;9109:18;9101:6;9098:30;9095:2;;;9141:1;9138;9131:12;9095:2;9161:62;9215:7;9206:6;9195:9;9191:22;9161:62;;;9151:72;;9036:193;8753:486;;;;;;9246:1507;;;;;;;9582:3;9570:9;9561:7;9557:23;9553:33;9550:2;;;9599:1;9596;9589:12;9550:2;9634:31;;9685:18;9674:30;;9671:2;;;9717:1;9714;9707:12;9671:2;9737:97;9826:7;9817:6;9806:9;9802:22;9737:97;;;9727:107;;9613:227;9899:2;9888:9;9884:18;9871:32;9923:18;9915:6;9912:30;9909:2;;;9955:1;9952;9945:12;9909:2;9975:83;10050:7;10041:6;10030:9;10026:22;9975:83;;;9965:93;;9850:214;10123:2;10112:9;10108:18;10095:32;10147:18;10139:6;10136:30;10133:2;;;10179:1;10176;10169:12;10133:2;10199:97;10288:7;10279:6;10268:9;10264:22;10199:97;;;10189:107;;10074:228;10361:2;10350:9;10346:18;10333:32;10385:18;10377:6;10374:30;10371:2;;;10417:1;10414;10407:12;10371:2;10437:83;10512:7;10503:6;10492:9;10488:22;10437:83;;;10427:93;;10312:214;10557:3;10576:52;10620:7;10611:6;10600:9;10596:22;10576:52;;;10566:62;;10536:98;10665:3;10684:53;10729:7;10720:6;10709:9;10705:22;10684:53;;;10674:63;;10644:99;9544:1209;;;;;;;;;10760:1633;;;;;;;;11113:3;11101:9;11092:7;11088:23;11084:33;11081:2;;;11130:1;11127;11120:12;11081:2;11165:31;;11216:18;11205:30;;11202:2;;;11248:1;11245;11238:12;11202:2;11268:97;11357:7;11348:6;11337:9;11333:22;11268:97;;;11258:107;;11144:227;11430:2;11419:9;11415:18;11402:32;11454:18;11446:6;11443:30;11440:2;;;11486:1;11483;11476:12;11440:2;11506:83;11581:7;11572:6;11561:9;11557:22;11506:83;;;11496:93;;11381:214;11654:2;11643:9;11639:18;11626:32;11678:18;11670:6;11667:30;11664:2;;;11710:1;11707;11700:12;11664:2;11730:97;11819:7;11810:6;11799:9;11795:22;11730:97;;;11720:107;;11605:228;11892:2;11881:9;11877:18;11864:32;11916:18;11908:6;11905:30;11902:2;;;11948:1;11945;11938:12;11902:2;11968:83;12043:7;12034:6;12023:9;12019:22;11968:83;;;11958:93;;11843:214;12088:3;12107:53;12152:7;12143:6;12132:9;12128:22;12107:53;;;12097:63;;12067:99;12197:3;12216:52;12260:7;12251:6;12240:9;12236:22;12216:52;;;12206:62;;12176:98;12305:3;12324:53;12369:7;12360:6;12349:9;12345:22;12324:53;;;12314:63;;12284:99;11075:1318;;;;;;;;;;;12400:540;;;12565:2;12553:9;12544:7;12540:23;12536:32;12533:2;;;12581:1;12578;12571:12;12533:2;12616:31;;12667:18;12656:30;;12653:2;;;12699:1;12696;12689:12;12653:2;12719:97;12808:7;12799:6;12788:9;12784:22;12719:97;;;12709:107;;12595:227;12853:2;12871:53;12916:7;12907:6;12896:9;12892:22;12871:53;;;12861:63;;12832:98;12527:413;;;;;;12947:257;;13059:2;13047:9;13038:7;13034:23;13030:32;13027:2;;;13075:1;13072;13065:12;13027:2;13110:1;13127:61;13180:7;13160:9;13127:61;;13211:239;;13314:2;13302:9;13293:7;13289:23;13285:32;13282:2;;;13330:1;13327;13320:12;13282:2;13365:1;13382:52;13426:7;13406:9;13382:52;;13457:322;;13601:3;13589:9;13580:7;13576:23;13572:33;13569:2;;;13618:1;13615;13608:12;13569:2;13653:1;13670:93;13755:7;13735:9;13670:93;;13786:317;;13928:2;13916:9;13907:7;13903:23;13899:32;13896:2;;;13944:1;13941;13934:12;13896:2;13979:1;13996:91;14079:7;14059:9;13996:91;;14110:110;14183:31;14208:5;14183:31;;;14178:3;14171:44;14165:55;;;14254:766;;14399:59;14452:5;14399:59;;;14476:6;14471:3;14464:19;14500:4;14495:3;14491:14;14484:21;;14548:3;14590:4;14582:6;14578:17;14573:3;14569:27;14616:61;14671:5;14616:61;;;14698:1;14683:298;14708:6;14705:1;14702:13;14683:298;;;14770:9;14764:4;14760:20;14755:3;14748:33;14796:68;14859:4;14850:6;14844:13;14796:68;;;14788:76;;14881:65;14939:6;14881:65;;;14969:4;14960:14;;;;;14871:75;-1:-1;14730:1;14723:9;14683:298;;;-1:-1;14994:4;;14378:642;-1:-1;;;;;;14378:642;15087:864;;15260:73;15327:5;15260:73;;;15351:6;15346:3;15339:19;15375:4;15370:3;15366:14;15359:21;;15423:3;15465:4;15457:6;15453:17;15448:3;15444:27;15491:75;15560:5;15491:75;;;15587:1;15572:340;15597:6;15594:1;15591:13;15572:340;;;15659:9;15653:4;15649:20;15644:3;15637:33;15685:96;15776:4;15767:6;15761:13;15685:96;;;15677:104;;15798:79;15870:6;15798:79;;;15900:4;15891:14;;;;;15788:89;-1:-1;15619:1;15612:9;15572:340;;15990:590;;16125:54;16173:5;16125:54;;;16197:6;16192:3;16185:19;16221:4;16216:3;16212:14;16205:21;;16266:56;16316:5;16266:56;;;16343:1;16328:230;16353:6;16350:1;16347:13;16328:230;;;16393:53;16442:3;16433:6;16427:13;16393:53;;;16463:60;16516:6;16463:60;;;16546:4;16537:14;;;;;16453:70;-1:-1;16375:1;16368:9;16328:230;;;-1:-1;16571:3;;16104:476;-1:-1;;;;16104:476;16588:107;16659:30;16683:5;16659:30;;16702:297;;16802:38;16834:5;16802:38;;;16857:6;16852:3;16845:19;16869:63;16925:6;16918:4;16913:3;16909:14;16902:4;16895:5;16891:16;16869:63;;;16964:29;16986:6;16964:29;;;16944:50;;;16957:4;16944:50;;16782:217;-1:-1;;;16782:217;17303:397;17458:2;17446:15;;17495:66;17490:2;17481:12;;17474:88;17596:66;17591:2;17582:12;;17575:88;17691:2;17682:12;;17439:261;17709:296;17864:2;17852:15;;17901:66;17896:2;17887:12;;17880:88;17996:2;17987:12;;17845:160;18014:397;18169:2;18157:15;;18206:66;18201:2;18192:12;;18185:88;18307:66;18302:2;18293:12;;18286:88;18402:2;18393:12;;18150:261;18420:296;18575:2;18563:15;;18612:66;18607:2;18598:12;;18591:88;18707:2;18698:12;;18556:160;18725:397;18880:2;18868:15;;18917:66;18912:2;18903:12;;18896:88;19018:66;19013:2;19004:12;;18997:88;19113:2;19104:12;;18861:261;19131:296;19286:2;19274:15;;19323:66;19318:2;19309:12;;19302:88;19418:2;19409:12;;19267:160;19436:296;19591:2;19579:15;;19628:66;19623:2;19614:12;;19607:88;19723:2;19714:12;;19572:160;19741:296;19896:2;19884:15;;19933:66;19928:2;19919:12;;19912:88;20028:2;20019:12;;19877:160;20046:296;20201:2;20189:15;;20238:66;20233:2;20224:12;;20217:88;20333:2;20324:12;;20182:160;20351:397;20506:2;20494:15;;20543:66;20538:2;20529:12;;20522:88;20644:66;20639:2;20630:12;;20623:88;20739:2;20730:12;;20487:261;20757:296;20912:2;20900:15;;20949:66;20944:2;20935:12;;20928:88;21044:2;21035:12;;20893:160;21062:397;21217:2;21205:15;;21254:66;21249:2;21240:12;;21233:88;21355:66;21350:2;21341:12;;21334:88;21450:2;21441:12;;21198:261;21544:888;21772:22;;21685:4;21676:14;;;21806:61;21680:3;21772:22;21806:61;;;21705:174;21973:4;21966:5;21962:16;21956:23;21991:62;22047:4;22042:3;22038:14;22025:11;21991:62;;;21889:176;22149:4;22142:5;22138:16;22132:23;22167:62;22223:4;22218:3;22214:14;22201:11;22167:62;;;22075:166;22325:4;22318:5;22314:16;22308:23;22343:62;22399:4;22394:3;22390:14;22377:11;22343:62;;22492:2419;22707:22;;22492:2419;;22629:5;22620:15;;;22741:61;22624:3;22707:22;22741:61;;;22650:164;22898:4;22891:5;22887:16;22881:23;22916:62;22972:4;22967:3;22963:14;22950:11;22916:62;;;22824:166;23081:4;23074:5;23070:16;23064:23;23099:62;23155:4;23150:3;23146:14;23133:11;23099:62;;;23000:173;23258:4;23251:5;23247:16;23241:23;23276:62;23332:4;23327:3;23323:14;23310:11;23276:62;;;23183:167;23438:4;23431:5;23427:16;23421:23;23456:62;23512:4;23507:3;23503:14;23490:11;23456:62;;;23360:170;23618:4;23611:5;23607:16;23601:23;23636:62;23692:4;23687:3;23683:14;23670:11;23636:62;;;23540:170;23790:4;23783:5;23779:16;23773:23;23808:62;23864:4;23859:3;23855:14;23842:11;23808:62;;;23720:162;23962:4;23955:5;23951:16;23945:23;23980:62;24036:4;24031:3;24027:14;24014:11;23980:62;;;23892:162;24147:5;24140;24136:17;24130:24;24166:63;24222:5;24217:3;24213:15;24200:11;24166:63;;;24064:177;24317:5;24310;24306:17;24300:24;24336:63;24392:5;24387:3;24383:15;24370:11;24336:63;;;24251:160;24497:5;24490;24486:17;24480:24;24550:3;24544:4;24540:14;24532:5;24527:3;24523:15;24516:39;24570:66;24631:4;24618:11;24570:66;;;24562:74;;24421:227;24734:5;24727;24723:17;24717:24;24787:3;24781:4;24777:14;24769:5;24764:3;24760:15;24753:39;24807:66;24868:4;24855:11;24807:66;;;24799:74;22602:2309;-1:-1;;;;;22602:2309;27393:107;27464:30;27488:5;27464:30;;27507:110;27580:31;27605:5;27580:31;;27624:193;27732:2;27717:18;;27746:61;27721:9;27780:6;27746:61;;27824:581;28034:3;28019:19;;28049:61;28023:9;28083:6;28049:61;;;28121:62;28179:2;28168:9;28164:18;28155:6;28121:62;;;28194;28252:2;28241:9;28237:18;28228:6;28194:62;;;28304:9;28298:4;28294:20;28289:2;28278:9;28274:18;28267:48;28329:66;28390:4;28381:6;28329:66;;;28321:74;28005:400;-1:-1;;;;;;28005:400;28412:294;28548:2;28533:18;;28562:61;28537:9;28596:6;28562:61;;;28634:62;28692:2;28681:9;28677:18;28668:6;28634:62;;28713:935;29075:2;29089:47;;;29060:18;;29150:136;29060:18;29272:6;29150:136;;;29142:144;;29334:9;29328:4;29324:20;29319:2;29308:9;29304:18;29297:48;29359:98;29452:4;29443:6;29359:98;;;29351:106;;29505:9;29499:4;29495:20;29490:2;29479:9;29475:18;29468:48;29530:108;29633:4;29624:6;29530:108;;29655:787;29967:2;29981:47;;;29952:18;;30042:136;29952:18;30164:6;30042:136;;;30034:144;;30189:62;30247:2;30236:9;30232:18;30223:6;30189:62;;;30299:9;30293:4;30289:20;30284:2;30273:9;30269:18;30262:48;30324:108;30427:4;30418:6;30324:108;;30449:189;30555:2;30540:18;;30569:59;30544:9;30601:6;30569:59;;30645:387;30826:2;30840:47;;;30811:18;;30901:121;30811:18;30901:121;;31039:387;31220:2;31234:47;;;31205:18;;31295:121;31205:18;31295:121;;31433:387;31614:2;31628:47;;;31599:18;;31689:121;31599:18;31689:121;;31827:387;32008:2;32022:47;;;31993:18;;32083:121;31993:18;32083:121;;32221:387;32402:2;32416:47;;;32387:18;;32477:121;32387:18;32477:121;;32615:387;32796:2;32810:47;;;32781:18;;32871:121;32781:18;32871:121;;33009:387;33190:2;33204:47;;;33175:18;;33265:121;33175:18;33265:121;;33403:387;33584:2;33598:47;;;33569:18;;33659:121;33569:18;33659:121;;33797:387;33978:2;33992:47;;;33963:18;;34053:121;33963:18;34053:121;;34191:387;34372:2;34386:47;;;34357:18;;34447:121;34357:18;34447:121;;34585:387;34766:2;34780:47;;;34751:18;;34841:121;34751:18;34841:121;;34979:387;35160:2;35174:47;;;35145:18;;35235:121;35145:18;35235:121;;35373:310;35539:3;35524:19;;35554:119;35528:9;35646:6;35554:119;;35690:333;35844:2;35858:47;;;35829:18;;35919:94;35829:18;35999:6;35919:94;;36030:603;36250:2;36264:47;;;36235:18;;36325:90;36235:18;36401:6;36325:90;;;36317:98;;36426:62;36484:2;36473:9;36469:18;36460:6;36426:62;;;36536:9;36530:4;36526:20;36521:2;36510:9;36506:18;36499:48;36561:62;36618:4;36609:6;36561:62;;36640:189;36746:2;36731:18;;36760:59;36735:9;36792:6;36760:59;;36836:193;36944:2;36929:18;;36958:61;36933:9;36992:6;36958:61;;37036:256;37098:2;37092:9;37124:17;;;37199:18;37184:34;;37220:22;;;37181:62;37178:2;;;37256:1;37253;37246:12;37178:2;37272;37265:22;37076:216;;-1:-1;37076:216;37299:263;;37463:18;37455:6;37452:30;37449:2;;;37495:1;37492;37485:12;37449:2;-1:-1;37524:4;37512:17;;;37542:15;;37386:176;37853:254;;37992:18;37984:6;37981:30;37978:2;;;38024:1;38021;38014:12;37978:2;-1:-1;38097:4;38068;38045:17;;;;38064:9;38041:33;38087:15;;37915:192;38381:126;38495:4;38483:17;;38464:43;38799:112;38894:12;;38878:33;39774:128;39854:42;39843:54;;39826:76;39909:151;39988:66;39977:78;;39960:100;40067:91;40146:6;40135:18;;40118:40;40165:79;40234:5;40217:27;40386:92;40459:13;40452:21;;40435:43;40913:88;40991:4;40980:16;;40963:38;41009:145;41090:6;41085:3;41080;41067:30;-1:-1;41146:1;41128:16;;41121:27;41060:94;41163:268;41228:1;41235:101;41249:6;41246:1;41243:13;41235:101;;;41316:11;;;41310:18;41297:11;;;41290:39;41271:2;41264:10;41235:101;;;41351:6;41348:1;41345:13;41342:2;;;-1:-1;;41416:1;41398:16;;41391:27;41212:219;41439:97;41527:2;41507:14;41523:7;41503:28;;41487:49" + "object": "0x6080604052600436106100a35763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663150b7a0281146100ff578063169645f2146101355780631c5b1ec41461015557806320472cf714610175578063725cef0614610197578063b3cd4254146101aa578063bc063e1a146101bf578063c5e6e6ac146101d4578063e58e9c16146101f4578063f0b9e5ba14610214575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e71565b60405180910390fd5b005b34801561010b57600080fd5b5061011f61011a36600461248a565b610234565b60405161012c9190612e63565b60405180910390f35b610148610143366004612568565b610294565b60405161012c9190612f31565b34801561016157600080fd5b50610148610170366004612749565b610560565b34801561018157600080fd5b5061018a610626565b60405161012c9190612f82565b6101486101a536600461264e565b61062c565b3480156101b657600080fd5b5061018a6109fa565b3480156101cb57600080fd5b5061018a610a00565b3480156101e057600080fd5b506101486101ef366004612749565b610a06565b34801561020057600080fd5b5061014861020f366004612749565b610a79565b34801561022057600080fd5b5061011f61022f366004612503565b610b76565b604080517f6f6e455243373231526563656976656428616464726573732c6164647265737381527f2c75696e743235362c62797465732900000000000000000000000000000000006020820152905190819003602f019020949350505050565b61029c6120ed565b34600080808084116102da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b6102e5848888610bd6565b92506102f18484610ca4565b9150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561037957600080fd5b505af115801561038d573d6000803e3d6000fd5b50505050506103ba8b60008151811015156103a457fe5b9060200190602002015161014001516010610ceb565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529394508301828280156104605780601f1061043557610100808354040283529160200191610460565b820191906000526020600020905b81548152906001019060200180831161044357829003601f168201915b50505050508b600081518110151561047457fe5b60209081029091010151610160015260025473ffffffffffffffffffffffffffffffffffffffff828116911614156104b8576104b18b8b84610d4c565b94506104c8565b6104c58b8b8b8b86610e66565b94505b6020850151841015610506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e81565b60208501518214610543576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b61055281338760000151610fee565b505050509695505050505050565b6105686120ed565b60008060006105756120ed565b600093505b865184101561061c57610591868660000151610ca4565b92506105d487858151811015156105a457fe5b9060200190602002015160a0015188868151811015156105c057fe5b9060200190602002015160800151856111c8565b91506105f787858151811015156105e757fe5b90602001906020020151836111e5565b9050610603858261132e565b84518614156106115761061c565b60019093019261057a565b5050505092915050565b61251c81565b6106346120ed565b346000808211610670576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b600086116106aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b6106d28a60008151811015156106bc57fe5b9060200190602002015161014001516000611390565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190209091507fffffffff00000000000000000000000000000000000000000000000000000000808316911614806107b45750604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff000000000000000000000000000000000000000000000000000000008281169116145b15156107ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f11565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b5050604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190207fffffffff000000000000000000000000000000000000000000000000000000008581169116141592506108ff915050576108f88a8a8a8a8a6113fd565b9250610992565b604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff00000000000000000000000000000000000000000000000000000000828116911614156109925761098f8a8a8a8a611754565b92505b60208301518210156109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e81565b6109ed6109e1838560200151610ca4565b84602001518787611a56565b5050979650505050505050565b61271081565b6103e881565b610a0e6120ed565b600080610a196120ed565b600092505b8551831015610a7057610a35858560200151610ca4565b9150610a4886848151811015156105e757fe5b9050610a54848261132e565b8484602001511415610a6557610a70565b600190920191610a1e565b50505092915050565b610a816120ed565b6000806000610a8e6120ed565b600093505b865184101561061c57610aaa868660000151610ca4565b9250610b118785815181101515610abd57fe5b9060200190602002015160a00151610b0b8987815181101515610adc57fe5b90602001906020020151608001518a88815181101515610af857fe5b9060200190602002015160e00151610ca4565b856111c8565b9150610b3e8785815181101515610b2457fe5b90602001906020020151610b39846001611b43565b6111e5565b9050610b5281600001518260600151610ca4565b8152610b5e858261132e565b84518611610b6b5761061c565b600190930192610a93565b604080517f6f6e455243373231526563656976656428616464726573732c75696e7432353681527f2c62797465732900000000000000000000000000000000000000000000000000602082015290519081900360270190205b9392505050565b6000808361ffff16118015610c00575073ffffffffffffffffffffffffffffffffffffffff821615155b15610bcf576103e861ffff84161115610c45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ed1565b610c5661ffff8416612710866111c8565b60405190915073ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610c9c573d6000803e3d6000fd5b509392505050565b600082821115610ce0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b508082035b92915050565b600081601401835110151515610d2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f01565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b610d546120ed565b600080546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d980890610daf90889087908990600401612e31565b608060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e01919081019061279a565b9150610e1582600001518360600151610ca4565b9050610e25826000015182611b8d565b1515610e5d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b81529392505050565b610e6e6120ed565b6000610e786120ed565b610e806120ed565b610e886120ed565b859350610e958a87610a06565b9250600083606001511115610f2957610eb388888560600151611baa565b9150610ecc86610ec7888560200151610ca4565b611b8d565b1515610f04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b610f12848360200151610ca4565b606080840151908701526020808401519087015293505b6000546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d980890610f83908d9088908e90600401612e31565b608060405180830381600087803b158015610f9d57600080fd5b505af1158015610fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fd5919081019061279a565b9050610fe1858261132e565b5050505095945050505050565b604080517f7472616e7366657228616464726573732c75696e7432353629000000000000008152905190819003601901812060009173ffffffffffffffffffffffffffffffffffffffff8616919061104c9086908690602401612ddd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931783525181519192909182919080838360005b838110156110f05781810151838201526020016110d8565b50505050905090810190601f16801561111d5780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af19250505080151561116c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ee1565b3d15611189575060003d602014156111895760206000803e506000515b8015156111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ee1565b50505050565b60006111dd6111d78584611ee3565b84611f3e565b949350505050565b6111ed6120ed565b6111f5612116565b600080546040517fc75e0a81000000000000000000000000000000000000000000000000000000008152829173ffffffffffffffffffffffffffffffffffffffff169063c75e0a819061124c908990600401612f3f565b606060405180830381600087803b15801561126657600080fd5b505af115801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061129e91908101906127b8565b805190935060ff166003146112b257610a70565b6112c48660a001518460400151610ca4565b91506112d08583611f55565b9050808460200181815250506112ef818760a0015188608001516111c8565b845260a086015160c08701516113069183916111c8565b604085015260a086015160e08701516113209183916111c8565b606085015250505092915050565b8151815161133c9190611b43565b8252602080830151908201516113529190611b43565b60208301526040808301519082015161136b9190611b43565b6040830152606080830151908201516113849190611b43565b60609092019190915250565b6000816004018351101515156113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f21565b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6114056120ed565b600061140f6120ed565b6114176120ed565b61141f6120ed565b6114318a60008151811015156103a457fe5b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529397508301828280156114d75780601f106114ac576101008083540402835291602001916114d7565b820191906000526020600020905b8154815290600101906020018083116114ba57829003601f168201915b50505050508a60008151811015156114eb57fe5b60209081029091010151610160015260025473ffffffffffffffffffffffffffffffffffffffff858116911614156115c9576115288a8a88611baa565b8051909350861115611566576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b611570858461132e565b61158c61158586600001518760600151611b43565b8651611b8d565b15156115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b611745565b6115d38a87610560565b9150600082606001511115611608576115f188888460600151611baa565b602080820151908701526060808201519087015290505b6000546040517fe5fa431b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e5fa431b90611662908d908a908e90600401612e31565b608060405180830381600087803b15801561167c57600080fd5b505af1158015611690573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116b4919081019061279a565b805190935086146116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b6116fb858461132e565b61170d85602001518460200151611b8d565b1515611745576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b610fe184338560000151610fee565b61175c6120ed565b6000806060600061176b6120ed565b6117736120ed565b8a519450846040519080825280602002602001820160405280156117a1578160200160208202803883390190505b509350600092505b848310156118dd576117d6868c858151811015156117c357fe5b9060200190602002015160e00151611b43565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815293995083018282801561187c5780601f106118515761010080835404028352916020019161187c565b820191906000526020600020905b81548152906001019060200180831161185f57829003601f168201915b50505050508b8481518110151561188f57fe5b6020908102909101015161016001528a518b90849081106118ac57fe5b9060200190602002015160a0015184848151811015156118c857fe5b602090810290910101526001909201916117a9565b6000861115611908576118f1898988611baa565b606080820151908901526020808201519089015291505b6000546040517f4d0ae54600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690634d0ae54690611962908e9088908f90600401612df8565b608060405180830381600087803b15801561197c57600080fd5b505af1158015611990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119b4919081019061279a565b90506119c0878261132e565b6119d287602001518260200151611b8d565b1515611a0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b600092505b84831015611a4857611a3d8b84815181101515611a2857fe5b90602001906020020151610140015133611f6b565b600190920191611a0f565b505050505050949350505050565b6000806000861115611b3b576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90611ab8908990600401612f90565b600060405180830381600087803b158015611ad257600080fd5b505af1158015611ae6573d6000803e3d6000fd5b50505050611af5858585610bd6565b9150611b018683610ca4565b90506000811115611b3b57604051339082156108fc029083906000818181858888f19350505050158015611b39573d6000803e3d6000fd5b505b505050505050565b600082820183811015611b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b8091505b5092915050565b600080611b9f61251c612710866111c8565b909210159392505050565b611bb26120ed565b6000806000611bbf6120ed565b600093505b8751841015611ed8576003805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015611c715780601f10611c4657610100808354040283529160200191611c71565b820191906000526020600020905b815481529060010190602001808311611c5457829003601f168201915b50505050508885815181101515611c8457fe5b602090810290910181015161014001919091526004805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600187161502019094169390930492830185900485028101850190915281815292830182828015611d395780601f10611d0e57610100808354040283529160200191611d39565b820191906000526020600020905b815481529060010190602001808311611d1c57829003601f168201915b50505050508885815181101515611d4c57fe5b6020908102909101015161016001528451611d68908790610ca4565b9250611db68885815181101515611d7b57fe5b9060200190602002015160a00151610b0b8a87815181101515611d9a57fe5b90602001906020020151608001518b88815181101515610af857fe5b600054895191935073ffffffffffffffffffffffffffffffffffffffff169063b4be83d5908a9087908110611de757fe5b90602001906020020151611dfc856001611b43565b8a88815181101515611e0a57fe5b906020019060200201516040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611e4e93929190612f50565b608060405180830381600087803b158015611e6857600080fd5b505af1158015611e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ea0919081019061279a565b9050611eb481600001518260600151610ca4565b8152611ec0858261132e565b84518611611ecd57611ed8565b600190930192611bc4565b505050509392505050565b600080831515611ef65760009150611b86565b50828202828482811515611f0657fe5b0414611b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b6000808284811515611f4c57fe5b04949350505050565b6000818310611f645781610bcf565b5090919050565b6000806060611f8185601063ffffffff610ceb16565b9250611f9485602463ffffffff61203b16565b9150611fa785606463ffffffff61204716565b6040517fb88d4fde00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff84169063b88d4fde90612002903090889087908790600401612d99565b600060405180830381600087803b15801561201c57600080fd5b505af1158015612030573d6000803e3d6000fd5b505050505050505050565b6000610bcf83836120a2565b60606000612055848461203b565b905060208301925080830184511015151561209c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e91565b50500190565b6000816020018351101515156120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612eb1565b50016020015190565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610bcf8235613036565b6000601f8201831361215357600080fd5b813561216661216182612fc5565b612f9e565b81815260209384019390925082018360005b8381101561061c578135860161218e888261220d565b8452506020928301929190910190600101612178565b6000601f820183136121b557600080fd5b81356121c361216182612fc5565b81815260209384019390925082018360005b8381101561061c57813586016121eb888261231d565b84525060209283019291909101906001016121d5565b6000610bcf825161307b565b6000601f8201831361221e57600080fd5b813561222c61216182612fe6565b9150808252602083016020830185838301111561224857600080fd5b610a70838284613084565b60006080828403121561226557600080fd5b61226f6080612f9e565b9050600061227d8484612201565b825250602061228e84848301612201565b60208301525060406122a284828501612201565b60408301525060606122b684828501612201565b60608301525092915050565b6000606082840312156122d457600080fd5b6122de6060612f9e565b905060006122ec848461247e565b82525060206122fd84848301612201565b602083015250604061231184828501612201565b60408301525092915050565b6000610180828403121561233057600080fd5b61233b610180612f9e565b905060006123498484612136565b825250602061235a84848301612136565b602083015250604061236e84828501612136565b604083015250606061238284828501612136565b606083015250608061239684828501612472565b60808301525060a06123aa84828501612472565b60a08301525060c06123be84828501612472565b60c08301525060e06123d284828501612472565b60e0830152506101006123e784828501612472565b610100830152506101206123fd84828501612472565b6101208301525061014082013567ffffffffffffffff81111561241f57600080fd5b61242b8482850161220d565b6101408301525061016082013567ffffffffffffffff81111561244d57600080fd5b6124598482850161220d565b6101608301525092915050565b6000610bcf8235613074565b6000610bcf823561307b565b6000610bcf825161307e565b600080600080608085870312156124a057600080fd5b60006124ac8787612136565b94505060206124bd87828801612136565b93505060406124ce87828801612472565b925050606085013567ffffffffffffffff8111156124eb57600080fd5b6124f78782880161220d565b91505092959194509250565b60008060006060848603121561251857600080fd5b60006125248686612136565b935050602061253586828701612472565b925050604084013567ffffffffffffffff81111561255257600080fd5b61255e8682870161220d565b9150509250925092565b60008060008060008060c0878903121561258157600080fd5b863567ffffffffffffffff81111561259857600080fd5b6125a489828a016121a4565b965050602087013567ffffffffffffffff8111156125c157600080fd5b6125cd89828a01612142565b955050604087013567ffffffffffffffff8111156125ea57600080fd5b6125f689828a016121a4565b945050606087013567ffffffffffffffff81111561261357600080fd5b61261f89828a01612142565b935050608061263089828a01612466565b92505060a061264189828a01612136565b9150509295509295509295565b600080600080600080600060e0888a03121561266957600080fd5b873567ffffffffffffffff81111561268057600080fd5b61268c8a828b016121a4565b975050602088013567ffffffffffffffff8111156126a957600080fd5b6126b58a828b01612142565b965050604088013567ffffffffffffffff8111156126d257600080fd5b6126de8a828b016121a4565b955050606088013567ffffffffffffffff8111156126fb57600080fd5b6127078a828b01612142565b94505060806127188a828b01612472565b93505060a06127298a828b01612466565b92505060c061273a8a828b01612136565b91505092959891949750929550565b6000806040838503121561275c57600080fd5b823567ffffffffffffffff81111561277357600080fd5b61277f858286016121a4565b925050602061279085828601612472565b9150509250929050565b6000608082840312156127ac57600080fd5b60006111dd8484612253565b6000606082840312156127ca57600080fd5b60006111dd84846122c2565b6127df81613036565b82525050565b60006127f082613032565b808452602084019350836020820285016128098561302c565b60005b84811015612840578383038852612824838351612907565b925061282f8261302c565b60209890980197915060010161280c565b50909695505050505050565b600061285782613032565b808452602084019350836020820285016128708561302c565b60005b8481101561284057838303885261288b838351612c84565b92506128968261302c565b602098909801979150600101612873565b60006128b282613032565b8084526020840193506128c48361302c565b60005b828110156128f4576128da868351612d90565b6128e38261302c565b6020969096019591506001016128c7565b5093949350505050565b6127df8161304f565b600061291282613032565b808452612926816020860160208601613090565b61292f816130bc565b9093016020019392505050565b602381527f44454641554c545f46554e4354494f4e5f574554485f434f4e54524143545f4f60208201527f4e4c590000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f494e56414c49445f4d53475f56414c5545000000000000000000000000000000602082015260400190565b603081527f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455360208201527f5f4c454e4754485f524551554952454400000000000000000000000000000000604082015260600190565b601781527f56414c55455f475245415445525f5448414e5f5a45524f000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b601881527f4645455f50524f504f5254494f4e5f544f4f5f4c415247450000000000000000602082015260400190565b600f81527f5452414e534645525f4641494c45440000000000000000000000000000000000602082015260400190565b601681527f554e41434345505441424c455f5448524553484f4c4400000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601781527f554e535550504f525445445f544f4b454e5f50524f5859000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b80516080830190612c4b8482612d90565b506020820151612c5e6020850182612d90565b506040820151612c716040850182612d90565b5060608201516111c26060850182612d90565b8051600090610180840190612c9985826127d6565b506020830151612cac60208601826127d6565b506040830151612cbf60408601826127d6565b506060830151612cd260608601826127d6565b506080830151612ce56080860182612d90565b5060a0830151612cf860a0860182612d90565b5060c0830151612d0b60c0860182612d90565b5060e0830151612d1e60e0860182612d90565b50610100830151612d33610100860182612d90565b50610120830151612d48610120860182612d90565b50610140830151848203610140860152612d628282612907565b915050610160830151848203610160860152612d7e8282612907565b95945050505050565b6127df81613074565b6127df8161307b565b60808101612da782876127d6565b612db460208301866127d6565b612dc16040830185612d90565b8181036060830152612dd38184612907565b9695505050505050565b60408101612deb82856127d6565b610bcf6020830184612d90565b60608082528101612e09818661284c565b90508181036020830152612e1d81856128a7565b90508181036040830152612d7e81846127e5565b60608082528101612e42818661284c565b9050612e516020830185612d90565b8181036040830152612d7e81846127e5565b60208101610ce582846128fe565b60208082528101610ce58161293c565b60208082528101610ce581612992565b60208082528101610ce5816129c2565b60208082528101610ce581612a18565b60208082528101610ce581612a48565b60208082528101610ce581612a9e565b60208082528101610ce581612ace565b60208082528101610ce581612afe565b60208082528101610ce581612b2e565b60208082528101610ce581612b5e565b60208082528101610ce581612bb4565b60208082528101610ce581612be4565b60808101610ce58284612c3a565b60208082528101610bcf8184612c84565b60608082528101612f618186612c84565b9050612f706020830185612d90565b8181036040830152612d7e8184612907565b60208101610ce58284612d87565b60208101610ce58284612d90565b60405181810167ffffffffffffffff81118282101715612fbd57600080fd5b604052919050565b600067ffffffffffffffff821115612fdc57600080fd5b5060209081020190565b600067ffffffffffffffff821115612ffd57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b61ffff1690565b90565b60ff1690565b82818337506000910152565b60005b838110156130ab578181015183820152602001613093565b838111156111c25750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820ff5c1e325698909ffd3590166bdff6a2f31ff4394822a4e1b9ea119a6a813e6c6c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x150B7A02 DUP2 EQ PUSH2 0xFF JUMPI DUP1 PUSH4 0x169645F2 EQ PUSH2 0x135 JUMPI DUP1 PUSH4 0x1C5B1EC4 EQ PUSH2 0x155 JUMPI DUP1 PUSH4 0x20472CF7 EQ PUSH2 0x175 JUMPI DUP1 PUSH4 0x725CEF06 EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0xB3CD4254 EQ PUSH2 0x1AA JUMPI DUP1 PUSH4 0xBC063E1A EQ PUSH2 0x1BF JUMPI DUP1 PUSH4 0xC5E6E6AC EQ PUSH2 0x1D4 JUMPI DUP1 PUSH4 0xE58E9C16 EQ PUSH2 0x1F4 JUMPI DUP1 PUSH4 0xF0B9E5BA EQ PUSH2 0x214 JUMPI JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xFD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E71 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11F PUSH2 0x11A CALLDATASIZE PUSH1 0x4 PUSH2 0x248A JUMP JUMPDEST PUSH2 0x234 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2E63 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x148 PUSH2 0x143 CALLDATASIZE PUSH1 0x4 PUSH2 0x2568 JUMP JUMPDEST PUSH2 0x294 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2F31 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x161 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x170 CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0x560 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x181 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0x626 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2F82 JUMP JUMPDEST PUSH2 0x148 PUSH2 0x1A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x264E JUMP JUMPDEST PUSH2 0x62C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0x9FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0xA00 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x1EF CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0xA06 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x200 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x20F CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0xA79 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x220 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11F PUSH2 0x22F CALLDATASIZE PUSH1 0x4 PUSH2 0x2503 JUMP JUMPDEST PUSH2 0xB76 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C61646472657373 DUP2 MSTORE PUSH32 0x2C75696E743235362C6279746573290000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x2F ADD SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x29C PUSH2 0x20ED JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP1 DUP1 DUP5 GT PUSH2 0x2DA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH2 0x2E5 DUP5 DUP9 DUP9 PUSH2 0xBD6 JUMP JUMPDEST SWAP3 POP PUSH2 0x2F1 DUP5 DUP5 PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x379 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x38D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0x3BA DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3A4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x10 PUSH2 0xCEB JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP5 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x460 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x435 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x460 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x443 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x474 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x4B8 JUMPI PUSH2 0x4B1 DUP12 DUP12 DUP5 PUSH2 0xD4C JUMP JUMPDEST SWAP5 POP PUSH2 0x4C8 JUMP JUMPDEST PUSH2 0x4C5 DUP12 DUP12 DUP12 DUP12 DUP7 PUSH2 0xE66 JUMP JUMPDEST SWAP5 POP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP5 LT ISZERO PUSH2 0x506 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E81 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP3 EQ PUSH2 0x543 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x552 DUP2 CALLER DUP8 PUSH1 0x0 ADD MLOAD PUSH2 0xFEE JUMP JUMPDEST POP POP POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x568 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x575 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x61C JUMPI PUSH2 0x591 DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0x5D4 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5A4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5C0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x11C8 JUMP JUMPDEST SWAP2 POP PUSH2 0x5F7 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5E7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 PUSH2 0x11E5 JUMP JUMPDEST SWAP1 POP PUSH2 0x603 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 EQ ISZERO PUSH2 0x611 JUMPI PUSH2 0x61C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x57A JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x251C DUP2 JUMP JUMPDEST PUSH2 0x634 PUSH2 0x20ED JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x670 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH1 0x0 DUP7 GT PUSH2 0x6AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH2 0x6D2 DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6BC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x0 PUSH2 0x1390 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 SWAP1 SWAP2 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP4 AND SWAP2 AND EQ DUP1 PUSH2 0x7B4 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x7EC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F11 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x872 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x886 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 DUP2 AND SWAP2 AND EQ ISZERO SWAP3 POP PUSH2 0x8FF SWAP2 POP POP JUMPI PUSH2 0x8F8 DUP11 DUP11 DUP11 DUP11 DUP11 PUSH2 0x13FD JUMP JUMPDEST SWAP3 POP PUSH2 0x992 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x992 JUMPI PUSH2 0x98F DUP11 DUP11 DUP11 DUP11 PUSH2 0x1754 JUMP JUMPDEST SWAP3 POP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD DUP3 LT ISZERO PUSH2 0x9D0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E81 JUMP JUMPDEST PUSH2 0x9ED PUSH2 0x9E1 DUP4 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP8 DUP8 PUSH2 0x1A56 JUMP JUMPDEST POP POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2710 DUP2 JUMP JUMPDEST PUSH2 0x3E8 DUP2 JUMP JUMPDEST PUSH2 0xA0E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xA19 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP6 MLOAD DUP4 LT ISZERO PUSH2 0xA70 JUMPI PUSH2 0xA35 DUP6 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH2 0xA48 DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5E7 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xA54 DUP5 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 DUP5 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0xA65 JUMPI PUSH2 0xA70 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0xA1E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xA81 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xA8E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x61C JUMPI PUSH2 0xAAA DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0xB11 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xABD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB0B DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xADC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAF8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP6 PUSH2 0x11C8 JUMP JUMPDEST SWAP2 POP PUSH2 0xB3E DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB24 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xB39 DUP5 PUSH1 0x1 PUSH2 0x1B43 JUMP JUMPDEST PUSH2 0x11E5 JUMP JUMPDEST SWAP1 POP PUSH2 0xB52 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP2 MSTORE PUSH2 0xB5E DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0xB6B JUMPI PUSH2 0x61C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0xA93 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C75696E74323536 DUP2 MSTORE PUSH32 0x2C62797465732900000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x27 ADD SWAP1 KECCAK256 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH2 0xFFFF AND GT DUP1 ISZERO PUSH2 0xC00 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xBCF JUMPI PUSH2 0x3E8 PUSH2 0xFFFF DUP5 AND GT ISZERO PUSH2 0xC45 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2ED1 JUMP JUMPDEST PUSH2 0xC56 PUSH2 0xFFFF DUP5 AND PUSH2 0x2710 DUP7 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xC9C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xCE0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0xD2D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F01 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xD54 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0xDAF SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDC9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xDDD 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 0xE01 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP2 POP PUSH2 0xE15 DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP1 POP PUSH2 0xE25 DUP3 PUSH1 0x0 ADD MLOAD DUP3 PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xE5D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST DUP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xE6E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE78 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0xE80 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0xE88 PUSH2 0x20ED JUMP JUMPDEST DUP6 SWAP4 POP PUSH2 0xE95 DUP11 DUP8 PUSH2 0xA06 JUMP JUMPDEST SWAP3 POP PUSH1 0x0 DUP4 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0xF29 JUMPI PUSH2 0xEB3 DUP9 DUP9 DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x1BAA JUMP JUMPDEST SWAP2 POP PUSH2 0xECC DUP7 PUSH2 0xEC7 DUP9 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xF04 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0xF12 DUP5 DUP4 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x20 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP4 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0xF83 SWAP1 DUP14 SWAP1 DUP9 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xFB1 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 0xFD5 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0xFE1 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x7472616E7366657228616464726573732C75696E743235362900000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x19 ADD DUP2 KECCAK256 PUSH1 0x0 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP2 SWAP1 PUSH2 0x104C SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x24 ADD PUSH2 0x2DDD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 MSTORE MLOAD DUP2 MLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x10F0 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x10D8 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x111D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP3 POP POP POP DUP1 ISZERO ISZERO PUSH2 0x116C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EE1 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x1189 JUMPI POP PUSH1 0x0 RETURNDATASIZE PUSH1 0x20 EQ ISZERO PUSH2 0x1189 JUMPI PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD JUMPDEST DUP1 ISZERO ISZERO PUSH2 0x11C2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EE1 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11DD PUSH2 0x11D7 DUP6 DUP5 PUSH2 0x1EE3 JUMP JUMPDEST DUP5 PUSH2 0x1F3E JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x11ED PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x11F5 PUSH2 0x2116 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xC75E0A8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xC75E0A81 SWAP1 PUSH2 0x124C SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F3F JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1266 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x127A 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 0x129E SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x27B8 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x12B2 JUMPI PUSH2 0xA70 JUMP JUMPDEST PUSH2 0x12C4 DUP7 PUSH1 0xA0 ADD MLOAD DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH2 0x12D0 DUP6 DUP4 PUSH2 0x1F55 JUMP JUMPDEST SWAP1 POP DUP1 DUP5 PUSH1 0x20 ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x12EF DUP2 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x11C8 JUMP JUMPDEST DUP5 MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x1306 SWAP2 DUP4 SWAP2 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x1320 SWAP2 DUP4 SWAP2 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x60 DUP6 ADD MSTORE POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x133C SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1352 SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x136B SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1384 SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x13D2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F21 JUMP JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0x1405 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140F PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1417 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x141F PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1431 DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3A4 JUMPI INVALID JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP8 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x14D7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14AC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x14D7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14BA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x14EB JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x15C9 JUMPI PUSH2 0x1528 DUP11 DUP11 DUP9 PUSH2 0x1BAA JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 GT ISZERO PUSH2 0x1566 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x1570 DUP6 DUP5 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x158C PUSH2 0x1585 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1B43 JUMP JUMPDEST DUP7 MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x15C4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x1745 JUMP JUMPDEST PUSH2 0x15D3 DUP11 DUP8 PUSH2 0x560 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 DUP3 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0x1608 JUMPI PUSH2 0x15F1 DUP9 DUP9 DUP5 PUSH1 0x60 ADD MLOAD PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP1 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0xE5FA431B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xE5FA431B SWAP1 PUSH2 0x1662 SWAP1 DUP14 SWAP1 DUP11 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x167C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1690 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 0x16B4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 EQ PUSH2 0x16F1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x16FB DUP6 DUP5 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x170D DUP6 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1745 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0xFE1 DUP5 CALLER DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0xFEE JUMP JUMPDEST PUSH2 0x175C PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH1 0x0 PUSH2 0x176B PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1773 PUSH2 0x20ED JUMP JUMPDEST DUP11 MLOAD SWAP5 POP DUP5 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x17A1 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x18DD JUMPI PUSH2 0x17D6 DUP7 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17C3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP10 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x187C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1851 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x187C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x185F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x188F JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP11 MLOAD DUP12 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x18AC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18C8 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x17A9 JUMP JUMPDEST PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1908 JUMPI PUSH2 0x18F1 DUP10 DUP10 DUP9 PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE SWAP2 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x4D0AE54600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x4D0AE546 SWAP1 PUSH2 0x1962 SWAP1 DUP15 SWAP1 DUP9 SWAP1 DUP16 SWAP1 PUSH1 0x4 ADD PUSH2 0x2DF8 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x197C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1990 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 0x19B4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0x19C0 DUP8 DUP3 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x19D2 DUP8 PUSH1 0x20 ADD MLOAD DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1A0A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x1A48 JUMPI PUSH2 0x1A3D DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A28 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD CALLER PUSH2 0x1F6B JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1A0F JUMP JUMPDEST POP POP POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1B3B JUMPI PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x1AB8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F90 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AD2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1AE6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x1AF5 DUP6 DUP6 DUP6 PUSH2 0xBD6 JUMP JUMPDEST SWAP2 POP PUSH2 0x1B01 DUP7 DUP4 PUSH2 0xCA4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT ISZERO PUSH2 0x1B3B JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1B39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1B82 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1B9F PUSH2 0x251C PUSH2 0x2710 DUP7 PUSH2 0x11C8 JUMP JUMPDEST SWAP1 SWAP3 LT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1BB2 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1BBF PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP8 MLOAD DUP5 LT ISZERO PUSH2 0x1ED8 JUMPI PUSH1 0x3 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1C71 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1C46 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1C71 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1C54 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C84 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP2 MSTORE DUP2 DUP2 MSTORE SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1D39 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1D0E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1D39 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1D1C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D4C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP5 MLOAD PUSH2 0x1D68 SWAP1 DUP8 SWAP1 PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0x1DB6 DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D7B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB0B DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D9A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP12 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAF8 JUMPI INVALID JUMPDEST PUSH1 0x0 SLOAD DUP10 MLOAD SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB4BE83D5 SWAP1 DUP11 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0x1DE7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1DFC DUP6 PUSH1 0x1 PUSH2 0x1B43 JUMP JUMPDEST DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1E0A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1E4E SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2F50 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E7C 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 0x1EA0 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0x1EB4 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x1EC0 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0x1ECD JUMPI PUSH2 0x1ED8 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x1BC4 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x1EF6 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x1B86 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x1F06 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1B82 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x1F4C JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1F64 JUMPI DUP2 PUSH2 0xBCF JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x1F81 DUP6 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0xCEB AND JUMP JUMPDEST SWAP3 POP PUSH2 0x1F94 DUP6 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x203B AND JUMP JUMPDEST SWAP2 POP PUSH2 0x1FA7 DUP6 PUSH1 0x64 PUSH4 0xFFFFFFFF PUSH2 0x2047 AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0x2002 SWAP1 ADDRESS SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x2D99 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x201C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2030 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP4 DUP4 PUSH2 0x20A2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x2055 DUP5 DUP5 PUSH2 0x203B JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x209C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E91 JUMP JUMPDEST POP POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x20E4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EB1 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD 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 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 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x3036 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x2153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2166 PUSH2 0x2161 DUP3 PUSH2 0x2FC5 JUMP JUMPDEST PUSH2 0x2F9E 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 0x61C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x218E DUP9 DUP3 PUSH2 0x220D JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2178 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x21B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x21C3 PUSH2 0x2161 DUP3 PUSH2 0x2FC5 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 0x61C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x21EB DUP9 DUP3 PUSH2 0x231D JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x21D5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 MLOAD PUSH2 0x307B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x221E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x222C PUSH2 0x2161 DUP3 PUSH2 0x2FE6 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x2248 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA70 DUP4 DUP3 DUP5 PUSH2 0x3084 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2265 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x226F PUSH1 0x80 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x227D DUP5 DUP5 PUSH2 0x2201 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x228E DUP5 DUP5 DUP4 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x22A2 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x22B6 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x22D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x22DE PUSH1 0x60 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x22EC DUP5 DUP5 PUSH2 0x247E JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x22FD DUP5 DUP5 DUP4 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x2311 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2330 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x233B PUSH2 0x180 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2349 DUP5 DUP5 PUSH2 0x2136 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x235A DUP5 DUP5 DUP4 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x236E DUP5 DUP3 DUP6 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x2382 DUP5 DUP3 DUP6 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x2396 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x23AA DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x23BE DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x23D2 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x23E7 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x23FD DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x241F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x242B DUP5 DUP3 DUP6 ADD PUSH2 0x220D JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x244D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2459 DUP5 DUP3 DUP6 ADD PUSH2 0x220D JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x3074 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x307B JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 MLOAD PUSH2 0x307E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x24A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x24AC DUP8 DUP8 PUSH2 0x2136 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x24BD DUP8 DUP3 DUP9 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x24CE DUP8 DUP3 DUP9 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x24EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x24F7 DUP8 DUP3 DUP9 ADD PUSH2 0x220D JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2518 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2524 DUP7 DUP7 PUSH2 0x2136 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x2535 DUP7 DUP3 DUP8 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2552 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x255E DUP7 DUP3 DUP8 ADD PUSH2 0x220D JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x2581 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2598 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25A4 DUP10 DUP3 DUP11 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x25C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25CD DUP10 DUP3 DUP11 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x25EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25F6 DUP10 DUP3 DUP11 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2613 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x261F DUP10 DUP3 DUP11 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 PUSH2 0x2630 DUP10 DUP3 DUP11 ADD PUSH2 0x2466 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xA0 PUSH2 0x2641 DUP10 DUP3 DUP11 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x2669 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2680 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x268C DUP11 DUP3 DUP12 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26B5 DUP11 DUP3 DUP12 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26DE DUP11 DUP3 DUP12 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2707 DUP11 DUP3 DUP12 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 PUSH2 0x2718 DUP11 DUP3 DUP12 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH2 0x2729 DUP11 DUP3 DUP12 ADD PUSH2 0x2466 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH2 0x273A DUP11 DUP3 DUP12 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x275C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2773 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x277F DUP6 DUP3 DUP7 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x2790 DUP6 DUP3 DUP7 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x27AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11DD DUP5 DUP5 PUSH2 0x2253 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x27CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11DD DUP5 DUP5 PUSH2 0x22C2 JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x3036 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27F0 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2809 DUP6 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2840 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2824 DUP4 DUP4 MLOAD PUSH2 0x2907 JUMP JUMPDEST SWAP3 POP PUSH2 0x282F DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x280C JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2857 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2870 DUP6 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2840 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x288B DUP4 DUP4 MLOAD PUSH2 0x2C84 JUMP JUMPDEST SWAP3 POP PUSH2 0x2896 DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x2873 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28B2 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x28C4 DUP4 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x28F4 JUMPI PUSH2 0x28DA DUP7 DUP4 MLOAD PUSH2 0x2D90 JUMP JUMPDEST PUSH2 0x28E3 DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x28C7 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x304F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2912 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x2926 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x3090 JUMP JUMPDEST PUSH2 0x292F DUP2 PUSH2 0x30BC JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x44454641554C545F46554E4354494F4E5F574554485F434F4E54524143545F4F PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4E4C590000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F4D53475F56414C5545000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x30 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x56414C55455F475245415445525F5448414E5F5A45524F000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 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 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4645455F50524F504F5254494F4E5F544F4F5F4C415247450000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x16 DUP2 MSTORE PUSH32 0x554E41434345505441424C455F5448524553484F4C4400000000000000000000 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 0x17 DUP2 MSTORE PUSH32 0x554E535550504F525445445F544F4B454E5F50524F5859000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 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 0x80 DUP4 ADD SWAP1 PUSH2 0x2C4B DUP5 DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x2C5E PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2C71 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x11C2 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x2C99 DUP6 DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x2CAC PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x2CBF PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x2CD2 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x2CE5 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x2CF8 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x2D0B PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x2D1E PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x2D33 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x2D48 PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x2D62 DUP3 DUP3 PUSH2 0x2907 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x2D7E DUP3 DUP3 PUSH2 0x2907 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x3074 JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x307B JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x2DA7 DUP3 DUP8 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0x2DB4 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0x2DC1 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x2DD3 DUP2 DUP5 PUSH2 0x2907 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x2DEB DUP3 DUP6 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0xBCF PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2E09 DUP2 DUP7 PUSH2 0x284C JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2E1D DUP2 DUP6 PUSH2 0x28A7 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x27E5 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2E42 DUP2 DUP7 PUSH2 0x284C JUMP JUMPDEST SWAP1 POP PUSH2 0x2E51 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x27E5 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x28FE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x293C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2992 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x29C2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A18 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A48 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A9E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2AFE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2B2E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2B5E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2BB4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2BE4 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2C3A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBCF DUP2 DUP5 PUSH2 0x2C84 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2F61 DUP2 DUP7 PUSH2 0x2C84 JUMP JUMPDEST SWAP1 POP PUSH2 0x2F70 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x2907 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2D87 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x2FBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2FDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2FFD 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 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x30AB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3093 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x11C2 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 SELFDESTRUCT 0x5c 0x1e ORIGIN JUMP SWAP9 SWAP1 SWAP16 REVERT CALLDATALOAD SWAP1 AND PUSH12 0xDFF6A2F31FF4394822A4E1B9 0xea GT SWAP11 PUSH11 0x813E6C6C6578706572696D PUSH6 0x6E74616CF500 CALLDATACOPY ", + "sourceMap": "834:541:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1170:11:3;;;;1148:10;:34;1127:116;;;;;;;;;;;;;;;;;;;;;;834:541:0;1336:209:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1336:209:6;;;;;;;;;;;;;;;;;;;;;;;;;2954:2408:4;;;;;;;;;;;;;;;;;;1419:950:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1419:950:2;;;;;;;;;925:59:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;925:59:3;;;;;;;;;;;;6720:1894:4;;;;;;;;;;786:53:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;786:53:3;;;;875:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;875:37:3;;;;2778:732:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2778:732:2;;;;;;;;;3919:1414;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3919:1414:2;;;;;;;;;1147:183:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1147:183:6;;;;;;;;;1336:209;1079:60;;;;;;;;;;;;;;;;;;;;;1336:209;;;;;;:::o;2954:2408:4:-;3256:35;;:::i;:::-;3332:9;3307:22;;;3372:18;;;3351:88;;;;;;;;;;;;;;3535:100;3558:14;3586:13;3613:12;3535:9;:100::i;:::-;3512:123;;3670:37;3678:14;3694:12;3670:7;:37::i;:::-;3645:62;;3774:11;;;;;;;;;;;:19;;;3800:14;3774:43;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3774:43:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3774:43:4;;;;;4011:50;4032:6;4039:1;4032:9;;;;;;;;;;;;;;;;;;:24;;;4058:2;4011:20;:50::i;:::-;4098:15;4071:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3983:78;;-1:-1:-1;4071:42:4;;4098:15;4071:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;4078:1;4071:9;;;;;;;;;;;;;;;;;;;:24;;:42;4156:9;;;4127:39;;;4156:9;;4127:39;4123:614;;;4366:125;4411:6;4435:10;4463:14;4366:27;:125::i;:::-;4347:144;;4123:614;;;4541:185;4588:6;4612:10;4640:9;4667:13;4698:14;4541:29;:185::i;:::-;4522:204;;4123:614;4862:39;;;;4844:57;;;4823:121;;;;;;;;;;;;;;5044:39;;;;5026:57;;5005:126;;;;;;;;;;;;;;5186:136;5218:17;5249:10;5273:16;:39;;;5186:18;:136::i;:::-;2954:2408;;;;;;;;;;;;:::o;1419:950:2:-;1583:35;;:::i;:::-;1639:9;1692:37;1816;2035:35;;:::i;:::-;1651:1;1639:13;;1634:696;1658:6;:13;1654:1;:17;1634:696;;;1732:70;1740:20;1762:16;:39;;;1732:7;:70::i;:::-;1692:110;;1856:165;1890:6;1897:1;1890:9;;;;;;;;;;;;;;;;;;:26;;;1934:6;1941:1;1934:9;;;;;;;;;;;;;;;;;;:26;;;1978:29;1856:16;:165::i;:::-;1816:205;;2073:62;2094:6;2101:1;2094:9;;;;;;;;;;;;;;;;;;2105:29;2073:20;:62::i;:::-;2035:100;;2149:50;2164:16;2182;2149:14;:50::i;:::-;2217:39;;:63;;2213:107;;;2300:5;;2213:107;1673:3;;;;;1634:696;;;1419:950;;;;;;;;:::o;925:59:3:-;980:4;925:59;:::o;6720:1894:4:-;7061:35;;:::i;:::-;7137:9;7112:22;7177:18;;;7156:88;;;;;;;;;;;;;;7298:1;7275:24;;7254:94;;;;;;;;;;;;;;7379:48;7399:6;7406:1;7399:9;;;;;;;;;;;;;;;;;;:24;;;7425:1;7379:19;:48::i;:::-;1204:32;;;;;;;;;;;;;;;;7358:69;;-1:-1:-1;7458:28:4;;;;;;;;:61;;-1:-1:-1;1292:47:4;;;;;;;;;;;;;;;;;;;;;7490:29;;;;;;;7458:61;7437:131;;;;;;;;;;;;;;;;7579:11;;;;;;;;;;;:19;;;7605:14;7579:43;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7579:43:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;1204:32:4;;;;;;;;;;;;;;;;7636:28;;;;;;;7632:505;;-1:-1:-1;7632:505:4;;-1:-1:-1;;7632:505:4;7699:190;7745:6;7769:10;7797:9;7824:13;7855:20;7699:28;:190::i;:::-;7680:209;;7632:505;;;1292:47;;;;;;;;;;;;;;;;;;;;;7910:29;;;;;;;7906:231;;;7974:152;8020:6;8044:10;8072:9;8099:13;7974:28;:152::i;:::-;7955:171;;7906:231;8262:39;;;;8244:57;;;8223:121;;;;;;;;;;;;;;8354:220;8394:64;8402:14;8418:16;:39;;;8394:7;:64::i;:::-;8472:16;:39;;;8525:13;8552:12;8354:26;:220::i;:::-;6720:1894;;;;;;;;;;;:::o;786:53:3:-;834:5;786:53;:::o;875:37::-;908:4;875:37;:::o;2778:732:2:-;2943:35;;:::i;:::-;2999:9;3052:37;3176:35;;:::i;:::-;3011:1;2999:13;;2994:477;3018:6;:13;3014:1;:17;2994:477;;;3092:70;3100:20;3122:16;:39;;;3092:7;:70::i;:::-;3052:110;;3214:62;3235:6;3242:1;3235:9;;;;;;;;;3214:62;3176:100;;3290:50;3305:16;3323;3290:14;:50::i;:::-;3401:20;3358:16;:39;;;:63;3354:107;;;3441:5;;3354:107;3033:3;;;;;2994:477;;;2778:732;;;;;;;:::o;3919:1414::-;4079:35;;:::i;:::-;4135:9;4188:30;4479:31;4747:35;;:::i;:::-;4147:1;4135:13;;4130:1164;4154:6;:13;4150:1;:17;4130:1164;;;4221:63;4229:13;4244:16;:39;;;4221:7;:63::i;:::-;4188:96;;4513:220;4547:6;4554:1;4547:9;;;;;;;;;;;;;;;;;;:26;;;4591:55;4599:6;4606:1;4599:9;;;;;;;;;;;;;;;;;;:26;;;4627:6;4634:1;4627:9;;;;;;;;;;;;;;;;;;:18;;;4591:7;:55::i;:::-;4697:22;4513:16;:220::i;:::-;4479:254;;4785:68;4806:6;4813:1;4806:9;;;;;;;;;;;;;;;;;;4817:35;4825:23;4850:1;4817:7;:35::i;:::-;4785:20;:68::i;:::-;4747:106;;4910:79;4918:16;:39;;;4959:16;:29;;;4910:7;:79::i;:::-;4868:121;;5003:50;5018:16;4868;5003:14;:50::i;:::-;5188:39;;:56;-1:-1:-1;5184:100:2;;5264:5;;5184:100;4169:3;;;;;4130:1164;;1147:183:6;961:52;;;;;;;;;;;;;;;;;;;;;1147:183;;;;;;:::o;1644:695:3:-;1795:20;1851:1;1835:13;:17;;;:47;;;;-1:-1:-1;1856:26:3;;;;;1835:47;1831:473;;;908:4;1923:24;;;;;1898:107;;;;;;;;;;;;;;2111:133;;;;834:5;2216:14;2111:16;:133::i;:::-;2258:35;;2096:148;;-1:-1:-1;2258:21:3;;;;:35;;;;;2096:148;;2258:35;;;;2096:148;2258:21;:35;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2258:35:3;1644:695;;;;;:::o;501:207:30:-;587:7;631:6;;;;610:69;;;;;;;;;;;;;;-1:-1:-1;696:5:30;;;501:207;;;;;:::o;10259:886:29:-;10380:14;10443:5;10451:2;10443:10;10431:1;:8;:22;;10410:135;;;;;;;;;;;;;;;;-1:-1:-1;11047:13:29;10792:2;11047:13;11041:20;11063:42;11037:69;;10259:886::o;11418:994:4:-;11602:35;;:::i;:::-;12042:23;11759:8;;:107;;;;;:8;;;;;:25;;:107;;11798:6;;11818:14;;11846:10;;11759:107;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11759:107:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11759:107:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;11759:107:4;;;;;;;;;11740:126;;12068:79;12076:16;:39;;;12117:16;:29;;;12068:7;:79::i;:::-;12042:105;;12178:79;12200:16;:39;;;12241:15;12178:21;:79::i;:::-;12157:148;;;;;;;;;;;;;;;;12315:57;;;11418:994;-1:-1:-1;;;11418:994:4:o;9162:1906::-;9429:35;;:::i;:::-;9480:31;9538:46;;:::i;:::-;9808:35;;:::i;:::-;10741:41;;:::i;:::-;9514:14;9480:48;;9587:50;9614:6;9622:14;9587:26;:50::i;:::-;9538:99;;9694:1;9651:27;:40;;;:44;9647:998;;;9846:150;9884:9;9911:13;9942:27;:40;;;9846:20;:150::i;:::-;9808:188;;10134:161;10177:14;10213:64;10221:14;10237:16;:39;;;10213:7;:64::i;:::-;10134:21;:161::i;:::-;10109:242;;;;;;;;;;;;;;;;10391:73;10399:23;10424:16;:39;;;10391:7;:73::i;:::-;10510:29;;;;;10478;;;:61;10595:39;;;;;10553;;;:81;10365:99;-1:-1:-1;9647:998:4;10785:8;;:116;;;;;:8;;;;;:25;;:116;;10824:6;;10844:23;;10881:10;;10785:116;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10785:116:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10785:116:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;10785:116:4;;;;;;;;;10741:160;;10972:56;10987:16;11005:22;10972:14;:56::i;:::-;9162:1906;;;;;;;;;;;:::o;1551:1224:6:-;866:38;;;;;;;;;;;;;;;;1809:12;;1824:10;;;;866:38;1835:105;;1908:2;;1924:6;;1835:105;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1835:105:6;;;49:4:-1;25:18;;61:17;;1835:105:6;182:15:-1;1835:105:6;;;;179:29:-1;;;;160:49;;1824:117:6;;;1835:105;;1824:117;;;;25:18:-1;1824:117:6;;25:18:-1;-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1824:117:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1951:69:6;;;;;;;;;;;;;;;;;2399:14;2396:2;;;-1:-1:-1;2443:1:6;2467:14;2483:2;2464:22;2461:2;;;2605;2602:1;2599;2584:24;-1:-1:-1;2646:1:6;2640:8;2461:2;2720:7;2699:69;;;;;;;;;;;;;;;;1551:1224;;;;:::o;937:326:24:-;1091:21;1144:82;1165:26;1173:9;1184:6;1165:7;:26::i;:::-;1205:11;1144:7;:82::i;:::-;1128:98;937:326;-1:-1:-1;;;;937:326:24:o;5694:1215:2:-;5852:30;;:::i;:::-;5898:35;;:::i;:::-;6093:33;5936:8;;:28;;;;;6093:33;;5936:8;;;:21;;:28;;5958:5;;5936:28;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5936:28:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5936:28:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5936:28:2;;;;;;;;;5978:21;;5898:66;;-1:-1:-1;5978:61:2;;6009:29;5978:61;5974:110;;6055:18;;5974:110;6129:70;6137:5;:22;;;6161:9;:37;;;6129:7;:70::i;:::-;6093:106;;6242:55;6249:20;6271:25;6242:6;:55::i;:::-;6209:88;;6345:22;6308:11;:34;;:59;;;;;6414:134;6444:22;6480:5;:22;;;6516:5;:22;;;6414:16;:134::i;:::-;6377:171;;6651:22;;;;6687:14;;;;6585:126;;6615:22;;6585:16;:126::i;:::-;6558:24;;;:153;6814:22;;;;6850:14;;;;6748:126;;6778:22;;6748:16;:126::i;:::-;6721:24;;;:153;5694:1215;;;;;;;:::o;1772:648:23:-;1965:39;;2006:40;;1957:90;;1965:39;1957:7;:90::i;:::-;1915:132;;2107:39;;;;;2148:40;;;;2099:90;;2107:39;2099:7;:90::i;:::-;2057:39;;;:132;2239:29;;;;;2270:30;;;;2231:70;;2239:29;2231:7;:70::i;:::-;2199:29;;;:102;2351:29;;;;;2382:30;;;;2343:70;;2351:29;2343:7;:70::i;:::-;2311:29;;;;:102;;;;-1:-1:-1;1772:648:23:o;15559:559:29:-;15679:13;15741:5;15749:1;15741:9;15729:1;:8;:21;;15708:105;;;;;;;;;;;;;;;;-1:-1:-1;;15869:2:29;15862:10;15856:17;16012:66;16000:79;;15559:559::o;13021:3595:4:-;13293:50;;:::i;:::-;13454:25;14027:35;;:::i;:::-;14951:45;;:::i;:::-;15236:38;;:::i;:::-;13482:50;13503:6;13510:1;13503:9;;;;;;;;;13482:50;13774:15;13747:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13454:78;;-1:-1:-1;13747:42:4;;13774:15;13747:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;13754:1;13747:9;;;;;;;;;;;;;;;;;;;:24;;:42;14105:9;;;14076:39;;;14105:9;;14076:39;14072:2304;;;14150:124;14188:6;14212:10;14240:20;14150;:124::i;:::-;14398:39;;14131:143;;-1:-1:-1;14398:63:4;-1:-1:-1;14398:63:4;14373:144;;;;;;;;;;;;;;14531:50;14546:16;14564;14531:14;:50::i;:::-;14620:244;14663:79;14671:16;:39;;;14712:16;:29;;;14663:7;:79::i;:::-;14777:39;;14620:21;:244::i;:::-;14595:325;;;;;;;;;;;;;;;;14072:2304;;;14999:55;15025:6;15033:20;14999:25;:55::i;:::-;14951:103;;15114:1;15072:26;:39;;;:43;15068:573;;;15277:165;15319:9;15350:13;15385:26;:39;;;15277:20;:165::i;:::-;15502:42;;;;;15460:39;;;:84;15594:32;;;;;15562:29;;;:64;15236:206;-1:-1:-1;15068:573:4;15759:8;;:128;;;;;:8;;;;;:24;;:128;;15801:6;;15825:20;;15863:10;;15759:128;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15759:128:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15759:128:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15759:128:4;;;;;;;;;15926:39;;15740:147;;-1:-1:-1;15926:63:4;;15901:144;;;;;;;;;;;;;;16059:50;16074:16;16092;16059:14;:50::i;:::-;16148:161;16191:16;:39;;;16252:16;:39;;;16148:21;:161::i;:::-;16123:242;;;;;;;;;;;;;;;;16440:136;16472:17;16503:10;16527:16;:39;;;16440:18;:136::i;17161:2228::-;17395:50;;:::i;:::-;17461:25;17496:20;17542:38;17625:9;18304:38;;:::i;:::-;18668:35;;:::i;:::-;17519:6;:13;17496:36;;17597:12;17583:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;17583:27:4;;17542:68;;17637:1;17625:13;;17620:543;17644:12;17640:1;:16;17620:543;;;17730:46;17738:17;17757:6;17764:1;17757:9;;;;;;;;;;;;;;;;;;:18;;;17730:7;:46::i;:::-;18004:15;17977:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17710:66;;-1:-1:-1;17977:42:4;;18004:15;17977:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;17984:1;17977:9;;;;;;;;;;;;;;;;;;;:24;;:42;18126:9;;:6;;18133:1;;18126:9;;;;;;;;;;;;;;:26;;;18099:21;18121:1;18099:24;;;;;;;;;;;;;;;;;;:53;17658:3;;;;;17620:543;;;18196:1;18176:17;:21;18172:487;;;18345:127;18383:9;18410:13;18441:17;18345:20;:127::i;:::-;18518:32;;;;;18486:29;;;:64;18606:42;;;;;18564:39;;;:84;18304:168;-1:-1:-1;18172:487:4;18706:8;;:119;;;;;:8;;;;;:30;;:119;;18750:6;;18770:21;;18805:10;;18706:119;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18706:119:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18706:119:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18706:119:4;;;;;;;;;18668:157;;18835:50;18850:16;18868;18835:14;:50::i;:::-;18916:149;18955:16;:39;;;19012:16;:39;;;18916:21;:149::i;:::-;18895:218;;;;;;;;;;;;;;;;19196:1;19192:5;;19187:163;19203:12;19199:1;:16;19187:163;;;19236:103;19273:6;19280:1;19273:9;;;;;;;;;;;;;;;;;;:24;;;19315:10;19236:19;:103::i;:::-;19217:3;;;;;19187:163;;;17161:2228;;;;;;;;;;;;:::o;2960:777:3:-;3391:20;3544:24;3267:1;3247:17;:21;3243:488;;;3284:11;;:39;;;;;:11;;;;;:20;;:39;;3305:17;;3284:39;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3284:39:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3284:39:3;;;;3414:116;3441:14;3473:13;3504:12;3414:9;:116::i;:::-;3391:139;;3571:40;3579:17;3598:12;3571:7;:40::i;:::-;3544:67;;3648:1;3629:16;:20;3625:96;;;3669:37;;:10;;:37;;;;;3689:16;;3669:37;;;;3689:16;3669:10;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3669:37:3;3625:96;2960:777;;;;;;:::o;714:230:30:-;800:7;835:5;;;871:6;;;;850:69;;;;;;;;;;;;;;936:1;929:8;;714:230;;;;;;:::o;4350:384:3:-;4482:4;;4533:138;980:4;834:5;4642:19;4533:16;:138::i;:::-;4688:39;;;;;4350:384;-1:-1:-1;;;4350:384:3:o;1831:2046:5:-;2006:35;;:::i;:::-;2062:9;2386:29;2675:31;3095:35;;:::i;:::-;2074:1;2062:13;;2057:1781;2081:6;:13;2077:1;:17;2057:1781;;;2235:14;2208:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2235:14;2208:41;;2235:14;2208:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;2215:1;2208:9;;;;;;;;;;;;;;;;;;;;:24;;:41;;;;2290:15;2263:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2290:15;2263:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;2270:1;2263:9;;;;;;;;;;;;;;;;;;;:24;;:42;2440:39;;2418:62;;2426:12;;2418:7;:62::i;:::-;2386:94;;2709:219;2743:6;2750:1;2743:9;;;;;;;;;;;;;;;;;;:26;;;2787:55;2795:6;2802:1;2795:9;;;;;;;;;;;;;;;;;;:26;;;2823:6;2830:1;2823:9;;;;;;;;;2709:219;3133:8;;3169:9;;2675:253;;-1:-1:-1;3133:8:5;;;:18;;3169:6;;3176:1;;3169:9;;;;;;;;;;;;;;3196:35;3204:23;3229:1;3196:7;:35::i;:::-;3249:10;3260:1;3249:13;;;;;;;;;;;;;;;;;;3133:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3133:143:5;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3133:143:5;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3133:143:5;;;;;;;;;3095:181;;3421:79;3429:16;:39;;;3470:16;:29;;;3421:7;:79::i;:::-;3379:121;;3584:50;3599:16;3379;3584:14;:50::i;:::-;3733:39;;:55;-1:-1:-1;3729:99:5;;3808:5;;3729:99;2096:3;;;;;2057:1781;;;1831:2046;;;;;;;;;:::o;50:288:30:-;136:7;;163:6;;159:45;;;192:1;185:8;;;;159:45;-1:-1:-1;225:5:30;;;229:1;225;:5;261;;;;;;;;:10;240:73;;;;;;;;;;;;;344:151;430:7;453:9;469:1;465;:5;;;;;;;;;344:151;-1:-1:-1;;;;344:151:30:o;1369:135::-;1454:7;1488:1;1484;:5;:13;;1496:1;1484:13;;;-1:-1:-1;1492:1:30;;1477:20;-1:-1:-1;1369:135:30:o;2781:467:6:-;2929:13;;3033:25;2945;:9;2967:2;2945:25;:21;:25;:::i;:::-;2929:41;-1:-1:-1;2998:25:6;:9;3020:2;2998:25;:21;:25;:::i;:::-;2980:43;-1:-1:-1;3061:34:6;:9;3091:3;3061:34;:29;:34;:::i;:::-;3105:136;;;;;3033:62;;-1:-1:-1;3105:36:6;;;;;;:136;;3163:4;;3182:2;;3198:7;;3033:62;;3105:136;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3105:136:6;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3105:136:6;;;;2781:467;;;;;:::o;14699:195:29:-;14820:14;14865:21;14877:1;14880:5;14865:11;:21::i;16441:672::-;16570:19;16644:25;16672:21;16684:1;16687:5;16672:11;:21::i;:::-;16644:49;;16712:2;16703:11;;;;16848:17;16840:5;:25;16828:1;:8;:37;;16807:132;;;;;;;;;;;;;;;;-1:-1:-1;;17061:13:29;;16441:672::o;13281:490::-;13402:14;13465:5;13473:2;13465:10;13453:1;:8;:22;;13432:107;;;;;;;;;;;;;;;;-1:-1:-1;13718:13:29;13620:2;13718:13;13712:20;;13281:490::o;834:541:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;834:541:0;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;146:693;;261:4;249:17;;245:27;-1:-1;235:2;;286:1;283;276:12;235:2;323:6;310:20;345:85;360:69;422:6;360:69;;;345:85;;;458:21;;;502:4;490:17;;;;336:94;;-1:-1;515:14;;490:17;610:1;595:238;620:6;617:1;614:13;595:238;;;703:3;690:17;682:6;678:30;727:42;765:3;753:10;727:42;;;715:55;;-1:-1;793:4;784:14;;;;812;;;;;642:1;635:9;595:238;;879:735;;1008:4;996:17;;992:27;-1:-1;982:2;;1033:1;1030;1023:12;982:2;1070:6;1057:20;1092:99;1107:83;1183:6;1107:83;;1092:99;1219:21;;;1263:4;1251:17;;;;1083:108;;-1:-1;1276:14;;1251:17;1371:1;1356:252;1381:6;1378:1;1375:13;1356:252;;;1464:3;1451:17;1443:6;1439:30;1488:56;1540:3;1528:10;1488:56;;;1476:69;;-1:-1;1568:4;1559:14;;;;1587;;;;;1403:1;1396:9;1356:252;;1622:122;;1700:39;1731:6;1725:13;1700:39;;1752:432;;1842:4;1830:17;;1826:27;-1:-1;1816:2;;1867:1;1864;1857:12;1816:2;1904:6;1891:20;1926:60;1941:44;1978:6;1941:44;;1926:60;1917:69;;2006:6;1999:5;1992:21;2042:4;2034:6;2030:17;2075:4;2068:5;2064:16;2110:3;2101:6;2096:3;2092:16;2089:25;2086:2;;;2127:1;2124;2117:12;2086:2;2137:41;2171:6;2166:3;2161;2137:41;;2681:865;;2810:4;2798:9;2793:3;2789:19;2785:30;2782:2;;;2828:1;2825;2818:12;2782:2;2846:20;2861:4;2846:20;;;2837:29;-1:-1;2934:1;2965:60;3021:3;3001:9;2965:60;;;2941:85;;-1:-1;3105:2;3138:60;3194:3;3170:22;;;3138:60;;;3131:4;3124:5;3120:16;3113:86;3047:163;3268:2;3301:60;3357:3;3348:6;3337:9;3333:22;3301:60;;;3294:4;3287:5;3283:16;3276:86;3220:153;3431:2;3464:60;3520:3;3511:6;3500:9;3496:22;3464:60;;;3457:4;3450:5;3446:16;3439:86;3383:153;2776:770;;;;;3585:689;;3712:4;3700:9;3695:3;3691:19;3687:30;3684:2;;;3730:1;3727;3720:12;3684:2;3748:20;3763:4;3748:20;;;3739:29;-1:-1;3825:1;3856:58;3910:3;3890:9;3856:58;;;3832:83;;-1:-1;3981:2;4014:60;4070:3;4046:22;;;4014:60;;;4007:4;4000:5;3996:16;3989:86;3936:150;4159:2;4192:60;4248:3;4239:6;4228:9;4224:22;4192:60;;;4185:4;4178:5;4174:16;4167:86;4096:168;3678:596;;;;;4309:2205;;4417:5;4405:9;4400:3;4396:19;4392:31;4389:2;;;4436:1;4433;4426:12;4389:2;4454:21;4469:5;4454:21;;;4445:30;-1:-1;4533:1;4564:49;4609:3;4589:9;4564:49;;;4540:74;;-1:-1;4683:2;4716:49;4761:3;4737:22;;;4716:49;;;4709:4;4702:5;4698:16;4691:75;4635:142;4842:2;4875:49;4920:3;4911:6;4900:9;4896:22;4875:49;;;4868:4;4861:5;4857:16;4850:75;4787:149;4995:2;5028:49;5073:3;5064:6;5053:9;5049:22;5028:49;;;5021:4;5014:5;5010:16;5003:75;4946:143;5151:3;5185:49;5230:3;5221:6;5210:9;5206:22;5185:49;;;5178:4;5171:5;5167:16;5160:75;5099:147;5308:3;5342:49;5387:3;5378:6;5367:9;5363:22;5342:49;;;5335:4;5328:5;5324:16;5317:75;5256:147;5457:3;5491:49;5536:3;5527:6;5516:9;5512:22;5491:49;;;5484:4;5477:5;5473:16;5466:75;5413:139;5606:3;5640:49;5685:3;5676:6;5665:9;5661:22;5640:49;;;5633:4;5626:5;5622:16;5615:75;5562:139;5768:3;5803:49;5848:3;5839:6;5828:9;5824:22;5803:49;;;5795:5;5788;5784:17;5777:76;5711:153;5914:3;5949:49;5994:3;5985:6;5974:9;5970:22;5949:49;;;5941:5;5934;5930:17;5923:76;5874:136;6098:3;6087:9;6083:19;6070:33;6123:18;6115:6;6112:30;6109:2;;;6155:1;6152;6145:12;6109:2;6191:54;6241:3;6232:6;6221:9;6217:22;6191:54;;;6183:5;6176;6172:17;6165:81;6020:237;6345:3;6334:9;6330:19;6317:33;6370:18;6362:6;6359:30;6356:2;;;6402:1;6399;6392:12;6356:2;6438:54;6488:3;6479:6;6468:9;6464:22;6438:54;;;6430:5;6423;6419:17;6412:81;6267:237;4383:2131;;;;;6521:116;;6587:45;6624:6;6611:20;6587:45;;6644:118;;6711:46;6749:6;6736:20;6711:46;;6898:118;;6974:37;7003:6;6997:13;6974:37;;7023:721;;;;;7187:3;7175:9;7166:7;7162:23;7158:33;7155:2;;;7204:1;7201;7194:12;7155:2;7239:1;7256:53;7301:7;7281:9;7256:53;;;7246:63;;7218:97;7346:2;7364:53;7409:7;7400:6;7389:9;7385:22;7364:53;;;7354:63;;7325:98;7454:2;7472:53;7517:7;7508:6;7497:9;7493:22;7472:53;;;7462:63;;7433:98;7590:2;7579:9;7575:18;7562:32;7614:18;7606:6;7603:30;7600:2;;;7646:1;7643;7636:12;7600:2;7666:62;7720:7;7711:6;7700:9;7696:22;7666:62;;;7656:72;;7541:193;7149:595;;;;;;;;7751;;;;7898:2;7886:9;7877:7;7873:23;7869:32;7866:2;;;7914:1;7911;7904:12;7866:2;7949:1;7966:53;8011:7;7991:9;7966:53;;;7956:63;;7928:97;8056:2;8074:53;8119:7;8110:6;8099:9;8095:22;8074:53;;;8064:63;;8035:98;8192:2;8181:9;8177:18;8164:32;8216:18;8208:6;8205:30;8202:2;;;8248:1;8245;8238:12;8202:2;8268:62;8322:7;8313:6;8302:9;8298:22;8268:62;;;8258:72;;8143:193;7860:486;;;;;;8353:1507;;;;;;;8689:3;8677:9;8668:7;8664:23;8660:33;8657:2;;;8706:1;8703;8696:12;8657:2;8741:31;;8792:18;8781:30;;8778:2;;;8824:1;8821;8814:12;8778:2;8844:97;8933:7;8924:6;8913:9;8909:22;8844:97;;;8834:107;;8720:227;9006:2;8995:9;8991:18;8978:32;9030:18;9022:6;9019:30;9016:2;;;9062:1;9059;9052:12;9016:2;9082:83;9157:7;9148:6;9137:9;9133:22;9082:83;;;9072:93;;8957:214;9230:2;9219:9;9215:18;9202:32;9254:18;9246:6;9243:30;9240:2;;;9286:1;9283;9276:12;9240:2;9306:97;9395:7;9386:6;9375:9;9371:22;9306:97;;;9296:107;;9181:228;9468:2;9457:9;9453:18;9440:32;9492:18;9484:6;9481:30;9478:2;;;9524:1;9521;9514:12;9478:2;9544:83;9619:7;9610:6;9599:9;9595:22;9544:83;;;9534:93;;9419:214;9664:3;9683:52;9727:7;9718:6;9707:9;9703:22;9683:52;;;9673:62;;9643:98;9772:3;9791:53;9836:7;9827:6;9816:9;9812:22;9791:53;;;9781:63;;9751:99;8651:1209;;;;;;;;;9867:1633;;;;;;;;10220:3;10208:9;10199:7;10195:23;10191:33;10188:2;;;10237:1;10234;10227:12;10188:2;10272:31;;10323:18;10312:30;;10309:2;;;10355:1;10352;10345:12;10309:2;10375:97;10464:7;10455:6;10444:9;10440:22;10375:97;;;10365:107;;10251:227;10537:2;10526:9;10522:18;10509:32;10561:18;10553:6;10550:30;10547:2;;;10593:1;10590;10583:12;10547:2;10613:83;10688:7;10679:6;10668:9;10664:22;10613:83;;;10603:93;;10488:214;10761:2;10750:9;10746:18;10733:32;10785:18;10777:6;10774:30;10771:2;;;10817:1;10814;10807:12;10771:2;10837:97;10926:7;10917:6;10906:9;10902:22;10837:97;;;10827:107;;10712:228;10999:2;10988:9;10984:18;10971:32;11023:18;11015:6;11012:30;11009:2;;;11055:1;11052;11045:12;11009:2;11075:83;11150:7;11141:6;11130:9;11126:22;11075:83;;;11065:93;;10950:214;11195:3;11214:53;11259:7;11250:6;11239:9;11235:22;11214:53;;;11204:63;;11174:99;11304:3;11323:52;11367:7;11358:6;11347:9;11343:22;11323:52;;;11313:62;;11283:98;11412:3;11431:53;11476:7;11467:6;11456:9;11452:22;11431:53;;;11421:63;;11391:99;10182:1318;;;;;;;;;;;11507:540;;;11672:2;11660:9;11651:7;11647:23;11643:32;11640:2;;;11688:1;11685;11678:12;11640:2;11723:31;;11774:18;11763:30;;11760:2;;;11806:1;11803;11796:12;11760:2;11826:97;11915:7;11906:6;11895:9;11891:22;11826:97;;;11816:107;;11702:227;11960:2;11978:53;12023:7;12014:6;12003:9;11999:22;11978:53;;;11968:63;;11939:98;11634:413;;;;;;12054:322;;12198:3;12186:9;12177:7;12173:23;12169:33;12166:2;;;12215:1;12212;12205:12;12166:2;12250:1;12267:93;12352:7;12332:9;12267:93;;12383:317;;12525:2;12513:9;12504:7;12500:23;12496:32;12493:2;;;12541:1;12538;12531:12;12493:2;12576:1;12593:91;12676:7;12656:9;12593:91;;12707:110;12780:31;12805:5;12780:31;;;12775:3;12768:44;12762:55;;;12851:766;;12996:59;13049:5;12996:59;;;13073:6;13068:3;13061:19;13097:4;13092:3;13088:14;13081:21;;13145:3;13187:4;13179:6;13175:17;13170:3;13166:27;13213:61;13268:5;13213:61;;;13295:1;13280:298;13305:6;13302:1;13299:13;13280:298;;;13367:9;13361:4;13357:20;13352:3;13345:33;13393:68;13456:4;13447:6;13441:13;13393:68;;;13385:76;;13478:65;13536:6;13478:65;;;13566:4;13557:14;;;;;13468:75;-1:-1;13327:1;13320:9;13280:298;;;-1:-1;13591:4;;12975:642;-1:-1;;;;;;12975:642;13684:864;;13857:73;13924:5;13857:73;;;13948:6;13943:3;13936:19;13972:4;13967:3;13963:14;13956:21;;14020:3;14062:4;14054:6;14050:17;14045:3;14041:27;14088:75;14157:5;14088:75;;;14184:1;14169:340;14194:6;14191:1;14188:13;14169:340;;;14256:9;14250:4;14246:20;14241:3;14234:33;14282:96;14373:4;14364:6;14358:13;14282:96;;;14274:104;;14395:79;14467:6;14395:79;;;14497:4;14488:14;;;;;14385:89;-1:-1;14216:1;14209:9;14169:340;;14587:590;;14722:54;14770:5;14722:54;;;14794:6;14789:3;14782:19;14818:4;14813:3;14809:14;14802:21;;14863:56;14913:5;14863:56;;;14940:1;14925:230;14950:6;14947:1;14944:13;14925:230;;;14990:53;15039:3;15030:6;15024:13;14990:53;;;15060:60;15113:6;15060:60;;;15143:4;15134:14;;;;;15050:70;-1:-1;14972:1;14965:9;14925:230;;;-1:-1;15168:3;;14701:476;-1:-1;;;;14701:476;15185:107;15256:30;15280:5;15256:30;;15299:297;;15399:38;15431:5;15399:38;;;15454:6;15449:3;15442:19;15466:63;15522:6;15515:4;15510:3;15506:14;15499:4;15492:5;15488:16;15466:63;;;15561:29;15583:6;15561:29;;;15541:50;;;15554:4;15541:50;;15379:217;-1:-1;;;15379:217;15900:397;16055:2;16043:15;;16092:66;16087:2;16078:12;;16071:88;16193:66;16188:2;16179:12;;16172:88;16288:2;16279:12;;16036:261;16306:296;16461:2;16449:15;;16498:66;16493:2;16484:12;;16477:88;16593:2;16584:12;;16442:160;16611:397;16766:2;16754:15;;16803:66;16798:2;16789:12;;16782:88;16904:66;16899:2;16890:12;;16883:88;16999:2;16990:12;;16747:261;17017:296;17172:2;17160:15;;17209:66;17204:2;17195:12;;17188:88;17304:2;17295:12;;17153:160;17322:397;17477:2;17465:15;;17514:66;17509:2;17500:12;;17493:88;17615:66;17610:2;17601:12;;17594:88;17710:2;17701:12;;17458:261;17728:296;17883:2;17871:15;;17920:66;17915:2;17906:12;;17899:88;18015:2;18006:12;;17864:160;18033:296;18188:2;18176:15;;18225:66;18220:2;18211:12;;18204:88;18320:2;18311:12;;18169:160;18338:296;18493:2;18481:15;;18530:66;18525:2;18516:12;;18509:88;18625:2;18616:12;;18474:160;18643:296;18798:2;18786:15;;18835:66;18830:2;18821:12;;18814:88;18930:2;18921:12;;18779:160;18948:397;19103:2;19091:15;;19140:66;19135:2;19126:12;;19119:88;19241:66;19236:2;19227:12;;19220:88;19336:2;19327:12;;19084:261;19354:296;19509:2;19497:15;;19546:66;19541:2;19532:12;;19525:88;19641:2;19632:12;;19490:160;19659:397;19814:2;19802:15;;19851:66;19846:2;19837:12;;19830:88;19952:66;19947:2;19938:12;;19931:88;20047:2;20038:12;;19795:261;20141:888;20369:22;;20282:4;20273:14;;;20403:61;20277:3;20369:22;20403:61;;;20302:174;20570:4;20563:5;20559:16;20553:23;20588:62;20644:4;20639:3;20635:14;20622:11;20588:62;;;20486:176;20746:4;20739:5;20735:16;20729:23;20764:62;20820:4;20815:3;20811:14;20798:11;20764:62;;;20672:166;20922:4;20915:5;20911:16;20905:23;20940:62;20996:4;20991:3;20987:14;20974:11;20940:62;;21089:2419;21304:22;;21089:2419;;21226:5;21217:15;;;21338:61;21221:3;21304:22;21338:61;;;21247:164;21495:4;21488:5;21484:16;21478:23;21513:62;21569:4;21564:3;21560:14;21547:11;21513:62;;;21421:166;21678:4;21671:5;21667:16;21661:23;21696:62;21752:4;21747:3;21743:14;21730:11;21696:62;;;21597:173;21855:4;21848:5;21844:16;21838:23;21873:62;21929:4;21924:3;21920:14;21907:11;21873:62;;;21780:167;22035:4;22028:5;22024:16;22018:23;22053:62;22109:4;22104:3;22100:14;22087:11;22053:62;;;21957:170;22215:4;22208:5;22204:16;22198:23;22233:62;22289:4;22284:3;22280:14;22267:11;22233:62;;;22137:170;22387:4;22380:5;22376:16;22370:23;22405:62;22461:4;22456:3;22452:14;22439:11;22405:62;;;22317:162;22559:4;22552:5;22548:16;22542:23;22577:62;22633:4;22628:3;22624:14;22611:11;22577:62;;;22489:162;22744:5;22737;22733:17;22727:24;22763:63;22819:5;22814:3;22810:15;22797:11;22763:63;;;22661:177;22914:5;22907;22903:17;22897:24;22933:63;22989:5;22984:3;22980:15;22967:11;22933:63;;;22848:160;23094:5;23087;23083:17;23077:24;23147:3;23141:4;23137:14;23129:5;23124:3;23120:15;23113:39;23167:66;23228:4;23215:11;23167:66;;;23159:74;;23018:227;23331:5;23324;23320:17;23314:24;23384:3;23378:4;23374:14;23366:5;23361:3;23357:15;23350:39;23404:66;23465:4;23452:11;23404:66;;;23396:74;21199:2309;-1:-1;;;;;21199:2309;25990:107;26061:30;26085:5;26061:30;;26104:110;26177:31;26202:5;26177:31;;26221:581;26431:3;26416:19;;26446:61;26420:9;26480:6;26446:61;;;26518:62;26576:2;26565:9;26561:18;26552:6;26518:62;;;26591;26649:2;26638:9;26634:18;26625:6;26591:62;;;26701:9;26695:4;26691:20;26686:2;26675:9;26671:18;26664:48;26726:66;26787:4;26778:6;26726:66;;;26718:74;26402:400;-1:-1;;;;;;26402:400;26809:294;26945:2;26930:18;;26959:61;26934:9;26993:6;26959:61;;;27031:62;27089:2;27078:9;27074:18;27065:6;27031:62;;27110:935;27472:2;27486:47;;;27457:18;;27547:136;27457:18;27669:6;27547:136;;;27539:144;;27731:9;27725:4;27721:20;27716:2;27705:9;27701:18;27694:48;27756:98;27849:4;27840:6;27756:98;;;27748:106;;27902:9;27896:4;27892:20;27887:2;27876:9;27872:18;27865:48;27927:108;28030:4;28021:6;27927:108;;28052:787;28364:2;28378:47;;;28349:18;;28439:136;28349:18;28561:6;28439:136;;;28431:144;;28586:62;28644:2;28633:9;28629:18;28620:6;28586:62;;;28696:9;28690:4;28686:20;28681:2;28670:9;28666:18;28659:48;28721:108;28824:4;28815:6;28721:108;;28846:189;28952:2;28937:18;;28966:59;28941:9;28998:6;28966:59;;29042:387;29223:2;29237:47;;;29208:18;;29298:121;29208:18;29298:121;;29436:387;29617:2;29631:47;;;29602:18;;29692:121;29602:18;29692:121;;29830:387;30011:2;30025:47;;;29996:18;;30086:121;29996:18;30086:121;;30224:387;30405:2;30419:47;;;30390:18;;30480:121;30390:18;30480:121;;30618:387;30799:2;30813:47;;;30784:18;;30874:121;30784:18;30874:121;;31012:387;31193:2;31207:47;;;31178:18;;31268:121;31178:18;31268:121;;31406:387;31587:2;31601:47;;;31572:18;;31662:121;31572:18;31662:121;;31800:387;31981:2;31995:47;;;31966:18;;32056:121;31966:18;32056:121;;32194:387;32375:2;32389:47;;;32360:18;;32450:121;32360:18;32450:121;;32588:387;32769:2;32783:47;;;32754:18;;32844:121;32754:18;32844:121;;32982:387;33163:2;33177:47;;;33148:18;;33238:121;33148:18;33238:121;;33376:387;33557:2;33571:47;;;33542:18;;33632:121;33542:18;33632:121;;33770:310;33936:3;33921:19;;33951:119;33925:9;34043:6;33951:119;;34087:333;34241:2;34255:47;;;34226:18;;34316:94;34226:18;34396:6;34316:94;;34427:603;34647:2;34661:47;;;34632:18;;34722:90;34632:18;34798:6;34722:90;;;34714:98;;34823:62;34881:2;34870:9;34866:18;34857:6;34823:62;;;34933:9;34927:4;34923:20;34918:2;34907:9;34903:18;34896:48;34958:62;35015:4;35006:6;34958:62;;35037:189;35143:2;35128:18;;35157:59;35132:9;35189:6;35157:59;;35233:193;35341:2;35326:18;;35355:61;35330:9;35389:6;35355:61;;35433:256;35495:2;35489:9;35521:17;;;35596:18;35581:34;;35617:22;;;35578:62;35575:2;;;35653:1;35650;35643:12;35575:2;35669;35662:22;35473:216;;-1:-1;35473:216;35696:263;;35860:18;35852:6;35849:30;35846:2;;;35892:1;35889;35882:12;35846:2;-1:-1;35921:4;35909:17;;;35939:15;;35783:176;36250:254;;36389:18;36381:6;36378:30;36375:2;;;36421:1;36418;36411:12;36375:2;-1:-1;36494:4;36465;36442:17;;;;36461:9;36438:33;36484:15;;36312:192;36778:126;36892:4;36880:17;;36861:43;37196:112;37291:12;;37275:33;38171:128;38251:42;38240:54;;38223:76;38306:151;38385:66;38374:78;;38357:100;38464:91;38543:6;38532:18;;38515:40;38562:79;38631:5;38614:27;39053:88;39131:4;39120:16;;39103:38;39149:145;39230:6;39225:3;39220;39207:30;-1:-1;39286:1;39268:16;;39261:27;39200:94;39303:268;39368:1;39375:101;39389:6;39386:1;39383:13;39375:101;;;39456:11;;;39450:18;39437:11;;;39430:39;39411:2;39404:10;39375:101;;;39491:6;39488:1;39485:13;39482:2;;;-1:-1;;39556:1;39538:16;;39531:27;39352:219;39579:97;39667:2;39647:14;39663:7;39643:28;;39627:49" } } }, @@ -732,176 +749,128 @@ "2.0.0/forwarder/MixinConstants.sol": { "id": 1 }, - "2.0.0/forwarder/MixinERC20.sol": { + "2.0.0/forwarder/MixinExpectedResults.sol": { "id": 2 }, - "2.0.0/forwarder/MixinERC721.sol": { + "2.0.0/forwarder/MixinFees.sol": { "id": 3 }, - "2.0.0/forwarder/MixinExpectedResults.sol": { + "2.0.0/forwarder/MixinForwarderCore.sol": { "id": 4 }, - "2.0.0/forwarder/MixinMarketBuyTokens.sol": { + "2.0.0/forwarder/MixinMarketBuyZrx.sol": { "id": 5 }, - "2.0.0/forwarder/MixinMarketBuyZrx.sol": { + "2.0.0/forwarder/MixinTransfer.sol": { "id": 6 }, - "2.0.0/forwarder/MixinMarketSellTokens.sol": { + "2.0.0/forwarder/interfaces/IExpectedResults.sol": { "id": 7 }, - "2.0.0/forwarder/MixinWethFees.sol": { + "2.0.0/forwarder/interfaces/IForwarderCore.sol": { "id": 8 }, - "2.0.0/protocol/AssetProxy/interfaces/IAssetProxy.sol": { + "2.0.0/forwarder/mixins/MConstants.sol": { "id": 9 }, - "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.sol": { + "2.0.0/forwarder/mixins/MExpectedResults.sol": { "id": 10 }, - "2.0.0/protocol/Exchange/Exchange.sol": { + "2.0.0/forwarder/mixins/MFees.sol": { "id": 11 }, - "2.0.0/protocol/Exchange/MixinAssetProxyDispatcher.sol": { + "2.0.0/forwarder/mixins/MForwarderCore.sol": { "id": 12 }, - "2.0.0/protocol/Exchange/MixinExchangeCore.sol": { + "2.0.0/forwarder/mixins/MMarketBuyZrx.sol": { "id": 13 }, - "2.0.0/protocol/Exchange/MixinMatchOrders.sol": { + "2.0.0/forwarder/mixins/MTransfer.sol": { "id": 14 }, - "2.0.0/protocol/Exchange/MixinSignatureValidator.sol": { + "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol": { "id": 15 }, - "2.0.0/protocol/Exchange/MixinTransactions.sol": { + "2.0.0/protocol/Exchange/interfaces/IExchange.sol": { "id": 16 }, - "2.0.0/protocol/Exchange/MixinWrapperFunctions.sol": { + "2.0.0/protocol/Exchange/interfaces/IExchangeCore.sol": { "id": 17 }, - "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol": { + "2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol": { "id": 18 }, - "2.0.0/protocol/Exchange/interfaces/IExchangeCore.sol": { + "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol": { "id": 19 }, - "2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol": { + "2.0.0/protocol/Exchange/interfaces/ITransactions.sol": { "id": 20 }, - "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol": { + "2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol": { "id": 21 }, - "2.0.0/protocol/Exchange/interfaces/ITransactions.sol": { + "2.0.0/protocol/Exchange/libs/LibEIP712.sol": { "id": 22 }, - "2.0.0/protocol/Exchange/interfaces/IValidator.sol": { + "2.0.0/protocol/Exchange/libs/LibFillResults.sol": { "id": 23 }, - "2.0.0/protocol/Exchange/interfaces/IWallet.sol": { + "2.0.0/protocol/Exchange/libs/LibMath.sol": { "id": 24 }, - "2.0.0/protocol/Exchange/libs/LibConstants.sol": { + "2.0.0/protocol/Exchange/libs/LibOrder.sol": { "id": 25 }, - "2.0.0/protocol/Exchange/libs/LibEIP712.sol": { + "2.0.0/tokens/ERC20Token/IERC20Token.sol": { "id": 26 }, - "2.0.0/protocol/Exchange/libs/LibExchangeErrors.sol": { + "2.0.0/tokens/ERC721Token/IERC721Token.sol": { "id": 27 }, - "2.0.0/protocol/Exchange/libs/LibFillResults.sol": { + "2.0.0/tokens/EtherToken/IEtherToken.sol": { "id": 28 }, - "2.0.0/protocol/Exchange/libs/LibMath.sol": { - "id": 29 - }, - "2.0.0/protocol/Exchange/libs/LibOrder.sol": { - "id": 30 - }, - "2.0.0/protocol/Exchange/mixins/MAssetProxyDispatcher.sol": { - "id": 31 - }, - "2.0.0/protocol/Exchange/mixins/MExchangeCore.sol": { - "id": 32 - }, - "2.0.0/protocol/Exchange/mixins/MMatchOrders.sol": { - "id": 33 - }, - "2.0.0/protocol/Exchange/mixins/MSignatureValidator.sol": { - "id": 34 - }, - "2.0.0/protocol/Exchange/mixins/MTransactions.sol": { - "id": 35 - }, - "2.0.0/tokens/ERC20Token/IERC20Token.sol": { - "id": 36 - }, - "2.0.0/tokens/ERC721Token/IERC721Token.sol": { - "id": 37 - }, - "2.0.0/tokens/WETH9/WETH9.sol": { - "id": 38 - }, "2.0.0/utils/LibBytes/LibBytes.sol": { - "id": 39 - }, - "2.0.0/utils/Ownable/IOwnable.sol": { - "id": 40 - }, - "2.0.0/utils/Ownable/Ownable.sol": { - "id": 41 + "id": 29 }, "2.0.0/utils/SafeMath/SafeMath.sol": { - "id": 42 + "id": 30 } }, "sourceCodes": { - "2.0.0/forwarder/Forwarder.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 \"./MixinWethFees.sol\";\nimport \"./MixinMarketSellTokens.sol\";\nimport \"./MixinMarketBuyTokens.sol\";\nimport \"./MixinConstants.sol\";\nimport \"../utils/Ownable/Ownable.sol\";\n\ncontract Forwarder is\n Ownable,\n MixinConstants,\n MixinWethFees,\n MixinMarketBuyZrx,\n MixinMarketBuyTokens,\n MixinMarketSellTokens\n{\n uint256 MAX_UINT = 2**256 - 1;\n\n constructor (\n address _exchange,\n address _etherToken,\n address _zrxToken,\n bytes4 _erc20AssetProxyId,\n bytes memory _zrxAssetData,\n bytes memory _wethAssetData\n )\n public\n Ownable()\n MixinConstants(\n _exchange,\n _etherToken,\n _zrxToken,\n _zrxAssetData,\n _wethAssetData\n )\n {\n setERC20ProxyApproval(_erc20AssetProxyId);\n }\n\n /// @dev Default payabale function, this allows us to withdraw WETH\n function ()\n public\n payable\n {\n require(\n msg.sender == address(ETHER_TOKEN),\n \"DEFAULT_FUNCTION_WETH_CONTRACT_ONLY\"\n );\n }\n\n /// @dev Sets the allowances to the proxy for this contract\n function setERC20ProxyApproval(bytes4 erc20AssetProxyId)\n public\n onlyOwner\n {\n address proxyAddress = EXCHANGE.getAssetProxy(erc20AssetProxyId);\n if (proxyAddress != address(0)) {\n ETHER_TOKEN.approve(proxyAddress, MAX_UINT);\n ZRX_TOKEN.approve(proxyAddress, MAX_UINT);\n }\n }\n}\n", - "2.0.0/forwarder/MixinConstants.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 \"../protocol/Exchange/Exchange.sol\";\nimport { WETH9 as EtherToken } from \"../tokens/WETH9/WETH9.sol\";\nimport \"../tokens/ERC20Token/IERC20Token.sol\";\n\ncontract MixinConstants {\n\n Exchange EXCHANGE;\n EtherToken ETHER_TOKEN;\n IERC20Token ZRX_TOKEN;\n bytes ZRX_ASSET_DATA;\n bytes WETH_ASSET_DATA;\n\n constructor (\n address _exchange,\n address _etherToken,\n address _zrxToken,\n bytes memory _zrxAssetData,\n bytes memory _wethAssetData\n )\n public\n {\n EXCHANGE = Exchange(_exchange);\n ETHER_TOKEN = EtherToken(_etherToken);\n ZRX_TOKEN = IERC20Token(_zrxToken);\n ZRX_ASSET_DATA = _zrxAssetData;\n WETH_ASSET_DATA = _wethAssetData;\n }\n\n}", - "2.0.0/forwarder/MixinERC20.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\ncontract MixinERC20 {\n\n string constant ERROR_TRANSFER_FAILED = \"TRANSFER_FAILED\";\n bytes4 constant ERC20_TRANSFER_SELECTOR = bytes4(keccak256(\"transfer(address,uint256)\"));\n\n function transferToken(\n address token,\n address to,\n uint256 amount\n )\n internal\n {\n // Transfer tokens.\n // We do a raw call so we can check the success separate\n // from the return data.\n bool success = token.call(abi.encodeWithSelector(\n ERC20_TRANSFER_SELECTOR,\n to,\n amount\n ));\n require(\n success,\n \"TRANSFER_FAILED\"\n );\n \n // Check return data.\n // If there is no return data, we assume the token incorrectly\n // does not return a bool. In this case we expect it to revert\n // on failure, which was handled above.\n // If the token does return data, we require that it is a single\n // value that evaluates to true.\n assembly {\n if returndatasize {\n success := 0\n if eq(returndatasize, 32) {\n // First 64 bytes of memory are reserved scratch space\n returndatacopy(0, 0, 32)\n success := mload(0)\n }\n }\n }\n require(\n success,\n \"TRANSFER_FAILED\"\n );\n }\n}\n", - "2.0.0/forwarder/MixinERC721.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 \"../utils/LibBytes/LibBytes.sol\";\nimport \"../tokens/ERC721Token/IERC721Token.sol\";\n\ncontract MixinERC721 {\n\n using LibBytes for bytes;\n bytes4 constant ERC721_RECEIVED = bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"));\n bytes4 constant ERC721_RECEIVED_OPERATOR = bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"));\n\n function onERC721Received(address, uint256, bytes memory)\n public\n pure\n returns(bytes4)\n {\n return ERC721_RECEIVED;\n }\n\n function onERC721Received(address, address, uint256, bytes memory)\n public\n pure\n returns(bytes4)\n {\n return ERC721_RECEIVED_OPERATOR;\n }\n\n function transferERC721Token(\n bytes memory assetData,\n address to\n )\n internal\n {\n // Decode asset data.\n address token = assetData.readAddress(16);\n uint256 tokenId = assetData.readUint256(36);\n bytes memory receiverData = assetData.readBytesWithLength(100);\n IERC721Token(token).safeTransferFrom(\n address(this),\n to,\n tokenId,\n receiverData\n );\n }\n}\n", - "2.0.0/forwarder/MixinExpectedResults.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 \"../utils/LibBytes/LibBytes.sol\";\nimport \"../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../protocol/Exchange/libs/LibMath.sol\";\nimport \"../protocol/Exchange/libs/LibOrder.sol\";\nimport \"./MixinConstants.sol\";\n\ncontract MixinExpectedResults is\n LibMath,\n LibFillResults,\n MixinConstants\n{\n\n /// @dev Simulates the 0x Exchange fillOrder validation and calculations, without performing any state changes.\n /// @param order An Order struct containing order specifications.\n /// @param takerAssetFillAmount A number representing the amount of this order to fill.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount\n )\n internal\n view\n returns (FillResults memory fillResults)\n {\n LibOrder.OrderInfo memory orderInfo = EXCHANGE.getOrderInfo(order);\n if (orderInfo.orderStatus != uint8(LibOrder.OrderStatus.FILLABLE)) {\n return fillResults;\n }\n uint256 remainingTakerAssetAmount = safeSub(order.takerAssetAmount, orderInfo.orderTakerAssetFilledAmount);\n uint256 takerAssetFilledAmount = min256(takerAssetFillAmount, remainingTakerAssetAmount);\n\n fillResults.takerAssetFilledAmount = takerAssetFilledAmount;\n fillResults.makerAssetFilledAmount = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n );\n fillResults.makerFeePaid = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerFee\n );\n fillResults.takerFeePaid = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.takerFee\n );\n return fillResults;\n }\n\n /// @dev Calculates a FillResults total for selling takerAssetFillAmount over all orders. \n /// Including the fees required to be paid. \n /// @param orders An array of Order struct containing order specifications.\n /// @param takerAssetFillAmount A number representing the amount of this order to fill.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker.\n function calculateMarketSellResults(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount\n )\n internal\n view\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);\n FillResults memory singleFillResult = calculateFillResults(orders[i], remainingTakerAssetFillAmount);\n addFillResults(totalFillResults, singleFillResult);\n if (totalFillResults.takerAssetFilledAmount == takerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Calculates a total FillResults for buying makerAssetFillAmount over all orders.\n /// Including the fees required to be paid. \n /// @param orders An array of Order struct containing order specifications.\n /// @param makerAssetFillAmount A number representing the amount of this order to fill.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker.\n function calculateMarketBuyResults(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount\n )\n public\n view\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n FillResults memory singleFillResult = calculateFillResults(orders[i], remainingTakerAssetFillAmount);\n addFillResults(totalFillResults, singleFillResult);\n if (totalFillResults.makerAssetFilledAmount == makerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Calculates fill results for buyFeeTokens. This handles fees on buying ZRX\n /// so the end result is the expected amount of ZRX (not less after fees).\n /// @param orders An array of Order struct containing order specifications.\n /// @param zrxFillAmount A number representing the amount zrx to buy\n /// @return totalFillResults Expected fill result amounts from buying fees\n function calculateMarketBuyZrxResults(\n LibOrder.Order[] memory orders,\n uint256 zrxFillAmount\n )\n public\n view\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n uint256 remainingZrxFillAmount = safeSub(zrxFillAmount, totalFillResults.makerAssetFilledAmount);\n // Convert the remaining amount of makerToken to buy into remaining amount\n // of takerToken to sell, assuming entire amount can be sold in the current order\n uint256 remainingWethSellAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n safeSub(orders[i].makerAssetAmount, orders[i].takerFee), // our exchange rate after fees \n remainingZrxFillAmount\n );\n FillResults memory singleFillResult = calculateFillResults(orders[i], safeAdd(remainingWethSellAmount, 1));\n\n singleFillResult.makerAssetFilledAmount = safeSub(singleFillResult.makerAssetFilledAmount, singleFillResult.takerFeePaid);\n addFillResults(totalFillResults, singleFillResult);\n // As we compensate for the rounding issue above have slightly more ZRX than the requested zrxFillAmount\n if (totalFillResults.makerAssetFilledAmount >= zrxFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n}\n", - "2.0.0/forwarder/MixinMarketBuyTokens.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 \"../utils/LibBytes/LibBytes.sol\";\nimport \"./MixinWethFees.sol\";\nimport \"./MixinMarketBuyZrx.sol\";\nimport \"./MixinExpectedResults.sol\";\nimport \"./MixinERC20.sol\";\nimport \"./MixinERC721.sol\";\nimport \"./MixinConstants.sol\";\nimport \"../protocol/Exchange/libs/LibOrder.sol\";\n\ncontract MixinMarketBuyTokens is\n MixinConstants,\n MixinWethFees,\n MixinMarketBuyZrx,\n MixinExpectedResults,\n MixinERC20,\n MixinERC721\n{\n bytes4 public constant ERC20_DATA_ID = bytes4(keccak256(\"ERC20Token(address)\"));\n bytes4 public constant ERC721_DATA_ID = bytes4(keccak256(\"ERC721Token(address,uint256,bytes)\"));\n\n /// @dev Buys the exact amount of assets (ERC20 and ERC721), performing fee abstraction if required.\n /// All order assets must be of the same type. Deducts a proportional fee to fee recipient.\n /// This function is payable and will convert all incoming ETH into WETH and perform the trade on behalf of the caller.\n /// The caller is sent all assets from the fill of orders. This function will revert unless the requested amount of assets are purchased.\n /// Any excess ETH sent will be returned to the caller\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param feeOrders An array of Order struct containing order specifications for fees.\n /// @param makerTokenFillAmount The amount of maker asset to buy.\n /// @param feeSignatures An array of Proof that order has been created by maker for the fee orders.\n /// @param feeProportion A proportion deducted off the ETH spent and sent to feeRecipient. The maximum value for this\n /// is 1000, aka 10%. Supports up to 2 decimal places. I.e 0.59% is 59.\n /// @param feeRecipient An address of the fee recipient whom receives feeProportion of ETH.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketBuyTokensWithEth(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 makerTokenFillAmount,\n uint16 feeProportion,\n address feeRecipient\n )\n payable\n public\n returns (FillResults memory totalFillResults)\n {\n uint256 takerEthAmount = msg.value;\n require(\n takerEthAmount > 0,\n \"VALUE_GREATER_THAN_ZERO\"\n );\n require(\n makerTokenFillAmount > 0,\n \"VALUE_GREATER_THAN_ZERO\"\n );\n bytes4 assetDataId = LibBytes.readBytes4(orders[0].makerAssetData, 0);\n require(\n assetDataId == ERC20_DATA_ID || assetDataId == ERC721_DATA_ID,\n \"UNSUPPORTED_TOKEN_PROXY\"\n );\n\n ETHER_TOKEN.deposit.value(takerEthAmount)();\n if (assetDataId == ERC20_DATA_ID) {\n totalFillResults = marketBuyERC20TokensInternal(\n orders,\n signatures,\n feeOrders,\n feeSignatures,\n makerTokenFillAmount\n );\n } else if (assetDataId == ERC721_DATA_ID) {\n totalFillResults = batchBuyERC721TokensInternal(\n orders,\n signatures,\n feeOrders,\n feeSignatures\n );\n }\n // Prevent accidental WETH owned by this contract and it being spent\n require(\n takerEthAmount >= totalFillResults.takerAssetFilledAmount,\n \"INVALID_MSG_VALUE\"\n );\n withdrawPayAndDeductEthFee(\n safeSub(takerEthAmount, totalFillResults.takerAssetFilledAmount),\n totalFillResults.takerAssetFilledAmount,\n feeProportion,\n feeRecipient\n );\n return totalFillResults;\n }\n\n /// @dev Buys an exact amount of an ERC20 token using WETH.\n /// @param orders Orders to fill. The maker asset is the ERC20 token to buy. The taker asset is WETH.\n /// @param signatures Proof that the orders were created by their respective makers.\n /// @param feeOrders to fill. The maker asset is ZRX and the taker asset is WETH.\n /// @param feeSignatures Proof that the feeOrders were created by their respective makers.\n /// @param makerTokenFillAmount Amount of the ERC20 token to buy.\n /// @return totalFillResults Aggregated fill results of buying the ERC20 and ZRX tokens.\n function marketBuyERC20TokensInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 makerTokenFillAmount\n )\n private\n returns (FillResults memory totalFillResults)\n {\n // We read the maker token address to check if it is ZRX and later use it for transfer\n address makerTokenAddress = LibBytes.readAddress(orders[0].makerAssetData, 16);\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we copy the makerAssetData from the first order onto all later orders.\n orders[0].takerAssetData = WETH_ASSET_DATA;\n // We can short cut here for effeciency and use buyFeeTokensInternal if maker asset token is ZRX\n // this buys us exactly that amount taking into account the fees. This saves gas and calculates the rate correctly\n FillResults memory marketBuyResults;\n if (makerTokenAddress == address(ZRX_TOKEN)) {\n marketBuyResults = marketBuyZrxInternal(\n orders,\n signatures,\n makerTokenFillAmount\n );\n // When buying ZRX we round up which can result in a small margin excess\n require(\n marketBuyResults.makerAssetFilledAmount >= makerTokenFillAmount,\n \"UNACCEPTABLE_THRESHOLD\"\n );\n addFillResults(totalFillResults, marketBuyResults);\n require(\n isAcceptableThreshold(\n safeAdd(totalFillResults.makerAssetFilledAmount, totalFillResults.takerFeePaid), // Total ZRX\n totalFillResults.makerAssetFilledAmount // amount going to msg.sender\n ),\n \"UNACCEPTABLE_THRESHOLD\"\n );\n } else {\n FillResults memory calculatedMarketBuyResults = calculateMarketBuyResults(orders, makerTokenFillAmount);\n if (calculatedMarketBuyResults.takerFeePaid > 0) {\n // Fees are required for these orders. Buy enough ZRX to cover the future market buy\n FillResults memory zrxMarketBuyResults = marketBuyZrxInternal(\n feeOrders,\n feeSignatures,\n calculatedMarketBuyResults.takerFeePaid\n );\n totalFillResults.takerAssetFilledAmount = zrxMarketBuyResults.takerAssetFilledAmount;\n totalFillResults.takerFeePaid = zrxMarketBuyResults.takerFeePaid;\n }\n // Make our market buy of the requested tokens with the remaining balance\n marketBuyResults = EXCHANGE.marketBuyOrders(\n orders,\n makerTokenFillAmount,\n signatures\n );\n require(\n marketBuyResults.makerAssetFilledAmount == makerTokenFillAmount,\n \"UNACCEPTABLE_THRESHOLD\"\n );\n addFillResults(totalFillResults, marketBuyResults);\n require(\n isAcceptableThreshold(\n totalFillResults.takerAssetFilledAmount,\n marketBuyResults.takerAssetFilledAmount\n ),\n \"UNACCEPTABLE_THRESHOLD\"\n );\n }\n // Transfer all purchased tokens to msg.sender\n transferToken(\n makerTokenAddress,\n msg.sender,\n marketBuyResults.makerAssetFilledAmount\n );\n return totalFillResults;\n }\n\n /// @dev Buys an all of the ERC721 tokens in the orders.\n /// @param orders Orders to fill. The maker asset is the ERC721 token to buy. The taker asset is WETH.\n /// @param signatures Proof that the orders were created by their respective makers.\n /// @param feeOrders to fill. The maker asset is ZRX and the taker asset is WETH.\n /// @param feeSignatures Proof that the feeOrders were created by their respective makers.\n /// @return totalFillResults Aggregated fill results of buying the ERC721 tokens and ZRX tokens.\n function batchBuyERC721TokensInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures\n )\n private\n returns (FillResults memory totalFillResults)\n {\n uint256 totalZrxFeeAmount;\n uint256 ordersLength = orders.length;\n uint256[] memory takerAssetFillAmounts = new uint256[](ordersLength);\n for (uint256 i = 0; i < ordersLength; i++) {\n // Total up the fees\n totalZrxFeeAmount = safeAdd(totalZrxFeeAmount, orders[i].takerFee);\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we set the takerAssetData as WETH asset data\n orders[i].takerAssetData = WETH_ASSET_DATA;\n // Populate takerAssetFillAmounts for later batchFill\n takerAssetFillAmounts[i] = orders[i].takerAssetAmount;\n }\n if (totalZrxFeeAmount > 0) {\n // Fees are required for these orders. Buy enough ZRX to cover the future fill\n FillResults memory zrxMarketBuyResults = marketBuyZrxInternal(\n feeOrders,\n feeSignatures,\n totalZrxFeeAmount\n );\n totalFillResults.takerFeePaid = zrxMarketBuyResults.takerFeePaid;\n totalFillResults.takerAssetFilledAmount = zrxMarketBuyResults.takerAssetFilledAmount;\n }\n FillResults memory batchFillResults = EXCHANGE.batchFillOrKillOrders(\n orders,\n takerAssetFillAmounts,\n signatures\n );\n addFillResults(totalFillResults, batchFillResults);\n require(\n isAcceptableThreshold(\n totalFillResults.takerAssetFilledAmount,\n batchFillResults.takerAssetFilledAmount\n ),\n \"UNACCEPTABLE_THRESHOLD\"\n );\n // Transfer all of the tokens filled from the batchFill\n for (i = 0; i < ordersLength; i++) {\n transferERC721Token(\n orders[i].makerAssetData,\n msg.sender\n );\n }\n return totalFillResults;\n }\n}\n", - "2.0.0/forwarder/MixinMarketBuyZrx.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/Exchange.sol\";\nimport \"../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../protocol/Exchange/libs/LibMath.sol\";\nimport \"./MixinConstants.sol\";\n\ncontract MixinMarketBuyZrx is\n LibMath,\n LibFillResults,\n MixinConstants\n{\n /// @dev Buys zrxBuyAmount of ZRX fee tokens, taking into account the fees on buying fee tokens. This will guarantee\n /// At least zrxBuyAmount of ZRX fee tokens are purchased (sometimes slightly over due to rounding issues).\n /// It is possible that a request to buy 200 ZRX fee tokens will require purchasing 202 ZRX tokens\n /// As 2 ZRX is required to purchase the 200 ZRX fee tokens. This guarantees at least 200 ZRX for future purchases.\n /// @param orders An array of Order struct containing order specifications for fees.\n /// @param signatures An array of Proof that order has been created by maker for the fee orders.\n /// @param zrxBuyAmount The number of requested ZRX fee tokens.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker. makerTokenAmount is the zrx amount deducted of fees\n function marketBuyZrxInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n uint256 zrxBuyAmount\n )\n internal\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n // All of these are ZRX/WETH, we can drop the respective assetData from callData\n orders[i].makerAssetData = ZRX_ASSET_DATA;\n orders[i].takerAssetData = WETH_ASSET_DATA;\n // Calculate the remaining amount of makerToken to buy\n uint256 remainingZrxBuyAmount = safeSub(zrxBuyAmount, totalFillResults.makerAssetFilledAmount);\n // Convert the remaining amount of makerToken to buy into remaining amount\n // of takerToken to sell, assuming entire amount can be sold in the current order\n uint256 remainingWethSellAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n safeSub(orders[i].makerAssetAmount, orders[i].takerFee), // our exchange rate after fees \n remainingZrxBuyAmount\n );\n // Attempt to sell the remaining amount of takerToken\n // Round up the amount to ensure we don't under buy by a fractional amount\n FillResults memory singleFillResult = EXCHANGE.fillOrder(\n orders[i],\n safeAdd(remainingWethSellAmount, 1),\n signatures[i]\n );\n // We didn't buy the full amount when buying ZRX as some were taken for fees\n singleFillResult.makerAssetFilledAmount = safeSub(singleFillResult.makerAssetFilledAmount, singleFillResult.takerFeePaid);\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResult);\n // Stop execution if the entire amount of makerToken has been bought\n if (totalFillResults.makerAssetFilledAmount >= zrxBuyAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n}\n", - "2.0.0/forwarder/MixinMarketSellTokens.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/libs/LibOrder.sol\";\nimport \"../utils/LibBytes/LibBytes.sol\";\nimport \"./MixinWethFees.sol\";\nimport \"./MixinExpectedResults.sol\";\nimport \"./MixinERC20.sol\";\nimport \"./MixinConstants.sol\";\nimport \"./MixinMarketBuyZrx.sol\";\n\ncontract MixinMarketSellTokens is\n MixinConstants,\n MixinWethFees,\n MixinMarketBuyZrx,\n MixinExpectedResults,\n MixinERC20\n{\n /// @dev Market sells ETH for ERC20 tokens, performing fee abstraction if required. This does not support ERC721 tokens. This function is payable\n /// and will convert all incoming ETH into WETH and perform the trade on behalf of the caller.\n /// This function allows for a deduction of a proportion of incoming ETH sent to the feeRecipient.\n /// The caller is sent all tokens from the operation.\n /// If the purchased token amount does not meet an acceptable threshold then this function reverts.\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param feeOrders An array of Order struct containing order specifications for fees.\n /// @param feeSignatures An array of Proof that order has been created by maker for the fee orders.\n /// @param feeProportion A proportion deducted off the incoming ETH and sent to feeRecipient. The maximum value for this\n /// is 1000, aka 10%. Supports up to 2 decimal places. I.e 0.59% is 59.\n /// @param feeRecipient An address of the fee recipient whom receives feeProportion of ETH.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketSellEthForERC20(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint16 feeProportion,\n address feeRecipient\n )\n payable\n public\n returns (FillResults memory totalFillResults)\n {\n uint256 takerEthAmount = msg.value;\n require(\n takerEthAmount > 0,\n \"VALUE_GREATER_THAN_ZERO\"\n );\n // Deduct the fee from the total amount of ETH sent in\n uint256 ethFeeAmount = payEthFee(\n takerEthAmount,\n feeProportion,\n feeRecipient\n );\n uint256 wethSellAmount = safeSub(takerEthAmount, ethFeeAmount);\n\n // Deposit the remaining to be used for trading\n ETHER_TOKEN.deposit.value(wethSellAmount)();\n // Populate the known assetData, as it is always WETH the caller can provide null bytes to save gas\n // marketSellOrders fills the remaining\n address makerTokenAddress = LibBytes.readAddress(orders[0].makerAssetData, 16);\n orders[0].takerAssetData = WETH_ASSET_DATA;\n if (makerTokenAddress == address(ZRX_TOKEN)) {\n // If this is ZRX then we market sell from the orders, rather than a 2 step of buying ZRX fees from feeOrders\n // then buying ZRX from orders\n totalFillResults = marketSellEthForZRXInternal(\n orders,\n signatures,\n wethSellAmount\n );\n } else {\n totalFillResults = marketSellEthForERC20Internal(\n orders,\n signatures,\n feeOrders,\n feeSignatures,\n wethSellAmount\n );\n }\n // Prevent accidental WETH owned by this contract and it being spent\n require(\n takerEthAmount >= totalFillResults.takerAssetFilledAmount,\n \"INVALID_MSG_VALUE\"\n );\n // Ensure no WETH is left in this contract\n require(\n wethSellAmount == totalFillResults.takerAssetFilledAmount,\n \"UNACCEPTABLE_THRESHOLD\"\n );\n // Transfer all tokens to msg.sender\n transferToken(\n makerTokenAddress,\n msg.sender,\n totalFillResults.makerAssetFilledAmount\n );\n return totalFillResults;\n }\n\n /// @dev Market sells WETH for ERC20 tokens.\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param feeOrders An array of Order struct containing order specifications for fees.\n /// @param feeSignatures An array of Proof that order has been created by maker for the fee orders.\n /// @param wethSellAmount The amount of WETH to sell.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketSellEthForERC20Internal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 wethSellAmount\n )\n internal\n returns (FillResults memory totalFillResults)\n {\n uint256 remainingWethSellAmount = wethSellAmount;\n FillResults memory calculatedMarketSellResults = calculateMarketSellResults(orders, wethSellAmount);\n if (calculatedMarketSellResults.takerFeePaid > 0) {\n // Fees are required for these orders. Buy enough ZRX to cover the future market buy\n FillResults memory feeTokensResults = marketBuyZrxInternal(\n feeOrders,\n feeSignatures,\n calculatedMarketSellResults.takerFeePaid\n );\n // Ensure the token abstraction was fair if fees were proportionally too high, we fail\n require(\n isAcceptableThreshold(\n wethSellAmount,\n safeSub(wethSellAmount, feeTokensResults.takerAssetFilledAmount)\n ),\n \"UNACCEPTABLE_THRESHOLD\"\n );\n remainingWethSellAmount = safeSub(remainingWethSellAmount, feeTokensResults.takerAssetFilledAmount);\n totalFillResults.takerFeePaid = feeTokensResults.takerFeePaid;\n totalFillResults.takerAssetFilledAmount = feeTokensResults.takerAssetFilledAmount;\n }\n // Make our market sell to buy the requested tokens with the remaining balance\n FillResults memory requestedTokensResults = EXCHANGE.marketSellOrders(\n orders,\n remainingWethSellAmount,\n signatures\n );\n // Update our return FillResult with the market sell\n addFillResults(totalFillResults, requestedTokensResults);\n return totalFillResults;\n }\n\n /// @dev Market sells WETH for ZRX tokens.\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param wethSellAmount The amount of WETH to sell.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketSellEthForZRXInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n uint256 wethSellAmount\n )\n internal\n returns (FillResults memory totalFillResults)\n {\n // Make our market sell to buy the requested tokens with the remaining balance\n totalFillResults = EXCHANGE.marketSellOrders(\n orders,\n wethSellAmount,\n signatures\n );\n // Exchange does not special case ZRX in the makerAssetFilledAmount, if fees were deducted then using this amount\n // for future transfers is invalid.\n uint256 zrxAmountBought = safeSub(totalFillResults.makerAssetFilledAmount, totalFillResults.takerFeePaid);\n require(\n isAcceptableThreshold(totalFillResults.makerAssetFilledAmount, zrxAmountBought),\n \"UNACCEPTABLE_THRESHOLD\"\n );\n totalFillResults.makerAssetFilledAmount = zrxAmountBought;\n return totalFillResults;\n }\n\n}\n", - "2.0.0/forwarder/MixinWethFees.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 { WETH9 as EtherToken } from \"../tokens/WETH9/WETH9.sol\";\nimport \"../protocol/Exchange/libs/LibMath.sol\";\nimport \"./MixinConstants.sol\";\n\ncontract MixinWethFees is\n LibMath,\n MixinConstants\n{\n\n uint16 constant public PERCENTAGE_DENOMINATOR = 10000; // 9800 == 98%, 10000 == 100%\n uint16 constant public MAX_FEE = 1000; // 10%\n uint16 constant public ALLOWABLE_EXCHANGE_PERCENTAGE = 9500; // 95%\n\n /// @dev Pays the feeRecipient feeProportion of the total takerEthAmount, denominated in ETH\n /// @param takerEthAmount The total amount that was transacted in WETH, fees are calculated from this value.\n /// @param feeProportion The proportion of fees\n /// @param feeRecipient The recipient of the fees\n /// @return ethFeeAmount Amount of ETH paid to feeRecipient as fee.\n function payEthFee(\n uint256 takerEthAmount,\n uint16 feeProportion,\n address feeRecipient\n )\n internal\n returns (uint256 ethFeeAmount)\n {\n if (feeProportion > 0 && feeRecipient != address(0)) {\n require(\n feeProportion <= MAX_FEE,\n \"FEE_PROPORTION_TOO_LARGE\"\n );\n // 1.5% is 150, allowing for 2 decimal precision, i.e 0.05% is 5\n ethFeeAmount = getPartialAmount(\n feeProportion,\n PERCENTAGE_DENOMINATOR,\n takerEthAmount\n );\n feeRecipient.transfer(ethFeeAmount);\n }\n return ethFeeAmount;\n }\n\n /// @dev Withdraws the remaining WETH, deduct and pay fees from this amount based on the takerTokenAmount to the feeRecipient.\n /// If a user overpaid ETH initially, the fees are calculated from the amount traded and deducted from withdrawAmount.\n /// Any remaining ETH is sent back to the user.\n /// @param ethWithdrawAmount The amount to withdraw from the WETH contract.\n /// @param wethAmountSold The total amount that was transacted in WETH, fees are calculated from this value.\n /// @param feeProportion The proportion of fees\n /// @param feeRecipient The recipient of the fees\n function withdrawPayAndDeductEthFee(\n uint256 ethWithdrawAmount,\n uint256 wethAmountSold,\n uint16 feeProportion,\n address feeRecipient\n )\n internal\n {\n // Return all of the excess WETH if any after deducting fees on the amount\n if (ethWithdrawAmount > 0) {\n ETHER_TOKEN.withdraw(ethWithdrawAmount);\n // Fees proportional to the amount traded\n uint256 ethFeeAmount = payEthFee(\n wethAmountSold,\n feeProportion,\n feeRecipient\n );\n uint256 unspentEthAmount = safeSub(ethWithdrawAmount, ethFeeAmount);\n if (unspentEthAmount > 0) {\n msg.sender.transfer(unspentEthAmount);\n }\n }\n }\n\n /// @dev Checks whether the amount of tokens sold against the amount of tokens requested\n /// is within a certain threshold. This ensures the caller gets a fair deal when\n /// performing any token fee abstraction. Threshold is 95%. If fee abstraction costs more than\n /// 5% of the total transaction, we return false.\n /// @param requestedSellAmount The amount the user requested, or sent in to a payable function\n /// @param tokenAmountSold The amount of the token that was sold after fee abstraction\n /// @return bool of whether this is within an acceptable threshold\n function isAcceptableThreshold(uint256 requestedSellAmount, uint256 tokenAmountSold)\n internal\n pure\n returns (bool)\n {\n uint256 acceptableSellAmount = getPartialAmount(\n ALLOWABLE_EXCHANGE_PERCENTAGE,\n PERCENTAGE_DENOMINATOR,\n requestedSellAmount\n );\n return tokenAmountSold >= acceptableSellAmount;\n }\n}\n", - "2.0.0/protocol/AssetProxy/interfaces/IAssetProxy.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 \"./IAuthorizable.sol\";\n\ncontract IAssetProxy is\n IAuthorizable\n{\n\n /// @dev Transfers assets. Either succeeds or throws.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFrom(\n bytes assetData,\n address from,\n address to,\n uint256 amount\n )\n external;\n \n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n pure\n returns (bytes4);\n}\n", - "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.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 \"../../../utils/Ownable/IOwnable.sol\";\n\ncontract IAuthorizable is\n IOwnable\n{\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[]);\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external;\n}\n", - "2.0.0/protocol/Exchange/Exchange.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/LibConstants.sol\";\nimport \"./MixinExchangeCore.sol\";\nimport \"./MixinSignatureValidator.sol\";\nimport \"./MixinWrapperFunctions.sol\";\nimport \"./MixinAssetProxyDispatcher.sol\";\nimport \"./MixinTransactions.sol\";\nimport \"./MixinMatchOrders.sol\";\n\ncontract Exchange is\n MixinExchangeCore,\n MixinMatchOrders,\n MixinSignatureValidator,\n MixinTransactions,\n MixinAssetProxyDispatcher,\n MixinWrapperFunctions\n{\n\n string constant public VERSION = \"2.0.1-alpha\";\n\n // Mixins are instantiated in the order they are inherited\n constructor (bytes memory _zrxAssetData)\n public\n LibConstants(_zrxAssetData) // @TODO: Remove when we deploy.\n MixinExchangeCore()\n MixinMatchOrders()\n MixinSignatureValidator()\n MixinTransactions()\n MixinAssetProxyDispatcher()\n MixinWrapperFunctions()\n {}\n}\n", - "2.0.0/protocol/Exchange/MixinAssetProxyDispatcher.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/Ownable/Ownable.sol\";\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./mixins/MAssetProxyDispatcher.sol\";\nimport \"../AssetProxy/interfaces/IAssetProxy.sol\";\n\ncontract MixinAssetProxyDispatcher is\n Ownable,\n MAssetProxyDispatcher\n{\n using LibBytes for bytes;\n \n // Mapping from Asset Proxy Id's to their respective Asset Proxy\n mapping (bytes4 => IAssetProxy) public assetProxies;\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 onlyOwner\n {\n IAssetProxy assetProxyContract = IAssetProxy(assetProxy);\n\n // Ensure that no asset proxy exists with current id.\n bytes4 assetProxyId = assetProxyContract.getProxyId();\n address currentAssetProxy = assetProxies[assetProxyId];\n require(\n currentAssetProxy == address(0),\n \"ASSET_PROXY_ALREADY_EXISTS\"\n );\n\n // Add asset proxy and log registration.\n assetProxies[assetProxyId] = assetProxyContract;\n emit AssetProxyRegistered(\n assetProxyId,\n assetProxy\n );\n }\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 return assetProxies[assetProxyId];\n }\n\n /// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws.\n /// @param assetData Byte array encoded for the asset.\n /// @param from Address to transfer token from.\n /// @param to Address to transfer token to.\n /// @param amount Amount of token to transfer.\n function dispatchTransferFrom(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n // Do nothing if no amount should be transferred.\n if (amount > 0) {\n // Ensure assetData length is valid\n require(\n assetData.length > 3,\n \"LENGTH_GREATER_THAN_3_REQUIRED\"\n );\n \n // Lookup assetProxy\n bytes4 assetProxyId;\n assembly {\n assetProxyId := and(mload(\n add(assetData, 32)),\n 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000\n )\n }\n address assetProxy = assetProxies[assetProxyId];\n\n // Ensure that assetProxy exists\n require(\n assetProxy != address(0),\n \"ASSET_PROXY_DOES_NOT_EXIST\"\n );\n \n // We construct calldata for the `assetProxy.transferFrom` ABI.\n // The layout of this calldata is in the table below.\n // \n // | Area | Offset | Length | Contents |\n // | -------- |--------|---------|-------------------------------------------- |\n // | Header | 0 | 4 | function selector |\n // | Params | | 4 * 32 | function parameters: |\n // | | 4 | | 1. offset to assetData (*) |\n // | | 36 | | 2. from |\n // | | 68 | | 3. to |\n // | | 100 | | 4. amount |\n // | Data | | | assetData: |\n // | | 132 | 32 | assetData Length |\n // | | 164 | ** | assetData Contents |\n\n assembly {\n /////// Setup State ///////\n // `cdStart` is the start of the calldata for `assetProxy.transferFrom` (equal to free memory ptr).\n let cdStart := mload(64)\n // `dataAreaLength` is the total number of words needed to store `assetData`\n // As-per the ABI spec, this value is padded up to the nearest multiple of 32,\n // and includes 32-bytes for length.\n let dataAreaLength := and(add(mload(assetData), 63), 0xFFFFFFFFFFFE0)\n // `cdEnd` is the end of the calldata for `assetProxy.transferFrom`.\n let cdEnd := add(cdStart, add(132, dataAreaLength))\n\n \n /////// Setup Header Area ///////\n // This area holds the 4-byte `transferFromSelector`.\n // bytes4(keccak256(\"transferFrom(bytes,address,address,uint256)\")) = 0xa85e59e4\n mstore(cdStart, 0xa85e59e400000000000000000000000000000000000000000000000000000000)\n \n /////// Setup Params Area ///////\n // Each parameter is padded to 32-bytes. The entire Params Area is 128 bytes.\n // Notes:\n // 1. The offset to `assetData` is the length of the Params Area (128 bytes).\n // 2. A 20-byte mask is applied to addresses to zero-out the unused bytes.\n mstore(add(cdStart, 4), 128)\n mstore(add(cdStart, 36), and(from, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(cdStart, 68), and(to, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(cdStart, 100), amount)\n \n /////// Setup Data Area ///////\n // This area holds `assetData`.\n let dataArea := add(cdStart, 132)\n for {} lt(dataArea, cdEnd) {} {\n mstore(dataArea, mload(assetData))\n dataArea := add(dataArea, 32)\n assetData := add(assetData, 32)\n }\n\n /////// Call `assetProxy.transferFrom` using the constructed calldata ///////\n let success := call(\n gas, // forward all gas\n assetProxy, // call address of asset proxy\n 0, // don't send any ETH\n cdStart, // pointer to start of input\n sub(cdEnd, cdStart), // length of input \n cdStart, // write output over input\n 512 // reserve 512 bytes for output\n )\n if iszero(success) {\n revert(cdStart, returndatasize())\n }\n }\n }\n }\n}\n", - "2.0.0/protocol/Exchange/MixinExchangeCore.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/LibConstants.sol\";\nimport \"./libs/LibFillResults.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibMath.sol\";\nimport \"./mixins/MExchangeCore.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./mixins/MAssetProxyDispatcher.sol\";\n\ncontract MixinExchangeCore is\n LibConstants,\n LibMath,\n LibOrder,\n LibFillResults,\n MAssetProxyDispatcher,\n MExchangeCore,\n MSignatureValidator,\n MTransactions\n{\n // Mapping of orderHash => amount of takerAsset already bought by maker\n mapping (bytes32 => uint256) public filled;\n\n // Mapping of orderHash => cancelled\n mapping (bytes32 => bool) public cancelled;\n\n // Mapping of makerAddress => senderAddress => lowest salt an order can have in order to be fillable\n // Orders with specified senderAddress and with a salt less than their epoch to are considered cancelled\n mapping (address => mapping (address => uint256)) public orderEpoch;\n\n ////// Core exchange functions //////\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 address makerAddress = getCurrentContextAddress();\n // If this function is called via `executeTransaction`, we only update the orderEpoch for the makerAddress/msg.sender combination.\n // This allows external filter contracts to add rules to how orders are cancelled via this function.\n address senderAddress = makerAddress == msg.sender ? address(0) : msg.sender;\n\n // orderEpoch is initialized to 0, so to cancelUpTo we need salt + 1\n uint256 newOrderEpoch = targetOrderEpoch + 1; \n uint256 oldOrderEpoch = orderEpoch[makerAddress][senderAddress];\n\n // Ensure orderEpoch is monotonically increasing\n require(\n newOrderEpoch > oldOrderEpoch, \n \"INVALID_NEW_ORDER_EPOCH\"\n );\n\n // Update orderEpoch\n orderEpoch[makerAddress][senderAddress] = newOrderEpoch;\n emit CancelUpTo(makerAddress, senderAddress, newOrderEpoch);\n }\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 Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n // Fetch order info\n OrderInfo memory orderInfo = getOrderInfo(order);\n\n // Fetch taker address\n address takerAddress = getCurrentContextAddress();\n\n // Get amount of takerAsset to fill\n uint256 remainingTakerAssetAmount = safeSub(order.takerAssetAmount, orderInfo.orderTakerAssetFilledAmount);\n uint256 takerAssetFilledAmount = min256(takerAssetFillAmount, remainingTakerAssetAmount);\n\n // Validate context\n assertValidFill(\n order,\n orderInfo,\n takerAddress,\n takerAssetFillAmount,\n takerAssetFilledAmount,\n signature\n );\n\n // Compute proportional fill amounts\n fillResults = calculateFillResults(order, takerAssetFilledAmount);\n\n // Update exchange internal state\n updateFilledState(\n order,\n takerAddress,\n orderInfo.orderHash,\n orderInfo.orderTakerAssetFilledAmount,\n fillResults\n );\n \n // Settle order\n settleOrder(order, takerAddress, fillResults);\n\n return fillResults;\n }\n\n /// @dev After calling, the order can not be filled anymore.\n /// Throws if order is invalid or sender does not have permission to cancel.\n /// @param order Order to cancel. Order must be OrderStatus.FILLABLE.\n function cancelOrder(Order memory order)\n public\n {\n // Fetch current order status\n OrderInfo memory orderInfo = getOrderInfo(order);\n\n // Validate context\n assertValidCancel(order, orderInfo);\n\n // Perform cancel\n updateCancelledState(order, orderInfo.orderHash);\n }\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(Order memory order)\n public\n view\n returns (OrderInfo memory orderInfo)\n {\n // Compute the order hash\n orderInfo.orderHash = getOrderHash(order);\n\n // If order.makerAssetAmount is zero, we also reject the order.\n // While the Exchange contract handles them correctly, they create\n // edge cases in the supporting infrastructure because they have\n // an 'infinite' price when computed by a simple division.\n if (order.makerAssetAmount == 0) {\n orderInfo.orderStatus = uint8(OrderStatus.INVALID_MAKER_ASSET_AMOUNT);\n return orderInfo;\n }\n\n // If order.takerAssetAmount is zero, then the order will always\n // be considered filled because 0 == takerAssetAmount == orderTakerAssetFilledAmount\n // Instead of distinguishing between unfilled and filled zero taker\n // amount orders, we choose not to support them.\n if (order.takerAssetAmount == 0) {\n orderInfo.orderStatus = uint8(OrderStatus.INVALID_TAKER_ASSET_AMOUNT);\n return orderInfo;\n }\n\n // Validate order expiration\n if (block.timestamp >= order.expirationTimeSeconds) {\n orderInfo.orderStatus = uint8(OrderStatus.EXPIRED);\n return orderInfo;\n }\n\n // Check if order has been cancelled\n if (cancelled[orderInfo.orderHash]) {\n orderInfo.orderStatus = uint8(OrderStatus.CANCELLED);\n return orderInfo;\n }\n if (orderEpoch[order.makerAddress][order.senderAddress] > order.salt) {\n orderInfo.orderStatus = uint8(OrderStatus.CANCELLED);\n return orderInfo;\n }\n\n // Fetch filled amount and validate order availability\n orderInfo.orderTakerAssetFilledAmount = filled[orderInfo.orderHash];\n if (orderInfo.orderTakerAssetFilledAmount >= order.takerAssetAmount) {\n orderInfo.orderStatus = uint8(OrderStatus.FULLY_FILLED);\n return orderInfo;\n }\n\n // All other statuses are ruled out: order is Fillable\n orderInfo.orderStatus = uint8(OrderStatus.FILLABLE);\n return orderInfo;\n }\n\n /// @dev Updates state with results of a fill order.\n /// @param order that was filled.\n /// @param takerAddress Address of taker who filled the order.\n /// @param orderTakerAssetFilledAmount Amount of order already filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function updateFilledState(\n Order memory order,\n address takerAddress,\n bytes32 orderHash,\n uint256 orderTakerAssetFilledAmount,\n FillResults memory fillResults\n )\n internal\n {\n // Update state\n filled[orderHash] = safeAdd(orderTakerAssetFilledAmount, fillResults.takerAssetFilledAmount);\n\n // Log order\n emit Fill(\n order.makerAddress,\n order.feeRecipientAddress,\n takerAddress,\n msg.sender,\n fillResults.makerAssetFilledAmount,\n fillResults.takerAssetFilledAmount,\n fillResults.makerFeePaid,\n fillResults.takerFeePaid,\n orderHash,\n order.makerAssetData,\n order.takerAssetData\n );\n }\n\n /// @dev Updates state with results of cancelling an order.\n /// State is only updated if the order is currently fillable.\n /// Otherwise, updating state would have no effect.\n /// @param order that was cancelled.\n /// @param orderHash Hash of order that was cancelled.\n function updateCancelledState(\n Order memory order,\n bytes32 orderHash\n )\n internal\n {\n // Perform cancel\n cancelled[orderHash] = true;\n\n // Log cancel\n emit Cancel(\n order.makerAddress,\n order.feeRecipientAddress,\n msg.sender,\n orderHash,\n order.makerAssetData,\n order.takerAssetData\n );\n }\n\n /// @dev Validates context for fillOrder. Succeeds or throws.\n /// @param order to be filled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n /// @param takerAddress Address of order taker.\n /// @param takerAssetFillAmount Desired amount of order to fill by taker.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @param signature Proof that the orders was created by its maker.\n function assertValidFill(\n Order memory order,\n OrderInfo memory orderInfo,\n address takerAddress,\n uint256 takerAssetFillAmount,\n uint256 takerAssetFilledAmount,\n bytes memory signature\n )\n internal\n view\n {\n // An order can only be filled if its status is FILLABLE.\n require(\n orderInfo.orderStatus == uint8(OrderStatus.FILLABLE),\n \"ORDER_UNFILLABLE\"\n );\n\n // Revert if fill amount is invalid\n require(\n takerAssetFillAmount != 0,\n \"INVALID_TAKER_AMOUNT\"\n );\n\n // Validate sender is allowed to fill this order\n if (order.senderAddress != address(0)) {\n require(\n order.senderAddress == msg.sender,\n \"INVALID_SENDER\"\n );\n }\n\n // Validate taker is allowed to fill this order\n if (order.takerAddress != address(0)) {\n require(\n order.takerAddress == takerAddress,\n \"INVALID_TAKER\"\n );\n }\n\n // Validate Maker signature (check only if first time seen)\n if (orderInfo.orderTakerAssetFilledAmount == 0) {\n require(\n isValidSignature(\n orderInfo.orderHash,\n order.makerAddress,\n signature\n ),\n \"INVALID_ORDER_SIGNATURE\"\n );\n }\n\n // Validate fill order rounding\n require(\n !isRoundingError(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n ),\n \"ROUNDING_ERROR\"\n );\n }\n\n /// @dev Validates context for cancelOrder. Succeeds or throws.\n /// @param order to be cancelled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n function assertValidCancel(\n Order memory order,\n OrderInfo memory orderInfo\n )\n internal\n view\n {\n // Ensure order is valid\n // An order can only be cancelled if its status is FILLABLE.\n require(\n orderInfo.orderStatus == uint8(OrderStatus.FILLABLE),\n \"ORDER_UNFILLABLE\"\n );\n\n // Validate sender is allowed to cancel this order\n if (order.senderAddress != address(0)) {\n require(\n order.senderAddress == msg.sender,\n \"INVALID_SENDER\"\n );\n }\n\n // Validate transaction signed by maker\n address makerAddress = getCurrentContextAddress();\n require(\n order.makerAddress == makerAddress,\n \"INVALID_MAKER\"\n );\n }\n\n /// @dev Calculates amounts filled and fees paid by maker and taker.\n /// @param order to be filled.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n Order memory order,\n uint256 takerAssetFilledAmount\n )\n internal\n pure\n returns (FillResults memory fillResults)\n {\n // Compute proportional transfer amounts\n // TODO: All three are multiplied by the same fraction. This can\n // potentially be optimized.\n fillResults.takerAssetFilledAmount = takerAssetFilledAmount;\n fillResults.makerAssetFilledAmount = getPartialAmount(\n fillResults.takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n );\n fillResults.makerFeePaid = getPartialAmount(\n fillResults.takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerFee\n );\n fillResults.takerFeePaid = getPartialAmount(\n fillResults.takerAssetFilledAmount,\n order.takerAssetAmount,\n order.takerFee\n );\n\n return fillResults;\n }\n\n /// @dev Settles an order by transferring assets between counterparties.\n /// @param order Order struct containing order specifications.\n /// @param takerAddress Address selling takerAsset and buying makerAsset.\n /// @param fillResults Amounts to be filled and fees paid by maker and taker.\n function settleOrder(\n LibOrder.Order memory order,\n address takerAddress,\n LibFillResults.FillResults memory fillResults\n )\n private\n {\n bytes memory zrxAssetData = ZRX_ASSET_DATA;\n dispatchTransferFrom(\n order.makerAssetData,\n order.makerAddress,\n takerAddress,\n fillResults.makerAssetFilledAmount\n );\n dispatchTransferFrom(\n order.takerAssetData,\n takerAddress,\n order.makerAddress,\n fillResults.takerAssetFilledAmount\n );\n dispatchTransferFrom(\n zrxAssetData,\n order.makerAddress,\n order.feeRecipientAddress,\n fillResults.makerFeePaid\n );\n dispatchTransferFrom(\n zrxAssetData,\n takerAddress,\n order.feeRecipientAddress,\n fillResults.takerFeePaid\n );\n }\n}\n", - "2.0.0/protocol/Exchange/MixinMatchOrders.sol": "/*\n Copyright 2018 ZeroEx Intl.\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 http://www.apache.org/licenses/LICENSE-2.0\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/LibConstants.sol\";\nimport \"./libs/LibMath.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibFillResults.sol\";\nimport \"./mixins/MExchangeCore.sol\";\nimport \"./mixins/MMatchOrders.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./mixins/MAssetProxyDispatcher.sol\";\n\ncontract MixinMatchOrders is\n LibConstants,\n LibMath,\n MAssetProxyDispatcher,\n MExchangeCore,\n MMatchOrders,\n MTransactions\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 /// TODO: Make this function external once supported by Solidity (See Solidity Issues #3199, #1603)\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 // We assume that rightOrder.takerAssetData == leftOrder.makerAssetData and rightOrder.makerAssetData == leftOrder.takerAssetData.\n // If this assumption isn't true, the match will fail at signature validation.\n rightOrder.makerAssetData = leftOrder.takerAssetData;\n rightOrder.takerAssetData = leftOrder.makerAssetData;\n\n // Get left & right order info\n LibOrder.OrderInfo memory leftOrderInfo = getOrderInfo(leftOrder);\n LibOrder.OrderInfo memory rightOrderInfo = getOrderInfo(rightOrder);\n\n // Fetch taker address\n address takerAddress = getCurrentContextAddress();\n\n // Either our context is valid or we revert\n assertValidMatch(leftOrder, rightOrder);\n\n // Compute proportional fill amounts\n matchedFillResults = calculateMatchedFillResults(\n leftOrder,\n rightOrder,\n leftOrderInfo.orderTakerAssetFilledAmount,\n rightOrderInfo.orderTakerAssetFilledAmount\n );\n\n // Validate fill contexts\n assertValidFill(\n leftOrder,\n leftOrderInfo,\n takerAddress,\n matchedFillResults.left.takerAssetFilledAmount,\n matchedFillResults.left.takerAssetFilledAmount,\n leftSignature\n );\n assertValidFill(\n rightOrder,\n rightOrderInfo,\n takerAddress,\n matchedFillResults.right.takerAssetFilledAmount,\n matchedFillResults.right.takerAssetFilledAmount,\n rightSignature\n );\n\n // Update exchange state\n updateFilledState(\n leftOrder,\n takerAddress,\n leftOrderInfo.orderHash,\n leftOrderInfo.orderTakerAssetFilledAmount,\n matchedFillResults.left\n );\n updateFilledState(\n rightOrder,\n takerAddress,\n rightOrderInfo.orderHash,\n rightOrderInfo.orderTakerAssetFilledAmount,\n matchedFillResults.right\n );\n \n // Settle matched orders. Succeeds or throws.\n settleMatchedOrders(\n leftOrder,\n rightOrder,\n takerAddress,\n matchedFillResults\n );\n\n return matchedFillResults;\n }\n\n /// @dev Validates context for matchOrders. Succeeds or throws.\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n function assertValidMatch(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder\n )\n internal\n pure\n {\n // Make sure there is a profitable spread.\n // There is a profitable spread iff the cost per unit bought (OrderA.MakerAmount/OrderA.TakerAmount) for each order is greater\n // than the profit per unit sold of the matched order (OrderB.TakerAmount/OrderB.MakerAmount).\n // This is satisfied by the equations below:\n // <leftOrder.makerAssetAmount> / <leftOrder.takerAssetAmount> >= <rightOrder.takerAssetAmount> / <rightOrder.makerAssetAmount>\n // AND\n // <rightOrder.makerAssetAmount> / <rightOrder.takerAssetAmount> >= <leftOrder.takerAssetAmount> / <leftOrder.makerAssetAmount>\n // These equations can be combined to get the following:\n require(\n safeMul(leftOrder.makerAssetAmount, rightOrder.makerAssetAmount) >=\n safeMul(leftOrder.takerAssetAmount, rightOrder.takerAssetAmount),\n \"NEGATIVE_SPREAD_REQUIRED\"\n );\n }\n\n /// @dev Calculates fill amounts for the matched orders.\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 leftOrder 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 leftOrderTakerAssetFilledAmount Amount of left order already filled.\n /// @param rightOrderTakerAssetFilledAmount Amount of right order already filled.\n /// @param matchedFillResults Amounts to fill and fees to pay by maker and taker of matched orders.\n function calculateMatchedFillResults(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftOrderTakerAssetFilledAmount,\n uint256 rightOrderTakerAssetFilledAmount\n )\n internal\n pure\n returns (LibFillResults.MatchedFillResults memory matchedFillResults)\n {\n // We settle orders at the exchange rate of the right order.\n // The amount saved by the left maker goes to the taker.\n // Either the left or right order will be fully filled; possibly both.\n // The left order is fully filled iff the right order can sell more than left can buy.\n // That is: the amount required to fill the left order is less than or equal to\n // the amount we can spend from the right order:\n // <leftTakerAssetAmountRemaining> <= <rightTakerAssetAmountRemaining> * <rightMakerToTakerRatio>\n // <leftTakerAssetAmountRemaining> <= <rightTakerAssetAmountRemaining> * <rightOrder.makerAssetAmount> / <rightOrder.takerAssetAmount>\n // <leftTakerAssetAmountRemaining> * <rightOrder.takerAssetAmount> <= <rightTakerAssetAmountRemaining> * <rightOrder.makerAssetAmount>\n uint256 leftTakerAssetAmountRemaining = safeSub(leftOrder.takerAssetAmount, leftOrderTakerAssetFilledAmount);\n uint256 rightTakerAssetAmountRemaining = safeSub(rightOrder.takerAssetAmount, rightOrderTakerAssetFilledAmount);\n uint256 leftTakerAssetFilledAmount;\n uint256 rightTakerAssetFilledAmount;\n if (\n safeMul(leftTakerAssetAmountRemaining, rightOrder.takerAssetAmount) <=\n safeMul(rightTakerAssetAmountRemaining, rightOrder.makerAssetAmount)\n ) {\n // Left order will be fully filled: maximally fill left\n leftTakerAssetFilledAmount = leftTakerAssetAmountRemaining;\n\n // The right order receives an amount proportional to how much was spent.\n // TODO: Can we ensure rounding error is in the correct direction?\n rightTakerAssetFilledAmount = getPartialAmount(\n rightOrder.takerAssetAmount,\n rightOrder.makerAssetAmount,\n leftTakerAssetFilledAmount\n );\n } else {\n // Right order will be fully filled: maximally fill right\n rightTakerAssetFilledAmount = rightTakerAssetAmountRemaining;\n\n // The left order receives an amount proportional to how much was spent.\n // TODO: Can we ensure rounding error is in the correct direction?\n leftTakerAssetFilledAmount = getPartialAmount(\n rightOrder.makerAssetAmount,\n rightOrder.takerAssetAmount,\n rightTakerAssetFilledAmount\n );\n }\n\n // Calculate fill results for left order\n matchedFillResults.left = calculateFillResults(\n leftOrder,\n leftTakerAssetFilledAmount\n );\n\n // Calculate fill results for right order\n matchedFillResults.right = calculateFillResults(\n rightOrder,\n rightTakerAssetFilledAmount\n );\n\n // Calculate amount given to taker\n matchedFillResults.leftMakerAssetSpreadAmount = safeSub(\n matchedFillResults.left.makerAssetFilledAmount,\n matchedFillResults.right.takerAssetFilledAmount\n );\n\n // Return fill results\n return matchedFillResults;\n }\n\n /// @dev Settles matched order by transferring appropriate funds between order makers, taker, and fee recipient.\n /// @param leftOrder First matched order.\n /// @param rightOrder Second matched order.\n /// @param takerAddress Address that matched the orders. The taker receives the spread between orders as profit.\n /// @param matchedFillResults Struct holding amounts to transfer between makers, taker, and fee recipients.\n function settleMatchedOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n address takerAddress,\n LibFillResults.MatchedFillResults memory matchedFillResults\n )\n private\n {\n bytes memory zrxAssetData = ZRX_ASSET_DATA;\n // Order makers and taker\n dispatchTransferFrom(\n leftOrder.makerAssetData,\n leftOrder.makerAddress,\n rightOrder.makerAddress,\n matchedFillResults.right.takerAssetFilledAmount\n );\n dispatchTransferFrom(\n rightOrder.makerAssetData,\n rightOrder.makerAddress,\n leftOrder.makerAddress,\n matchedFillResults.left.takerAssetFilledAmount\n );\n dispatchTransferFrom(\n leftOrder.makerAssetData,\n leftOrder.makerAddress,\n takerAddress,\n matchedFillResults.leftMakerAssetSpreadAmount\n );\n\n // Maker fees\n dispatchTransferFrom(\n zrxAssetData,\n leftOrder.makerAddress,\n leftOrder.feeRecipientAddress,\n matchedFillResults.left.makerFeePaid\n );\n dispatchTransferFrom(\n zrxAssetData,\n rightOrder.makerAddress,\n rightOrder.feeRecipientAddress,\n matchedFillResults.right.makerFeePaid\n );\n\n // Taker fees\n if (leftOrder.feeRecipientAddress == rightOrder.feeRecipientAddress) {\n dispatchTransferFrom(\n zrxAssetData,\n takerAddress,\n leftOrder.feeRecipientAddress,\n safeAdd(\n matchedFillResults.left.takerFeePaid,\n matchedFillResults.right.takerFeePaid\n )\n );\n } else {\n dispatchTransferFrom(\n zrxAssetData,\n takerAddress,\n leftOrder.feeRecipientAddress,\n matchedFillResults.left.takerFeePaid\n );\n dispatchTransferFrom(\n zrxAssetData,\n takerAddress,\n rightOrder.feeRecipientAddress,\n matchedFillResults.right.takerFeePaid\n );\n }\n }\n}\n", - "2.0.0/protocol/Exchange/MixinSignatureValidator.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/LibBytes/LibBytes.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./interfaces/IWallet.sol\";\nimport \"./interfaces/IValidator.sol\";\n\ncontract MixinSignatureValidator is\n MSignatureValidator,\n MTransactions\n{\n using LibBytes for bytes;\n \n // Mapping of hash => signer => signed\n mapping (bytes32 => mapping (address => bool)) public preSigned;\n\n // Mapping of signer => validator => approved\n mapping (address => mapping (address => bool)) public allowedValidators;\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 require(\n isValidSignature(\n hash,\n signerAddress,\n signature\n ),\n \"INVALID_SIGNATURE\"\n );\n preSigned[hash][signerAddress] = true;\n }\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 address signerAddress = getCurrentContextAddress();\n allowedValidators[signerAddress][validatorAddress] = approval;\n emit SignatureValidatorApproval(\n signerAddress,\n validatorAddress,\n approval\n );\n }\n\n /// @dev Verifies that a hash has been signed by the given signer.\n /// @param hash Any 32 byte hash.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return True if the address recovered from the provided signature matches the input signer address.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid)\n {\n // TODO: Domain separation: make hash depend on role. (Taker sig should not be valid as maker sig, etc.)\n require(\n signature.length > 0,\n \"LENGTH_GREATER_THAN_0_REQUIRED\"\n );\n\n // Ensure signature is supported\n uint8 signatureTypeRaw = uint8(signature.popLastByte());\n require(\n signatureTypeRaw < uint8(SignatureType.NSignatureTypes),\n \"SIGNATURE_UNSUPPORTED\"\n );\n\n // Pop last byte off of signature byte array.\n SignatureType signatureType = SignatureType(signatureTypeRaw);\n\n // Variables are not scoped in Solidity.\n uint8 v;\n bytes32 r;\n bytes32 s;\n address recovered;\n\n // Always illegal signature.\n // This is always an implicit option since a signer can create a\n // signature array with invalid type or length. We may as well make\n // it an explicit option. This aids testing and analysis. It is\n // also the initialization value for the enum type.\n if (signatureType == SignatureType.Illegal) {\n revert(\"SIGNATURE_ILLEGAL\");\n\n // Always invalid signature.\n // Like Illegal, this is always implicitly available and therefore\n // offered explicitly. It can be implicitly created by providing\n // a correctly formatted but incorrect signature.\n } else if (signatureType == SignatureType.Invalid) {\n require(\n signature.length == 0,\n \"LENGTH_0_REQUIRED\"\n );\n isValid = false;\n return isValid;\n\n // Signature using EIP712\n } else if (signatureType == SignatureType.EIP712) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n v = uint8(signature[0]);\n r = signature.readBytes32(1);\n s = signature.readBytes32(33);\n recovered = ecrecover(hash, v, r, s);\n isValid = signerAddress == recovered;\n return isValid;\n\n // Signed using web3.eth_sign\n } else if (signatureType == SignatureType.EthSign) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n v = uint8(signature[0]);\n r = signature.readBytes32(1);\n s = signature.readBytes32(33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(\n \"\\x19Ethereum Signed Message:\\n32\",\n hash\n )),\n v,\n r,\n s\n );\n isValid = signerAddress == recovered;\n return isValid;\n\n // Implicitly signed by caller.\n // The signer has initiated the call. In the case of non-contract\n // accounts it means the transaction itself was signed.\n // Example: let's say for a particular operation three signatures\n // A, B and C are required. To submit the transaction, A and B can\n // give a signature to C, who can then submit the transaction using\n // `Caller` for his own signature. Or A and C can sign and B can\n // submit using `Caller`. Having `Caller` allows this flexibility.\n } else if (signatureType == SignatureType.Caller) {\n require(\n signature.length == 0,\n \"LENGTH_0_REQUIRED\"\n );\n isValid = signerAddress == msg.sender;\n return isValid;\n\n // Signature verified by wallet contract.\n // If used with an order, the maker of the order is the wallet contract.\n } else if (signatureType == SignatureType.Wallet) {\n isValid = IWallet(signerAddress).isValidSignature(hash, signature);\n return isValid;\n\n // Signature verified by validator contract.\n // If used with an order, the maker of the order can still be an EOA.\n // A signature using this type should be encoded as:\n // | Offset | Length | Contents |\n // | 0x00 | x | Signature to validate |\n // | 0x00 + x | 20 | Address of validator contract |\n // | 0x14 + x | 1 | Signature type is always \"\\x06\" |\n } else if (signatureType == SignatureType.Validator) {\n // Pop last 20 bytes off of signature byte array.\n\n address validatorAddress = signature.popLast20Bytes();\n \n // Ensure signer has approved validator.\n if (!allowedValidators[signerAddress][validatorAddress]) {\n return false;\n }\n isValid = IValidator(validatorAddress).isValidSignature(\n hash,\n signerAddress,\n signature\n );\n return isValid;\n\n // Signer signed hash previously using the preSign function.\n } else if (signatureType == SignatureType.PreSigned) {\n isValid = preSigned[hash][signerAddress];\n return isValid;\n\n // Signature from Trezor hardware wallet.\n // It differs from web3.eth_sign in the encoding of message length\n // (Bitcoin varint encoding vs ascii-decimal, the latter is not\n // self-terminating which leads to ambiguities).\n // See also:\n // https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/ethereum.c#L602\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/crypto.c#L36\n } else if (signatureType == SignatureType.Trezor) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n v = uint8(signature[0]);\n r = signature.readBytes32(1);\n s = signature.readBytes32(33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(\n \"\\x19Ethereum Signed Message:\\n\\x20\",\n hash\n )),\n v,\n r,\n s\n );\n isValid = signerAddress == recovered;\n return isValid;\n }\n\n // Anything else is illegal (We do not return false because\n // the signature may actually be valid, just not in a format\n // that we currently support. In this case returning false\n // may lead the caller to incorrectly believe that the\n // signature was invalid.)\n revert(\"SIGNATURE_UNSUPPORTED\");\n }\n}\n", - "2.0.0/protocol/Exchange/MixinTransactions.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\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./libs/LibEIP712.sol\";\n\ncontract MixinTransactions is\n LibEIP712,\n MSignatureValidator,\n MTransactions\n{\n\n // Mapping of transaction hash => executed\n // This prevents transactions from being executed more than once.\n mapping (bytes32 => bool) public transactions;\n\n // Address of current transaction signer\n address public currentContextAddress;\n\n // Hash for the EIP712 ZeroEx Transaction Schema\n bytes32 constant EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"ZeroExTransaction(\",\n \"uint256 salt,\",\n \"address signerAddress,\",\n \"bytes data\",\n \")\"\n ));\n\n /// @dev Calculates EIP712 hash of the Transaction.\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 /// @return EIP712 hash of the Transaction.\n function hashZeroExTransaction(\n uint256 salt,\n address signerAddress,\n bytes memory data\n )\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH;\n bytes32 dataHash = keccak256(data);\n // Assembly for more efficiently computing:\n // keccak256(abi.encode(\n // EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH,\n // salt,\n // signerAddress,\n // keccak256(data)\n // ));\n assembly {\n let memPtr := mload(64)\n mstore(memPtr, schemaHash)\n mstore(add(memPtr, 32), salt)\n mstore(add(memPtr, 64), and(signerAddress, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(memPtr, 96), dataHash)\n result := keccak256(memPtr, 128)\n }\n\n return result;\n }\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 // Prevent reentrancy\n require(\n currentContextAddress == address(0),\n \"REENTRANCY_ILLEGAL\"\n );\n\n bytes32 transactionHash = hashEIP712Message(hashZeroExTransaction(\n salt,\n signerAddress,\n data\n ));\n\n // Validate transaction has not been executed\n require(\n !transactions[transactionHash],\n \"INVALID_TX_HASH\"\n );\n\n // Transaction always valid if signer is sender of transaction\n if (signerAddress != msg.sender) {\n // Validate signature\n require(\n isValidSignature(\n transactionHash,\n signerAddress,\n signature\n ),\n \"INVALID_TX_SIGNATURE\"\n );\n\n // Set the current transaction signer\n currentContextAddress = signerAddress;\n }\n\n // Execute transaction\n transactions[transactionHash] = true;\n require(\n address(this).delegatecall(data),\n \"FAILED_EXECUTION\"\n );\n\n // Reset current transaction signer\n // TODO: Check if gas is paid when currentContextAddress is already 0.\n currentContextAddress = address(0);\n }\n\n /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n /// If calling a fill function, this address will represent the taker.\n /// If calling a cancel function, this address will represent the maker.\n /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n /// `msg.sender` if entry point is any other function.\n function getCurrentContextAddress()\n internal\n view\n returns (address)\n {\n address contextAddress = currentContextAddress == address(0) ? msg.sender : currentContextAddress;\n return contextAddress;\n }\n}\n", - "2.0.0/protocol/Exchange/MixinWrapperFunctions.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/LibMath.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibFillResults.sol\";\nimport \"./mixins/MExchangeCore.sol\";\n\ncontract MixinWrapperFunctions is\n LibMath,\n LibFillResults,\n MExchangeCore\n{\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\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 function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n fillResults = fillOrder(\n order,\n takerAssetFillAmount,\n signature\n );\n require(\n fillResults.takerAssetFilledAmount == takerAssetFillAmount,\n \"COMPLETE_FILL_FAILED\"\n );\n return fillResults;\n }\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\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 fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n // We need to call MExchangeCore.fillOrder using a delegatecall in\n // assembly so that we can intercept a call that throws. For this, we\n // need the input encoded in memory in the Ethereum ABIv2 format [1].\n\n // | Area | Offset | Length | Contents |\n // | -------- |--------|---------|-------------------------------------------- |\n // | Header | 0x00 | 4 | function selector |\n // | Params | | 3 * 32 | function parameters: |\n // | | 0x00 | | 1. offset to order (*) |\n // | | 0x20 | | 2. takerAssetFillAmount |\n // | | 0x40 | | 3. offset to signature (*) |\n // | Data | | 12 * 32 | order: |\n // | | 0x000 | | 1. senderAddress |\n // | | 0x020 | | 2. makerAddress |\n // | | 0x040 | | 3. takerAddress |\n // | | 0x060 | | 4. feeRecipientAddress |\n // | | 0x080 | | 5. makerAssetAmount |\n // | | 0x0A0 | | 6. takerAssetAmount |\n // | | 0x0C0 | | 7. makerFeeAmount |\n // | | 0x0E0 | | 8. takerFeeAmount |\n // | | 0x100 | | 9. expirationTimeSeconds |\n // | | 0x120 | | 10. salt |\n // | | 0x140 | | 11. Offset to makerAssetData (*) |\n // | | 0x160 | | 12. Offset to takerAssetData (*) |\n // | | 0x180 | 32 | makerAssetData Length |\n // | | 0x1A0 | ** | makerAssetData Contents |\n // | | 0x1C0 | 32 | takerAssetData Length |\n // | | 0x1E0 | ** | takerAssetData Contents |\n // | | 0x200 | 32 | signature Length |\n // | | 0x220 | ** | signature Contents |\n\n // * Offsets are calculated from the beginning of the current area: Header, Params, Data:\n // An offset stored in the Params area is calculated from the beginning of the Params section.\n // An offset stored in the Data area is calculated from the beginning of the Data section.\n\n // ** The length of dynamic array contents are stored in the field immediately preceeding the contents.\n\n // [1]: https://solidity.readthedocs.io/en/develop/abi-spec.html\n\n bytes4 fillOrderSelector = this.fillOrder.selector;\n\n assembly {\n\n // Areas below may use the following variables:\n // 1. <area>Start -- Start of this area in memory\n // 2. <area>End -- End of this area in memory. This value may\n // be precomputed (before writing contents),\n // or it may be computed as contents are written.\n // 3. <area>Offset -- Current offset into area. If an area's End\n // is precomputed, this variable tracks the\n // offsets of contents as they are written.\n\n /////// Setup Header Area ///////\n // Load free memory pointer\n let headerAreaStart := mload(0x40)\n mstore(headerAreaStart, fillOrderSelector)\n let headerAreaEnd := add(headerAreaStart, 0x4)\n\n /////// Setup Params Area ///////\n // This area is preallocated and written to later.\n // This is because we need to fill in offsets that have not yet been calculated.\n let paramsAreaStart := headerAreaEnd\n let paramsAreaEnd := add(paramsAreaStart, 0x60)\n let paramsAreaOffset := paramsAreaStart\n\n /////// Setup Data Area ///////\n let dataAreaStart := paramsAreaEnd\n let dataAreaEnd := dataAreaStart\n\n // Offset from the source data we're reading from\n let sourceOffset := order\n // arrayLenBytes and arrayLenWords track the length of a dynamically-allocated bytes array.\n let arrayLenBytes := 0\n let arrayLenWords := 0\n\n /////// Write order Struct ///////\n // Write memory location of Order, relative to the start of the\n // parameter list, then increment the paramsAreaOffset respectively.\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n // Write values for each field in the order\n // It would be nice to use a loop, but we save on gas by writing\n // the stores sequentially.\n mstore(dataAreaEnd, mload(sourceOffset)) // makerAddress\n mstore(add(dataAreaEnd, 0x20), mload(add(sourceOffset, 0x20))) // takerAddress\n mstore(add(dataAreaEnd, 0x40), mload(add(sourceOffset, 0x40))) // feeRecipientAddress\n mstore(add(dataAreaEnd, 0x60), mload(add(sourceOffset, 0x60))) // senderAddress\n mstore(add(dataAreaEnd, 0x80), mload(add(sourceOffset, 0x80))) // makerAssetAmount\n mstore(add(dataAreaEnd, 0xA0), mload(add(sourceOffset, 0xA0))) // takerAssetAmount\n mstore(add(dataAreaEnd, 0xC0), mload(add(sourceOffset, 0xC0))) // makerFeeAmount\n mstore(add(dataAreaEnd, 0xE0), mload(add(sourceOffset, 0xE0))) // takerFeeAmount\n mstore(add(dataAreaEnd, 0x100), mload(add(sourceOffset, 0x100))) // expirationTimeSeconds\n mstore(add(dataAreaEnd, 0x120), mload(add(sourceOffset, 0x120))) // salt\n mstore(add(dataAreaEnd, 0x140), mload(add(sourceOffset, 0x140))) // Offset to makerAssetData\n mstore(add(dataAreaEnd, 0x160), mload(add(sourceOffset, 0x160))) // Offset to takerAssetData\n dataAreaEnd := add(dataAreaEnd, 0x180)\n sourceOffset := add(sourceOffset, 0x180)\n\n // Write offset to <order.makerAssetData>\n mstore(add(dataAreaStart, mul(10, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.makerAssetData>\n sourceOffset := mload(add(order, 0x140)) // makerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.makerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.makerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Write offset to <order.takerAssetData>\n mstore(add(dataAreaStart, mul(11, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.takerAssetData>\n sourceOffset := mload(add(order, 0x160)) // takerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.takerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.takerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n /////// Write takerAssetFillAmount ///////\n mstore(paramsAreaOffset, takerAssetFillAmount)\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n /////// Write signature ///////\n // Write offset to paramsArea\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n\n // Calculate length of signature\n sourceOffset := signature\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of signature\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of signature\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Execute delegatecall\n let success := delegatecall(\n gas, // forward all gas, TODO: look into gas consumption of assert/throw\n address, // call address of this contract\n headerAreaStart, // pointer to start of input\n sub(dataAreaEnd, headerAreaStart), // length of input\n headerAreaStart, // write output over input\n 128 // output size is 128 bytes\n )\n switch success\n case 0 {\n mstore(fillResults, 0)\n mstore(add(fillResults, 32), 0)\n mstore(add(fillResults, 64), 0)\n mstore(add(fillResults, 96), 0)\n }\n case 1 {\n mstore(fillResults, mload(headerAreaStart))\n mstore(add(fillResults, 32), mload(add(headerAreaStart, 32)))\n mstore(add(fillResults, 64), mload(add(headerAreaStart, 64)))\n mstore(add(fillResults, 96), mload(add(headerAreaStart, 96)))\n }\n }\n return fillResults;\n }\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 /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n FillResults memory singleFillResults = fillOrder(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n addFillResults(totalFillResults, singleFillResults);\n }\n return totalFillResults;\n }\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 /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n FillResults memory singleFillResults = fillOrKillOrder(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n addFillResults(totalFillResults, singleFillResults);\n }\n return totalFillResults;\n }\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 /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n addFillResults(totalFillResults, singleFillResults);\n }\n return totalFillResults;\n }\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 (FillResults memory totalFillResults)\n {\n bytes memory takerAssetData = orders[0].takerAssetData;\n \n for (uint256 i = 0; i < orders.length; i++) {\n\n // We assume that asset being sold by taker is the same for each order.\n // Rather than passing this in as calldata, we use the takerAssetData from the first order in all later orders.\n orders[i].takerAssetData = takerAssetData;\n\n // Calculate the remaining amount of takerAsset to sell\n uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrder(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of takerAsset has been sold\n if (totalFillResults.takerAssetFilledAmount == takerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\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 (FillResults memory totalFillResults)\n {\n bytes memory takerAssetData = orders[0].takerAssetData;\n\n for (uint256 i = 0; i < orders.length; i++) {\n\n // We assume that asset being sold by taker is the same for each order.\n // Rather than passing this in as calldata, we use the takerAssetData from the first order in all later orders.\n orders[i].takerAssetData = takerAssetData;\n\n // Calculate the remaining amount of takerAsset to sell\n uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of takerAsset has been sold\n if (totalFillResults.takerAssetFilledAmount == takerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\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 (FillResults memory totalFillResults)\n {\n bytes memory makerAssetData = orders[0].makerAssetData;\n\n for (uint256 i = 0; i < orders.length; i++) {\n\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we copy the makerAssetData from the first order onto all later orders.\n orders[i].makerAssetData = makerAssetData;\n\n // Calculate the remaining amount of makerAsset to buy\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n\n // Convert the remaining amount of makerAsset to buy into remaining amount\n // of takerAsset to sell, assuming entire amount can be sold in the current order\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrder(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of makerAsset has been bought\n if (totalFillResults.makerAssetFilledAmount == makerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\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 (FillResults memory totalFillResults)\n {\n bytes memory makerAssetData = orders[0].makerAssetData;\n\n for (uint256 i = 0; i < orders.length; i++) {\n\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we copy the makerAssetData from the first order onto all later orders.\n orders[i].makerAssetData = makerAssetData;\n\n // Calculate the remaining amount of makerAsset to buy\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n\n // Convert the remaining amount of makerAsset to buy into remaining amount\n // of takerAsset to sell, assuming entire amount can be sold in the current order\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of makerAsset has been bought\n if (totalFillResults.makerAssetFilledAmount == makerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\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 for (uint256 i = 0; i < orders.length; i++) {\n cancelOrder(orders[i]);\n }\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\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/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\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\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 /// TODO: Make this function external once supported by Solidity (See Solidity Issues #3199, #1603)\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\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\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/IValidator.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.23;\n\ncontract IValidator {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n", - "2.0.0/protocol/Exchange/interfaces/IWallet.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\ncontract IWallet {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n", - "2.0.0/protocol/Exchange/libs/LibConstants.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\ncontract LibConstants {\n \n // Asset data for ZRX token. Used for fee transfers.\n // @TODO: Hardcode constant when we deploy. Currently \n // not constant to make testing easier.\n bytes public ZRX_ASSET_DATA;\n\n // @TODO: Remove when we deploy.\n constructor (bytes memory zrxAssetData)\n public\n {\n ZRX_ASSET_DATA = zrxAssetData;\n }\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\ncontract LibEIP712 {\n // EIP191 header for EIP712 prefix\n string constant EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant EIP712_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Domain Version value\n string constant EIP712_DOMAIN_VERSION = \"2\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 public constant 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 bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encode(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n 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)\n {\n return keccak256(abi.encodePacked(EIP191_HEADER, EIP712_DOMAIN_HASH, hashStruct));\n }\n}\n", - "2.0.0/protocol/Exchange/libs/LibExchangeErrors.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/// @dev This contract documents the revert reasons used in the Exchange contract.\n/// This contract is intended to serve as a reference, but is not actually used for efficiency reasons.\ncontract LibExchangeErrors {\n\n /// Order validation errors ///\n string constant ORDER_UNFILLABLE = \"ORDER_UNFILLABLE\"; // Order cannot be filled.\n string constant INVALID_MAKER = \"INVALID_MAKER\"; // Invalid makerAddress.\n string constant INVALID_TAKER = \"INVALID_TAKER\"; // Invalid takerAddress.\n string constant INVALID_SENDER = \"INVALID_SENDER\"; // Invalid `msg.sender`.\n string constant INVALID_ORDER_SIGNATURE = \"INVALID_ORDER_SIGNATURE\"; // Signature validation failed. \n \n /// fillOrder validation errors ///\n string constant INVALID_TAKER_AMOUNT = \"INVALID_TAKER_AMOUNT\"; // takerAssetFillAmount cannot equal 0.\n string constant ROUNDING_ERROR = \"ROUNDING_ERROR\"; // Rounding error greater than 0.1% of takerAssetFillAmount. \n \n /// Signature validation errors ///\n string constant INVALID_SIGNATURE = \"INVALID_SIGNATURE\"; // Signature validation failed. \n string constant SIGNATURE_ILLEGAL = \"SIGNATURE_ILLEGAL\"; // Signature type is illegal.\n string constant SIGNATURE_UNSUPPORTED = \"SIGNATURE_UNSUPPORTED\"; // Signature type unsupported.\n \n /// cancelOrdersUptTo errors ///\n string constant INVALID_NEW_ORDER_EPOCH = \"INVALID_NEW_ORDER_EPOCH\"; // Specified salt must be greater than or equal to existing orderEpoch.\n\n /// fillOrKillOrder errors ///\n string constant COMPLETE_FILL_FAILED = \"COMPLETE_FILL_FAILED\"; // Desired takerAssetFillAmount could not be completely filled. \n\n /// matchOrders errors ///\n string constant NEGATIVE_SPREAD_REQUIRED = \"NEGATIVE_SPREAD_REQUIRED\"; // Matched orders must have a negative spread.\n\n /// Transaction errors ///\n string constant REENTRANCY_ILLEGAL = \"REENTRANCY_ILLEGAL\"; // Recursive reentrancy is not allowed. \n string constant INVALID_TX_HASH = \"INVALID_TX_HASH\"; // Transaction has already been executed. \n string constant INVALID_TX_SIGNATURE = \"INVALID_TX_SIGNATURE\"; // Signature validation failed. \n string constant FAILED_EXECUTION = \"FAILED_EXECUTION\"; // Transaction execution failed. \n \n /// registerAssetProxy errors ///\n string constant ASSET_PROXY_ALREADY_EXISTS = \"ASSET_PROXY_ALREADY_EXISTS\"; // AssetProxy with same id already exists.\n\n /// dispatchTransferFrom errors ///\n string constant ASSET_PROXY_DOES_NOT_EXIST = \"ASSET_PROXY_DOES_NOT_EXIST\"; // No assetProxy registered at given id.\n string constant TRANSFER_FAILED = \"TRANSFER_FAILED\"; // Asset transfer unsuccesful.\n\n /// Length validation errors ///\n string constant LENGTH_GREATER_THAN_0_REQUIRED = \"LENGTH_GREATER_THAN_0_REQUIRED\"; // Byte array must have a length greater than 0.\n string constant LENGTH_GREATER_THAN_3_REQUIRED = \"LENGTH_GREATER_THAN_3_REQUIRED\"; // Byte array must have a length greater than 3.\n string constant LENGTH_0_REQUIRED = \"LENGTH_0_REQUIRED\"; // Byte array must have a length of 0.\n string constant LENGTH_65_REQUIRED = \"LENGTH_65_REQUIRED\"; // Byte array must have a length of 65.\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\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/LibMath.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\ncontract LibMath is\n SafeMath\n{\n\n /// @dev Calculates partial value given a numerator and denominator.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target.\n function getPartialAmount(\n uint256 numerator,\n uint256 denominator,\n uint256 target)\n internal\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = safeDiv(\n safeMul(numerator, target),\n denominator\n );\n return partialAmount;\n }\n\n /// @dev Checks if rounding error > 0.1%.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingError(\n uint256 numerator,\n uint256 denominator,\n uint256 target)\n internal\n pure\n returns (bool isError)\n {\n uint256 remainder = mulmod(target, numerator, denominator);\n if (remainder == 0) {\n return false; // No rounding error.\n }\n\n uint256 errPercentageTimes1000000 = safeDiv(\n safeMul(remainder, 1000000),\n safeMul(numerator, target)\n );\n isError = errPercentageTimes1000000 > 1000;\n return isError;\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\ncontract LibOrder is\n LibEIP712\n{\n\n // Hash for the EIP712 Order Schema\n bytes32 constant 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 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\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 // Assembly for more efficiently computing:\n // keccak256(abi.encode(\n // order.makerAddress,\n // order.takerAddress,\n // order.feeRecipientAddress,\n // 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 assembly {\n // Backup\n let temp1 := mload(sub(order, 32))\n let temp2 := mload(add(order, 320))\n let temp3 := mload(add(order, 352))\n \n // Hash in place\n mstore(sub(order, 32), schemaHash)\n mstore(add(order, 320), makerAssetDataHash)\n mstore(add(order, 352), takerAssetDataHash)\n result := keccak256(sub(order, 32), 416)\n \n // Restore\n mstore(sub(order, 32), temp1)\n mstore(add(order, 320), temp2)\n mstore(add(order, 352), temp3)\n }\n return result;\n }\n}\n", - "2.0.0/protocol/Exchange/mixins/MAssetProxyDispatcher.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 \"../interfaces/IAssetProxyDispatcher.sol\";\n\ncontract MAssetProxyDispatcher is\n IAssetProxyDispatcher\n{\n\n // Logs registration of new asset proxy\n event AssetProxyRegistered(\n bytes4 id, // Id of new registered AssetProxy.\n address assetProxy // Address of new registered AssetProxy.\n );\n\n /// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws.\n /// @param assetData Byte array encoded for the asset.\n /// @param from Address to transfer token from.\n /// @param to Address to transfer token to.\n /// @param amount Amount of token to transfer.\n function dispatchTransferFrom(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal;\n}\n", - "2.0.0/protocol/Exchange/mixins/MExchangeCore.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\";\nimport \"../interfaces/IExchangeCore.sol\";\n\ncontract MExchangeCore is\n IExchangeCore\n{\n // Fill event is emitted whenever an order is filled.\n event Fill(\n address indexed makerAddress, // Address that created the order. \n address indexed feeRecipientAddress, // Address that received fees.\n address takerAddress, // Address that filled the order.\n address senderAddress, // Address that called the Exchange contract (msg.sender).\n uint256 makerAssetFilledAmount, // Amount of makerAsset sold by maker and bought by taker. \n uint256 takerAssetFilledAmount, // Amount of takerAsset sold by taker and bought by maker.\n uint256 makerFeePaid, // Amount of ZRX paid to feeRecipient by maker.\n uint256 takerFeePaid, // Amount of ZRX paid to feeRecipient by taker.\n bytes32 indexed orderHash, // EIP712 hash of order (see LibOrder.getOrderHash).\n bytes makerAssetData, // Encoded data specific to makerAsset. \n bytes takerAssetData // Encoded data specific to takerAsset.\n );\n\n // Cancel event is emitted whenever an individual order is cancelled.\n event Cancel(\n address indexed makerAddress, // Address that created the order. \n address indexed feeRecipientAddress, // Address that would have recieved fees if order was filled. \n address senderAddress, // Address that called the Exchange contract (msg.sender).\n bytes32 indexed orderHash, // EIP712 hash of order (see LibOrder.getOrderHash).\n bytes makerAssetData, // Encoded data specific to makerAsset. \n bytes takerAssetData // Encoded data specific to takerAsset.\n );\n\n // CancelUpTo event is emitted whenever `cancelOrdersUpTo` is executed succesfully.\n event CancelUpTo(\n address indexed makerAddress, // Orders cancelled must have been created by this address.\n address indexed senderAddress, // Orders cancelled must have a `senderAddress` equal to this address.\n uint256 orderEpoch // Orders specified makerAddress and senderAddress with a salt <= this value are considered cancelled.\n );\n\n /// @dev Updates state with results of a fill order.\n /// @param order that was filled.\n /// @param takerAddress Address of taker who filled the order.\n /// @param orderTakerAssetFilledAmount Amount of order already filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function updateFilledState(\n LibOrder.Order memory order,\n address takerAddress,\n bytes32 orderHash,\n uint256 orderTakerAssetFilledAmount,\n LibFillResults.FillResults memory fillResults\n )\n internal;\n\n /// @dev Updates state with results of cancelling an order.\n /// State is only updated if the order is currently fillable.\n /// Otherwise, updating state would have no effect.\n /// @param order that was cancelled.\n /// @param orderHash Hash of order that was cancelled.\n function updateCancelledState(\n LibOrder.Order memory order,\n bytes32 orderHash\n )\n internal;\n\n /// @dev Validates context for fillOrder. Succeeds or throws.\n /// @param order to be filled.\n /// @param orderInfo Status, orderHash, and amount already filled of order.\n /// @param takerAddress Address of order taker.\n /// @param takerAssetFillAmount Desired amount of order to fill by taker.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @param signature Proof that the orders was created by its maker.\n function assertValidFill(\n LibOrder.Order memory order,\n LibOrder.OrderInfo memory orderInfo,\n address takerAddress,\n uint256 takerAssetFillAmount,\n uint256 takerAssetFilledAmount,\n bytes memory signature\n )\n internal\n view;\n\n\n /// @dev Validates context for cancelOrder. Succeeds or throws.\n /// @param order to be cancelled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n function assertValidCancel(\n LibOrder.Order memory order,\n LibOrder.OrderInfo memory orderInfo\n )\n internal\n view;\n\n /// @dev Calculates amounts filled and fees paid by maker and taker.\n /// @param order to be filled.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n LibOrder.Order memory order,\n uint256 takerAssetFilledAmount\n )\n internal\n pure\n returns (LibFillResults.FillResults memory fillResults);\n\n}\n", - "2.0.0/protocol/Exchange/mixins/MMatchOrders.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\";\nimport \"../interfaces/IMatchOrders.sol\";\n\ncontract MMatchOrders is\n IMatchOrders\n{\n\n /// @dev Validates context for matchOrders. Succeeds or throws.\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n function assertValidMatch(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder\n )\n internal\n pure;\n\n /// @dev Calculates fill amounts for the matched orders.\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 leftOrder 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 leftOrderTakerAssetFilledAmount Amount of left order already filled.\n /// @param rightOrderTakerAssetFilledAmount Amount of right order already filled.\n /// @param matchedFillResults Amounts to fill and fees to pay by maker and taker of matched orders.\n function calculateMatchedFillResults(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftOrderTakerAssetFilledAmount,\n uint256 rightOrderTakerAssetFilledAmount\n )\n internal\n pure\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n\n}\n", - "2.0.0/protocol/Exchange/mixins/MSignatureValidator.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 \"../interfaces/ISignatureValidator.sol\";\n\ncontract MSignatureValidator is\n ISignatureValidator\n{\n event SignatureValidatorApproval(\n address indexed signerAddress, // Address that approves or disapproves a contract to verify signatures.\n address indexed validatorAddress, // Address of signature validator contract.\n bool approved // Approval or disapproval of validator contract.\n );\n\n // Allowed signature types.\n enum SignatureType {\n Illegal, // 0x00, default value\n Invalid, // 0x01\n EIP712, // 0x02\n EthSign, // 0x03\n Caller, // 0x04\n Wallet, // 0x05\n Validator, // 0x06\n PreSigned, // 0x07\n Trezor, // 0x08\n NSignatureTypes // 0x09, number of signature types. Always leave at end.\n }\n}\n", - "2.0.0/protocol/Exchange/mixins/MTransactions.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\nimport \"../interfaces/ITransactions.sol\";\n\ncontract MTransactions is\n ITransactions\n{\n\n /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n /// If calling a fill function, this address will represent the taker.\n /// If calling a cancel function, this address will represent the maker.\n /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n /// `msg.sender` if entry point is any other function.\n function getCurrentContextAddress()\n internal\n view\n returns (address);\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;\npragma experimental ABIEncoderV2;\n\ncontract IERC20Token {\n\n /// @notice 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 Whether the transfer was successful or not\n function transfer(address _to, uint256 _value)\n public\n returns (bool);\n\n /// @notice 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 Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value)\n public\n returns (bool);\n \n /// @notice `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 Whether the approval was successful or not\n function approve(address _spender, uint256 _value)\n public\n returns (bool);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return The balance\n function balanceOf(address _owner)\n public 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 public view\n returns (uint256);\n\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", - "2.0.0/tokens/ERC721Token/IERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity ^0.4.24;\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic interface\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Basic.sol\n */\ncontract IERC721Token {\n string internal name_;\n string internal symbol_;\n\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _tokenId\n );\n event Approval(\n address indexed _owner,\n address indexed _approved,\n uint256 _tokenId\n );\n event ApprovalForAll(\n address indexed _owner,\n address indexed _operator,\n bool _approved\n );\n\n function name()\n public\n view\n returns (string);\n function symbol()\n public\n view\n returns (string);\n\n function balanceOf(address _owner)\n public\n view\n returns (uint256 _balance);\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address _owner);\n function exists(uint256 _tokenId)\n public\n view\n returns (bool _exists);\n\n function approve(address _to, uint256 _tokenId)\n public;\n function getApproved(uint256 _tokenId)\n public\n view\n returns (address _operator);\n\n function setApprovalForAll(address _operator, bool _approved)\n public;\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool);\n\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId)\n public;\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId)\n public;\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data)\n public;\n}\n", - "2.0.0/tokens/WETH9/WETH9.sol": "// Copyright (C) 2015, 2016, 2017 Dapphub\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\npragma solidity ^0.4.18;\n\ncontract WETH9 {\n string public name = \"Wrapped Ether\";\n string public symbol = \"WETH\";\n uint8 public decimals = 18;\n\n event Approval(address indexed src, address indexed guy, uint wad);\n event Transfer(address indexed src, address indexed dst, uint wad);\n event Deposit(address indexed dst, uint wad);\n event Withdrawal(address indexed src, uint wad);\n\n mapping (address => uint) public balanceOf;\n mapping (address => mapping (address => uint)) public allowance;\n\n function() public payable {\n deposit();\n }\n function deposit() public payable {\n balanceOf[msg.sender] += msg.value;\n Deposit(msg.sender, msg.value);\n }\n function withdraw(uint wad) public {\n require(balanceOf[msg.sender] >= wad);\n balanceOf[msg.sender] -= wad;\n msg.sender.transfer(wad);\n Withdrawal(msg.sender, wad);\n }\n\n function totalSupply() public view returns (uint) {\n return this.balance;\n }\n\n function approve(address guy, uint wad) public returns (bool) {\n allowance[msg.sender][guy] = wad;\n Approval(msg.sender, guy, wad);\n return true;\n }\n\n function transfer(address dst, uint wad) public returns (bool) {\n return transferFrom(msg.sender, dst, wad);\n }\n\n function transferFrom(address src, address dst, uint wad)\n public\n returns (bool)\n {\n require(balanceOf[src] >= wad);\n\n if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {\n require(allowance[src][msg.sender] >= wad);\n allowance[src][msg.sender] -= wad;\n }\n\n balanceOf[src] -= wad;\n balanceOf[dst] += wad;\n\n Transfer(src, dst, wad);\n\n return true;\n }\n}\n\n\n/*\n GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n Preamble\n\n The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works. By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users. We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors. You can apply it to\nyour programs, too.\n\n When we speak of free software, we are referring to freedom, not\nprice. Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights. Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received. You must make sure that they, too, receive\nor can get the source code. And you must show them these terms so they\nknow their rights.\n\n Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software. For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so. This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software. The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable. Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts. If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary. To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n The precise terms and conditions for copying, distribution and\nmodification follow.\n\n TERMS AND CONDITIONS\n\n 0. Definitions.\n\n \"This License\" refers to version 3 of the GNU General Public License.\n\n \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n \"The Program\" refers to any copyrightable work licensed under this\nLicense. Each licensee is addressed as \"you\". \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy. The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy. Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies. Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License. If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n 1. Source Code.\n\n The \"source code\" for a work means the preferred form of the work\nfor making modifications to it. \"Object code\" means any non-source\nform of a work.\n\n A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form. A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities. However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work. For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n The Corresponding Source for a work in source code form is that\nsame work.\n\n 2. Basic Permissions.\n\n All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met. This License explicitly affirms your unlimited\npermission to run the unmodified Program. The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work. This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force. You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright. Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n Conveying under any other circumstances is permitted solely under\nthe conditions stated below. Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n 3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n 4. Conveying Verbatim Copies.\n\n You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n 5. Conveying Modified Source Versions.\n\n You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n a) The work must carry prominent notices stating that you modified\n it, and giving a relevant date.\n\n b) The work must carry prominent notices stating that it is\n released under this License and any conditions added under section\n 7. This requirement modifies the requirement in section 4 to\n \"keep intact all notices\".\n\n c) You must license the entire work, as a whole, under this\n License to anyone who comes into possession of a copy. This\n License will therefore apply, along with any applicable section 7\n additional terms, to the whole of the work, and all its parts,\n regardless of how they are packaged. This License gives no\n permission to license the work in any other way, but it does not\n invalidate such permission if you have separately received it.\n\n d) If the work has interactive user interfaces, each must display\n Appropriate Legal Notices; however, if the Program has interactive\n interfaces that do not display Appropriate Legal Notices, your\n work need not make them do so.\n\n A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit. Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n 6. Conveying Non-Source Forms.\n\n You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n a) Convey the object code in, or embodied in, a physical product\n (including a physical distribution medium), accompanied by the\n Corresponding Source fixed on a durable physical medium\n customarily used for software interchange.\n\n b) Convey the object code in, or embodied in, a physical product\n (including a physical distribution medium), accompanied by a\n written offer, valid for at least three years and valid for as\n long as you offer spare parts or customer support for that product\n model, to give anyone who possesses the object code either (1) a\n copy of the Corresponding Source for all the software in the\n product that is covered by this License, on a durable physical\n medium customarily used for software interchange, for a price no\n more than your reasonable cost of physically performing this\n conveying of source, or (2) access to copy the\n Corresponding Source from a network server at no charge.\n\n c) Convey individual copies of the object code with a copy of the\n written offer to provide the Corresponding Source. This\n alternative is allowed only occasionally and noncommercially, and\n only if you received the object code with such an offer, in accord\n with subsection 6b.\n\n d) Convey the object code by offering access from a designated\n place (gratis or for a charge), and offer equivalent access to the\n Corresponding Source in the same way through the same place at no\n further charge. You need not require recipients to copy the\n Corresponding Source along with the object code. If the place to\n copy the object code is a network server, the Corresponding Source\n may be on a different server (operated by you or a third party)\n that supports equivalent copying facilities, provided you maintain\n clear directions next to the object code saying where to find the\n Corresponding Source. Regardless of what server hosts the\n Corresponding Source, you remain obligated to ensure that it is\n available for as long as needed to satisfy these requirements.\n\n e) Convey the object code using peer-to-peer transmission, provided\n you inform other peers where the object code and Corresponding\n Source of the work are being offered to the general public at no\n charge under subsection 6d.\n\n A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling. In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage. For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product. A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source. The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information. But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed. Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n 7. Additional Terms.\n\n \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law. If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit. (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.) You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n a) Disclaiming warranty or limiting liability differently from the\n terms of sections 15 and 16 of this License; or\n\n b) Requiring preservation of specified reasonable legal notices or\n author attributions in that material or in the Appropriate Legal\n Notices displayed by works containing it; or\n\n c) Prohibiting misrepresentation of the origin of that material, or\n requiring that modified versions of such material be marked in\n reasonable ways as different from the original version; or\n\n d) Limiting the use for publicity purposes of names of licensors or\n authors of the material; or\n\n e) Declining to grant rights under trademark law for use of some\n trade names, trademarks, or service marks; or\n\n f) Requiring indemnification of licensors and authors of that\n material by anyone who conveys the material (or modified versions of\n it) with contractual assumptions of liability to the recipient, for\n any liability that these contractual assumptions directly impose on\n those licensors and authors.\n\n All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10. If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term. If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n 8. Termination.\n\n You may not propagate or modify a covered work except as expressly\nprovided under this License. Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License. If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n 9. Acceptance Not Required for Having Copies.\n\n You are not required to accept this License in order to receive or\nrun a copy of the Program. Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance. However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work. These actions infringe copyright if you do\nnot accept this License. Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n 10. Automatic Licensing of Downstream Recipients.\n\n Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License. You are not responsible\nfor enforcing compliance by third parties with this License.\n\n An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations. If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License. For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n 11. Patents.\n\n A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based. The\nwork thus licensed is called the contributor's \"contributor version\".\n\n A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version. For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement). To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients. \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License. You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n 12. No Surrender of Others' Freedom.\n\n If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License. If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all. For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n 13. Use with the GNU Affero General Public License.\n\n Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work. The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n 14. Revised Versions of this License.\n\n The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time. Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n Each version is given a distinguishing version number. If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation. If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n Later license versions may give you additional or different\npermissions. However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n 15. Disclaimer of Warranty.\n\n THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n 16. Limitation of Liability.\n\n IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n 17. Interpretation of Sections 15 and 16.\n\n If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n END OF TERMS AND CONDITIONS\n\n How to Apply These Terms to Your New Programs\n\n If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n To do so, attach the following notices to the program. It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n <one line to give the program's name and a brief idea of what it does.>\n Copyright (C) <year> <name of author>\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU General Public License for more details.\n\n You should have received a copy of the GNU General Public License\n along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n <program> Copyright (C) <year> <name of author>\n This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n This is free software, and you are welcome to redistribute it\n under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License. Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n The GNU General Public License does not permit incorporating your program\ninto proprietary programs. If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library. If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License. But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n\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\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 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 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(bytes memory b, uint256 from, uint256 to)\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(bytes memory b, uint256 from, uint256 to)\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(mload(add(b, index)), 0xffffffffffffffffffffffff0000000000000000000000000000000000000000)\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 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 /* 32 bytes to store length */ + input.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/Ownable/IOwnable.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n", - "2.0.0/utils/Ownable/Ownable.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"ONLY_CONTRACT_OWNER\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n", - "2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\ncontract SafeMath {\n function safeMul(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a * b;\n assert(a == 0 || c / a == b);\n return c;\n }\n\n function safeDiv(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a / b;\n return c;\n }\n\n function safeSub(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n assert(b <= a);\n return a - b;\n }\n\n function safeAdd(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a + b;\n assert(c >= a);\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" + "2.0.0/forwarder/Forwarder.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 \"./MixinFees.sol\";\nimport \"./MixinForwarderCore.sol\";\nimport \"./MixinConstants.sol\";\nimport \"./MixinMarketBuyZrx.sol\";\nimport \"./MixinExpectedResults.sol\";\nimport \"./MixinTransfer.sol\";\n\n\ncontract Forwarder is\n MixinConstants,\n MixinExpectedResults,\n MixinFees,\n MixinMarketBuyZrx,\n MixinTransfer,\n MixinForwarderCore\n{\n\n constructor (\n address _exchange,\n address _etherToken,\n address _zrxToken,\n bytes memory _zrxAssetData,\n bytes memory _wethAssetData\n )\n public\n MixinConstants(\n _exchange,\n _etherToken,\n _zrxToken,\n _zrxAssetData,\n _wethAssetData\n )\n MixinForwarderCore()\n {}\n}\n", + "2.0.0/forwarder/MixinConstants.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 \"./mixins/MConstants.sol\";\n\n\ncontract MixinConstants is\n MConstants\n{\n\n constructor (\n address _exchange,\n address _etherToken,\n address _zrxToken,\n bytes memory _zrxAssetData,\n bytes memory _wethAssetData\n )\n public\n {\n EXCHANGE = IExchange(_exchange);\n ETHER_TOKEN = IEtherToken(_etherToken);\n ZRX_TOKEN = IERC20Token(_zrxToken);\n ZRX_ASSET_DATA = _zrxAssetData;\n WETH_ASSET_DATA = _wethAssetData;\n }\n}\n", + "2.0.0/forwarder/MixinExpectedResults.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 \"../utils/LibBytes/LibBytes.sol\";\nimport \"../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../protocol/Exchange/libs/LibMath.sol\";\nimport \"../protocol/Exchange/libs/LibOrder.sol\";\nimport \"./mixins/MConstants.sol\";\nimport \"./mixins/MExpectedResults.sol\";\n\n\ncontract MixinExpectedResults is\n LibMath,\n LibFillResults,\n MConstants,\n MExpectedResults\n{\n\n /// @dev Calculates a total FillResults for buying makerAssetFillAmount over all orders.\n /// Including the fees required to be paid. \n /// @param orders An array of Order struct containing order specifications.\n /// @param makerAssetFillAmount A number representing the amount of this order to fill.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker.\n function calculateMarketBuyResults(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount\n )\n public\n view\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n FillResults memory singleFillResult = calculateFillResults(orders[i], remainingTakerAssetFillAmount);\n addFillResults(totalFillResults, singleFillResult);\n if (totalFillResults.makerAssetFilledAmount == makerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Calculates a FillResults total for selling takerAssetFillAmount over all orders. \n /// Including the fees required to be paid. \n /// @param orders An array of Order struct containing order specifications.\n /// @param takerAssetFillAmount A number representing the amount of this order to fill.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker.\n function calculateMarketSellResults(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount\n )\n public\n view\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);\n FillResults memory singleFillResult = calculateFillResults(orders[i], remainingTakerAssetFillAmount);\n addFillResults(totalFillResults, singleFillResult);\n if (totalFillResults.takerAssetFilledAmount == takerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Calculates fill results for buyFeeTokens. This handles fees on buying ZRX\n /// so the end result is the expected amount of ZRX (not less after fees).\n /// @param orders An array of Order struct containing order specifications.\n /// @param zrxFillAmount A number representing the amount zrx to buy\n /// @return totalFillResults Expected fill result amounts from buying fees\n function calculateMarketBuyZrxResults(\n LibOrder.Order[] memory orders,\n uint256 zrxFillAmount\n )\n public\n view\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n uint256 remainingZrxFillAmount = safeSub(zrxFillAmount, totalFillResults.makerAssetFilledAmount);\n // Convert the remaining amount of makerToken to buy into remaining amount\n // of takerToken to sell, assuming entire amount can be sold in the current order\n uint256 remainingWethSellAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n safeSub(orders[i].makerAssetAmount, orders[i].takerFee), // our exchange rate after fees \n remainingZrxFillAmount\n );\n FillResults memory singleFillResult = calculateFillResults(orders[i], safeAdd(remainingWethSellAmount, 1));\n\n singleFillResult.makerAssetFilledAmount = safeSub(singleFillResult.makerAssetFilledAmount, singleFillResult.takerFeePaid);\n addFillResults(totalFillResults, singleFillResult);\n // As we compensate for the rounding issue above have slightly more ZRX than the requested zrxFillAmount\n if (totalFillResults.makerAssetFilledAmount >= zrxFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Simulates the 0x Exchange fillOrder validation and calculations, without performing any state changes.\n /// @param order An Order struct containing order specifications.\n /// @param takerAssetFillAmount A number representing the amount of this order to fill.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount\n )\n internal\n view\n returns (FillResults memory fillResults)\n {\n LibOrder.OrderInfo memory orderInfo = EXCHANGE.getOrderInfo(order);\n if (orderInfo.orderStatus != uint8(LibOrder.OrderStatus.FILLABLE)) {\n return fillResults;\n }\n uint256 remainingTakerAssetAmount = safeSub(order.takerAssetAmount, orderInfo.orderTakerAssetFilledAmount);\n uint256 takerAssetFilledAmount = min256(takerAssetFillAmount, remainingTakerAssetAmount);\n\n fillResults.takerAssetFilledAmount = takerAssetFilledAmount;\n fillResults.makerAssetFilledAmount = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n );\n fillResults.makerFeePaid = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerFee\n );\n fillResults.takerFeePaid = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.takerFee\n );\n return fillResults;\n }\n}\n", + "2.0.0/forwarder/MixinFees.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 \"../protocol/Exchange/libs/LibMath.sol\";\nimport \"./mixins/MConstants.sol\";\nimport \"./mixins/MFees.sol\";\n\n\ncontract MixinFees is\n LibMath,\n MConstants,\n MFees\n{\n\n uint16 constant public PERCENTAGE_DENOMINATOR = 10000; // 9800 == 98%, 10000 == 100%\n uint16 constant public MAX_FEE = 1000; // 10%\n uint16 constant public ALLOWABLE_EXCHANGE_PERCENTAGE = 9500; // 95%\n\n /// @dev Default payabale function, this allows us to withdraw WETH\n function ()\n public\n payable\n {\n require(\n msg.sender == address(ETHER_TOKEN),\n \"DEFAULT_FUNCTION_WETH_CONTRACT_ONLY\"\n );\n }\n\n /// @dev Pays the feeRecipient feeProportion of the total takerEthAmount, denominated in ETH\n /// @param takerEthAmount The total amount that was transacted in WETH, fees are calculated from this value.\n /// @param feeProportion The proportion of fees\n /// @param feeRecipient The recipient of the fees\n /// @return ethFeeAmount Amount of ETH paid to feeRecipient as fee.\n function payEthFee(\n uint256 takerEthAmount,\n uint16 feeProportion,\n address feeRecipient\n )\n internal\n returns (uint256 ethFeeAmount)\n {\n if (feeProportion > 0 && feeRecipient != address(0)) {\n require(\n feeProportion <= MAX_FEE,\n \"FEE_PROPORTION_TOO_LARGE\"\n );\n // 1.5% is 150, allowing for 2 decimal precision, i.e 0.05% is 5\n ethFeeAmount = getPartialAmount(\n feeProportion,\n PERCENTAGE_DENOMINATOR,\n takerEthAmount\n );\n feeRecipient.transfer(ethFeeAmount);\n }\n return ethFeeAmount;\n }\n\n /// @dev Withdraws the remaining WETH, deduct and pay fees from this amount based on the takerTokenAmount to the feeRecipient.\n /// If a user overpaid ETH initially, the fees are calculated from the amount traded and deducted from withdrawAmount.\n /// Any remaining ETH is sent back to the user.\n /// @param ethWithdrawAmount The amount to withdraw from the WETH contract.\n /// @param wethAmountSold The total amount that was transacted in WETH, fees are calculated from this value.\n /// @param feeProportion The proportion of fees\n /// @param feeRecipient The recipient of the fees\n function withdrawPayAndDeductEthFee(\n uint256 ethWithdrawAmount,\n uint256 wethAmountSold,\n uint16 feeProportion,\n address feeRecipient\n )\n internal\n {\n // Return all of the excess WETH if any after deducting fees on the amount\n if (ethWithdrawAmount > 0) {\n ETHER_TOKEN.withdraw(ethWithdrawAmount);\n // Fees proportional to the amount traded\n uint256 ethFeeAmount = payEthFee(\n wethAmountSold,\n feeProportion,\n feeRecipient\n );\n uint256 unspentEthAmount = safeSub(ethWithdrawAmount, ethFeeAmount);\n if (unspentEthAmount > 0) {\n msg.sender.transfer(unspentEthAmount);\n }\n }\n }\n\n /// @dev Checks whether the amount of tokens sold against the amount of tokens requested\n /// is within a certain threshold. This ensures the caller gets a fair deal when\n /// performing any token fee abstraction. Threshold is 95%. If fee abstraction costs more than\n /// 5% of the total transaction, we return false.\n /// @param requestedSellAmount The amount the user requested, or sent in to a payable function\n /// @param tokenAmountSold The amount of the token that was sold after fee abstraction\n /// @return bool of whether this is within an acceptable threshold\n function isAcceptableThreshold(uint256 requestedSellAmount, uint256 tokenAmountSold)\n internal\n pure\n returns (bool)\n {\n uint256 acceptableSellAmount = getPartialAmount(\n ALLOWABLE_EXCHANGE_PERCENTAGE,\n PERCENTAGE_DENOMINATOR,\n requestedSellAmount\n );\n return tokenAmountSold >= acceptableSellAmount;\n }\n}\n", + "2.0.0/forwarder/MixinForwarderCore.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 \"../utils/LibBytes/LibBytes.sol\";\nimport \"./mixins/MFees.sol\";\nimport \"./mixins/MMarketBuyZrx.sol\";\nimport \"./mixins/MExpectedResults.sol\";\nimport \"./mixins/MTransfer.sol\";\nimport \"./mixins/MConstants.sol\";\nimport \"./mixins/MForwarderCore.sol\";\nimport \"../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../protocol/Exchange/libs/LibFillResults.sol\";\n\n\ncontract MixinForwarderCore is\n LibFillResults,\n MConstants,\n MExpectedResults,\n MFees,\n MMarketBuyZrx,\n MTransfer,\n MForwarderCore\n{\n bytes4 constant internal ERC20_DATA_ID = bytes4(keccak256(\"ERC20Token(address)\"));\n bytes4 constant internal ERC721_DATA_ID = bytes4(keccak256(\"ERC721Token(address,uint256,bytes)\"));\n uint256 constant internal MAX_UINT = 2**256 - 1;\n\n constructor ()\n public\n {\n address proxyAddress = EXCHANGE.getAssetProxy(ERC20_DATA_ID);\n if (proxyAddress != address(0)) {\n ETHER_TOKEN.approve(proxyAddress, MAX_UINT);\n ZRX_TOKEN.approve(proxyAddress, MAX_UINT);\n }\n }\n\n /// @dev Market sells ETH for ERC20 tokens, performing fee abstraction if required. This does not support ERC721 tokens. This function is payable\n /// and will convert all incoming ETH into WETH and perform the trade on behalf of the caller.\n /// This function allows for a deduction of a proportion of incoming ETH sent to the feeRecipient.\n /// The caller is sent all tokens from the operation.\n /// If the purchased token amount does not meet an acceptable threshold then this function reverts.\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param feeOrders An array of Order struct containing order specifications for fees.\n /// @param feeSignatures An array of Proof that order has been created by maker for the fee orders.\n /// @param feeProportion A proportion deducted off the incoming ETH and sent to feeRecipient. The maximum value for this\n /// is 1000, aka 10%. Supports up to 2 decimal places. I.e 0.59% is 59.\n /// @param feeRecipient An address of the fee recipient whom receives feeProportion of ETH.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketSellEthForERC20(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint16 feeProportion,\n address feeRecipient\n )\n public\n payable\n returns (FillResults memory totalFillResults)\n {\n uint256 takerEthAmount = msg.value;\n require(\n takerEthAmount > 0,\n \"VALUE_GREATER_THAN_ZERO\"\n );\n // Deduct the fee from the total amount of ETH sent in\n uint256 ethFeeAmount = payEthFee(\n takerEthAmount,\n feeProportion,\n feeRecipient\n );\n uint256 wethSellAmount = safeSub(takerEthAmount, ethFeeAmount);\n\n // Deposit the remaining to be used for trading\n ETHER_TOKEN.deposit.value(wethSellAmount)();\n // Populate the known assetData, as it is always WETH the caller can provide null bytes to save gas\n // marketSellOrders fills the remaining\n address makerTokenAddress = LibBytes.readAddress(orders[0].makerAssetData, 16);\n orders[0].takerAssetData = WETH_ASSET_DATA;\n if (makerTokenAddress == address(ZRX_TOKEN)) {\n // If this is ZRX then we market sell from the orders, rather than a 2 step of buying ZRX fees from feeOrders\n // then buying ZRX from orders\n totalFillResults = marketSellEthForZRXInternal(\n orders,\n signatures,\n wethSellAmount\n );\n } else {\n totalFillResults = marketSellEthForERC20Internal(\n orders,\n signatures,\n feeOrders,\n feeSignatures,\n wethSellAmount\n );\n }\n // Prevent accidental WETH owned by this contract and it being spent\n require(\n takerEthAmount >= totalFillResults.takerAssetFilledAmount,\n \"INVALID_MSG_VALUE\"\n );\n // Ensure no WETH is left in this contract\n require(\n wethSellAmount == totalFillResults.takerAssetFilledAmount,\n \"UNACCEPTABLE_THRESHOLD\"\n );\n // Transfer all tokens to msg.sender\n transferERC20Token(\n makerTokenAddress,\n msg.sender,\n totalFillResults.makerAssetFilledAmount\n );\n return totalFillResults;\n }\n\n /// @dev Buys the exact amount of assets (ERC20 and ERC721), performing fee abstraction if required.\n /// All order assets must be of the same type. Deducts a proportional fee to fee recipient.\n /// This function is payable and will convert all incoming ETH into WETH and perform the trade on behalf of the caller.\n /// The caller is sent all assets from the fill of orders. This function will revert unless the requested amount of assets are purchased.\n /// Any excess ETH sent will be returned to the caller\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param feeOrders An array of Order struct containing order specifications for fees.\n /// @param makerTokenFillAmount The amount of maker asset to buy.\n /// @param feeSignatures An array of Proof that order has been created by maker for the fee orders.\n /// @param feeProportion A proportion deducted off the ETH spent and sent to feeRecipient. The maximum value for this\n /// is 1000, aka 10%. Supports up to 2 decimal places. I.e 0.59% is 59.\n /// @param feeRecipient An address of the fee recipient whom receives feeProportion of ETH.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketBuyTokensWithEth(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 makerTokenFillAmount,\n uint16 feeProportion,\n address feeRecipient\n )\n public\n payable\n returns (FillResults memory totalFillResults)\n {\n uint256 takerEthAmount = msg.value;\n require(\n takerEthAmount > 0,\n \"VALUE_GREATER_THAN_ZERO\"\n );\n require(\n makerTokenFillAmount > 0,\n \"VALUE_GREATER_THAN_ZERO\"\n );\n bytes4 assetDataId = LibBytes.readBytes4(orders[0].makerAssetData, 0);\n require(\n assetDataId == ERC20_DATA_ID || assetDataId == ERC721_DATA_ID,\n \"UNSUPPORTED_TOKEN_PROXY\"\n );\n\n ETHER_TOKEN.deposit.value(takerEthAmount)();\n if (assetDataId == ERC20_DATA_ID) {\n totalFillResults = marketBuyERC20TokensInternal(\n orders,\n signatures,\n feeOrders,\n feeSignatures,\n makerTokenFillAmount\n );\n } else if (assetDataId == ERC721_DATA_ID) {\n totalFillResults = batchBuyERC721TokensInternal(\n orders,\n signatures,\n feeOrders,\n feeSignatures\n );\n }\n // Prevent accidental WETH owned by this contract and it being spent\n require(\n takerEthAmount >= totalFillResults.takerAssetFilledAmount,\n \"INVALID_MSG_VALUE\"\n );\n withdrawPayAndDeductEthFee(\n safeSub(takerEthAmount, totalFillResults.takerAssetFilledAmount),\n totalFillResults.takerAssetFilledAmount,\n feeProportion,\n feeRecipient\n );\n return totalFillResults;\n }\n\n /// @dev Market sells WETH for ERC20 tokens.\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param feeOrders An array of Order struct containing order specifications for fees.\n /// @param feeSignatures An array of Proof that order has been created by maker for the fee orders.\n /// @param wethSellAmount The amount of WETH to sell.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketSellEthForERC20Internal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 wethSellAmount\n )\n internal\n returns (FillResults memory totalFillResults)\n {\n uint256 remainingWethSellAmount = wethSellAmount;\n FillResults memory calculatedMarketSellResults = calculateMarketSellResults(orders, wethSellAmount);\n if (calculatedMarketSellResults.takerFeePaid > 0) {\n // Fees are required for these orders. Buy enough ZRX to cover the future market buy\n FillResults memory feeTokensResults = marketBuyZrxInternal(\n feeOrders,\n feeSignatures,\n calculatedMarketSellResults.takerFeePaid\n );\n // Ensure the token abstraction was fair if fees were proportionally too high, we fail\n require(\n isAcceptableThreshold(\n wethSellAmount,\n safeSub(wethSellAmount, feeTokensResults.takerAssetFilledAmount)\n ),\n \"UNACCEPTABLE_THRESHOLD\"\n );\n remainingWethSellAmount = safeSub(remainingWethSellAmount, feeTokensResults.takerAssetFilledAmount);\n totalFillResults.takerFeePaid = feeTokensResults.takerFeePaid;\n totalFillResults.takerAssetFilledAmount = feeTokensResults.takerAssetFilledAmount;\n }\n // Make our market sell to buy the requested tokens with the remaining balance\n FillResults memory requestedTokensResults = EXCHANGE.marketSellOrders(\n orders,\n remainingWethSellAmount,\n signatures\n );\n // Update our return FillResult with the market sell\n addFillResults(totalFillResults, requestedTokensResults);\n return totalFillResults;\n }\n\n /// @dev Market sells WETH for ZRX tokens.\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param wethSellAmount The amount of WETH to sell.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketSellEthForZRXInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n uint256 wethSellAmount\n )\n internal\n returns (FillResults memory totalFillResults)\n {\n // Make our market sell to buy the requested tokens with the remaining balance\n totalFillResults = EXCHANGE.marketSellOrders(\n orders,\n wethSellAmount,\n signatures\n );\n // Exchange does not special case ZRX in the makerAssetFilledAmount, if fees were deducted then using this amount\n // for future transfers is invalid.\n uint256 zrxAmountBought = safeSub(totalFillResults.makerAssetFilledAmount, totalFillResults.takerFeePaid);\n require(\n isAcceptableThreshold(totalFillResults.makerAssetFilledAmount, zrxAmountBought),\n \"UNACCEPTABLE_THRESHOLD\"\n );\n totalFillResults.makerAssetFilledAmount = zrxAmountBought;\n return totalFillResults;\n }\n\n /// @dev Buys an exact amount of an ERC20 token using WETH.\n /// @param orders Orders to fill. The maker asset is the ERC20 token to buy. The taker asset is WETH.\n /// @param signatures Proof that the orders were created by their respective makers.\n /// @param feeOrders to fill. The maker asset is ZRX and the taker asset is WETH.\n /// @param feeSignatures Proof that the feeOrders were created by their respective makers.\n /// @param makerTokenFillAmount Amount of the ERC20 token to buy.\n /// @return totalFillResults Aggregated fill results of buying the ERC20 and ZRX tokens.\n function marketBuyERC20TokensInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 makerTokenFillAmount\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults)\n {\n // We read the maker token address to check if it is ZRX and later use it for transfer\n address makerTokenAddress = LibBytes.readAddress(orders[0].makerAssetData, 16);\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we copy the makerAssetData from the first order onto all later orders.\n orders[0].takerAssetData = WETH_ASSET_DATA;\n // We can short cut here for effeciency and use buyFeeTokensInternal if maker asset token is ZRX\n // this buys us exactly that amount taking into account the fees. This saves gas and calculates the rate correctly\n FillResults memory marketBuyResults;\n if (makerTokenAddress == address(ZRX_TOKEN)) {\n marketBuyResults = marketBuyZrxInternal(\n orders,\n signatures,\n makerTokenFillAmount\n );\n // When buying ZRX we round up which can result in a small margin excess\n require(\n marketBuyResults.makerAssetFilledAmount >= makerTokenFillAmount,\n \"UNACCEPTABLE_THRESHOLD\"\n );\n addFillResults(totalFillResults, marketBuyResults);\n require(\n isAcceptableThreshold(\n safeAdd(totalFillResults.makerAssetFilledAmount, totalFillResults.takerFeePaid), // Total ZRX\n totalFillResults.makerAssetFilledAmount // amount going to msg.sender\n ),\n \"UNACCEPTABLE_THRESHOLD\"\n );\n } else {\n FillResults memory calculatedMarketBuyResults = calculateMarketBuyResults(orders, makerTokenFillAmount);\n if (calculatedMarketBuyResults.takerFeePaid > 0) {\n // Fees are required for these orders. Buy enough ZRX to cover the future market buy\n FillResults memory zrxMarketBuyResults = marketBuyZrxInternal(\n feeOrders,\n feeSignatures,\n calculatedMarketBuyResults.takerFeePaid\n );\n totalFillResults.takerAssetFilledAmount = zrxMarketBuyResults.takerAssetFilledAmount;\n totalFillResults.takerFeePaid = zrxMarketBuyResults.takerFeePaid;\n }\n // Make our market buy of the requested tokens with the remaining balance\n marketBuyResults = EXCHANGE.marketBuyOrders(\n orders,\n makerTokenFillAmount,\n signatures\n );\n require(\n marketBuyResults.makerAssetFilledAmount == makerTokenFillAmount,\n \"UNACCEPTABLE_THRESHOLD\"\n );\n addFillResults(totalFillResults, marketBuyResults);\n require(\n isAcceptableThreshold(\n totalFillResults.takerAssetFilledAmount,\n marketBuyResults.takerAssetFilledAmount\n ),\n \"UNACCEPTABLE_THRESHOLD\"\n );\n }\n // Transfer all purchased tokens to msg.sender\n transferERC20Token(\n makerTokenAddress,\n msg.sender,\n marketBuyResults.makerAssetFilledAmount\n );\n return totalFillResults;\n }\n\n /// @dev Buys an all of the ERC721 tokens in the orders.\n /// @param orders Orders to fill. The maker asset is the ERC721 token to buy. The taker asset is WETH.\n /// @param signatures Proof that the orders were created by their respective makers.\n /// @param feeOrders to fill. The maker asset is ZRX and the taker asset is WETH.\n /// @param feeSignatures Proof that the feeOrders were created by their respective makers.\n /// @return totalFillResults Aggregated fill results of buying the ERC721 tokens and ZRX tokens.\n function batchBuyERC721TokensInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults)\n {\n uint256 totalZrxFeeAmount;\n uint256 ordersLength = orders.length;\n uint256[] memory takerAssetFillAmounts = new uint256[](ordersLength);\n for (uint256 i = 0; i < ordersLength; i++) {\n // Total up the fees\n totalZrxFeeAmount = safeAdd(totalZrxFeeAmount, orders[i].takerFee);\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we set the takerAssetData as WETH asset data\n orders[i].takerAssetData = WETH_ASSET_DATA;\n // Populate takerAssetFillAmounts for later batchFill\n takerAssetFillAmounts[i] = orders[i].takerAssetAmount;\n }\n if (totalZrxFeeAmount > 0) {\n // Fees are required for these orders. Buy enough ZRX to cover the future fill\n FillResults memory zrxMarketBuyResults = marketBuyZrxInternal(\n feeOrders,\n feeSignatures,\n totalZrxFeeAmount\n );\n totalFillResults.takerFeePaid = zrxMarketBuyResults.takerFeePaid;\n totalFillResults.takerAssetFilledAmount = zrxMarketBuyResults.takerAssetFilledAmount;\n }\n FillResults memory batchFillResults = EXCHANGE.batchFillOrKillOrders(\n orders,\n takerAssetFillAmounts,\n signatures\n );\n addFillResults(totalFillResults, batchFillResults);\n require(\n isAcceptableThreshold(\n totalFillResults.takerAssetFilledAmount,\n batchFillResults.takerAssetFilledAmount\n ),\n \"UNACCEPTABLE_THRESHOLD\"\n );\n // Transfer all of the tokens filled from the batchFill\n for (i = 0; i < ordersLength; i++) {\n transferERC721Token(\n orders[i].makerAssetData,\n msg.sender\n );\n }\n return totalFillResults;\n }\n}\n", + "2.0.0/forwarder/MixinMarketBuyZrx.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/libs/LibFillResults.sol\";\nimport \"../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../protocol/Exchange/libs/LibMath.sol\";\nimport \"./mixins/MConstants.sol\";\nimport \"./mixins/MMarketBuyZrx.sol\";\n\n\ncontract MixinMarketBuyZrx is\n LibMath,\n LibFillResults,\n MConstants,\n MMarketBuyZrx\n{\n\n /// @dev Buys zrxBuyAmount of ZRX fee tokens, taking into account the fees on buying fee tokens. This will guarantee\n /// At least zrxBuyAmount of ZRX fee tokens are purchased (sometimes slightly over due to rounding issues).\n /// It is possible that a request to buy 200 ZRX fee tokens will require purchasing 202 ZRX tokens\n /// As 2 ZRX is required to purchase the 200 ZRX fee tokens. This guarantees at least 200 ZRX for future purchases.\n /// @param orders An array of Order struct containing order specifications for fees.\n /// @param signatures An array of Proof that order has been created by maker for the fee orders.\n /// @param zrxBuyAmount The number of requested ZRX fee tokens.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker. makerTokenAmount is the zrx amount deducted of fees\n function marketBuyZrxInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n uint256 zrxBuyAmount\n )\n internal\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n // All of these are ZRX/WETH, we can drop the respective assetData from callData\n orders[i].makerAssetData = ZRX_ASSET_DATA;\n orders[i].takerAssetData = WETH_ASSET_DATA;\n // Calculate the remaining amount of makerToken to buy\n uint256 remainingZrxBuyAmount = safeSub(zrxBuyAmount, totalFillResults.makerAssetFilledAmount);\n // Convert the remaining amount of makerToken to buy into remaining amount\n // of takerToken to sell, assuming entire amount can be sold in the current order\n uint256 remainingWethSellAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n safeSub(orders[i].makerAssetAmount, orders[i].takerFee), // our exchange rate after fees \n remainingZrxBuyAmount\n );\n // Attempt to sell the remaining amount of takerToken\n // Round up the amount to ensure we don't under buy by a fractional amount\n FillResults memory singleFillResult = EXCHANGE.fillOrder(\n orders[i],\n safeAdd(remainingWethSellAmount, 1),\n signatures[i]\n );\n // We didn't buy the full amount when buying ZRX as some were taken for fees\n singleFillResult.makerAssetFilledAmount = safeSub(singleFillResult.makerAssetFilledAmount, singleFillResult.takerFeePaid);\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResult);\n // Stop execution if the entire amount of makerToken has been bought\n if (totalFillResults.makerAssetFilledAmount >= zrxBuyAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n}\n", + "2.0.0/forwarder/MixinTransfer.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/LibBytes/LibBytes.sol\";\nimport \"../tokens/ERC721Token/IERC721Token.sol\";\nimport \"./mixins/MTransfer.sol\";\n\n\ncontract MixinTransfer is\n MTransfer\n{\n\n using LibBytes for bytes;\n\n bytes4 constant internal ERC20_TRANSFER_SELECTOR = bytes4(keccak256(\"transfer(address,uint256)\"));\n bytes4 constant internal ERC721_RECEIVED = bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"));\n bytes4 constant internal ERC721_RECEIVED_OPERATOR = bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"));\n\n function onERC721Received(\n address,\n uint256,\n bytes memory\n )\n public\n pure\n returns(bytes4)\n {\n return ERC721_RECEIVED;\n }\n\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n )\n public\n pure\n returns(bytes4)\n {\n return ERC721_RECEIVED_OPERATOR;\n }\n\n function transferERC20Token(\n address token,\n address to,\n uint256 amount\n )\n internal\n {\n // Transfer tokens.\n // We do a raw call so we can check the success separate\n // from the return data.\n bool success = token.call(abi.encodeWithSelector(\n ERC20_TRANSFER_SELECTOR,\n to,\n amount\n ));\n require(\n success,\n \"TRANSFER_FAILED\"\n );\n \n // Check return data.\n // If there is no return data, we assume the token incorrectly\n // does not return a bool. In this case we expect it to revert\n // on failure, which was handled above.\n // If the token does return data, we require that it is a single\n // value that evaluates to true.\n assembly {\n if returndatasize {\n success := 0\n if eq(returndatasize, 32) {\n // First 64 bytes of memory are reserved scratch space\n returndatacopy(0, 0, 32)\n success := mload(0)\n }\n }\n }\n require(\n success,\n \"TRANSFER_FAILED\"\n );\n }\n\n function transferERC721Token(\n bytes memory assetData,\n address to\n )\n internal\n {\n // Decode asset data.\n address token = assetData.readAddress(16);\n uint256 tokenId = assetData.readUint256(36);\n bytes memory receiverData = assetData.readBytesWithLength(100);\n IERC721Token(token).safeTransferFrom(\n address(this),\n to,\n tokenId,\n receiverData\n );\n }\n}\n", + "2.0.0/forwarder/interfaces/IExpectedResults.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/libs/LibFillResults.sol\";\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\n\n\ncontract IExpectedResults {\n\n /// @dev Calculates a total FillResults for buying makerAssetFillAmount over all orders.\n /// Including the fees required to be paid. \n /// @param orders An array of Order struct containing order specifications.\n /// @param makerAssetFillAmount A number representing the amount of this order to fill.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker.\n function calculateMarketBuyResults(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount\n )\n public\n view\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Calculates a FillResults total for selling takerAssetFillAmount over all orders. \n /// Including the fees required to be paid. \n /// @param orders An array of Order struct containing order specifications.\n /// @param takerAssetFillAmount A number representing the amount of this order to fill.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker.\n function calculateMarketSellResults(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount\n )\n public\n view\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Calculates fill results for buyFeeTokens. This handles fees on buying ZRX\n /// so the end result is the expected amount of ZRX (not less after fees).\n /// @param orders An array of Order struct containing order specifications.\n /// @param zrxFillAmount A number representing the amount zrx to buy\n /// @return totalFillResults Expected fill result amounts from buying fees\n function calculateMarketBuyZrxResults(\n LibOrder.Order[] memory orders,\n uint256 zrxFillAmount\n )\n public\n view\n returns (LibFillResults.FillResults memory totalFillResults);\n}\n", + "2.0.0/forwarder/interfaces/IForwarderCore.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/libs/LibOrder.sol\";\nimport \"../../protocol/Exchange/libs/LibFillResults.sol\";\n\n\ncontract IForwarderCore {\n\n /// @dev Market sells ETH for ERC20 tokens, performing fee abstraction if required. This does not support ERC721 tokens. This function is payable\n /// and will convert all incoming ETH into WETH and perform the trade on behalf of the caller.\n /// This function allows for a deduction of a proportion of incoming ETH sent to the feeRecipient.\n /// The caller is sent all tokens from the operation.\n /// If the purchased token amount does not meet an acceptable threshold then this function reverts.\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param feeOrders An array of Order struct containing order specifications for fees.\n /// @param feeSignatures An array of Proof that order has been created by maker for the fee orders.\n /// @param feeProportion A proportion deducted off the incoming ETH and sent to feeRecipient. The maximum value for this\n /// is 1000, aka 10%. Supports up to 2 decimal places. I.e 0.59% is 59.\n /// @param feeRecipient An address of the fee recipient whom receives feeProportion of ETH.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketSellEthForERC20(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint16 feeProportion,\n address feeRecipient\n )\n public\n payable\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Buys the exact amount of assets (ERC20 and ERC721), performing fee abstraction if required.\n /// All order assets must be of the same type. Deducts a proportional fee to fee recipient.\n /// This function is payable and will convert all incoming ETH into WETH and perform the trade on behalf of the caller.\n /// The caller is sent all assets from the fill of orders. This function will revert unless the requested amount of assets are purchased.\n /// Any excess ETH sent will be returned to the caller\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param feeOrders An array of Order struct containing order specifications for fees.\n /// @param makerTokenFillAmount The amount of maker asset to buy.\n /// @param feeSignatures An array of Proof that order has been created by maker for the fee orders.\n /// @param feeProportion A proportion deducted off the ETH spent and sent to feeRecipient. The maximum value for this\n /// is 1000, aka 10%. Supports up to 2 decimal places. I.e 0.59% is 59.\n /// @param feeRecipient An address of the fee recipient whom receives feeProportion of ETH.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketBuyTokensWithEth(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 makerTokenFillAmount,\n uint16 feeProportion,\n address feeRecipient\n )\n public\n payable\n returns (LibFillResults.FillResults memory totalFillResults);\n}\n", + "2.0.0/forwarder/mixins/MConstants.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 \"../../protocol/Exchange/interfaces/IExchange.sol\";\nimport \"../../tokens/EtherToken/IEtherToken.sol\";\nimport \"../../tokens/ERC20Token/IERC20Token.sol\";\n\n\ncontract MConstants {\n\n // solhint-disable var-name-mixedcase\n IExchange internal EXCHANGE;\n IEtherToken internal ETHER_TOKEN;\n IERC20Token internal ZRX_TOKEN;\n bytes internal ZRX_ASSET_DATA;\n bytes internal WETH_ASSET_DATA;\n // solhint-enable var-name-mixedcase\n}\n", + "2.0.0/forwarder/mixins/MExpectedResults.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/libs/LibFillResults.sol\";\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../interfaces/IExpectedResults.sol\";\n\n\ncontract MExpectedResults is\n IExpectedResults\n{\n\n /// @dev Simulates the 0x Exchange fillOrder validation and calculations, without performing any state changes.\n /// @param order An Order struct containing order specifications.\n /// @param takerAssetFillAmount A number representing the amount of this order to fill.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount\n )\n internal\n view\n returns (LibFillResults.FillResults memory fillResults);\n}\n", + "2.0.0/forwarder/mixins/MFees.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 MFees {\n\n /// @dev Pays the feeRecipient feeProportion of the total takerEthAmount, denominated in ETH\n /// @param takerEthAmount The total amount that was transacted in WETH, fees are calculated from this value.\n /// @param feeProportion The proportion of fees\n /// @param feeRecipient The recipient of the fees\n /// @return ethFeeAmount Amount of ETH paid to feeRecipient as fee.\n function payEthFee(\n uint256 takerEthAmount,\n uint16 feeProportion,\n address feeRecipient\n )\n internal\n returns (uint256 ethFeeAmount);\n\n /// @dev Withdraws the remaining WETH, deduct and pay fees from this amount based on the takerTokenAmount to the feeRecipient.\n /// If a user overpaid ETH initially, the fees are calculated from the amount traded and deducted from withdrawAmount.\n /// Any remaining ETH is sent back to the user.\n /// @param ethWithdrawAmount The amount to withdraw from the WETH contract.\n /// @param wethAmountSold The total amount that was transacted in WETH, fees are calculated from this value.\n /// @param feeProportion The proportion of fees\n /// @param feeRecipient The recipient of the fees\n function withdrawPayAndDeductEthFee(\n uint256 ethWithdrawAmount,\n uint256 wethAmountSold,\n uint16 feeProportion,\n address feeRecipient\n )\n internal;\n\n /// @dev Checks whether the amount of tokens sold against the amount of tokens requested\n /// is within a certain threshold. This ensures the caller gets a fair deal when\n /// performing any token fee abstraction. Threshold is 95%. If fee abstraction costs more than\n /// 5% of the total transaction, we return false.\n /// @param requestedSellAmount The amount the user requested, or sent in to a payable function\n /// @param tokenAmountSold The amount of the token that was sold after fee abstraction\n /// @return bool of whether this is within an acceptable threshold\n function isAcceptableThreshold(uint256 requestedSellAmount, uint256 tokenAmountSold)\n internal\n pure\n returns (bool);\n}\n", + "2.0.0/forwarder/mixins/MForwarderCore.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/libs/LibOrder.sol\";\nimport \"../../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../interfaces/IForwarderCore.sol\";\n\n\ncontract MForwarderCore is\n IForwarderCore\n{\n\n /// @dev Market sells WETH for ERC20 tokens.\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param feeOrders An array of Order struct containing order specifications for fees.\n /// @param feeSignatures An array of Proof that order has been created by maker for the fee orders.\n /// @param wethSellAmount The amount of WETH to sell.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketSellEthForERC20Internal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 wethSellAmount\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Market sells WETH for ZRX tokens.\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param wethSellAmount The amount of WETH to sell.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketSellEthForZRXInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n uint256 wethSellAmount\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Buys an exact amount of an ERC20 token using WETH.\n /// @param orders Orders to fill. The maker asset is the ERC20 token to buy. The taker asset is WETH.\n /// @param signatures Proof that the orders were created by their respective makers.\n /// @param feeOrders to fill. The maker asset is ZRX and the taker asset is WETH.\n /// @param feeSignatures Proof that the feeOrders were created by their respective makers.\n /// @param makerTokenFillAmount Amount of the ERC20 token to buy.\n /// @return totalFillResults Aggregated fill results of buying the ERC20 and ZRX tokens.\n function marketBuyERC20TokensInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 makerTokenFillAmount\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Buys an all of the ERC721 tokens in the orders.\n /// @param orders Orders to fill. The maker asset is the ERC721 token to buy. The taker asset is WETH.\n /// @param signatures Proof that the orders were created by their respective makers.\n /// @param feeOrders to fill. The maker asset is ZRX and the taker asset is WETH.\n /// @param feeSignatures Proof that the feeOrders were created by their respective makers.\n /// @return totalFillResults Aggregated fill results of buying the ERC721 tokens and ZRX tokens.\n function batchBuyERC721TokensInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults);\n}\n", + "2.0.0/forwarder/mixins/MMarketBuyZrx.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 \"../../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\n\n\ncontract MMarketBuyZrx {\n\n /// @dev Buys zrxBuyAmount of ZRX fee tokens, taking into account the fees on buying fee tokens. This will guarantee\n /// At least zrxBuyAmount of ZRX fee tokens are purchased (sometimes slightly over due to rounding issues).\n /// It is possible that a request to buy 200 ZRX fee tokens will require purchasing 202 ZRX tokens\n /// As 2 ZRX is required to purchase the 200 ZRX fee tokens. This guarantees at least 200 ZRX for future purchases.\n /// @param orders An array of Order struct containing order specifications for fees.\n /// @param signatures An array of Proof that order has been created by maker for the fee orders.\n /// @param zrxBuyAmount The number of requested ZRX fee tokens.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker. makerTokenAmount is the zrx amount deducted of fees\n function marketBuyZrxInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n uint256 zrxBuyAmount\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults);\n}\n", + "2.0.0/forwarder/mixins/MTransfer.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 MTransfer {\n\n function onERC721Received(address, uint256, bytes memory)\n public\n pure\n returns(bytes4);\n\n function onERC721Received(address, address, uint256, bytes memory)\n public\n pure\n returns(bytes4);\n \n function transferERC20Token(\n address token,\n address to,\n uint256 amount\n )\n internal;\n\n function transferERC721Token(\n bytes memory assetData,\n address to\n )\n internal;\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 public constant 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.encode(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n 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)\n {\n return keccak256(abi.encodePacked(EIP191_HEADER, EIP712_DOMAIN_HASH, hashStruct));\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/LibMath.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 LibMath is\n SafeMath\n{\n\n /// @dev Calculates partial value given a numerator and denominator.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target.\n function getPartialAmount(\n uint256 numerator,\n uint256 denominator,\n uint256 target)\n internal\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = safeDiv(\n safeMul(numerator, target),\n denominator\n );\n return partialAmount;\n }\n\n /// @dev Checks if rounding error > 0.1%.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingError(\n uint256 numerator,\n uint256 denominator,\n uint256 target)\n internal\n pure\n returns (bool isError)\n {\n uint256 remainder = mulmod(target, numerator, denominator);\n if (remainder == 0) {\n return false; // No rounding error.\n }\n\n uint256 errPercentageTimes1000000 = safeDiv(\n safeMul(remainder, 1000000),\n safeMul(numerator, target)\n );\n isError = errPercentageTimes1000000 > 1000;\n return isError;\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.encode(\n // order.makerAddress,\n // order.takerAddress,\n // order.feeRecipientAddress,\n // 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 // Backup\n // solhint-disable-next-line space-after-comma\n let temp1 := mload(sub(order, 32))\n let temp2 := mload(add(order, 320))\n let temp3 := mload(add(order, 352))\n \n // Hash in place\n // solhint-disable-next-line space-after-comma\n mstore(sub(order, 32), schemaHash)\n mstore(add(order, 320), makerAssetDataHash)\n mstore(add(order, 352), takerAssetDataHash)\n result := keccak256(sub(order, 32), 416)\n \n // Restore\n // solhint-disable-next-line space-after-comma\n mstore(sub(order, 32), temp1)\n mstore(add(order, 320), temp2)\n mstore(add(order, 352), 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 /// @notice 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 Whether the transfer was successful or not\n function transfer(address _to, uint256 _value)\n public\n returns (bool);\n\n /// @notice 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 Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value)\n public\n returns (bool);\n \n /// @notice `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 Whether the approval was successful or not\n function approve(address _spender, uint256 _value)\n public\n returns (bool);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return The balance\n function balanceOf(address _owner)\n public 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 public view\n returns (uint256);\n\n // solhint-disable-next-line 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", + "2.0.0/tokens/ERC721Token/IERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity 0.4.24;\n\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic interface\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Basic.sol\n */\ncontract IERC721Token {\n string internal name_;\n string internal symbol_;\n\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _tokenId\n );\n\n event Approval(\n address indexed _owner,\n address indexed _approved,\n uint256 _tokenId\n );\n\n event ApprovalForAll(\n address indexed _owner,\n address indexed _operator,\n bool _approved\n );\n\n function name()\n public\n view\n returns (string);\n\n function symbol()\n public\n view\n returns (string);\n\n function balanceOf(address _owner)\n public\n view\n returns (uint256 _balance);\n\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address _owner);\n\n function exists(uint256 _tokenId)\n public\n view\n returns (bool _exists);\n\n function approve(address _to, uint256 _tokenId)\n public;\n\n function getApproved(uint256 _tokenId)\n public\n view\n returns (address _operator);\n\n function setApprovalForAll(address _operator, bool _approved)\n public;\n\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool);\n\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n public;\n\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n public;\n\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data\n )\n public;\n}\n", + "2.0.0/tokens/EtherToken/IEtherToken.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 \"../ERC20Token/IERC20Token.sol\";\n\n\ncontract IEtherToken is\n IERC20Token\n{\n function deposit()\n public\n payable;\n \n function withdraw(uint256 amount)\n public;\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_OVERFLOW\"\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": "0x9db1fea357d8344a687da4bec67291f43cafe64ec20255f96248c2e180279382", + "sourceTreeHashHex": "0xe5560a5c22d8ed65136ac6d596bd8540f0c92f2a0b1e192720af2ab8dd3fca8b", "compiler": { "name": "solc", "version": "soljson-v0.4.24+commit.e67f0147.js", @@ -923,5 +892,11 @@ } } }, - "networks": {} + "networks": { + "50": { + "address": "0xb69e673309512a9d726f87304c6984054f87a93b", + "links": {}, + "constructorArgs": "[\"0x48bacb9266a570d521063ef5dd96e61686dbe788\",\"0x0b1ba0af832d7c05fd64161e0db78e85978e8082\",\"0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c\",\"0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c\",\"0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082\"]" + } + } }
\ No newline at end of file |