From 8f02871a7087aa2a4491218a2f34ce985d72bc92 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Mon, 28 Sep 2020 15:31:31 -0700 Subject: [PATCH] debug: contract deployment with new sighash --- packages/provider/src/app/provider.ts | 4 +- packages/provider/src/app/signer.ts | 73 +- packages/provider/src/app/utils.ts | 3 +- packages/provider/test/data/ERC20.json | 691 ++++++++++++++++++ .../provider/test/sendtransaction.spec.ts | 31 +- 5 files changed, 787 insertions(+), 15 deletions(-) create mode 100644 packages/provider/test/data/ERC20.json diff --git a/packages/provider/src/app/provider.ts b/packages/provider/src/app/provider.ts index 25a94d34dd290..ce82a3e307f53 100644 --- a/packages/provider/src/app/provider.ts +++ b/packages/provider/src/app/provider.ts @@ -102,8 +102,8 @@ export class OptimismProvider extends JsonRpcProvider { public prepareRequest(method: string, params: any): [string, any[]] { switch (method) { - case 'sendTransaction': - case 'sendEthSignTransaction': + case 'sendRawEthSignTransaction': + case 'sendRawTransaction': return ['eth_sendRawEthSignTransaction', [params.signedTransaction]] } diff --git a/packages/provider/src/app/signer.ts b/packages/provider/src/app/signer.ts index 0946c9f2f9ef5..b106b90c8c033 100644 --- a/packages/provider/src/app/signer.ts +++ b/packages/provider/src/app/signer.ts @@ -23,8 +23,8 @@ import { } from '@ethersproject/abstract-provider' import { Signer } from '@ethersproject/abstract-signer' import { BigNumberish, BigNumber } from '@ethersproject/bignumber' -import { Bytes, splitSignature } from '@ethersproject/bytes' -import { serialize, UnsignedTransaction } from '@ethersproject/transactions' +import { Bytes, splitSignature, joinSignature, SignatureLike } from '@ethersproject/bytes' +import { serialize, UnsignedTransaction, parse } from '@ethersproject/transactions' import { hexStrToBuf, isHexString, remove0x } from '@eth-optimism/core-utils' import { ConnectionInfo, fetchJson, poll } from '@ethersproject/web' import { keccak256 } from '@ethersproject/keccak256' @@ -41,7 +41,6 @@ import { import { allowedTransactionKeys, - serializeEthSignTransaction, sighashEthSign, } from './utils' @@ -148,11 +147,42 @@ export class OptimismSigner implements JsonRpcSigner { tx.from = sender } - const hexTx = (this.provider.constructor as any).hexlifyTransaction(tx, { - from: true, + if (typeof tx.gasPrice !== 'undefined' && (tx.gasPrice as BigNumber)._isBigNumber) { + tx.gasPrice = (tx.gasPrice as BigNumber).toNumber() + } + if (typeof tx.gasLimit !== 'undefined' && (tx.gasLimit as BigNumber)._isBigNumber) { + tx.gasLimit = (tx.gasLimit as BigNumber).toNumber() + } + if (typeof tx.value !== 'undefined' && (tx.value as BigNumber)._isBigNumber) { + tx.value = (tx.value as BigNumber).toNumber() + } + + const hexTx = (this.provider.constructor as any).hexlifyTransaction({ + nonce: tx.nonce, + gasPrice: tx.gasPrice, + gasLimit: tx.gasLimit, + to: tx.to, + data: tx.data, + value: tx.value }) - return this.provider.send('eth_sendTransaction', [hexTx]).then( + // Contract creation + if (tx.to === '0x0000000000000000000000000000000000000000') { + tx.to = undefined + } + + const sig = joinSignature(tx as SignatureLike) + const serialized = serialize({ + chainId: tx.chainId, + data: hexTx.data, + gasLimit: hexTx.gas, + gasPrice: hexTx.gasPrice, + nonce: hexTx.nonce, + to: hexTx.to, + value: hexTx.value, + }, sig) + + return this.provider.send('eth_sendRawEthSignTransaction', [serialized]).then( (hash) => { return hash }, @@ -201,12 +231,16 @@ export class OptimismSigner implements JsonRpcSigner { public async signTransaction( transaction: Deferrable ): Promise { - const hash = sighashEthSign(transaction) - const sig = await this.signer.signMessage(hash) - if (transaction.chainId == null) { transaction.chainId = await this.getChainId() } + // If `to` is not specified, assume contract creation. + if (transaction.to == null) { + transaction.to = '0x0000000000000000000000000000000000000000' + } + + const hash = sighashEthSign(transaction) + const sig = await this.signMessage(hash) // Copy over "allowed" properties into new object so that // `serialize` doesn't throw an error. A "from" property @@ -230,8 +264,23 @@ export class OptimismSigner implements JsonRpcSigner { ): Promise { this._checkProvider('sendTransaction') const tx = await this.populateTransaction(transaction) - const signed = await this.signTransaction(tx) - return this.provider.sendTransaction(signed) + const hex = await this.signTransaction(tx) + + const signed = parse(hex) + signed.from = tx.from + + //return this.provider.sendTransaction(tx) + const hash = await this.sendUncheckedTransaction(signed) + + return poll(() => { + return this.provider.getTransaction(hash).then((txn: TransactionResponse) => { + if (txn === null) { return undefined; } + return this.provider._wrapTransaction(txn, hash); + }); + }, { onceBlock: this.provider }).catch((error: Error) => { + (error as any).transactionHash = hash; + throw error; + }); } public async signMessage(message: Bytes | string): Promise { @@ -386,6 +435,8 @@ export class OptimismSigner implements JsonRpcSigner { tx.nonce = this.getTransactionCount('pending') } + // The call to estimate gas is breaking + // Figure out why if (tx.gasLimit == null) { tx.gasLimit = this.estimateGas(tx).catch((error) => { return logger.throwError( diff --git a/packages/provider/src/app/utils.ts b/packages/provider/src/app/utils.ts index 068b001be94f0..a8856cb69eb64 100644 --- a/packages/provider/src/app/utils.ts +++ b/packages/provider/src/app/utils.ts @@ -73,6 +73,7 @@ export const allowedTransactionKeys: { [key: string]: boolean } = { nonce: true, to: true, value: true, + from: true, } export function serializeEthSignTransaction(transaction): Bytes { @@ -80,7 +81,7 @@ export function serializeEthSignTransaction(transaction): Bytes { const gasLimit = zeroPad(transaction.gasLimit, 32) const gasPrice = zeroPad(transaction.gasPrice, 32) const chainId = zeroPad(transaction.chainId, 32) - const to = hexStrToBuf(transaction.to) + const to = hexStrToBuf(transaction.to) // this is empty for contract creation const data = toBuffer(transaction.data) return Buffer.concat([ diff --git a/packages/provider/test/data/ERC20.json b/packages/provider/test/data/ERC20.json new file mode 100644 index 0000000000000..cbbf31f2bbf12 --- /dev/null +++ b/packages/provider/test/data/ERC20.json @@ -0,0 +1,691 @@ +{ + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_initialAmount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_tokenName", + "type": "string" + }, + { + "internalType": "uint8", + "name": "_decimalUnits", + "type": "uint8" + }, + { + "internalType": "string", + "name": "_tokenSymbol", + "type": "string" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "remaining", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "allowed", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balances", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "string", + "name": "test", + "type": "string" + } + ], + "name": "encode", + "outputs": [ + { + "internalType": "bytes", + "name": "ret", + "type": "bytes" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "linkReferences": {}, + "object": "60806040523480156200001157600080fd5b506040516200138e3803806200138e833981810160405260808110156200003757600080fd5b8101908080519060200190929190805160405193929190846401000000008211156200006257600080fd5b838201915060208201858111156200007957600080fd5b82518660018202830111640100000000821117156200009757600080fd5b8083526020830192505050908051906020019080838360005b83811015620000cd578082015181840152602081019050620000b0565b50505050905090810190601f168015620000fb5780820380516001836020036101000a031916815260200191505b5060405260200180519060200190929190805160405193929190846401000000008211156200012957600080fd5b838201915060208201858111156200014057600080fd5b82518660018202830111640100000000821117156200015e57600080fd5b8083526020830192505050908051906020019080838360005b838110156200019457808201518184015260208101905062000177565b50505050905090810190601f168015620001c25780820380516001836020036101000a031916815260200191505b50604052505050836000805a620001d86200029e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081906200021e620002d0565b505050836005819062000230620002d0565b50505082600290805190602001906200024b9291906200030a565b5081600360006101000a8162000260620003bb565b8160ff021916908360ff1602179062000278620002d0565b5050508060049080519060200190620002939291906200030a565b505050505062000426565b6373509064620800008160e01b81526020816004836000335af16000811415620002c757600080fd5b81519450505050565b6328dcb2a0620800008160e01b81528360048201528460248201526000816044836000335af160008114156200030557600080fd5b505050565b828062000316620003bb565b600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200036157805160ff1916838001178562000359620002d0565b5050620003a8565b8280016001018562000372620002d0565b50508215620003a8579182015b82811115620003a75782518262000395620002d0565b5050916020019190600101906200037f565b5b509050620003b79190620003f3565b5090565b6320966208620800008160e01b81528360048201526020816024836000335af16000811415620003ea57600080fd5b81519450505050565b6200042391905b808211156200041f5760008160009062000413620002d0565b505050600101620003fa565b5090565b90565b610f5880620004366000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80635c658165116100715780635c658165146102c25780636a11b2a81461033a57806370a082311461042c57806395d89b4114610484578063a9059cbb14610507578063dd62ed3e1461056d576100b4565b806306fdde03146100b9578063095ea7b31461013c57806318160ddd146101a257806323b872dd146101c057806327e235e314610246578063313ce5671461029e575b600080fd5b6100c16105e5565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101015780820151818401526020810190506100e6565b50505050905090810190601f16801561012e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101886004803603604081101561015257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061069f565b604051808215151515815260200191505060405180910390f35b6101aa6107aa565b6040518082815260200191505060405180910390f35b61022c600480360360608110156101d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506107b7565b604051808215151515815260200191505060405180910390f35b6102886004803603602081101561025c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a9a565b6040518082815260200191505060405180910390f35b6102a6610ab9565b604051808260ff1660ff16815260200191505060405180910390f35b610324600480360360408110156102d857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ad3565b6040518082815260200191505060405180910390f35b6103b16004803603602081101561035057600080fd5b810190808035906020019064010000000081111561036d57600080fd5b82018360208201111561037f57600080fd5b803590602001918460018302840111640100000000831117156103a157600080fd5b9091929391929390505050610aff565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103f15780820151818401526020810190506103d6565b50505050905090810190601f16801561041e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61046e6004803603602081101561044257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b32565b6040518082815260200191505060405180910390f35b61048c610b81565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104cc5780820151818401526020810190506104b1565b50505050905090810190601f1680156104f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105536004803603604081101561051d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c3b565b604051808215151515815260200191505060405180910390f35b6105cf6004803603604081101561058357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610dce565b6040518082815260200191505060405180910390f35b6002806105f0610e5c565b600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828061062b610e5c565b600181600116156101000203166002900480156106975780601f10610665576101008083610657610e5c565b040283529160200191610697565b820191906000526020600020905b8161067c610e5c565b8152906001019060200180831161067357829003601f168201915b505050505081565b600081600160005a6106af610e93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190610730610ec4565b5050508273ffffffffffffffffffffffffffffffffffffffff165a610753610e93565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60056107b4610e5c565b81565b600080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005a610804610e93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610846610e5c565b9050826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061088f610e5c565b1015801561089d5750828110155b6108a657600080fd5b826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082826108f1610e5c565b0192505081906108ff610ec4565b505050826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828261094d610e5c565b03925050819061095b610ec4565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610a295782600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005a6109d1610e93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610a17610e5c565b039250508190610a25610ec4565b5050505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150509392505050565b6000602052806000526040600020600091509050610ab6610e5c565b81565b6003600090610ac6610e5c565b906101000a900460ff1681565b600160205281600052604060002060205280600052604060002060009150915050610afc610e5c565b81565b60608282604051602001808383808284378083019250505092505050604051602081830303815290604052905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610b7a610e5c565b9050919050565b600480610b8c610e5c565b600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280610bc7610e5c565b60018160011615610100020316600290048015610c335780601f10610c01576101008083610bf3610e5c565b040283529160200191610c33565b820191906000526020600020905b81610c18610e5c565b81529060010190602001808311610c0f57829003601f168201915b505050505081565b6000816000805a610c4a610e93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610c8c610e5c565b1015610c9757600080fd5b816000805a610ca4610e93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610cea610e5c565b039250508190610cf8610ec4565b505050816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610d46610e5c565b019250508190610d54610ec4565b5050508273ffffffffffffffffffffffffffffffffffffffff165a610d77610e93565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610e54610e5c565b905092915050565b6320966208620800008160e01b81528360048201526020816024836000335af16000811415610e8a57600080fd5b81519450505050565b6373509064620800008160e01b81526020816004836000335af16000811415610ebb57600080fd5b81519450505050565b6328dcb2a0620800008160e01b81528360048201528460248201526000816044836000335af16000811415610ef857600080fd5b50505056fea265627a7a72315820c4c909f639abba10c6b9ab443bb8bd9987147150d1fb98d9108d06b5ce675f0e64736f6c637828302e352e31362d646576656c6f702e323032302e372e32392b636f6d6d69742e36326536346536370058", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x138E CODESIZE SUB DUP1 PUSH3 0x138E DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x80 DUP2 LT ISZERO PUSH3 0x37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD PUSH1 0x40 MLOAD SWAP4 SWAP3 SWAP2 SWAP1 DUP5 PUSH5 0x100000000 DUP3 GT ISZERO PUSH3 0x62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP3 ADD DUP6 DUP2 GT ISZERO PUSH3 0x79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD DUP7 PUSH1 0x1 DUP3 MUL DUP4 ADD GT PUSH5 0x100000000 DUP3 GT OR ISZERO PUSH3 0x97 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP3 POP POP POP SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0xCD JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH3 0xB0 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH3 0xFB 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 PUSH1 0x40 MSTORE PUSH1 0x20 ADD DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD PUSH1 0x40 MLOAD SWAP4 SWAP3 SWAP2 SWAP1 DUP5 PUSH5 0x100000000 DUP3 GT ISZERO PUSH3 0x129 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP3 ADD DUP6 DUP2 GT ISZERO PUSH3 0x140 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD DUP7 PUSH1 0x1 DUP3 MUL DUP4 ADD GT PUSH5 0x100000000 DUP3 GT OR ISZERO PUSH3 0x15E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP3 POP POP POP SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x194 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH3 0x177 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH3 0x1C2 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 PUSH1 0x40 MSTORE POP POP POP DUP4 PUSH1 0x0 DUP1 GAS PUSH3 0x1D8 PUSH3 0x29E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 PUSH3 0x21E PUSH3 0x2D0 JUMP JUMPDEST POP POP POP DUP4 PUSH1 0x5 DUP2 SWAP1 PUSH3 0x230 PUSH3 0x2D0 JUMP JUMPDEST POP POP POP DUP3 PUSH1 0x2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0x24B SWAP3 SWAP2 SWAP1 PUSH3 0x30A JUMP JUMPDEST POP DUP2 PUSH1 0x3 PUSH1 0x0 PUSH2 0x100 EXP DUP2 PUSH3 0x260 PUSH3 0x3BB JUMP JUMPDEST DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 PUSH3 0x278 PUSH3 0x2D0 JUMP JUMPDEST POP POP POP DUP1 PUSH1 0x4 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0x293 SWAP3 SWAP2 SWAP1 PUSH3 0x30A JUMP JUMPDEST POP POP POP POP POP PUSH3 0x426 JUMP JUMPDEST PUSH4 0x73509064 PUSH3 0x80000 DUP2 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x20 DUP2 PUSH1 0x4 DUP4 PUSH1 0x0 CALLER GAS CALL PUSH1 0x0 DUP2 EQ ISZERO PUSH3 0x2C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD SWAP5 POP POP POP POP JUMP JUMPDEST PUSH4 0x28DCB2A0 PUSH3 0x80000 DUP2 PUSH1 0xE0 SHL DUP2 MSTORE DUP4 PUSH1 0x4 DUP3 ADD MSTORE DUP5 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP2 PUSH1 0x44 DUP4 PUSH1 0x0 CALLER GAS CALL PUSH1 0x0 DUP2 EQ ISZERO PUSH3 0x305 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP JUMP JUMPDEST DUP3 DUP1 PUSH3 0x316 PUSH3 0x3BB JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x361 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 PUSH3 0x359 PUSH3 0x2D0 JUMP JUMPDEST POP POP PUSH3 0x3A8 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 PUSH3 0x372 PUSH3 0x2D0 JUMP JUMPDEST POP POP DUP3 ISZERO PUSH3 0x3A8 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x3A7 JUMPI DUP3 MLOAD DUP3 PUSH3 0x395 PUSH3 0x2D0 JUMP JUMPDEST POP POP SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x37F JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH3 0x3B7 SWAP2 SWAP1 PUSH3 0x3F3 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH4 0x20966208 PUSH3 0x80000 DUP2 PUSH1 0xE0 SHL DUP2 MSTORE DUP4 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP4 PUSH1 0x0 CALLER GAS CALL PUSH1 0x0 DUP2 EQ ISZERO PUSH3 0x3EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD SWAP5 POP POP POP POP JUMP JUMPDEST PUSH3 0x423 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x41F JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 PUSH3 0x413 PUSH3 0x2D0 JUMP JUMPDEST POP POP POP PUSH1 0x1 ADD PUSH3 0x3FA JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xF58 DUP1 PUSH3 0x436 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 0xB4 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x5C658165 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0x5C658165 EQ PUSH2 0x2C2 JUMPI DUP1 PUSH4 0x6A11B2A8 EQ PUSH2 0x33A JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x42C JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x484 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x507 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x56D JUMPI PUSH2 0xB4 JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xB9 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1A2 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1C0 JUMPI DUP1 PUSH4 0x27E235E3 EQ PUSH2 0x246 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x29E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC1 PUSH2 0x5E5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x101 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xE6 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x12E 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 0x188 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x152 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x69F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1AA PUSH2 0x7AA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x22C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x1D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x7B7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x288 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x25C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xA9A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2A6 PUSH2 0xAB9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x324 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xAD3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x3B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x350 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x36D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x37F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x3A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP2 SWAP3 SWAP4 SWAP1 POP POP POP PUSH2 0xAFF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3F1 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x3D6 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x41E 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 0x46E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x442 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xB32 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x48C PUSH2 0xB81 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4CC JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x4B1 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x4F9 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 0x553 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x51D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xC3B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x5CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x583 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xDCE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x2 DUP1 PUSH2 0x5F0 PUSH2 0xE5C JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 PUSH2 0x62B PUSH2 0xE5C JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x697 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x665 JUMPI PUSH2 0x100 DUP1 DUP4 PUSH2 0x657 PUSH2 0xE5C JUMP JUMPDEST DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x697 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH2 0x67C PUSH2 0xE5C JUMP JUMPDEST DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x673 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x0 GAS PUSH2 0x6AF PUSH2 0xE93 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 PUSH2 0x730 PUSH2 0xEC4 JUMP JUMPDEST POP POP POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS PUSH2 0x753 PUSH2 0xE93 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x5 PUSH2 0x7B4 PUSH2 0xE5C JUMP JUMPDEST DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 GAS PUSH2 0x804 PUSH2 0xE93 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH2 0x846 PUSH2 0xE5C JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH2 0x88F PUSH2 0xE5C JUMP JUMPDEST LT ISZERO DUP1 ISZERO PUSH2 0x89D JUMPI POP DUP3 DUP2 LT ISZERO JUMPDEST PUSH2 0x8A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 PUSH2 0x8F1 PUSH2 0xE5C JUMP JUMPDEST ADD SWAP3 POP POP DUP2 SWAP1 PUSH2 0x8FF PUSH2 0xEC4 JUMP JUMPDEST POP POP POP DUP3 PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 PUSH2 0x94D PUSH2 0xE5C JUMP JUMPDEST SUB SWAP3 POP POP DUP2 SWAP1 PUSH2 0x95B PUSH2 0xEC4 JUMP JUMPDEST POP POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 LT ISZERO PUSH2 0xA29 JUMPI DUP3 PUSH1 0x1 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 GAS PUSH2 0x9D1 PUSH2 0xE93 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 PUSH2 0xA17 PUSH2 0xE5C JUMP JUMPDEST SUB SWAP3 POP POP DUP2 SWAP1 PUSH2 0xA25 PUSH2 0xEC4 JUMP JUMPDEST POP POP POP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP PUSH2 0xAB6 PUSH2 0xE5C JUMP JUMPDEST DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 SWAP1 PUSH2 0xAC6 PUSH2 0xE5C JUMP JUMPDEST SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP POP PUSH2 0xAFC PUSH2 0xE5C JUMP JUMPDEST DUP2 JUMP JUMPDEST PUSH1 0x60 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP1 DUP4 ADD SWAP3 POP POP POP SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH2 0xB7A PUSH2 0xE5C JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x4 DUP1 PUSH2 0xB8C PUSH2 0xE5C JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 PUSH2 0xBC7 PUSH2 0xE5C JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xC33 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xC01 JUMPI PUSH2 0x100 DUP1 DUP4 PUSH2 0xBF3 PUSH2 0xE5C JUMP JUMPDEST DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC33 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH2 0xC18 PUSH2 0xE5C JUMP JUMPDEST DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xC0F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 DUP1 GAS PUSH2 0xC4A PUSH2 0xE93 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH2 0xC8C PUSH2 0xE5C JUMP JUMPDEST LT ISZERO PUSH2 0xC97 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x0 DUP1 GAS PUSH2 0xCA4 PUSH2 0xE93 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 PUSH2 0xCEA PUSH2 0xE5C JUMP JUMPDEST SUB SWAP3 POP POP DUP2 SWAP1 PUSH2 0xCF8 PUSH2 0xEC4 JUMP JUMPDEST POP POP POP DUP2 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 PUSH2 0xD46 PUSH2 0xE5C JUMP JUMPDEST ADD SWAP3 POP POP DUP2 SWAP1 PUSH2 0xD54 PUSH2 0xEC4 JUMP JUMPDEST POP POP POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS PUSH2 0xD77 PUSH2 0xE93 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH2 0xE54 PUSH2 0xE5C JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH4 0x20966208 PUSH3 0x80000 DUP2 PUSH1 0xE0 SHL DUP2 MSTORE DUP4 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP4 PUSH1 0x0 CALLER GAS CALL PUSH1 0x0 DUP2 EQ ISZERO PUSH2 0xE8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD SWAP5 POP POP POP POP JUMP JUMPDEST PUSH4 0x73509064 PUSH3 0x80000 DUP2 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x20 DUP2 PUSH1 0x4 DUP4 PUSH1 0x0 CALLER GAS CALL PUSH1 0x0 DUP2 EQ ISZERO PUSH2 0xEBB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD SWAP5 POP POP POP POP JUMP JUMPDEST PUSH4 0x28DCB2A0 PUSH3 0x80000 DUP2 PUSH1 0xE0 SHL DUP2 MSTORE DUP4 PUSH1 0x4 DUP3 ADD MSTORE DUP5 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP2 PUSH1 0x44 DUP4 PUSH1 0x0 CALLER GAS CALL PUSH1 0x0 DUP2 EQ ISZERO PUSH2 0xEF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP JUMP INVALID LOG2 PUSH6 0x627A7A723158 KECCAK256 0xC4 0xC9 MULMOD 0xF6 CODECOPY 0xAB 0xBA LT 0xC6 0xB9 0xAB DIFFICULTY EXTCODESIZE 0xB8 0xBD SWAP10 DUP8 EQ PUSH18 0x50D1FB98D9108D06B5CE675F0E64736F6C63 PUSH25 0x28302E352E31362D646576656C6F702E323032302E372E3239 0x2B PUSH4 0x6F6D6D69 PUSH21 0x2E3632653634653637005800000000000000000000 ", + "sourceMap": "152:2752:0:-;;;884:649;8:9:-1;5:2;;;30:1;27;20:12;5:2;884:649:0;;;;;;;;;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;884:649:0;;;;;;;;;;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;330:9;325:1;311:12;307:20;289:16;285:43;282:58;261:11;247:12;244:29;233:115;230:2;;;361:1;358;351:12;230:2;384:12;379:3;372:25;420:4;415:3;411:14;404:21;;0:432;;884:649:0;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;884:649:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;330:9;325:1;311:12;307:20;289:16;285:43;282:58;261:11;247:12;244:29;233:115;230:2;;;361:1;358;351:12;230:2;384:12;379:3;372:25;420:4;415:3;411:14;404:21;;0:432;;884:649:0;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;884:649:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1073:14;1050:8;:20;1059:10;;;:::i;:::-;1050:20;;;;;;;;;;;;;;;:37;;;;:::i;:::-;;;;1164:14;1150:11;:28;;;;:::i;:::-;;;;1241:10;1234:4;:17;;;;;;;;;;;;:::i;:::-;;1343:13;1332:8;;:24;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;1445:12;1436:6;:21;;;;;;;;;;;;:::i;:::-;;884:649;;;;152:2752;;;20:10:-1;80:7;173:8;168:3;164:18;153:9;146:37;287:2;276:9;273:1;262:9;259:1;249:8;242:5;237:53;309:1;300:7;297:14;294:2;;;328:1;325;318:12;294:2;350:9;344:16;338:22;;0:363;;;152:2752:0:o;:::-;20:10:-1;80:7;173:8;168:3;164:18;153:9;146:37;214:2;210:1;199:9;195:17;188:29;249:2;242:4;231:9;227:20;220:32;349:1;338:9;334:2;323:9;320:1;310:8;303:5;298:53;370:1;361:7;358:14;355:2;;;389:1;386;379:12;355:2;0:402;;;152:2752:0:o;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;20:10:-1;80:7;173:8;168:3;164:18;153:9;146:37;214:2;210:1;199:9;195:17;188:29;317:2;306:9;302:2;291:9;288:1;278:8;271:5;266:54;339:1;330:7;327:14;324:2;;;358:1;355;348:12;324:2;380:9;374:16;368:22;;0:393;;;152:2752:0:o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b50600436106100b45760003560e01c80635c658165116100715780635c658165146102c25780636a11b2a81461033a57806370a082311461042c57806395d89b4114610484578063a9059cbb14610507578063dd62ed3e1461056d576100b4565b806306fdde03146100b9578063095ea7b31461013c57806318160ddd146101a257806323b872dd146101c057806327e235e314610246578063313ce5671461029e575b600080fd5b6100c16105e5565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101015780820151818401526020810190506100e6565b50505050905090810190601f16801561012e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101886004803603604081101561015257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061069f565b604051808215151515815260200191505060405180910390f35b6101aa6107aa565b6040518082815260200191505060405180910390f35b61022c600480360360608110156101d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506107b7565b604051808215151515815260200191505060405180910390f35b6102886004803603602081101561025c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a9a565b6040518082815260200191505060405180910390f35b6102a6610ab9565b604051808260ff1660ff16815260200191505060405180910390f35b610324600480360360408110156102d857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ad3565b6040518082815260200191505060405180910390f35b6103b16004803603602081101561035057600080fd5b810190808035906020019064010000000081111561036d57600080fd5b82018360208201111561037f57600080fd5b803590602001918460018302840111640100000000831117156103a157600080fd5b9091929391929390505050610aff565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103f15780820151818401526020810190506103d6565b50505050905090810190601f16801561041e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61046e6004803603602081101561044257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b32565b6040518082815260200191505060405180910390f35b61048c610b81565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104cc5780820151818401526020810190506104b1565b50505050905090810190601f1680156104f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105536004803603604081101561051d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c3b565b604051808215151515815260200191505060405180910390f35b6105cf6004803603604081101561058357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610dce565b6040518082815260200191505060405180910390f35b6002806105f0610e5c565b600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828061062b610e5c565b600181600116156101000203166002900480156106975780601f10610665576101008083610657610e5c565b040283529160200191610697565b820191906000526020600020905b8161067c610e5c565b8152906001019060200180831161067357829003601f168201915b505050505081565b600081600160005a6106af610e93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190610730610ec4565b5050508273ffffffffffffffffffffffffffffffffffffffff165a610753610e93565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60056107b4610e5c565b81565b600080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005a610804610e93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610846610e5c565b9050826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061088f610e5c565b1015801561089d5750828110155b6108a657600080fd5b826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082826108f1610e5c565b0192505081906108ff610ec4565b505050826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828261094d610e5c565b03925050819061095b610ec4565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610a295782600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005a6109d1610e93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610a17610e5c565b039250508190610a25610ec4565b5050505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150509392505050565b6000602052806000526040600020600091509050610ab6610e5c565b81565b6003600090610ac6610e5c565b906101000a900460ff1681565b600160205281600052604060002060205280600052604060002060009150915050610afc610e5c565b81565b60608282604051602001808383808284378083019250505092505050604051602081830303815290604052905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610b7a610e5c565b9050919050565b600480610b8c610e5c565b600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280610bc7610e5c565b60018160011615610100020316600290048015610c335780601f10610c01576101008083610bf3610e5c565b040283529160200191610c33565b820191906000526020600020905b81610c18610e5c565b81529060010190602001808311610c0f57829003601f168201915b505050505081565b6000816000805a610c4a610e93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610c8c610e5c565b1015610c9757600080fd5b816000805a610ca4610e93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610cea610e5c565b039250508190610cf8610ec4565b505050816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610d46610e5c565b019250508190610d54610ec4565b5050508273ffffffffffffffffffffffffffffffffffffffff165a610d77610e93565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610e54610e5c565b905092915050565b6320966208620800008160e01b81528360048201526020816024836000335af16000811415610e8a57600080fd5b81519450505050565b6373509064620800008160e01b81526020816004836000335af16000811415610ebb57600080fd5b81519450505050565b6328dcb2a0620800008160e01b81528360048201528460248201526000816044836000335af16000811415610ef857600080fd5b50505056fea265627a7a72315820c4c909f639abba10c6b9ab443bb8bd9987147150d1fb98d9108d06b5ce675f0e64736f6c637828302e352e31362d646576656c6f702e323032302e372e32392b636f6d6d69742e36326536346536370058", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB4 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x5C658165 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0x5C658165 EQ PUSH2 0x2C2 JUMPI DUP1 PUSH4 0x6A11B2A8 EQ PUSH2 0x33A JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x42C JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x484 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x507 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x56D JUMPI PUSH2 0xB4 JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xB9 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1A2 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1C0 JUMPI DUP1 PUSH4 0x27E235E3 EQ PUSH2 0x246 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x29E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC1 PUSH2 0x5E5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x101 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xE6 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x12E 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 0x188 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x152 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x69F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1AA PUSH2 0x7AA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x22C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x1D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x7B7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x288 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x25C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xA9A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2A6 PUSH2 0xAB9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x324 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xAD3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x3B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x350 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x36D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x37F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x3A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP2 SWAP3 SWAP4 SWAP1 POP POP POP PUSH2 0xAFF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3F1 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x3D6 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x41E 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 0x46E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x442 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xB32 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x48C PUSH2 0xB81 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4CC JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x4B1 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x4F9 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 0x553 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x51D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xC3B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x5CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x583 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xDCE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x2 DUP1 PUSH2 0x5F0 PUSH2 0xE5C JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 PUSH2 0x62B PUSH2 0xE5C JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x697 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x665 JUMPI PUSH2 0x100 DUP1 DUP4 PUSH2 0x657 PUSH2 0xE5C JUMP JUMPDEST DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x697 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH2 0x67C PUSH2 0xE5C JUMP JUMPDEST DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x673 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x0 GAS PUSH2 0x6AF PUSH2 0xE93 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 PUSH2 0x730 PUSH2 0xEC4 JUMP JUMPDEST POP POP POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS PUSH2 0x753 PUSH2 0xE93 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x5 PUSH2 0x7B4 PUSH2 0xE5C JUMP JUMPDEST DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 GAS PUSH2 0x804 PUSH2 0xE93 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH2 0x846 PUSH2 0xE5C JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH2 0x88F PUSH2 0xE5C JUMP JUMPDEST LT ISZERO DUP1 ISZERO PUSH2 0x89D JUMPI POP DUP3 DUP2 LT ISZERO JUMPDEST PUSH2 0x8A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 PUSH2 0x8F1 PUSH2 0xE5C JUMP JUMPDEST ADD SWAP3 POP POP DUP2 SWAP1 PUSH2 0x8FF PUSH2 0xEC4 JUMP JUMPDEST POP POP POP DUP3 PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 PUSH2 0x94D PUSH2 0xE5C JUMP JUMPDEST SUB SWAP3 POP POP DUP2 SWAP1 PUSH2 0x95B PUSH2 0xEC4 JUMP JUMPDEST POP POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 LT ISZERO PUSH2 0xA29 JUMPI DUP3 PUSH1 0x1 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 GAS PUSH2 0x9D1 PUSH2 0xE93 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 PUSH2 0xA17 PUSH2 0xE5C JUMP JUMPDEST SUB SWAP3 POP POP DUP2 SWAP1 PUSH2 0xA25 PUSH2 0xEC4 JUMP JUMPDEST POP POP POP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP PUSH2 0xAB6 PUSH2 0xE5C JUMP JUMPDEST DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 SWAP1 PUSH2 0xAC6 PUSH2 0xE5C JUMP JUMPDEST SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP POP PUSH2 0xAFC PUSH2 0xE5C JUMP JUMPDEST DUP2 JUMP JUMPDEST PUSH1 0x60 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP1 DUP4 ADD SWAP3 POP POP POP SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH2 0xB7A PUSH2 0xE5C JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x4 DUP1 PUSH2 0xB8C PUSH2 0xE5C JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 PUSH2 0xBC7 PUSH2 0xE5C JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xC33 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xC01 JUMPI PUSH2 0x100 DUP1 DUP4 PUSH2 0xBF3 PUSH2 0xE5C JUMP JUMPDEST DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC33 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH2 0xC18 PUSH2 0xE5C JUMP JUMPDEST DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xC0F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 DUP1 GAS PUSH2 0xC4A PUSH2 0xE93 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH2 0xC8C PUSH2 0xE5C JUMP JUMPDEST LT ISZERO PUSH2 0xC97 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x0 DUP1 GAS PUSH2 0xCA4 PUSH2 0xE93 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 PUSH2 0xCEA PUSH2 0xE5C JUMP JUMPDEST SUB SWAP3 POP POP DUP2 SWAP1 PUSH2 0xCF8 PUSH2 0xEC4 JUMP JUMPDEST POP POP POP DUP2 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 PUSH2 0xD46 PUSH2 0xE5C JUMP JUMPDEST ADD SWAP3 POP POP DUP2 SWAP1 PUSH2 0xD54 PUSH2 0xEC4 JUMP JUMPDEST POP POP POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS PUSH2 0xD77 PUSH2 0xE93 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH2 0xE54 PUSH2 0xE5C JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH4 0x20966208 PUSH3 0x80000 DUP2 PUSH1 0xE0 SHL DUP2 MSTORE DUP4 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP4 PUSH1 0x0 CALLER GAS CALL PUSH1 0x0 DUP2 EQ ISZERO PUSH2 0xE8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD SWAP5 POP POP POP POP JUMP JUMPDEST PUSH4 0x73509064 PUSH3 0x80000 DUP2 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x20 DUP2 PUSH1 0x4 DUP4 PUSH1 0x0 CALLER GAS CALL PUSH1 0x0 DUP2 EQ ISZERO PUSH2 0xEBB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD SWAP5 POP POP POP POP JUMP JUMPDEST PUSH4 0x28DCB2A0 PUSH3 0x80000 DUP2 PUSH1 0xE0 SHL DUP2 MSTORE DUP4 PUSH1 0x4 DUP3 ADD MSTORE DUP5 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP2 PUSH1 0x44 DUP4 PUSH1 0x0 CALLER GAS CALL PUSH1 0x0 DUP2 EQ ISZERO PUSH2 0xEF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP JUMP INVALID LOG2 PUSH6 0x627A7A723158 KECCAK256 0xC4 0xC9 MULMOD 0xF6 CODECOPY 0xAB 0xBA LT 0xC6 0xB9 0xAB DIFFICULTY EXTCODESIZE 0xB8 0xBD SWAP10 DUP8 EQ PUSH18 0x50D1FB98D9108D06B5CE675F0E64736F6C63 PUSH25 0x28302E352E31362D646576656C6F702E323032302E372E3239 0x2B PUSH4 0x6F6D6D69 PUSH21 0x2E3632653634653637005800000000000000000000 ", + "sourceMap": "152:2752:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;152:2752:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;646:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;646:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:212;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2408:212:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;851:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1822:459;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1822:459:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;239:44;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;239:44:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;714:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;289:64;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;289:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2776:126;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2776:126:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;2776:126:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;2776:126:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;2776:126:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2776:126:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2287:115;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2287:115:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;785:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;785:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1539:277;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1539:277:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2626:144;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2626:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;646:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2408:212::-;2477:12;2533:6;2501:7;:19;2509:10;;;:::i;:::-;2501:19;;;;;;;;;;;;;;;:29;2521:8;2501:29;;;;;;;;;;;;;;;:38;;;;:::i;:::-;;;;2575:8;2554:38;;2563:10;;;:::i;:::-;2554:38;;;2585:6;2554:38;;;;;;;;;;;;;;;;;;2609:4;2602:11;;2408:212;;;;:::o;851:26::-;;;;:::i;:::-;;:::o;1822:459::-;1906:12;1930:17;1950:7;:14;1958:5;1950:14;;;;;;;;;;;;;;;:26;1965:10;;;:::i;:::-;1950:26;;;;;;;;;;;;;;;;;:::i;:::-;1930:46;;2013:6;1994:8;:15;2003:5;1994:15;;;;;;;;;;;;;;;;;:::i;:::-;:25;;:48;;;;;2036:6;2023:9;:19;;1994:48;1986:57;;;;;;2070:6;2053:8;:13;2062:3;2053:13;;;;;;;;;;;;;;;;:23;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;2105:6;2086:8;:15;2095:5;2086:15;;;;;;;;;;;;;;;;:25;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;223:10;2125:9;:23;2121:90;;;2194:6;2164:7;:14;2172:5;2164:14;;;;;;;;;;;;;;;:26;2179:10;;;:::i;:::-;2164:26;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;2121:90;2241:3;2225:28;;2234:5;2225:28;;;2246:6;2225:28;;;;;;;;;;;;;;;;;;2270:4;2263:11;;;1822:459;;;;;:::o;239:44::-;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;714:21::-;;;;;;:::i;:::-;;;;;;;;;:::o;289:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;2776:126::-;2837:16;2890:4;;2873:22;;;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;2873:22:0;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2873:22:0;;;2866:29;;2776:126;;;;:::o;2287:115::-;2345:15;2379:8;:16;2388:6;2379:16;;;;;;;;;;;;;;;;;:::i;:::-;2372:23;;2287:115;;;:::o;785:20::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1539:277::-;1604:12;1660:6;1636:8;:20;1645:10;;;:::i;:::-;1636:20;;;;;;;;;;;;;;;;;:::i;:::-;:30;;1628:39;;;;;;1701:6;1677:8;:20;1686:10;;;:::i;:::-;1677:20;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;1734:6;1717:8;:13;1726:3;1717:13;;;;;;;;;;;;;;;;:23;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;1776:3;1755:33;;1764:10;;;:::i;:::-;1755:33;;;1781:6;1755:33;;;;;;;;;;;;;;;;;;1805:4;1798:11;;1539:277;;;;:::o;2626:144::-;2702:17;2738:7;:15;2746:6;2738:15;;;;;;;;;;;;;;;:25;2754:8;2738:25;;;;;;;;;;;;;;;;;:::i;:::-;2731:32;;2626:144;;;;:::o;152:2752::-;20:10:-1;80:7;173:8;168:3;164:18;153:9;146:37;214:2;210:1;199:9;195:17;188:29;317:2;306:9;302:2;291:9;288:1;278:8;271:5;266:54;339:1;330:7;327:14;324:2;;;358:1;355;348:12;324:2;380:9;374:16;368:22;;0:393;;;152:2752:0:o;:::-;20:10:-1;80:7;173:8;168:3;164:18;153:9;146:37;287:2;276:9;273:1;262:9;259:1;249:8;242:5;237:53;309:1;300:7;297:14;294:2;;;328:1;325;318:12;294:2;350:9;344:16;338:22;;0:363;;;152:2752:0:o;:::-;20:10:-1;80:7;173:8;168:3;164:18;153:9;146:37;214:2;210:1;199:9;195:17;188:29;249:2;242:4;231:9;227:20;220:32;349:1;338:9;334:2;323:9;320:1;310:8;303:5;298:53;370:1;361:7;358:14;355:2;;;389:1;386;379:12;355:2;0:402;;;152:2752:0:o" + } + }, + "interface": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_initialAmount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_tokenName", + "type": "string" + }, + { + "internalType": "uint8", + "name": "_decimalUnits", + "type": "uint8" + }, + { + "internalType": "string", + "name": "_tokenSymbol", + "type": "string" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "remaining", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "allowed", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balances", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "string", + "name": "test", + "type": "string" + } + ], + "name": "encode", + "outputs": [ + { + "internalType": "bytes", + "name": "ret", + "type": "bytes" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "60806040523480156200001157600080fd5b506040516200138e3803806200138e833981810160405260808110156200003757600080fd5b8101908080519060200190929190805160405193929190846401000000008211156200006257600080fd5b838201915060208201858111156200007957600080fd5b82518660018202830111640100000000821117156200009757600080fd5b8083526020830192505050908051906020019080838360005b83811015620000cd578082015181840152602081019050620000b0565b50505050905090810190601f168015620000fb5780820380516001836020036101000a031916815260200191505b5060405260200180519060200190929190805160405193929190846401000000008211156200012957600080fd5b838201915060208201858111156200014057600080fd5b82518660018202830111640100000000821117156200015e57600080fd5b8083526020830192505050908051906020019080838360005b838110156200019457808201518184015260208101905062000177565b50505050905090810190601f168015620001c25780820380516001836020036101000a031916815260200191505b50604052505050836000805a620001d86200029e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081906200021e620002d0565b505050836005819062000230620002d0565b50505082600290805190602001906200024b9291906200030a565b5081600360006101000a8162000260620003bb565b8160ff021916908360ff1602179062000278620002d0565b5050508060049080519060200190620002939291906200030a565b505050505062000426565b6373509064620800008160e01b81526020816004836000335af16000811415620002c757600080fd5b81519450505050565b6328dcb2a0620800008160e01b81528360048201528460248201526000816044836000335af160008114156200030557600080fd5b505050565b828062000316620003bb565b600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200036157805160ff1916838001178562000359620002d0565b5050620003a8565b8280016001018562000372620002d0565b50508215620003a8579182015b82811115620003a75782518262000395620002d0565b5050916020019190600101906200037f565b5b509050620003b79190620003f3565b5090565b6320966208620800008160e01b81528360048201526020816024836000335af16000811415620003ea57600080fd5b81519450505050565b6200042391905b808211156200041f5760008160009062000413620002d0565b505050600101620003fa565b5090565b90565b610f5880620004366000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80635c658165116100715780635c658165146102c25780636a11b2a81461033a57806370a082311461042c57806395d89b4114610484578063a9059cbb14610507578063dd62ed3e1461056d576100b4565b806306fdde03146100b9578063095ea7b31461013c57806318160ddd146101a257806323b872dd146101c057806327e235e314610246578063313ce5671461029e575b600080fd5b6100c16105e5565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101015780820151818401526020810190506100e6565b50505050905090810190601f16801561012e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101886004803603604081101561015257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061069f565b604051808215151515815260200191505060405180910390f35b6101aa6107aa565b6040518082815260200191505060405180910390f35b61022c600480360360608110156101d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506107b7565b604051808215151515815260200191505060405180910390f35b6102886004803603602081101561025c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a9a565b6040518082815260200191505060405180910390f35b6102a6610ab9565b604051808260ff1660ff16815260200191505060405180910390f35b610324600480360360408110156102d857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ad3565b6040518082815260200191505060405180910390f35b6103b16004803603602081101561035057600080fd5b810190808035906020019064010000000081111561036d57600080fd5b82018360208201111561037f57600080fd5b803590602001918460018302840111640100000000831117156103a157600080fd5b9091929391929390505050610aff565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103f15780820151818401526020810190506103d6565b50505050905090810190601f16801561041e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61046e6004803603602081101561044257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b32565b6040518082815260200191505060405180910390f35b61048c610b81565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104cc5780820151818401526020810190506104b1565b50505050905090810190601f1680156104f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105536004803603604081101561051d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c3b565b604051808215151515815260200191505060405180910390f35b6105cf6004803603604081101561058357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610dce565b6040518082815260200191505060405180910390f35b6002806105f0610e5c565b600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828061062b610e5c565b600181600116156101000203166002900480156106975780601f10610665576101008083610657610e5c565b040283529160200191610697565b820191906000526020600020905b8161067c610e5c565b8152906001019060200180831161067357829003601f168201915b505050505081565b600081600160005a6106af610e93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190610730610ec4565b5050508273ffffffffffffffffffffffffffffffffffffffff165a610753610e93565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60056107b4610e5c565b81565b600080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005a610804610e93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610846610e5c565b9050826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061088f610e5c565b1015801561089d5750828110155b6108a657600080fd5b826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082826108f1610e5c565b0192505081906108ff610ec4565b505050826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828261094d610e5c565b03925050819061095b610ec4565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610a295782600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005a6109d1610e93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610a17610e5c565b039250508190610a25610ec4565b5050505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150509392505050565b6000602052806000526040600020600091509050610ab6610e5c565b81565b6003600090610ac6610e5c565b906101000a900460ff1681565b600160205281600052604060002060205280600052604060002060009150915050610afc610e5c565b81565b60608282604051602001808383808284378083019250505092505050604051602081830303815290604052905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610b7a610e5c565b9050919050565b600480610b8c610e5c565b600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280610bc7610e5c565b60018160011615610100020316600290048015610c335780601f10610c01576101008083610bf3610e5c565b040283529160200191610c33565b820191906000526020600020905b81610c18610e5c565b81529060010190602001808311610c0f57829003601f168201915b505050505081565b6000816000805a610c4a610e93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610c8c610e5c565b1015610c9757600080fd5b816000805a610ca4610e93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610cea610e5c565b039250508190610cf8610ec4565b505050816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610d46610e5c565b019250508190610d54610ec4565b5050508273ffffffffffffffffffffffffffffffffffffffff165a610d77610e93565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610e54610e5c565b905092915050565b6320966208620800008160e01b81528360048201526020816024836000335af16000811415610e8a57600080fd5b81519450505050565b6373509064620800008160e01b81526020816004836000335af16000811415610ebb57600080fd5b81519450505050565b6328dcb2a0620800008160e01b81528360048201528460248201526000816044836000335af16000811415610ef857600080fd5b50505056fea265627a7a72315820c4c909f639abba10c6b9ab443bb8bd9987147150d1fb98d9108d06b5ce675f0e64736f6c637828302e352e31362d646576656c6f702e323032302e372e32392b636f6d6d69742e36326536346536370058" +} \ No newline at end of file diff --git a/packages/provider/test/sendtransaction.spec.ts b/packages/provider/test/sendtransaction.spec.ts index 332baa36a09f3..3b4e970e59f91 100644 --- a/packages/provider/test/sendtransaction.spec.ts +++ b/packages/provider/test/sendtransaction.spec.ts @@ -13,8 +13,13 @@ import BigNumber = require('bn.js') import { OptimismProvider, sighashEthSign } from '../src/index' import { verifyMessage } from '@ethersproject/wallet' import { parse } from '@ethersproject/transactions' +import { ContractFactory } from '@ethersproject/contracts' import { SignatureLike, joinSignature } from '@ethersproject/bytes' +// TODO: temp +import { JsonRpcProvider } from '@ethersproject/providers' + +import ERC20 = require('./data/ERC20.json') import { mnemonic } from './common' chai.use(chaiAsPromised) @@ -23,6 +28,7 @@ const should = chai.should() describe('sendTransaction', () => { let provider let server + let rProvider const handlers = { eth_chainId: () => '0x1', @@ -34,7 +40,9 @@ describe('sendTransaction', () => { mnemonic, }) ) - provider = new OptimismProvider('http://127.0.0.1:3002', web3) + rProvider = new JsonRpcProvider('http://127.0.0.1:8545') + provider = new OptimismProvider('http://127.0.0.1:8545', web3) + server = new JsonRpcServer(handlers, 'localhost', 3002) await server.listen() }) @@ -70,4 +78,25 @@ describe('sendTransaction', () => { const recovered = verifyMessage(hash, sig) address.should.eq(recovered) }) + + it('should create a contract', async () => { + const rSigner = await rProvider.getSigner() + const signer = await provider.getSigner() + const nonce = await signer.getTransactionCount() + + // signing a contract creation tx commits to empty to + // this is not how my stuff is working now + + const factory = new ContractFactory(ERC20.abi, ERC20.bytecode, signer) + const tx = await factory.deploy(1000, 'OVM', 18, 'OVM', { + gasLimit: 100000, + gasPrice: 0, + nonce + }) + + console.log(tx) + + const address = tx.address + const code = await provider.getCode(address) + }) })