Files
protocol/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json
Jacob Evans a458e81f8d ERC20BridgeSampler: Additional Buy support (#2551)
* ERC20BridgeSampler: Sample Curve Buy

* Fake Buy Kyber/PLP

* Deploy mainnet

* Add Kyber rates for buy tests

* CHANGELOGs

* Provide maxIterations and targetSlippage as options

* Cleanup ERC20BridgeSampler for re-use

* Redeploy Mainnet Kovan

* Feedback fixes

* Handle OOG/revert 0s

* Redeploy Mainnet refactor
2020-04-21 13:26:12 +10:00

419 lines
73 KiB
JSON
Generated

{
"schemaVersion": "2.0.0",
"contractName": "ERC20BridgeSampler",
"compilerOutput": {
"abi": [
{
"inputs": [{ "internalType": "address", "name": "devUtilsAddress", "type": "address" }],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"constant": true,
"inputs": [{ "internalType": "bytes[]", "name": "callDatas", "type": "bytes[]" }],
"name": "batchCall",
"outputs": [{ "internalType": "bytes[]", "name": "callResults", "type": "bytes[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "registryAddress", "type": "address" },
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" }
],
"name": "getLiquidityProviderFromRegistry",
"outputs": [{ "internalType": "address", "name": "providerAddress", "type": "address" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"components": [
{ "internalType": "address", "name": "makerAddress", "type": "address" },
{ "internalType": "address", "name": "takerAddress", "type": "address" },
{ "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
{ "internalType": "address", "name": "senderAddress", "type": "address" },
{ "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
{ "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
{ "internalType": "uint256", "name": "makerFee", "type": "uint256" },
{ "internalType": "uint256", "name": "takerFee", "type": "uint256" },
{ "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
{ "internalType": "uint256", "name": "salt", "type": "uint256" },
{ "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
],
"internalType": "struct LibOrder.Order[]",
"name": "orders",
"type": "tuple[]"
},
{ "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" }
],
"name": "getOrderFillableMakerAssetAmounts",
"outputs": [
{ "internalType": "uint256[]", "name": "orderFillableMakerAssetAmounts", "type": "uint256[]" }
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"components": [
{ "internalType": "address", "name": "makerAddress", "type": "address" },
{ "internalType": "address", "name": "takerAddress", "type": "address" },
{ "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
{ "internalType": "address", "name": "senderAddress", "type": "address" },
{ "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
{ "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
{ "internalType": "uint256", "name": "makerFee", "type": "uint256" },
{ "internalType": "uint256", "name": "takerFee", "type": "uint256" },
{ "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
{ "internalType": "uint256", "name": "salt", "type": "uint256" },
{ "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
],
"internalType": "struct LibOrder.Order[]",
"name": "orders",
"type": "tuple[]"
},
{ "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" }
],
"name": "getOrderFillableTakerAssetAmounts",
"outputs": [
{ "internalType": "uint256[]", "name": "orderFillableTakerAssetAmounts", "type": "uint256[]" }
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "curveAddress", "type": "address" },
{ "internalType": "int128", "name": "fromTokenIdx", "type": "int128" },
{ "internalType": "int128", "name": "toTokenIdx", "type": "int128" },
{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleBuysFromCurve",
"outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleBuysFromEth2Dai",
"outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" },
{
"components": [
{ "internalType": "uint256", "name": "targetSlippageBps", "type": "uint256" },
{ "internalType": "uint256", "name": "maxIterations", "type": "uint256" }
],
"internalType": "struct IERC20BridgeSampler.FakeBuyOptions",
"name": "opts",
"type": "tuple"
}
],
"name": "sampleBuysFromKyberNetwork",
"outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "registryAddress", "type": "address" },
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" },
{
"components": [
{ "internalType": "uint256", "name": "targetSlippageBps", "type": "uint256" },
{ "internalType": "uint256", "name": "maxIterations", "type": "uint256" }
],
"internalType": "struct IERC20BridgeSampler.FakeBuyOptions",
"name": "opts",
"type": "tuple"
}
],
"name": "sampleBuysFromLiquidityProviderRegistry",
"outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleBuysFromUniswap",
"outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "curveAddress", "type": "address" },
{ "internalType": "int128", "name": "fromTokenIdx", "type": "int128" },
{ "internalType": "int128", "name": "toTokenIdx", "type": "int128" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromCurve",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromEth2Dai",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromKyberNetwork",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "registryAddress", "type": "address" },
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromLiquidityProviderRegistry",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromUniswap",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
}
],
"devdoc": {
"methods": {
"batchCall(bytes[])": {
"details": "Call multiple public functions on this contract in a single transaction.",
"params": { "callDatas": "ABI-encoded call data for each function call." },
"return": "callResults ABI-encoded results data for each call."
},
"getLiquidityProviderFromRegistry(address,address,address)": {
"details": "Returns the address of a liquidity provider for the given market (takerToken, makerToken), from a registry of liquidity providers. Returns address(0) if no such provider exists in the registry.",
"params": {
"makerToken": "Maker asset managed by liquidity provider.",
"takerToken": "Taker asset managed by liquidity provider."
},
"return": "providerAddress Address of the liquidity provider."
},
"getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])": {
"details": "Queries the fillable taker asset amounts of native orders. Effectively ignores orders that have empty signatures or",
"params": {
"orderSignatures": "Signatures for each respective order in `orders`.",
"orders": "Native orders to query."
},
"return": "orderFillableMakerAssetAmounts How much maker asset can be filled by each order in `orders`."
},
"getOrderFillableTakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])": {
"details": "Queries the fillable taker asset amounts of native orders. Effectively ignores orders that have empty signatures or maker/taker asset amounts (returning 0).",
"params": {
"orderSignatures": "Signatures for each respective order in `orders`.",
"orders": "Native orders to query."
},
"return": "orderFillableTakerAssetAmounts How much taker asset can be filled by each order in `orders`."
},
"sampleBuysFromCurve(address,int128,int128,uint256[])": {
"details": "Sample buy quotes from Curve.",
"params": {
"curveAddress": "Address of the Curve contract.",
"fromTokenIdx": "Index of the taker token (what to sell).",
"makerTokenAmounts": "Maker token buy amount for each sample.",
"toTokenIdx": "Index of the maker token (what to buy)."
},
"return": "takerTokenAmounts Taker amounts sold at each maker token amount."
},
"sampleBuysFromEth2Dai(address,address,uint256[])": {
"details": "Sample buy quotes from Eth2Dai/Oasis.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Maker token sell amount for each sample."
},
"return": "takerTokenAmounts Taker amounts sold at each maker token amount."
},
"sampleBuysFromKyberNetwork(address,address,uint256[],(uint256,uint256))": {
"details": "Sample buy quotes from Kyber.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"makerTokenAmounts": "Maker token buy amount for each sample.",
"opts": "`FakeBuyOptions` specifying target slippage and max iterations.",
"takerToken": "Address of the taker token (what to sell)."
},
"return": "takerTokenAmounts Taker amounts sold at each maker token amount."
},
"sampleBuysFromLiquidityProviderRegistry(address,address,address,uint256[],(uint256,uint256))": {
"details": "Sample buy quotes from an arbitrary on-chain liquidity provider.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"makerTokenAmounts": "Maker token buy amount for each sample.",
"opts": "`FakeBuyOptions` specifying target slippage and max iterations.",
"registryAddress": "Address of the liquidity provider registry contract.",
"takerToken": "Address of the taker token (what to sell)."
},
"return": "takerTokenAmounts Taker amounts sold at each maker token amount."
},
"sampleBuysFromUniswap(address,address,uint256[])": {
"details": "Sample buy quotes from Uniswap.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"makerTokenAmounts": "Maker token sell amount for each sample.",
"takerToken": "Address of the taker token (what to sell)."
},
"return": "takerTokenAmounts Taker amounts sold at each maker token amount."
},
"sampleSellsFromCurve(address,int128,int128,uint256[])": {
"details": "Sample sell quotes from Curve.",
"params": {
"curveAddress": "Address of the Curve contract.",
"fromTokenIdx": "Index of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample.",
"toTokenIdx": "Index of the maker token (what to buy)."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromEth2Dai(address,address,uint256[])": {
"details": "Sample sell quotes from Eth2Dai/Oasis.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromKyberNetwork(address,address,uint256[])": {
"details": "Sample sell quotes from Kyber.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromLiquidityProviderRegistry(address,address,address,uint256[])": {
"details": "Sample sell quotes from an arbitrary on-chain liquidity provider.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"registryAddress": "Address of the liquidity provider registry contract.",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromUniswap(address,address,uint256[])": {
"details": "Sample sell quotes from Uniswap.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
}
}
},
"evm": {
"bytecode": {
"object": "0x60806040523480156200001157600080fd5b50604051620031de380380620031de83398101604081905262000034916200005a565b600080546001600160a01b0319166001600160a01b03929092169190911790556200008a565b6000602082840312156200006c578081fd5b81516001600160a01b038116811462000083578182fd5b9392505050565b613144806200009a6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806368be3cf21161008c57806398cdafba1161006657806398cdafba146101d05780639f76ad35146101e3578063c7f7142e146101f6578063d0eea06d14610216576100ea565b806368be3cf21461018a5780636dd6b78d146101aa5780638b123a02146101bd576100ea565b80634cb8e253116100c85780634cb8e2531461013e57806359f515d01461015157806360ee052a1461016457806364ee6ade14610177576100ea565b80631796fb87146100ef578063354152a3146101185780634703a7e61461012b575b600080fd5b6101026100fd36600461299b565b610229565b60405161010f9190612e4a565b60405180910390f35b61010261012636600461299b565b6103fa565b6101026101393660046128c9565b6105b4565b61010261014c3660046128c9565b610790565b61010261015f366004612a45565b610a80565b6101026101723660046128c9565b610b29565b6101026101853660046128c9565b610de9565b61019d6101983660046129d9565b610faf565b60405161010f9190612dcc565b6101026101b83660046128c9565b6110ee565b6101026101cb366004612a45565b611396565b6101026101de366004612844565b61166f565b6101026101f13660046127d1565b6116ab565b610209610204366004612787565b6118b0565b60405161010f9190612cd9565b610102610224366004612929565b6119eb565b60606000825190508060405190808252806020026020018201604052801561025b578160200160208202803883390190505b50915060005b818110156103f057600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff16630e71d1b9905060e01b8a8a8a88815181106102b857fe5b60200260200101516040516024016102d293929190612e8d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161035b9190612cbd565b6000604051808303818686fa925050503d8060008114610397576040519150601f19603f3d011682016040523d82523d6000602084013e61039c565b606091505b509092509050600082156103c557818060200190516103be9190810190612bf6565b90506103cd565b5050506103f0565b808685815181106103da57fe5b6020908102919091010152505050600101610261565b5050949350505050565b60606000825190508060405190808252806020026020018201604052801561042c578160200160208202803883390190505b50915060005b818110156103f057600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a888151811061048957fe5b60200260200101516040516024016104a393929190612e8d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161052c9190612cbd565b6000604051808303818686fa925050503d8060008114610568576040519150601f19603f3d011682016040523d82523d6000602084013e61056d565b606091505b509092509050600082156103c5578180602001905161058f9190810190612bf6565b90508086858151811061059e57fe5b6020908102919091010152505050600101610432565b60606105c08385611a1c565b81516040805182815260208084028201019091528180156105eb578160200160208202803883390190505b50915060005b818110156107875760006060610605611a8f565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a888151811061064f57fe5b602002602001015160405160240161066993929190612d9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516106f29190612cbd565b6000604051808303818686fa925050503d806000811461072e576040519150601f19603f3d011682016040523d82523d6000602084013e610733565b606091505b5090925090506000821561075c57818060200190516107559190810190612bf6565b9050610764565b505050610787565b8086858151811061077157fe5b60209081029190910101525050506001016105f1565b50509392505050565b606061079c8385611a1c565b60006107a6611aa7565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146107de57846107f4565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b90506000610800611aa7565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610838578461084e565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061085b87611abf565b60ff169050600061086b87611abf565b60ff169050600086519050806040519080825280602002602001820160405280156108a0578160200160208202803883390190505b50955060005b81811015610a7357600060606108ba611ad0565b73ffffffffffffffffffffffffffffffffffffffff166216e360600073ffffffffffffffffffffffffffffffffffffffff1663809a9e55905060e01b8a8a8e888151811061090457fe5b602002602001015160405160240161091e93929190612d9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516109a79190612cbd565b6000604051808303818686fa925050503d80600081146109e3576040519150601f19603f3d011682016040523d82523d6000602084013e6109e8565b606091505b50909250905060008215610a115781806020019051610a0a9190810190612bf6565b9050610a19565b505050610a73565b670de0b6b3a764000087600a0a87600a0a8d8781518110610a3657fe5b602002602001015184020281610a4857fe5b0481610a5057fe5b048a8581518110610a5d57fe5b60209081029190910101525050506001016108a6565b5050505050509392505050565b6060610a8c8383611396565b905060005b8351811015610b2257818181518110610aa657fe5b6020026020010151600014610b1a57610b01828281518110610ac457fe5b6020026020010151858381518110610ad857fe5b602002602001015160a00151868481518110610af057fe5b602002602001015160800151611ae8565b828281518110610b0d57fe5b6020026020010181815250505b600101610a91565b5092915050565b6060610b358385611a1c565b8151604080518281526020808402820101909152818015610b60578160200160208202803883390190505b5091506000610b6d611aa7565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610bad57610ba886611b2a565b610bb0565b60005b90506000610bbc611aa7565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610bfc57610bf786611b2a565b610bff565b60005b905060005b83811015610dde576001610c16611aa7565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610cad578651610c8c9085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610c7f57fe5b6020026020010151611bbc565b878481518110610c9857fe5b60200260200101819350828152505050610dca565b610cb5611aa7565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610d1e578651610c8c9084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610c7f57fe5b8651600090610d579085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610c7f57fe5b925090508015610dad57610d8c857f2640f62c0000000000000000000000000000000000000000000000000000000083611bbc565b888581518110610d9857fe5b60200260200101819450828152505050610dc8565b6000878481518110610dbb57fe5b6020026020010181815250505b505b80610dd55750610dde565b50600101610c04565b505050509392505050565b6060610df58385611a1c565b8151604080518281526020808402820101909152818015610e20578160200160208202803883390190505b50915060005b818110156107875760006060610e3a611a8f565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a8881518110610e8457fe5b6020026020010151604051602401610e9e93929190612d9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610f279190612cbd565b6000604051808303818686fa925050503d8060008114610f63576040519150601f19603f3d011682016040523d82523d6000602084013e610f68565b606091505b5090925090506000821561075c5781806020019051610f8a9190810190612bf6565b905080868581518110610f9957fe5b6020908102919091010152505050600101610e26565b604080518281526020808402820101909152606090828015610fe557816020015b6060815260200190600190039081610fd05790505b50905060005b808314610b2257600060603086868581811061100357fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe13684900301811261103d57600080fd5b9091016020810191503567ffffffffffffffff81111561105c57600080fd5b3681900382131561106c57600080fd5b60405161107a929190612cad565b600060405180830381855afa9150503d80600081146110b5576040519150601f19603f3d011682016040523d82523d6000602084013e6110ba565b606091505b5091509150816110cc57805160208201fd5b808484815181106110d957fe5b60209081029190910101525050600101610feb565b60606110fa8385611a1c565b8151604080518281526020808402820101909152818015611125578160200160208202803883390190505b5091506000611132611aa7565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146111725761116d86611b2a565b611175565b60005b90506000611181611aa7565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146111c1576111bc86611b2a565b6111c4565b60005b905060005b83811015610dde5760016111db611aa7565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156112655786516112449085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610c7f57fe5b87848151811061125057fe5b60200260200101819350828152505050611382565b61126d611aa7565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156112d65786516112449084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610c7f57fe5b865160009061130f9086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610c7f57fe5b92509050801561136557611344847fcd7724c30000000000000000000000000000000000000000000000000000000083611bbc565b88858151811061135057fe5b60200260200101819450828152505050611380565b600087848151811061137357fe5b6020026020010181815250505b505b8061138d5750610dde565b506001016111c9565b606082516040519080825280602002602001820160405280156113c3578160200160208202803883390190505b506000805491925073ffffffffffffffffffffffffffffffffffffffff909116905b84518114611667578381815181106113f957fe5b60200260200101515160001480611427575084818151811061141757fe5b6020026020010151608001516000145b80611449575084818151811061143957fe5b602002602001015160a001516000145b1561146d57600083828151811061145c57fe5b60200260200101818152505061165f565b600060608373ffffffffffffffffffffffffffffffffffffffff166207a1208573ffffffffffffffffffffffffffffffffffffffff1663e77286eb905060e01b8986815181106114b957fe5b60200260200101518987815181106114cd57fe5b60200260200101516040516024016114e6929190612f08565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161156f9190612cbd565b6000604051808303818686fa925050503d80600081146115ab576040519150601f19603f3d011682016040523d82523d6000602084013e6115b0565b606091505b5091509150816115db5760008584815181106115c857fe5b602002602001018181525050505061165f565b6115e3612452565b600080838060200190516115fa9190810190612b89565b9194509250905060038351600681111561161057fe5b14158061161b575080155b1561163f57600088878151811061162e57fe5b602002602001018181525050611659565b8188878151811061164c57fe5b6020026020010181815250505b50505050505b6001016113e5565b505092915050565b606061169f858585857f9f76ad35000000000000000000000000000000000000000000000000000000008b611d05565b90505b95945050505050565b6060600082519050806040519080825280602002602001820160405280156116dd578160200160208202803883390190505b50915060006116ed8787876118b0565b905073ffffffffffffffffffffffffffffffffffffffff811661171257506118a89050565b60005b828110156118a457600060608373ffffffffffffffffffffffffffffffffffffffff1662030d40600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b888151811061176c57fe5b602002602001015160405160240161178693929190612d9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161180f9190612cbd565b6000604051808303818686fa925050503d806000811461184b576040519150601f19603f3d011682016040523d82523d6000602084013e611850565b606091505b5090925090506000821561187957818060200190516118729190810190612bf6565b9050611881565b5050506118a4565b8087858151811061188e57fe5b6020908102919091010152505050600101611715565b5050505b949350505050565b6040516000906060907f153f599700000000000000000000000000000000000000000000000000000000906118eb9086908690602401612cfa565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff16836040516119739190612cbd565b600060405180830381855afa9150503d80600081146119ae576040519150601f19603f3d011682016040523d82523d6000602084013e6119b3565b606091505b50915091508180156119c6575080516020145b156119e0576119d681600c611ed7565b93505050506119e4565b5050505b9392505050565b60606116a2858585857f4cb8e253000000000000000000000000000000000000000000000000000000006000611d05565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8290612eab565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b6000611aca82611f1c565b92915050565b73818e6fecd516ecc3849daf6845e3ec868087b75590565b60006118a883611b1e611b0282600163ffffffff611fed16565b611b12888763ffffffff61200c16565b9063ffffffff61203d16565b9063ffffffff61205916565b6000611b34612083565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b8152600401611b6c9190612cd9565b60206040518083038186803b158015611b8457600080fd5b505afa158015611b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611aca919081019061276b565b60008073ffffffffffffffffffffffffffffffffffffffff8516611bdf57611cfd565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f08686604051602401611c0e919061305c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611c979190612cbd565b6000604051808303818686fa925050503d8060008114611cd3576040519150601f19603f3d011682016040523d82523d6000602084013e611cd8565b606091505b5090925090508115611cfb5780806020019051611cf89190810190612bf6565b92505b505b935093915050565b6060611d118688611a1c565b8451611d1c57611ecd565b60008060008751604051908082528060200260200182016040528015611d4c578160200160208202803883390190505b509350611d70898b8a600081518110611d6157fe5b6020026020010151898961209b565b925082611d805750611ecd915050565b611d8d8a8a85898961209b565b915081611d9d5750611ecd915050565b60005b8851811015611ec8578751600101915060005b611dd18a8381518110611dc257fe5b60200260200101518587611ae8565b9450611de889600001516127100161271087611ae8565b9450611df78c8c878b8b61209b565b935083611e0357611e99565b898281518110611e0f57fe5b60200260200101518410611e5d576127108a8381518110611e2c57fe5b602002602001015181611e3b57fe5b048a8381518110611e4857fe5b6020026020010151850381611e5957fe5b0492505b898281518110611e6957fe5b602002602001015184108015611e7f5750885183115b8015611e945750886020015181600101915081105b611db3575b611ea88a8381518110611dc257fe5b868381518110611eb457fe5b602090810291909101015250600101611da0565b505050505b9695505050505050565b60008160140183511015611efd57611efd611ef86004855185601401612350565b6123f5565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce56700000000000000000000000000000000000000000000000000000000815250604051611f809190612cbd565b600060405180830381855afa9150503d8060008114611fbb576040519150601f19603f3d011682016040523d82523d6000602084013e611fc0565b606091505b5091509150818015611fd3575080516020145b15611fe657611fe38160006123fd565b92505b5050919050565b60008282111561200657612006611ef860028585612409565b50900390565b60008261201b57506000611aca565b8282028284828161202857fe5b04146119e4576119e4611ef860018686612409565b6000828201838110156119e4576119e4611ef860008686612409565b60008161206f5761206f611ef860038585612409565b600082848161207a57fe5b04949350505050565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b60408051600180825281830190925260009160609182916020808301908038833901905050905085816000815181106120d057fe5b60209081029190910101527fffffffff0000000000000000000000000000000000000000000000000000000085167f4cb8e2530000000000000000000000000000000000000000000000000000000014156121e0576040517f4cb8e253000000000000000000000000000000000000000000000000000000009061215c908a908a908590602401612d62565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529150612299565b6040517f9f76ad3500000000000000000000000000000000000000000000000000000000906122199086908b908b908690602401612d21565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915291505b600060603073ffffffffffffffffffffffffffffffffffffffff16846040516122c29190612cbd565b600060405180830381855afa9150503d80600081146122fd576040519150601f19603f3d011682016040523d82523d6000602084013e612302565b606091505b5091509150816123195760009450505050506116a2565b8080602001905161232d9190810190612af6565b60008151811061233957fe5b602002602001015194505050505095945050505050565b6060632800659560e01b84848460405160240161236f93929190612e7f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b60006119e48383612428565b606063e946c1bb60e01b84848460405160240161236f93929190612e5d565b6000816020018351101561244957612449611ef86005855185602001612350565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b8035611aca816130dc565b600082601f83011261248f578081fd5b81356124a261249d8261308c565b613065565b8181529150602080830190840160005b838110156124df576124ca8760208435890101612552565b835260209283019291909101906001016124b2565b5050505092915050565b600082601f8301126124f9578081fd5b813561250761249d8261308c565b81815291506020808301908481018184028601820187101561252857600080fd5b60005b848110156125475781358452928201929082019060010161252b565b505050505092915050565b600082601f830112612562578081fd5b813567ffffffffffffffff811115612578578182fd5b6125a960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613065565b91508082528360208285010111156125c057600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b8114611aca57600080fd5b6000604082840312156125fc578081fd5b6126066040613065565b9050813581526020820135602082015292915050565b60006101c080838503121561262f578182fd5b61263881613065565b9150506126458383612474565b81526126548360208401612474565b60208201526126668360408401612474565b60408201526126788360608401612474565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff808211156126da57600080fd5b6126e686838701612552565b8385015261016092508285013591508082111561270257600080fd5b61270e86838701612552565b8385015261018092508285013591508082111561272a57600080fd5b61273686838701612552565b838501526101a092508285013591508082111561275257600080fd5b5061275f85828601612552565b82840152505092915050565b60006020828403121561277c578081fd5b81516119e4816130dc565b60008060006060848603121561279b578182fd5b83356127a6816130dc565b925060208401356127b6816130dc565b915060408401356127c6816130dc565b809150509250925092565b600080600080608085870312156127e6578081fd5b84356127f1816130dc565b93506020850135612801816130dc565b92506040850135612811816130dc565b9150606085013567ffffffffffffffff81111561282c578182fd5b612838878288016124e9565b91505092959194509250565b600080600080600060c0868803121561285b578283fd5b8535612866816130dc565b94506020860135612876816130dc565b93506040860135612886816130dc565b9250606086013567ffffffffffffffff8111156128a1578182fd5b6128ad888289016124e9565b9250506128bd87608088016125eb565b90509295509295909350565b6000806000606084860312156128dd578081fd5b83356128e8816130dc565b925060208401356128f8816130dc565b9150604084013567ffffffffffffffff811115612913578182fd5b61291f868287016124e9565b9150509250925092565b60008060008060a0858703121561293e578182fd5b8435612949816130dc565b93506020850135612959816130dc565b9250604085013567ffffffffffffffff811115612974578283fd5b612980878288016124e9565b92505061299086606087016125eb565b905092959194509250565b600080600080608085870312156129b0578182fd5b84356129bb816130dc565b93506129ca86602087016125d9565b925061281186604087016125d9565b600080602083850312156129eb578182fd5b823567ffffffffffffffff80821115612a02578384fd5b81850186601f820112612a13578485fd5b8035925081831115612a23578485fd5b8660208085028301011115612a36578485fd5b60200196919550909350505050565b60008060408385031215612a57578182fd5b823567ffffffffffffffff80821115612a6e578384fd5b81850186601f820112612a7f578485fd5b80359250612a8f61249d8461308c565b83815260208082019190838101885b87811015612ac757612ab58c84843589010161261c565b85529382019390820190600101612a9e565b50919750880135945050505080821115612adf578283fd5b50612aec8582860161247f565b9150509250929050565b60006020808385031215612b08578182fd5b825167ffffffffffffffff811115612b1e578283fd5b80840185601f820112612b2f578384fd5b80519150612b3f61249d8361308c565b8281528381019082850185850284018601891015612b5b578687fd5b8693505b84841015612b7d578051835260019390930192918501918501612b5f565b50979650505050505050565b600080600083850360a0811215612b9e578182fd5b6060811215612bab578182fd5b50612bb66060613065565b845160078110612bc4578283fd5b8152602085810151908201526040808601519082015260608501516080860151919450925080151581146127c6578182fd5b600060208284031215612c07578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b82811015612c59578151865260209586019590910190600101612c3b565b5093949350505050565b60008151808452612c7b8160208601602086016130ac565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b60008251612ccf8184602087016130ac565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401528085166040840152506080606083015261169f6080830184612c28565b600073ffffffffffffffffffffffffffffffffffffffff8086168352808516602084015250606060408301526116a26060830184612c28565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015612e3d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452612e2b858351612c63565b94509285019290850190600101612df1565b5092979650505050505050565b6000602082526119e46020830184612c28565b6060810160048510612e6b57fe5b938152602081019290925260409091015290565b6060810160088510612e6b57fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b600060408252612f1c604083018551612c0e565b6020840151612f2e6060840182612c0e565b506040840151612f416080840182612c0e565b506060840151612f5460a0840182612c0e565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c091506101808281870152612fc5610200870185612c63565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a08388830301818901526130048287612c63565b838b015196508489820301868a015261301d8188612c63565b955050808a0151955050505080858303016101e08601525061303f8183612c63565b84810360208601526130518187612c63565b979650505050505050565b90815260200190565b60405181810167ffffffffffffffff8111828210171561308457600080fd5b604052919050565b600067ffffffffffffffff8211156130a2578081fd5b5060209081020190565b60005b838110156130c75781810151838201526020016130af565b838111156130d6576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146130fe57600080fd5b5056fea365627a7a723158208777a7f5c90c6021748d69e56d7d4136320b8e8d099fdd1cd108e182d1ee4d7f6c6578706572696d656e74616cf564736f6c63430005110040"
},
"deployedBytecode": {
"object": "0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c806368be3cf21161008c57806398cdafba1161006657806398cdafba146101d05780639f76ad35146101e3578063c7f7142e146101f6578063d0eea06d14610216576100ea565b806368be3cf21461018a5780636dd6b78d146101aa5780638b123a02146101bd576100ea565b80634cb8e253116100c85780634cb8e2531461013e57806359f515d01461015157806360ee052a1461016457806364ee6ade14610177576100ea565b80631796fb87146100ef578063354152a3146101185780634703a7e61461012b575b600080fd5b6101026100fd36600461299b565b610229565b60405161010f9190612e4a565b60405180910390f35b61010261012636600461299b565b6103fa565b6101026101393660046128c9565b6105b4565b61010261014c3660046128c9565b610790565b61010261015f366004612a45565b610a80565b6101026101723660046128c9565b610b29565b6101026101853660046128c9565b610de9565b61019d6101983660046129d9565b610faf565b60405161010f9190612dcc565b6101026101b83660046128c9565b6110ee565b6101026101cb366004612a45565b611396565b6101026101de366004612844565b61166f565b6101026101f13660046127d1565b6116ab565b610209610204366004612787565b6118b0565b60405161010f9190612cd9565b610102610224366004612929565b6119eb565b60606000825190508060405190808252806020026020018201604052801561025b578160200160208202803883390190505b50915060005b818110156103f057600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff16630e71d1b9905060e01b8a8a8a88815181106102b857fe5b60200260200101516040516024016102d293929190612e8d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161035b9190612cbd565b6000604051808303818686fa925050503d8060008114610397576040519150601f19603f3d011682016040523d82523d6000602084013e61039c565b606091505b509092509050600082156103c557818060200190516103be9190810190612bf6565b90506103cd565b5050506103f0565b808685815181106103da57fe5b6020908102919091010152505050600101610261565b5050949350505050565b60606000825190508060405190808252806020026020018201604052801561042c578160200160208202803883390190505b50915060005b818110156103f057600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a888151811061048957fe5b60200260200101516040516024016104a393929190612e8d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161052c9190612cbd565b6000604051808303818686fa925050503d8060008114610568576040519150601f19603f3d011682016040523d82523d6000602084013e61056d565b606091505b509092509050600082156103c5578180602001905161058f9190810190612bf6565b90508086858151811061059e57fe5b6020908102919091010152505050600101610432565b60606105c08385611a1c565b81516040805182815260208084028201019091528180156105eb578160200160208202803883390190505b50915060005b818110156107875760006060610605611a8f565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a888151811061064f57fe5b602002602001015160405160240161066993929190612d9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516106f29190612cbd565b6000604051808303818686fa925050503d806000811461072e576040519150601f19603f3d011682016040523d82523d6000602084013e610733565b606091505b5090925090506000821561075c57818060200190516107559190810190612bf6565b9050610764565b505050610787565b8086858151811061077157fe5b60209081029190910101525050506001016105f1565b50509392505050565b606061079c8385611a1c565b60006107a6611aa7565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146107de57846107f4565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b90506000610800611aa7565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610838578461084e565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061085b87611abf565b60ff169050600061086b87611abf565b60ff169050600086519050806040519080825280602002602001820160405280156108a0578160200160208202803883390190505b50955060005b81811015610a7357600060606108ba611ad0565b73ffffffffffffffffffffffffffffffffffffffff166216e360600073ffffffffffffffffffffffffffffffffffffffff1663809a9e55905060e01b8a8a8e888151811061090457fe5b602002602001015160405160240161091e93929190612d9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516109a79190612cbd565b6000604051808303818686fa925050503d80600081146109e3576040519150601f19603f3d011682016040523d82523d6000602084013e6109e8565b606091505b50909250905060008215610a115781806020019051610a0a9190810190612bf6565b9050610a19565b505050610a73565b670de0b6b3a764000087600a0a87600a0a8d8781518110610a3657fe5b602002602001015184020281610a4857fe5b0481610a5057fe5b048a8581518110610a5d57fe5b60209081029190910101525050506001016108a6565b5050505050509392505050565b6060610a8c8383611396565b905060005b8351811015610b2257818181518110610aa657fe5b6020026020010151600014610b1a57610b01828281518110610ac457fe5b6020026020010151858381518110610ad857fe5b602002602001015160a00151868481518110610af057fe5b602002602001015160800151611ae8565b828281518110610b0d57fe5b6020026020010181815250505b600101610a91565b5092915050565b6060610b358385611a1c565b8151604080518281526020808402820101909152818015610b60578160200160208202803883390190505b5091506000610b6d611aa7565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610bad57610ba886611b2a565b610bb0565b60005b90506000610bbc611aa7565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610bfc57610bf786611b2a565b610bff565b60005b905060005b83811015610dde576001610c16611aa7565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610cad578651610c8c9085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610c7f57fe5b6020026020010151611bbc565b878481518110610c9857fe5b60200260200101819350828152505050610dca565b610cb5611aa7565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610d1e578651610c8c9084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610c7f57fe5b8651600090610d579085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610c7f57fe5b925090508015610dad57610d8c857f2640f62c0000000000000000000000000000000000000000000000000000000083611bbc565b888581518110610d9857fe5b60200260200101819450828152505050610dc8565b6000878481518110610dbb57fe5b6020026020010181815250505b505b80610dd55750610dde565b50600101610c04565b505050509392505050565b6060610df58385611a1c565b8151604080518281526020808402820101909152818015610e20578160200160208202803883390190505b50915060005b818110156107875760006060610e3a611a8f565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a8881518110610e8457fe5b6020026020010151604051602401610e9e93929190612d9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610f279190612cbd565b6000604051808303818686fa925050503d8060008114610f63576040519150601f19603f3d011682016040523d82523d6000602084013e610f68565b606091505b5090925090506000821561075c5781806020019051610f8a9190810190612bf6565b905080868581518110610f9957fe5b6020908102919091010152505050600101610e26565b604080518281526020808402820101909152606090828015610fe557816020015b6060815260200190600190039081610fd05790505b50905060005b808314610b2257600060603086868581811061100357fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe13684900301811261103d57600080fd5b9091016020810191503567ffffffffffffffff81111561105c57600080fd5b3681900382131561106c57600080fd5b60405161107a929190612cad565b600060405180830381855afa9150503d80600081146110b5576040519150601f19603f3d011682016040523d82523d6000602084013e6110ba565b606091505b5091509150816110cc57805160208201fd5b808484815181106110d957fe5b60209081029190910101525050600101610feb565b60606110fa8385611a1c565b8151604080518281526020808402820101909152818015611125578160200160208202803883390190505b5091506000611132611aa7565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146111725761116d86611b2a565b611175565b60005b90506000611181611aa7565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146111c1576111bc86611b2a565b6111c4565b60005b905060005b83811015610dde5760016111db611aa7565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156112655786516112449085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610c7f57fe5b87848151811061125057fe5b60200260200101819350828152505050611382565b61126d611aa7565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156112d65786516112449084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610c7f57fe5b865160009061130f9086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610c7f57fe5b92509050801561136557611344847fcd7724c30000000000000000000000000000000000000000000000000000000083611bbc565b88858151811061135057fe5b60200260200101819450828152505050611380565b600087848151811061137357fe5b6020026020010181815250505b505b8061138d5750610dde565b506001016111c9565b606082516040519080825280602002602001820160405280156113c3578160200160208202803883390190505b506000805491925073ffffffffffffffffffffffffffffffffffffffff909116905b84518114611667578381815181106113f957fe5b60200260200101515160001480611427575084818151811061141757fe5b6020026020010151608001516000145b80611449575084818151811061143957fe5b602002602001015160a001516000145b1561146d57600083828151811061145c57fe5b60200260200101818152505061165f565b600060608373ffffffffffffffffffffffffffffffffffffffff166207a1208573ffffffffffffffffffffffffffffffffffffffff1663e77286eb905060e01b8986815181106114b957fe5b60200260200101518987815181106114cd57fe5b60200260200101516040516024016114e6929190612f08565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161156f9190612cbd565b6000604051808303818686fa925050503d80600081146115ab576040519150601f19603f3d011682016040523d82523d6000602084013e6115b0565b606091505b5091509150816115db5760008584815181106115c857fe5b602002602001018181525050505061165f565b6115e3612452565b600080838060200190516115fa9190810190612b89565b9194509250905060038351600681111561161057fe5b14158061161b575080155b1561163f57600088878151811061162e57fe5b602002602001018181525050611659565b8188878151811061164c57fe5b6020026020010181815250505b50505050505b6001016113e5565b505092915050565b606061169f858585857f9f76ad35000000000000000000000000000000000000000000000000000000008b611d05565b90505b95945050505050565b6060600082519050806040519080825280602002602001820160405280156116dd578160200160208202803883390190505b50915060006116ed8787876118b0565b905073ffffffffffffffffffffffffffffffffffffffff811661171257506118a89050565b60005b828110156118a457600060608373ffffffffffffffffffffffffffffffffffffffff1662030d40600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b888151811061176c57fe5b602002602001015160405160240161178693929190612d9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161180f9190612cbd565b6000604051808303818686fa925050503d806000811461184b576040519150601f19603f3d011682016040523d82523d6000602084013e611850565b606091505b5090925090506000821561187957818060200190516118729190810190612bf6565b9050611881565b5050506118a4565b8087858151811061188e57fe5b6020908102919091010152505050600101611715565b5050505b949350505050565b6040516000906060907f153f599700000000000000000000000000000000000000000000000000000000906118eb9086908690602401612cfa565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff16836040516119739190612cbd565b600060405180830381855afa9150503d80600081146119ae576040519150601f19603f3d011682016040523d82523d6000602084013e6119b3565b606091505b50915091508180156119c6575080516020145b156119e0576119d681600c611ed7565b93505050506119e4565b5050505b9392505050565b60606116a2858585857f4cb8e253000000000000000000000000000000000000000000000000000000006000611d05565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8290612eab565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b6000611aca82611f1c565b92915050565b73818e6fecd516ecc3849daf6845e3ec868087b75590565b60006118a883611b1e611b0282600163ffffffff611fed16565b611b12888763ffffffff61200c16565b9063ffffffff61203d16565b9063ffffffff61205916565b6000611b34612083565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b8152600401611b6c9190612cd9565b60206040518083038186803b158015611b8457600080fd5b505afa158015611b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611aca919081019061276b565b60008073ffffffffffffffffffffffffffffffffffffffff8516611bdf57611cfd565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f08686604051602401611c0e919061305c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611c979190612cbd565b6000604051808303818686fa925050503d8060008114611cd3576040519150601f19603f3d011682016040523d82523d6000602084013e611cd8565b606091505b5090925090508115611cfb5780806020019051611cf89190810190612bf6565b92505b505b935093915050565b6060611d118688611a1c565b8451611d1c57611ecd565b60008060008751604051908082528060200260200182016040528015611d4c578160200160208202803883390190505b509350611d70898b8a600081518110611d6157fe5b6020026020010151898961209b565b925082611d805750611ecd915050565b611d8d8a8a85898961209b565b915081611d9d5750611ecd915050565b60005b8851811015611ec8578751600101915060005b611dd18a8381518110611dc257fe5b60200260200101518587611ae8565b9450611de889600001516127100161271087611ae8565b9450611df78c8c878b8b61209b565b935083611e0357611e99565b898281518110611e0f57fe5b60200260200101518410611e5d576127108a8381518110611e2c57fe5b602002602001015181611e3b57fe5b048a8381518110611e4857fe5b6020026020010151850381611e5957fe5b0492505b898281518110611e6957fe5b602002602001015184108015611e7f5750885183115b8015611e945750886020015181600101915081105b611db3575b611ea88a8381518110611dc257fe5b868381518110611eb457fe5b602090810291909101015250600101611da0565b505050505b9695505050505050565b60008160140183511015611efd57611efd611ef86004855185601401612350565b6123f5565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce56700000000000000000000000000000000000000000000000000000000815250604051611f809190612cbd565b600060405180830381855afa9150503d8060008114611fbb576040519150601f19603f3d011682016040523d82523d6000602084013e611fc0565b606091505b5091509150818015611fd3575080516020145b15611fe657611fe38160006123fd565b92505b5050919050565b60008282111561200657612006611ef860028585612409565b50900390565b60008261201b57506000611aca565b8282028284828161202857fe5b04146119e4576119e4611ef860018686612409565b6000828201838110156119e4576119e4611ef860008686612409565b60008161206f5761206f611ef860038585612409565b600082848161207a57fe5b04949350505050565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b60408051600180825281830190925260009160609182916020808301908038833901905050905085816000815181106120d057fe5b60209081029190910101527fffffffff0000000000000000000000000000000000000000000000000000000085167f4cb8e2530000000000000000000000000000000000000000000000000000000014156121e0576040517f4cb8e253000000000000000000000000000000000000000000000000000000009061215c908a908a908590602401612d62565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529150612299565b6040517f9f76ad3500000000000000000000000000000000000000000000000000000000906122199086908b908b908690602401612d21565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915291505b600060603073ffffffffffffffffffffffffffffffffffffffff16846040516122c29190612cbd565b600060405180830381855afa9150503d80600081146122fd576040519150601f19603f3d011682016040523d82523d6000602084013e612302565b606091505b5091509150816123195760009450505050506116a2565b8080602001905161232d9190810190612af6565b60008151811061233957fe5b602002602001015194505050505095945050505050565b6060632800659560e01b84848460405160240161236f93929190612e7f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b60006119e48383612428565b606063e946c1bb60e01b84848460405160240161236f93929190612e5d565b6000816020018351101561244957612449611ef86005855185602001612350565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b8035611aca816130dc565b600082601f83011261248f578081fd5b81356124a261249d8261308c565b613065565b8181529150602080830190840160005b838110156124df576124ca8760208435890101612552565b835260209283019291909101906001016124b2565b5050505092915050565b600082601f8301126124f9578081fd5b813561250761249d8261308c565b81815291506020808301908481018184028601820187101561252857600080fd5b60005b848110156125475781358452928201929082019060010161252b565b505050505092915050565b600082601f830112612562578081fd5b813567ffffffffffffffff811115612578578182fd5b6125a960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613065565b91508082528360208285010111156125c057600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b8114611aca57600080fd5b6000604082840312156125fc578081fd5b6126066040613065565b9050813581526020820135602082015292915050565b60006101c080838503121561262f578182fd5b61263881613065565b9150506126458383612474565b81526126548360208401612474565b60208201526126668360408401612474565b60408201526126788360608401612474565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff808211156126da57600080fd5b6126e686838701612552565b8385015261016092508285013591508082111561270257600080fd5b61270e86838701612552565b8385015261018092508285013591508082111561272a57600080fd5b61273686838701612552565b838501526101a092508285013591508082111561275257600080fd5b5061275f85828601612552565b82840152505092915050565b60006020828403121561277c578081fd5b81516119e4816130dc565b60008060006060848603121561279b578182fd5b83356127a6816130dc565b925060208401356127b6816130dc565b915060408401356127c6816130dc565b809150509250925092565b600080600080608085870312156127e6578081fd5b84356127f1816130dc565b93506020850135612801816130dc565b92506040850135612811816130dc565b9150606085013567ffffffffffffffff81111561282c578182fd5b612838878288016124e9565b91505092959194509250565b600080600080600060c0868803121561285b578283fd5b8535612866816130dc565b94506020860135612876816130dc565b93506040860135612886816130dc565b9250606086013567ffffffffffffffff8111156128a1578182fd5b6128ad888289016124e9565b9250506128bd87608088016125eb565b90509295509295909350565b6000806000606084860312156128dd578081fd5b83356128e8816130dc565b925060208401356128f8816130dc565b9150604084013567ffffffffffffffff811115612913578182fd5b61291f868287016124e9565b9150509250925092565b60008060008060a0858703121561293e578182fd5b8435612949816130dc565b93506020850135612959816130dc565b9250604085013567ffffffffffffffff811115612974578283fd5b612980878288016124e9565b92505061299086606087016125eb565b905092959194509250565b600080600080608085870312156129b0578182fd5b84356129bb816130dc565b93506129ca86602087016125d9565b925061281186604087016125d9565b600080602083850312156129eb578182fd5b823567ffffffffffffffff80821115612a02578384fd5b81850186601f820112612a13578485fd5b8035925081831115612a23578485fd5b8660208085028301011115612a36578485fd5b60200196919550909350505050565b60008060408385031215612a57578182fd5b823567ffffffffffffffff80821115612a6e578384fd5b81850186601f820112612a7f578485fd5b80359250612a8f61249d8461308c565b83815260208082019190838101885b87811015612ac757612ab58c84843589010161261c565b85529382019390820190600101612a9e565b50919750880135945050505080821115612adf578283fd5b50612aec8582860161247f565b9150509250929050565b60006020808385031215612b08578182fd5b825167ffffffffffffffff811115612b1e578283fd5b80840185601f820112612b2f578384fd5b80519150612b3f61249d8361308c565b8281528381019082850185850284018601891015612b5b578687fd5b8693505b84841015612b7d578051835260019390930192918501918501612b5f565b50979650505050505050565b600080600083850360a0811215612b9e578182fd5b6060811215612bab578182fd5b50612bb66060613065565b845160078110612bc4578283fd5b8152602085810151908201526040808601519082015260608501516080860151919450925080151581146127c6578182fd5b600060208284031215612c07578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b82811015612c59578151865260209586019590910190600101612c3b565b5093949350505050565b60008151808452612c7b8160208601602086016130ac565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b60008251612ccf8184602087016130ac565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401528085166040840152506080606083015261169f6080830184612c28565b600073ffffffffffffffffffffffffffffffffffffffff8086168352808516602084015250606060408301526116a26060830184612c28565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015612e3d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452612e2b858351612c63565b94509285019290850190600101612df1565b5092979650505050505050565b6000602082526119e46020830184612c28565b6060810160048510612e6b57fe5b938152602081019290925260409091015290565b6060810160088510612e6b57fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b600060408252612f1c604083018551612c0e565b6020840151612f2e6060840182612c0e565b506040840151612f416080840182612c0e565b506060840151612f5460a0840182612c0e565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c091506101808281870152612fc5610200870185612c63565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a08388830301818901526130048287612c63565b838b015196508489820301868a015261301d8188612c63565b955050808a0151955050505080858303016101e08601525061303f8183612c63565b84810360208601526130518187612c63565b979650505050505050565b90815260200190565b60405181810167ffffffffffffffff8111828210171561308457600080fd5b604052919050565b600067ffffffffffffffff8211156130a2578081fd5b5060209081020190565b60005b838110156130c75781810151838201526020016130af565b838111156130d6576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146130fe57600080fd5b5056fea365627a7a723158208777a7f5c90c6021748d69e56d7d4136320b8e8d099fdd1cd108e182d1ee4d7f6c6578706572696d656e74616cf564736f6c63430005110040"
}
}
},
"compiler": {
"name": "solc",
"version": "0.5.17+commit.d19bba13",
"settings": {
"optimizer": {
"enabled": true,
"runs": 1000000,
"details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true }
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap"
]
}
},
"evmVersion": "istanbul"
}
},
"chains": {}
}