@hybridx-exchange/orderbook-core
Version:
🎛 Core contracts for the HybridX protocol
717 lines • 174 kB
JSON
{
"abi": [
{
"inputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountOffer",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountRemain",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "price",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "OrderCanceled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountOffer",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountUsed",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "price",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "OrderClosed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountOffer",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountRemain",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "price",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "OrderCreated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountOffer",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountUsed",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "price",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "OrderUpdate",
"type": "event"
},
{
"constant": true,
"inputs": [],
"name": "baseBalance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "baseDecimal",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "baseToken",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "factory",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getPrice",
"outputs": [
{
"internalType": "uint256",
"name": "price",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getReserves",
"outputs": [
{
"internalType": "uint112",
"name": "reserveBase",
"type": "uint112"
},
{
"internalType": "uint112",
"name": "reserveQuote",
"type": "uint112"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
}
],
"name": "getUserOrders",
"outputs": [
{
"internalType": "uint256[]",
"name": "orderIds",
"type": "uint256[]"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address",
"name": "_pair",
"type": "address"
},
{
"internalType": "address",
"name": "_baseToken",
"type": "address"
},
{
"internalType": "address",
"name": "_quoteToken",
"type": "address"
},
{
"internalType": "uint256",
"name": "_priceStep",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_minAmount",
"type": "uint256"
}
],
"name": "initialize",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "uint256",
"name": "direction",
"type": "uint256"
},
{
"internalType": "uint32",
"name": "maxSize",
"type": "uint32"
}
],
"name": "marketBook",
"outputs": [
{
"internalType": "uint256[]",
"name": "prices",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "amounts",
"type": "uint256[]"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "uint256",
"name": "orderId",
"type": "uint256"
}
],
"name": "marketOrder",
"outputs": [
{
"internalType": "uint256[]",
"name": "order",
"type": "uint256[]"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "marketOrders",
"outputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "orderId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "price",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOffer",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountRemain",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "orderType",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "orderIndex",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "minAmount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "uint256",
"name": "newMinAmount",
"type": "uint256"
}
],
"name": "minAmountUpdate",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "pair",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "priceDecimal",
"outputs": [
{
"internalType": "uint256",
"name": "decimal",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "priceStep",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "uint256",
"name": "newPriceStep",
"type": "uint256"
}
],
"name": "priceStepUpdate",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "protocolFeeRate",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "uint256",
"name": "newProtocolFeeRate",
"type": "uint256"
}
],
"name": "protocolFeeRateUpdate",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "quoteBalance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "quoteToken",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "uint256",
"name": "direction",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "price",
"type": "uint256"
}
],
"name": "rangeBook",
"outputs": [
{
"internalType": "uint256[]",
"name": "prices",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "amounts",
"type": "uint256[]"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "address payable",
"name": "to",
"type": "address"
}
],
"name": "safeRefund",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "subsidyFeeRate",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "uint256",
"name": "newSubsidyFeeRate",
"type": "uint256"
}
],
"name": "subsidyFeeRateUpdate",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "userOrders",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
],
"evm": {
"bytecode": {
"linkReferences": {},
"object": "6080604052600160125534801561001557600080fd5b50600580546001600160a01b03191633179055611b3f806100376000396000f3fe608060405234801561001057600080fd5b50600436106101495760003560e01c806306fdde031461014e5780630902f1ac146101cb57806319eda4bc146101f9578063217a4b7014610218578063346970f91461023c57806338bde791146102a6578063573dd9db146102c057806358f858801461032d5780636069f0801461033557806363c69f08146103525780637de81d8b14610378578063856652e91461043457806388d519c41461046057806398d5fdca146104685780639b2cb5d814610470578063a6b63eb814610478578063a8aa1b31146104ba578063bc9113f0146104c2578063c45a0155146104ca578063c55dae63146104d2578063cb160866146104da578063db7b373e14610508578063deb65ac314610510578063e52fa98b1461052d578063f1564c0b14610556578063f1a2e84914610573578063f361df081461057b575b600080fd5b610156610583565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610190578181015183820152602001610178565b50505050905090810190601f1680156101bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101d36105b0565b604080516001600160701b03938416815291909216602082015281519081900390910190f35b6102166004803603602081101561020f57600080fd5b50356105e1565b005b6102206106df565b604080516001600160a01b039092168252519081900360200190f35b6102596004803603602081101561025257600080fd5b50356106ee565b604080516001600160a01b03998a168152979098166020880152868801959095526060860193909352608085019190915260a084015260c083015260e08201529051908190036101000190f35b6102ae61073e565b60408051918252519081900360200190f35b6102dd600480360360208110156102d657600080fd5b5035610744565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610319578181015183820152602001610301565b505050509050019250505060405180910390f35b6102ae6108e1565b6102166004803603602081101561034b57600080fd5b50356108e7565b6102dd6004803603602081101561036857600080fd5b50356001600160a01b03166109e5565b61039b6004803603604081101561038e57600080fd5b5080359060200135610a51565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156103df5781810151838201526020016103c7565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561041e578181015183820152602001610406565b5050505090500194505050505060405180910390f35b6102ae6004803603604081101561044a57600080fd5b506001600160a01b038135169060200135610ba0565b6102ae610bce565b6102ae610bd4565b6102ae610c4d565b610216600480360360a081101561048e57600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060800135610c53565b610220610f78565b6102ae610f87565b610220611000565b61022061100f565b610216600480360360408110156104f057600080fd5b506001600160a01b038135811691602001351661101e565b6102ae61122c565b6102166004803603602081101561052657600080fd5b5035611232565b61039b6004803603604081101561054357600080fd5b508035906020013563ffffffff16611356565b6102166004803603602081101561056c57600080fd5b5035611463565b6102ae611587565b6102ae61158d565b6040518060400160405280601181526020017048796272696458204f72646572426f6f6b60781b81525081565b600654600a54600b5460009283926105d8926001600160a01b03928316929182169116611593565b90939092509050565b601254600114610621576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b600060125560055461063b906001600160a01b0316611702565b6001600160a01b0316336001600160a01b03161461068c576040805162461bcd60e51b81526020600482015260096024820152682337b93134b23232b760b91b604482015290519081900360640190fd5b60648111156106d5576040805162461bcd60e51b815260206004820152601060248201526f496e76616c696420466565205261746560801b604482015290519081900360640190fd5b600f556001601255565b600b546001600160a01b031681565b601060205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b03968716979590961695939492939192909188565b600c5481565b60408051600880825261012082019092526060916020820161010080388339019050509050610771611ab3565b50600082815260106020908152604080832081516101008101835281546001600160a01b039081168083526001840154909116948201949094526002820154928101929092526003810154606083015260048101546080830152600581015460a0830152600681015460c08301526007015460e08201528351909284916107f457fe5b60200260200101818152505080602001516001600160a01b03168260018151811061081b57fe5b60200260200101818152505080604001518260028151811061083957fe5b60200260200101818152505080606001518260038151811061085757fe5b60200260200101818152505080608001518260048151811061087557fe5b6020026020010181815250508060a001518260058151811061089357fe5b6020026020010181815250508060c00151826006815181106108b157fe5b6020026020010181815250508060e00151826007815181106108cf57fe5b60200260200101818152505050919050565b600e5481565b601254600114610927576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b6000601255600554610941906001600160a01b0316611702565b6001600160a01b0316336001600160a01b031614610992576040805162461bcd60e51b81526020600482015260096024820152682337b93134b23232b760b91b604482015290519081900360640190fd5b601e8111156109db576040805162461bcd60e51b815260206004820152601060248201526f496e76616c696420466565205261746560801b604482015290519081900360640190fd5b600e556001601255565b6001600160a01b038116600090815260116020908152604091829020805483518184028101840190945280845260609392830182828015610a4557602002820191906000526020600020905b815481526020019060010190808311610a31575b50505050509050919050565b6060806000610a618560006117dd565b905060006001861415610a9c575b8115801590610a7e5750848210155b15610a9757610a8d86836117dd565b9150600101610a6f565b610ace565b6002861415610ace575b8115801590610ab55750848211155b15610ace57610ac486836117dd565b9150600101610aa6565b8015610b975780604051908082528060200260200182016040528015610afe578160200160208202803883390190505b50935080604051908082528060200260200182016040528015610b2b578160200160208202803883390190505b509250610b398660006117dd565b915060005b81811015610b955782858281518110610b5357fe5b602002602001018181525050610b6987846117fa565b848281518110610b7557fe5b602002602001018181525050610b8b87846117dd565b9250600101610b3e565b505b50509250929050565b60116020528160005260406000208181548110610bb957fe5b90600052602060002001600091509150505481565b60075481565b600654600a54600b5460009283928392610bfd926001600160a01b039081169281169116611593565b91509150816001600160701b0316600014610c4857816001600160701b0316610c3d600954600a0a836001600160701b031661187490919063ffffffff16565b81610c4457fe5b0492505b505090565b60085481565b6005546001600160a01b03163314610c9e576040805162461bcd60e51b81526020600482015260096024820152682327a92124a22222a760b91b604482015290519081900360640190fd5b6001821015610ce9576040805162461bcd60e51b8152602060048201526012602482015271141c9a58d94814dd195c08125b9d985b1a5960721b604482015290519081900360640190fd5b6001811015610d34576040805162461bcd60e51b8152602060048201526012602482015271135a5b88105b5bdd5b9d08125b9d985b1a5960721b604482015290519081900360640190fd5b600080866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7057600080fd5b505afa158015610d84573d6000803e3d6000fd5b505050506040513d6020811015610d9a57600080fd5b50516040805163d21220a760e01b815290516001600160a01b038a169163d21220a7916004808301926020929190829003018186803b158015610ddc57600080fd5b505afa158015610df0573d6000803e3d6000fd5b505050506040513d6020811015610e0657600080fd5b505190925090506001600160a01b03808316908716148015610e395750846001600160a01b0316816001600160a01b0316145b80610e715750856001600160a01b0316816001600160a01b0316148015610e715750846001600160a01b0316826001600160a01b0316145b610eb7576040805162461bcd60e51b8152602060048201526012602482015271151bdad95b8814185a5c88125b9d985b1a5960721b604482015290519081900360640190fd5b600680546001600160a01b03808a166001600160a01b031992831617909255600a80548984169083168117909155600b80549389169390921692909217905560078590556040805163313ce56760e01b8152905163313ce56791600481810192602092909190829003018186803b158015610f3157600080fd5b505afa158015610f45573d6000803e3d6000fd5b505050506040513d6020811015610f5b57600080fd5b505160ff1660095550506008555050601e600e5550506032600f55565b6006546001600160a01b031681565b600b546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b158015610fcc57600080fd5b505afa158015610fe0573d6000803e3d6000fd5b505050506040513d6020811015610ff657600080fd5b505160ff16919050565b6005546001600160a01b031681565b600a546001600160a01b031681565b60125460011461105e576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b6000601255600554611078906001600160a01b0316611702565b6001600160a01b0316336001600160a01b0316146110c9576040805162461bcd60e51b81526020600482015260096024820152682337b93134b23232b760b91b604482015290519081900360640190fd5b6001600160a01b03821661111c57478015611116576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611114573d6000803e3d6000fd5b505b50611223565b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b15801561116657600080fd5b505afa15801561117a573d6000803e3d6000fd5b505050506040513d602081101561119057600080fd5b5051600a5490915081906001600160a01b03858116911614156111d55760006111b960026118dd565b90508083116111c95760006111cd565b8083035b91505061120f565b600b546001600160a01b038581169116141561120f5760006111f760016118dd565b905080831161120757600061120b565b8083035b9150505b801561122057611220848483611919565b50505b50506001601255565b60095481565b601254600114611272576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b600060125560055461128c906001600160a01b0316611702565b6001600160a01b0316336001600160a01b031614611301576112ae6001611aa1565b1580156112c257506112c06002611aa1565b155b611301576040805162461bcd60e51b815260206004820152600b60248201526a13dc99195c88115e1a5cdd60aa1b604482015290519081900360640190fd5b600181101561134c576040805162461bcd60e51b8152602060048201526012602482015271141c9a58d94814dd195c08125b9d985b1a5960721b604482015290519081900360640190fd5b6007556001601255565b606080600061136485611aa1565b90508363ffffffff1681116113795780611381565b8363ffffffff165b9050806040519080825280602002602001820160405280156113ad578160200160208202803883390190505b509250806040519080825280602002602001820160405280156113da578160200160208202803883390190505b50915060006113ea8660006117dd565b905060005b81158015906114035750828163ffffffff16105b15610b955781858263ffffffff168151811061141b57fe5b60200260200101818152505061143187836117fa565b848263ffffffff168151811061144357fe5b60200260200101818152505061145987836117dd565b91506001016113ef565b6012546001146114a3576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b60006012556005546114bd906001600160a01b0316611702565b6001600160a01b0316336001600160a01b031614611532576114df6001611aa1565b1580156114f357506114f16002611aa1565b155b611532576040805162461bcd60e51b815260206004820152600b60248201526a13dc99195c88115e1a5cdd60aa1b604482015290519081900360640190fd5b600181101561157d576040805162461bcd60e51b8152602060048201526012602482015271135a5b88105b5bdd5b9d08125b9d985b1a5960721b604482015290519081900360640190fd5b6008556001601255565b600d5481565b600f5481565b600080826001600160a01b0316846001600160a01b031614156115f3576040805162461bcd60e51b81526020600482015260136024820152724944454e544943414c5f41444452455353455360681b604482015290519081900360640190fd5b6000836001600160a01b0316856001600160a01b0316106116145783611616565b845b90506001600160a01b038116611662576040805162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015290519081900360640190fd5b600080876001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561169e57600080fd5b505afa1580156116b2573d6000803e3d6000fd5b505050506040513d60608110156116c857600080fd5b50805160209091015190925090506001600160a01b03878116908416146116f05780826116f3565b81815b90999098509650505050505050565b6000816001600160a01b031663e14f870d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561173d57600080fd5b505afa158015611751573d6000803e3d6000fd5b505050506040513d602081101561176757600080fd5b5051604080516303e1469160e61b815290516001600160a01b039092169163f851a44091600480820192602092909190829003018186803b1580156117ab57600080fd5b505afa1580156117bf573d6000803e3d6000fd5b505050506040513d60208110156117d557600080fd5b505192915050565b600091825260036020908152604080842092845291905290205490565b600082815260016020908152604080832084845282528083205485845260028352818420858552909252822054815b8181101561186b576000868152602081815260408083208884528252808320848452825280832054835260109091529020600501549390930192600101611829565b50505092915050565b600081158061188f5750508082028282828161188c57fe5b04145b6118d7576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b92915050565b6000806118eb8360006117dd565b90505b8015611913576118fe83826117fa565b8201915061190c83826117dd565b90506118ee565b50919050565b60408051808201825260198152787472616e7366657228616464726573732c75696e743235362960381b60209182015281516001600160a01b0385811660248301526044808301869052845180840390910181526064909201845291810180516001600160e01b031663a9059cbb60e01b1781529251815160009460609489169392918291908083835b602083106119c25780518252601f1990920191602091820191016119a3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611a24576040519150601f19603f3d011682016040523d82523d6000602084013e611a29565b606091505b5091509150818015611a57575080511580611a575750808060200190516020811015611a5457600080fd5b50515b611a9a576040805162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015290519081900360640190fd5b5050505050565b60009081526004602052604090205490565b60405180610100016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509056fea265627a7a7231582068a190ca533713eb961d085ac92a787bb45e6b65391c158c7f706ad6fcab081064736f6c63430005100032",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x12 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0x1B3F DUP1 PUSH2 0x37 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x149 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x14E JUMPI DUP1 PUSH4 0x902F1AC EQ PUSH2 0x1CB JUMPI DUP1 PUSH4 0x19EDA4BC EQ PUSH2 0x1F9 JUMPI DUP1 PUSH4 0x217A4B70 EQ PUSH2 0x218 JUMPI DUP1 PUSH4 0x346970F9 EQ PUSH2 0x23C JUMPI DUP1 PUSH4 0x38BDE791 EQ PUSH2 0x2A6 JUMPI DUP1 PUSH4 0x573DD9DB EQ PUSH2 0x2C0 JUMPI DUP1 PUSH4 0x58F85880 EQ PUSH2 0x32D JUMPI DUP1 PUSH4 0x6069F080 EQ PUSH2 0x335 JUMPI DUP1 PUSH4 0x63C69F08 EQ PUSH2 0x352 JUMPI DUP1 PUSH4 0x7DE81D8B EQ PUSH2 0x378 JUMPI DUP1 PUSH4 0x856652E9 EQ PUSH2 0x434 JUMPI DUP1 PUSH4 0x88D519C4 EQ PUSH2 0x460 JUMPI DUP1 PUSH4 0x98D5FDCA EQ PUSH2 0x468 JUMPI DUP1 PUSH4 0x9B2CB5D8 EQ PUSH2 0x470 JUMPI DUP1 PUSH4 0xA6B63EB8 EQ PUSH2 0x478 JUMPI DUP1 PUSH4 0xA8AA1B31 EQ PUSH2 0x4BA JUMPI DUP1 PUSH4 0xBC9113F0 EQ PUSH2 0x4C2 JUMPI DUP1 PUSH4 0xC45A0155 EQ PUSH2 0x4CA JUMPI DUP1 PUSH4 0xC55DAE63 EQ PUSH2 0x4D2 JUMPI DUP1 PUSH4 0xCB160866 EQ PUSH2 0x4DA JUMPI DUP1 PUSH4 0xDB7B373E EQ PUSH2 0x508 JUMPI DUP1 PUSH4 0xDEB65AC3 EQ PUSH2 0x510 JUMPI DUP1 PUSH4 0xE52FA98B EQ PUSH2 0x52D JUMPI DUP1 PUSH4 0xF1564C0B EQ PUSH2 0x556 JUMPI DUP1 PUSH4 0xF1A2E849 EQ PUSH2 0x573 JUMPI DUP1 PUSH4 0xF361DF08 EQ PUSH2 0x57B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x156 PUSH2 0x583 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x190 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x178 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1BD 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 SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1D3 PUSH2 0x5B0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE DUP2 MLOAD SWAP1 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 RETURN JUMPDEST PUSH2 0x216 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x20F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x5E1 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x220 PUSH2 0x6DF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x259 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x252 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x6EE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP10 DUP11 AND DUP2 MSTORE SWAP8 SWAP1 SWAP9 AND PUSH1 0x20 DUP9 ADD MSTORE DUP7 DUP9 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0x60 DUP7 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x80 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0xC0 DUP4 ADD MSTORE PUSH1 0xE0 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH2 0x100 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2AE PUSH2 0x73E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2DD PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x744 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x319 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x301 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2AE PUSH2 0x8E1 JUMP JUMPDEST PUSH2 0x216 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x34B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x8E7 JUMP JUMPDEST PUSH2 0x2DD PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x368 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x9E5 JUMP JUMPDEST PUSH2 0x39B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x38E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xA51 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3DF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3C7 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD DUP4 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x41E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x406 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2AE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x44A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xBA0 JUMP JUMPDEST PUSH2 0x2AE PUSH2 0xBCE JUMP JUMPDEST PUSH2 0x2AE PUSH2 0xBD4 JUMP JUMPDEST PUSH2 0x2AE PUSH2 0xC4D JUMP JUMPDEST PUSH2 0x216 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xA0 DUP2 LT ISZERO PUSH2 0x48E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x80 ADD CALLDATALOAD PUSH2 0xC53 JUMP JUMPDEST PUSH2 0x220 PUSH2 0xF78 JUMP JUMPDEST PUSH2 0x2AE PUSH2 0xF87 JUMP JUMPDEST PUSH2 0x220 PUSH2 0x1000 JUMP JUMPDEST PUSH2 0x220 PUSH2 0x100F JUMP JUMPDEST PUSH2 0x216 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x4F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x101E JUMP JUMPDEST PUSH2 0x2AE PUSH2 0x122C JUMP JUMPDEST PUSH2 0x216 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x526 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1232 JUMP JUMPDEST PUSH2 0x39B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x543 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH4 0xFFFFFFFF AND PUSH2 0x1356 JUMP JUMPDEST PUSH2 0x216 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x56C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1463 JUMP JUMPDEST PUSH2 0x2AE PUSH2 0x1587 JUMP JUMPDEST PUSH2 0x2AE PUSH2 0x158D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x11 DUP2 MSTORE PUSH1 0x20 ADD PUSH17 0x48796272696458204F72646572426F6F6B PUSH1 0x78 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0xA SLOAD PUSH1 0xB SLOAD PUSH1 0x0 SWAP3 DUP4 SWAP3 PUSH2 0x5D8 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 SWAP2 DUP3 AND SWAP2 AND PUSH2 0x1593 JUMP JUMPDEST SWAP1 SWAP4 SWAP1 SWAP3 POP SWAP1 POP JUMP JUMPDEST PUSH1 0x12 SLOAD PUSH1 0x1 EQ PUSH2 0x621 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x6 PUSH1 0x24 DUP3 ADD MSTORE PUSH6 0x1313D0D2D151 PUSH1 0xD2 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x12 SSTORE PUSH1 0x5 SLOAD PUSH2 0x63B SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1702 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x68C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x9 PUSH1 0x24 DUP3 ADD MSTORE PUSH9 0x2337B93134B23232B7 PUSH1 0xB9 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x64 DUP2 GT ISZERO PUSH2 0x6D5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH16 0x496E76616C6964204665652052617465 PUSH1 0x80 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0xF SSTORE PUSH1 0x1 PUSH1 0x12 SSTORE JUMP JUMPDEST PUSH1 0xB SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP3 ADD SLOAD PUSH1 0x2 DUP4 ADD SLOAD PUSH1 0x3 DUP5 ADD SLOAD PUSH1 0x4 DUP6 ADD SLOAD PUSH1 0x5 DUP7 ADD SLOAD PUSH1 0x6 DUP8 ADD SLOAD PUSH1 0x7 SWAP1 SWAP8 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP7 DUP8 AND SWAP8 SWAP6 SWAP1 SWAP7 AND SWAP6 SWAP4 SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 SWAP1 SWAP2 DUP9 JUMP JUMPDEST PUSH1 0xC SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x8 DUP1 DUP3 MSTORE PUSH2 0x120 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 PUSH1 0x20 DUP3 ADD PUSH2 0x100 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP POP SWAP1 POP PUSH2 0x771 PUSH2 0x1AB3 JUMP JUMPDEST POP PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH2 0x100 DUP2 ADD DUP4 MSTORE DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP1 DUP4 MSTORE PUSH1 0x1 DUP5 ADD SLOAD SWAP1 SWAP2 AND SWAP5 DUP3 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x2 DUP3 ADD SLOAD SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x4 DUP2 ADD SLOAD PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x5 DUP2 ADD SLOAD PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0x6 DUP2 ADD SLOAD PUSH1 0xC0 DUP4 ADD MSTORE PUSH1 0x7 ADD SLOAD PUSH1 0xE0 DUP3 ADD MSTORE DUP4 MLOAD SWAP1 SWAP3 DUP5 SWAP2 PUSH2 0x7F4 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP1 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x81B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP1 PUSH1 0x40 ADD MLOAD DUP3 PUSH1 0x2 DUP2 MLOAD DUP2 LT PUSH2 0x839 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP1 PUSH1 0x60 ADD MLOAD DUP3 PUSH1 0x3 DUP2 MLOAD DUP2 LT PUSH2 0x857 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP1 PUSH1 0x80 ADD MLOAD DUP3 PUSH1 0x4 DUP2 MLOAD DUP2 LT PUSH2 0x875 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP1 PUSH1 0xA0 ADD MLOAD DUP3 PUSH1 0x5 DUP2 MLOAD DUP2 LT PUSH2 0x893 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP1 PUSH1 0xC0 ADD MLOAD DUP3 PUSH1 0x6 DUP2 MLOAD DUP2 LT PUSH2 0x8B1 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP1 PUSH1 0xE0 ADD MLOAD DUP3 PUSH1 0x7 DUP2 MLOAD DUP2 LT PUSH2 0x8CF JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0xE SLOAD DUP2 JUMP JUMPDEST PUSH1 0x12 SLOAD PUSH1 0x1 EQ PUSH2 0x927 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x6 PUSH1 0x24 DUP3 ADD MSTORE PUSH6 0x1313D0D2D151 PUSH1 0xD2 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x12 SSTORE PUSH1 0x5 SLOAD PUSH2 0x941 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1702 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x992 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x9 PUSH1 0x24 DUP3 ADD MSTORE PUSH9 0x2337B93134B23232B7 PUSH1 0xB9 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1E DUP2 GT ISZERO PUSH2 0x9DB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH16 0x496E76616C6964204665652052617465 PUSH1 0x80 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0xE SSTORE PUSH1 0x1 PUSH1 0x12 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x11 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD DUP4 MLOAD DUP2 DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH1 0x60 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xA45 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0xA31 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 PUSH2 0xA61 DUP6 PUSH1 0x0 PUSH2 0x17DD JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x1 DUP7 EQ ISZERO PUSH2 0xA9C JUMPI JUMPDEST DUP2 ISZERO DUP1 ISZERO SWAP1 PUSH2 0xA7E JUMPI POP DUP5 DUP3 LT ISZERO JUMPDEST ISZERO PUSH2 0xA97 JUMPI PUSH2 0xA8D DUP7 DUP4 PUSH2 0x17DD JUMP JUMPDEST SWAP2 POP PUSH1 0x1 ADD PUSH2 0xA6F JUMP JUMPDEST PUSH2 0xACE JUMP JUMPDEST PUSH1 0x2 DUP7 EQ ISZERO PUSH2 0xACE JUMPI JUMPDEST DUP2 ISZERO DUP1 ISZERO SWAP1 PUSH2 0xAB5 JUMPI POP DUP5 DUP3 GT ISZERO JUMPDEST ISZERO PUSH2 0xACE JUMPI PUSH2 0xAC4 DUP7 DUP4 PUSH2 0x17DD JUMP JUMPDEST SWAP2 POP PUSH1 0x1 ADD PUSH2 0xAA6 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xB97 JUMPI DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xAFE JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xB2B JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP3 POP PUSH2 0xB39 DUP7 PUSH1 0x0 PUSH2 0x17DD JUMP JUMPDEST SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xB95 JUMPI DUP3 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xB53 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH2 0xB69 DUP8 DUP5 PUSH2 0x17FA JUMP JUMPDEST DUP5 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xB75 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH2 0xB8B DUP8 DUP5 PUSH2 0x17DD JUMP JUMPDEST SWAP3 POP PUSH1 0x1 ADD PUSH2 0xB3E JUMP JUMPDEST POP JUMPDEST POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x11 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0xBB9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP2 POP SWAP2 POP POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0xA SLOAD PUSH1 0xB SLOAD PUSH1 0x0 SWAP3 DUP4 SWAP3 DUP4 SWAP3 PUSH2 0xBFD SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND SWAP3 DUP2 AND SWAP2 AND PUSH2 0x1593 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH1 0x0 EQ PUSH2 0xC48 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH2 0xC3D PUSH1 0x9 SLOAD PUSH1 0xA EXP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH2 0x1874 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0xC44 JUMPI INVALID JUMPDEST DIV SWAP3 POP JUMPDEST POP POP SWAP1 JUMP JUMPDEST PUSH1 0x8 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xC9E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x9 PUSH1 0x24 DUP3 ADD MSTORE PUSH9 0x2327A92124A22222A7 PUSH1 0xB9 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP3 LT ISZERO PUSH2 0xCE9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH18 0x141C9A58D94814DD195C08125B9D985B1A59 PUSH1 0x72 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP2 LT ISZERO PUSH2 0xD34 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH18 0x135A5B88105B5BDD5B9D08125B9D985B1A59 PUSH1 0x72 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xDFE1681 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD70 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xD84 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xD9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xD21220A7 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP2 PUSH4 0xD21220A7 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xDF0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xE06 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND SWAP1 DUP8 AND EQ DUP1 ISZERO PUSH2 0xE39 JUMPI POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xE71 JUMPI POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 ISZERO PUSH2 0xE71 JUMPI POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0xEB7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH18 0x151BDAD95B8814185A5C88125B9D985B1A59 PUSH1 0x72 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x6 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP11 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0xA DUP1 SLOAD DUP10 DUP5 AND SWAP1 DUP4 AND DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0xB DUP1 SLOAD SWAP4 DUP10 AND SWAP4 SWAP1 SWAP3 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SSTORE PUSH1 0x7 DUP6 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH4 0x313CE567 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH4 0x313CE567 SWAP2 PUSH1 0x4 DUP2 DUP2 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF31 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF45 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xF5B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0xFF AND PUSH1 0x9 SSTORE POP POP PUSH1 0x8 SSTORE POP POP PUSH1 0x1E PUSH1 0xE SSTORE POP POP PUSH1 0x32 PUSH1 0xF SSTORE JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0xB SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x313CE567 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0