From d93b0cb9c7a47abd5c4750e3bd4ecafcede3cc6d Mon Sep 17 00:00:00 2001 From: Ladd Hoffman Date: Tue, 26 Mar 2024 18:28:38 -0500 Subject: [PATCH] add binding percent and redistribute losing stakes parameters to validation pool --- client/src/App.jsx | 2 + client/src/assets/DAO.json | 39 +++- client/src/assets/Onboarding.json | 4 +- client/src/assets/Work1.json | 4 +- client/src/contract-addresses.json | 6 +- ethereum/contract-addresses.json | 6 +- ethereum/contracts/DAO.sol | 101 +++++++--- ethereum/contracts/Onboarding.sol | 13 +- ethereum/contracts/Proposal.sol | 81 ++++++++ ethereum/contracts/WorkContract.sol | 8 +- ethereum/test/DAO.js | 288 ++++++++++++++++++++++------ ethereum/test/Onboarding.js | 2 +- ethereum/test/Work1.js | 2 +- 13 files changed, 442 insertions(+), 114 deletions(-) create mode 100644 ethereum/contracts/Proposal.sol diff --git a/client/src/App.jsx b/client/src/App.jsx index 3b4ff59..ec5b4ef 100644 --- a/client/src/App.jsx +++ b/client/src/App.jsx @@ -220,6 +220,8 @@ function App() { poolDuration ?? 3600, 1, 3, + 100, + true, false, web3.eth.abi.encodeParameter('bytes', '0x00'), ).send({ diff --git a/client/src/assets/DAO.json b/client/src/assets/DAO.json index 413be8c..017c8e8 100644 --- a/client/src/assets/DAO.json +++ b/client/src/assets/DAO.json @@ -329,6 +329,16 @@ "name": "quorumDenominator", "type": "uint256" }, + { + "internalType": "uint256", + "name": "bindingPercent", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "redistributeLosingStakes", + "type": "bool" + }, { "internalType": "bool", "name": "callbackOnValidate", @@ -676,13 +686,30 @@ "type": "uint256" }, { - "internalType": "uint256", - "name": "fee", - "type": "uint256" + "components": [ + { + "internalType": "uint256", + "name": "quorumPPB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bindingPercent", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "redistributeLosingStakes", + "type": "bool" + } + ], + "internalType": "struct ValidationPoolParams", + "name": "params", + "type": "tuple" }, { "internalType": "uint256", - "name": "quorumPPB", + "name": "fee", "type": "uint256" }, { @@ -720,8 +747,8 @@ "type": "function" } ], - "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600a81526020017f52657075746174696f6e000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f524550000000000000000000000000000000000000000000000000000000000081525081600390816200008f919062000324565b508060049081620000a1919062000324565b5050506200040b565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200012c57607f821691505b602082108103620001425762000141620000e4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620001ac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200016d565b620001b886836200016d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000205620001ff620001f984620001d0565b620001da565b620001d0565b9050919050565b6000819050919050565b6200022183620001e4565b6200023962000230826200020c565b8484546200017a565b825550505050565b600090565b6200025062000241565b6200025d81848462000216565b505050565b5b8181101562000285576200027960008262000246565b60018101905062000263565b5050565b601f821115620002d4576200029e8162000148565b620002a9846200015d565b81016020851015620002b9578190505b620002d1620002c8856200015d565b83018262000262565b50505b505050565b600082821c905092915050565b6000620002f960001984600802620002d9565b1980831691505092915050565b6000620003148383620002e6565b9150826002028217905092915050565b6200032f82620000aa565b67ffffffffffffffff8111156200034b576200034a620000b5565b5b62000357825462000113565b6200036482828562000289565b600060209050601f8311600181146200039c576000841562000387578287015190505b62000393858262000306565b86555062000403565b601f198416620003ac8662000148565b60005b82811015620003d657848901518255600182019150602085019450602081019050620003af565b86831015620003f65784890151620003f2601f891682620002e6565b8355505b6001600288020188555050505b505050505050565b613360806200041b6000396000f3fe60806040526004361061014b5760003560e01c80635daf08ca116100b6578063a230c5241161006f578063a230c524146104da578063a233627914610517578063a9059cbb1461055f578063d6ba43841461059c578063dd62ed3e146105c7578063ff869240146106045761014b565b80635daf08ca146103a2578063642b5bfb146103df5780636db5c8fd1461040a57806370a0823114610435578063883802741461047257806395d89b41146104af5761014b565b806317c182171161010857806317c182171461027e57806318160ddd146102bb57806323b872dd146102e6578063313ce56714610323578063561b24631461034e57806356715761146103775761014b565b806306fdde0314610150578063095ea7b31461017b5780630b1e7f83146101b85780630ce7e299146101f857806311aee3801461022857806317906c2e14610253575b600080fd5b34801561015c57600080fd5b50610165610641565b604051610172919061206e565b60405180910390f35b34801561018757600080fd5b506101a2600480360381019061019d919061212e565b6106d3565b6040516101af9190612189565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da91906121a4565b6106f6565b6040516101ef94939291906121ef565b60405180910390f35b610212600480360381019061020d91906122cc565b6107ee565b60405161021f919061237b565b60405180910390f35b34801561023457600080fd5b5061023d610bf7565b60405161024a919061237b565b60405180910390f35b34801561025f57600080fd5b50610268610bfd565b604051610275919061237b565b60405180910390f35b34801561028a57600080fd5b506102a560048036038101906102a091906121a4565b610c03565b6040516102b29190612189565b60405180910390f35b3480156102c757600080fd5b506102d061129e565b6040516102dd919061237b565b60405180910390f35b3480156102f257600080fd5b5061030d60048036038101906103089190612396565b6112a8565b60405161031a9190612189565b60405180910390f35b34801561032f57600080fd5b506103386112d7565b6040516103459190612405565b60405180910390f35b34801561035a57600080fd5b5061037560048036038101906103709190612420565b6112e0565b005b34801561038357600080fd5b5061038c611309565b604051610399919061237b565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c491906121a4565b61130e565b6040516103d69190612473565b60405180910390f35b3480156103eb57600080fd5b506103f4611341565b604051610401919061237b565b60405180910390f35b34801561041657600080fd5b5061041f611347565b60405161042c919061237b565b60405180910390f35b34801561044157600080fd5b5061045c6004803603810190610457919061248e565b611351565b604051610469919061237b565b60405180910390f35b34801561047e57600080fd5b50610499600480360381019061049491906124bb565b611399565b6040516104a69190612189565b60405180910390f35b3480156104bb57600080fd5b506104c4611424565b6040516104d1919061206e565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc919061248e565b6114b6565b60405161050e9190612189565b60405180910390f35b34801561052357600080fd5b5061053e600480360381019061053991906121a4565b6114d6565b6040516105569c9b9a99989796959493929190612563565b60405180910390f35b34801561056b57600080fd5b506105866004803603810190610581919061212e565b611605565b6040516105939190612189565b60405180910390f35b3480156105a857600080fd5b506105b1611628565b6040516105be919061237b565b60405180910390f35b3480156105d357600080fd5b506105ee60048036038101906105e99190612624565b611630565b6040516105fb919061237b565b60405180910390f35b34801561061057600080fd5b5061062b600480360381019061062691906126ba565b6116b7565b604051610638919061237b565b60405180910390f35b60606003805461065090612749565b80601f016020809104026020016040519081016040528092919081815260200182805461067c90612749565b80156106c95780601f1061069e576101008083540402835291602001916106c9565b820191906000526020600020905b8154815290600101906020018083116106ac57829003601f168201915b5050505050905090565b6000806106de6117cb565b90506106eb8185856117d3565b600191505092915050565b600a6020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600301805461076b90612749565b80601f016020809104026020016040519081016040528092919081815260200182805461079790612749565b80156107e45780601f106107b9576101008083540402835291602001916107e4565b820191906000526020600020905b8154815290600101906020018083116107c757829003601f168201915b5050505050905084565b6000803411610832576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610829906127ec565b60405180910390fd5b6001871015610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086d90612858565b60405180910390fd5b651cae8c13e0008711156108bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b6906128c4565b60405180910390fd5b6313de43558587633b9aca006108d59190612913565b6108df9190612984565b1015610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091790612a01565b60405180910390fd5b84861115610963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095a90612a6d565b60405180910390fd5b6000600a60008a81526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0490612ad9565b60405180910390fd5b60096000815480929190610a2090612af9565b9190505591506000600860008481526020019081526020016000209050338160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508981600101819055503481600501819055508688633b9aca00610aa39190612913565b610aad9190612984565b81600601819055508881600701819055508842610aca9190612b41565b8160080181905550828160000181905550858160090160026101000a81548160ff021916908315150217905550848482600a019182610b0a929190612d5b565b50610b398260020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16346117e5565b610b76818360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600234610b6f9190612984565b6001611867565b610bb3818360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600234610bac9190612984565b6000611867565b7f6e5c598b821d7fa8550e5fea58ab6e27c59e1cbe1df75a8591aa0c453b49e10a83604051610be2919061237b565b60405180910390a15050979650505050505050565b60065481565b600b5481565b6000806008600084815260200190815260200160002090506000600a600083600101548152602001908152602001600020905081600801544211610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7390612e9d565b60405180910390fd5b600015158260090160009054906101000a900460ff16151514610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb90612f09565b60405180910390fd5b600080600080600090505b8560040154811015610d505785600301600082815260200190815260200160002091508160010160009054906101000a900460ff1615610d3057816002015484610d299190612b41565b9350610d43565b816002015483610d409190612b41565b92505b8080600101915050610cdf565b508460060154610d5e61129e565b610d689190612913565b8284610d749190612b41565b633b9aca00610d839190612913565b1015610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb90612f75565b60405180910390fd5b818310159550858015610e455750600760008560020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610f53578360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166005600060066000815480929190610e8690612af9565b91905055815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008660020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b610f7b6040518060600160405280603081526020016132fb6030913984848860040154611968565b60018560090160006101000a81548160ff021916908315150217905550858560090160016101000a81548160ff0219169083151502179055507f926ee3a021d24f18cfab444988fa0338bcaa0f1e0d7c2211c07d10cbad6772948787604051610fe5929190612f95565b60405180910390a1600086610ffa5782610ffc565b835b905060008761100b578461100d565b835b9050600080600090505b88600401548110156110d05788600301600082815260200190815260200160002094508460010160009054906101000a900460ff1615158a1515036110c3576000848660020154856110699190612913565b6110739190612984565b90506110b3308760030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168389600201546110ae9190612b41565b611a0a565b80836110bf9190612b41565b9250505b8080600101915050611017565b50600081836110df9190612fbe565b9050600081111561111a57611119308960020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611a0a565b5b60005b6006548110156111e35760006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600061116961129e565b61117283611351565b8d600501546111819190612913565b61118b9190612984565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111d3573d6000803e3d6000fd5b505050808060010191505061111d565b508860090160029054906101000a900460ff1615611290578860020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1397c6e8b8b600a016040518363ffffffff1660e01b815260040161125d929190613076565b600060405180830381600087803b15801561127757600080fd5b505af115801561128b573d6000803e3d6000fd5b505050505b505050505050505050919050565b6000600254905090565b6000806112b36117cb565b90506112c0858285611afe565b6112cb858585611a0a565b60019150509392505050565b60006012905090565b600060086000858152602001908152602001600020905061130381338585611867565b50505050565b600181565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b651cae8c13e00081565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006113a58484611605565b9050801561141d578373ffffffffffffffffffffffffffffffffffffffff1663216ed6ad3385856040518463ffffffff1660e01b81526004016113ea939291906130a6565b600060405180830381600087803b15801561140457600080fd5b505af1158015611418573d6000803e3d6000fd5b505050505b9392505050565b60606004805461143390612749565b80601f016020809104026020016040519081016040528092919081815260200182805461145f90612749565b80156114ac5780601f10611481576101008083540402835291602001916114ac565b820191906000526020600020905b81548152906001019060200180831161148f57829003601f168201915b5050505050905090565b60076020528060005260406000206000915054906101000a900460ff1681565b60086020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154908060050154908060060154908060070154908060080154908060090160009054906101000a900460ff16908060090160019054906101000a900460ff16908060090160029054906101000a900460ff169080600a01805461158290612749565b80601f01602080910402602001604051908101604052809291908181526020018280546115ae90612749565b80156115fb5780601f106115d0576101008083540402835291602001916115fb565b820191906000526020600020905b8154815290600101906020018083116115de57829003601f168201915b505050505090508c565b6000806116106117cb565b905061161d818585611a0a565b600191505092915050565b6313de435581565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600b60008154809291906116cc90612af9565b9190505590506000600a60008381526020019081526020016000209050848160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550338160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818160000181905550838382600301918261178b929190613143565b507f60b94e7764708712b927071922e2d834b79011347c7b80aed74caeeece2eed4c826040516117bb919061237b565b60405180910390a1509392505050565b600033905090565b6117e08383836001611b92565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118575760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161184e9190612473565b60405180910390fd5b61186360008383611d69565b5050565b83600801544211156118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a59061325f565b60405180910390fd5b6118b9833084611a0a565b60008460040160008154809291906118d090612af9565b91905055905060008560030160008381526020019081526020016000209050848160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828160010160006101000a81548160ff021916908315150217905550838160020181905550818160000181905550505050505050565b611a0484848484604051602401611982949392919061327f565b6040516020818303038152906040527fa7a87853000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f8e565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a7c5760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611a739190612473565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611aee5760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611ae59190612473565b60405180910390fd5b611af9838383611d69565b505050565b6000611b0a8484611630565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611b8c5781811015611b7c578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611b73939291906130a6565b60405180910390fd5b611b8b84848484036000611b92565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c045760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611bfb9190612473565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c765760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611c6d9190612473565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015611d63578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611d5a919061237b565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611dbb578060026000828254611daf9190612b41565b92505081905550611e8e565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611e47578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611e3e939291906130a6565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ed75780600260008282540392505081905550611f24565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f81919061237b565b60405180910390a3505050565b611fa581611f9d611fa8611fc9565b63ffffffff16565b50565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b611fd4819050919050565b611fdc6132cb565b565b600081519050919050565b600082825260208201905092915050565b60005b83811015612018578082015181840152602081019050611ffd565b60008484015250505050565b6000601f19601f8301169050919050565b600061204082611fde565b61204a8185611fe9565b935061205a818560208601611ffa565b61206381612024565b840191505092915050565b600060208201905081810360008301526120888184612035565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006120c58261209a565b9050919050565b6120d5816120ba565b81146120e057600080fd5b50565b6000813590506120f2816120cc565b92915050565b6000819050919050565b61210b816120f8565b811461211657600080fd5b50565b60008135905061212881612102565b92915050565b6000806040838503121561214557612144612090565b5b6000612153858286016120e3565b925050602061216485828601612119565b9150509250929050565b60008115159050919050565b6121838161216e565b82525050565b600060208201905061219e600083018461217a565b92915050565b6000602082840312156121ba576121b9612090565b5b60006121c884828501612119565b91505092915050565b6121da816120f8565b82525050565b6121e9816120ba565b82525050565b600060808201905061220460008301876121d1565b61221160208301866121e0565b61221e60408301856121e0565b81810360608301526122308184612035565b905095945050505050565b6122448161216e565b811461224f57600080fd5b50565b6000813590506122618161223b565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261228c5761228b612267565b5b8235905067ffffffffffffffff8111156122a9576122a861226c565b5b6020830191508360018202830111156122c5576122c4612271565b5b9250929050565b600080600080600080600060c0888a0312156122eb576122ea612090565b5b60006122f98a828b01612119565b975050602061230a8a828b01612119565b965050604061231b8a828b01612119565b955050606061232c8a828b01612119565b945050608061233d8a828b01612252565b93505060a088013567ffffffffffffffff81111561235e5761235d612095565b5b61236a8a828b01612276565b925092505092959891949750929550565b600060208201905061239060008301846121d1565b92915050565b6000806000606084860312156123af576123ae612090565b5b60006123bd868287016120e3565b93505060206123ce868287016120e3565b92505060406123df86828701612119565b9150509250925092565b600060ff82169050919050565b6123ff816123e9565b82525050565b600060208201905061241a60008301846123f6565b92915050565b60008060006060848603121561243957612438612090565b5b600061244786828701612119565b935050602061245886828701612119565b925050604061246986828701612252565b9150509250925092565b600060208201905061248860008301846121e0565b92915050565b6000602082840312156124a4576124a3612090565b5b60006124b2848285016120e3565b91505092915050565b6000806000606084860312156124d4576124d3612090565b5b60006124e2868287016120e3565b93505060206124f386828701612119565b925050604061250486828701612119565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b60006125358261250e565b61253f8185612519565b935061254f818560208601611ffa565b61255881612024565b840191505092915050565b600061018082019050612579600083018f6121d1565b612586602083018e6121d1565b612593604083018d6121e0565b6125a0606083018c6121d1565b6125ad608083018b6121d1565b6125ba60a083018a6121d1565b6125c760c08301896121d1565b6125d460e08301886121d1565b6125e261010083018761217a565b6125f061012083018661217a565b6125fe61014083018561217a565b818103610160830152612611818461252a565b90509d9c50505050505050505050505050565b6000806040838503121561263b5761263a612090565b5b6000612649858286016120e3565b925050602061265a858286016120e3565b9150509250929050565b60008083601f84011261267a57612679612267565b5b8235905067ffffffffffffffff8111156126975761269661226c565b5b6020830191508360018202830111156126b3576126b2612271565b5b9250929050565b6000806000604084860312156126d3576126d2612090565b5b60006126e1868287016120e3565b935050602084013567ffffffffffffffff81111561270257612701612095565b5b61270e86828701612664565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061276157607f821691505b6020821081036127745761277361271a565b5b50919050565b7f46656520697320726571756972656420746f20696e6974696174652076616c6960008201527f646174696f6e20706f6f6c000000000000000000000000000000000000000000602082015250565b60006127d6602b83611fe9565b91506127e18261277a565b604082019050919050565b60006020820190508181036000830152612805816127c9565b9050919050565b7f4475726174696f6e20697320746f6f2073686f72740000000000000000000000600082015250565b6000612842601583611fe9565b915061284d8261280c565b602082019050919050565b6000602082019050818103600083015261287181612835565b9050919050565b7f4475726174696f6e20697320746f6f206c6f6e67000000000000000000000000600082015250565b60006128ae601483611fe9565b91506128b982612878565b602082019050919050565b600060208201905081810360008301526128dd816128a1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061291e826120f8565b9150612929836120f8565b9250828202612937816120f8565b9150828204841483151761294e5761294d6128e4565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061298f826120f8565b915061299a836120f8565b9250826129aa576129a9612955565b5b828204905092915050565b7f51756f72756d2069732062656c6f77206d696e696d756d000000000000000000600082015250565b60006129eb601783611fe9565b91506129f6826129b5565b602082019050919050565b60006020820190508181036000830152612a1a816129de565b9050919050565b7f51756f72756d2069732067726561746572207468616e206f6e65000000000000600082015250565b6000612a57601a83611fe9565b9150612a6282612a21565b602082019050919050565b60006020820190508181036000830152612a8681612a4a565b9050919050565b7f54617267657420706f7374206e6f7420666f756e640000000000000000000000600082015250565b6000612ac3601583611fe9565b9150612ace82612a8d565b602082019050919050565b60006020820190508181036000830152612af281612ab6565b9050919050565b6000612b04826120f8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612b3657612b356128e4565b5b600182019050919050565b6000612b4c826120f8565b9150612b57836120f8565b9250828201905080821115612b6f57612b6e6128e4565b5b92915050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612c117fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612bd4565b612c1b8683612bd4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612c58612c53612c4e846120f8565b612c33565b6120f8565b9050919050565b6000819050919050565b612c7283612c3d565b612c86612c7e82612c5f565b848454612be1565b825550505050565b600090565b612c9b612c8e565b612ca6818484612c69565b505050565b5b81811015612cca57612cbf600082612c93565b600181019050612cac565b5050565b601f821115612d0f57612ce081612baf565b612ce984612bc4565b81016020851015612cf8578190505b612d0c612d0485612bc4565b830182612cab565b50505b505050565b600082821c905092915050565b6000612d3260001984600802612d14565b1980831691505092915050565b6000612d4b8383612d21565b9150826002028217905092915050565b612d658383612b75565b67ffffffffffffffff811115612d7e57612d7d612b80565b5b612d888254612749565b612d93828285612cce565b6000601f831160018114612dc25760008415612db0578287013590505b612dba8582612d3f565b865550612e22565b601f198416612dd086612baf565b60005b82811015612df857848901358255600182019150602085019450602081019050612dd3565b86831015612e155784890135612e11601f891682612d21565b8355505b6001600288020188555050505b50505050505050565b7f506f6f6c20656e642074696d6520686173206e6f74207965742061727269766560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e87602183611fe9565b9150612e9282612e2b565b604082019050919050565b60006020820190508181036000830152612eb681612e7a565b9050919050565b7f506f6f6c20697320616c7265616479207265736f6c7665640000000000000000600082015250565b6000612ef3601883611fe9565b9150612efe82612ebd565b602082019050919050565b60006020820190508181036000830152612f2281612ee6565b9050919050565b7f51756f72756d20666f72207468697320706f6f6c20776173206e6f74206d6574600082015250565b6000612f5f602083611fe9565b9150612f6a82612f29565b602082019050919050565b60006020820190508181036000830152612f8e81612f52565b9050919050565b6000604082019050612faa60008301856121d1565b612fb7602083018461217a565b9392505050565b6000612fc9826120f8565b9150612fd4836120f8565b9250828203905081811115612fec57612feb6128e4565b5b92915050565b60008154612fff81612749565b6130098186612519565b94506001821660008114613024576001811461303a5761306d565b60ff19831686528115156020028601935061306d565b61304385612baf565b60005b8381101561306557815481890152600182019150602081019050613046565b808801955050505b50505092915050565b600060408201905061308b600083018561217a565b818103602083015261309d8184612ff2565b90509392505050565b60006060820190506130bb60008301866121e0565b6130c860208301856121d1565b6130d560408301846121d1565b949350505050565b600082905092915050565b60008190508160005260206000209050919050565b601f82111561313e5761310f816130e8565b61311884612bc4565b81016020851015613127578190505b61313b61313385612bc4565b830182612cab565b50505b505050565b61314d83836130dd565b67ffffffffffffffff81111561316657613165612b80565b5b6131708254612749565b61317b8282856130fd565b6000601f8311600181146131aa5760008415613198578287013590505b6131a28582612d3f565b86555061320a565b601f1984166131b8866130e8565b60005b828110156131e0578489013582556001820191506020850194506020810190506131bb565b868310156131fd57848901356131f9601f891682612d21565b8355505b6001600288020188555050505b50505050505050565b7f506f6f6c20656e642074696d6520686173207061737365640000000000000000600082015250565b6000613249601883611fe9565b915061325482613213565b602082019050919050565b600060208201905081810360008301526132788161323c565b9050919050565b600060808201905081810360008301526132998187612035565b90506132a860208301866121d1565b6132b560408301856121d1565b6132c260608301846121d1565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fdfe7374616b6564466f723a2025642c207374616b6564416761696e73743a2025642c207374616b65436f756e743a202564a26469706673582212204aed0732d16704c2940d3e42d7f895f3d9e744959416cb2c6c5dd7a729b3e22464736f6c63430008180033", - "deployedBytecode": "0x60806040526004361061014b5760003560e01c80635daf08ca116100b6578063a230c5241161006f578063a230c524146104da578063a233627914610517578063a9059cbb1461055f578063d6ba43841461059c578063dd62ed3e146105c7578063ff869240146106045761014b565b80635daf08ca146103a2578063642b5bfb146103df5780636db5c8fd1461040a57806370a0823114610435578063883802741461047257806395d89b41146104af5761014b565b806317c182171161010857806317c182171461027e57806318160ddd146102bb57806323b872dd146102e6578063313ce56714610323578063561b24631461034e57806356715761146103775761014b565b806306fdde0314610150578063095ea7b31461017b5780630b1e7f83146101b85780630ce7e299146101f857806311aee3801461022857806317906c2e14610253575b600080fd5b34801561015c57600080fd5b50610165610641565b604051610172919061206e565b60405180910390f35b34801561018757600080fd5b506101a2600480360381019061019d919061212e565b6106d3565b6040516101af9190612189565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da91906121a4565b6106f6565b6040516101ef94939291906121ef565b60405180910390f35b610212600480360381019061020d91906122cc565b6107ee565b60405161021f919061237b565b60405180910390f35b34801561023457600080fd5b5061023d610bf7565b60405161024a919061237b565b60405180910390f35b34801561025f57600080fd5b50610268610bfd565b604051610275919061237b565b60405180910390f35b34801561028a57600080fd5b506102a560048036038101906102a091906121a4565b610c03565b6040516102b29190612189565b60405180910390f35b3480156102c757600080fd5b506102d061129e565b6040516102dd919061237b565b60405180910390f35b3480156102f257600080fd5b5061030d60048036038101906103089190612396565b6112a8565b60405161031a9190612189565b60405180910390f35b34801561032f57600080fd5b506103386112d7565b6040516103459190612405565b60405180910390f35b34801561035a57600080fd5b5061037560048036038101906103709190612420565b6112e0565b005b34801561038357600080fd5b5061038c611309565b604051610399919061237b565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c491906121a4565b61130e565b6040516103d69190612473565b60405180910390f35b3480156103eb57600080fd5b506103f4611341565b604051610401919061237b565b60405180910390f35b34801561041657600080fd5b5061041f611347565b60405161042c919061237b565b60405180910390f35b34801561044157600080fd5b5061045c6004803603810190610457919061248e565b611351565b604051610469919061237b565b60405180910390f35b34801561047e57600080fd5b50610499600480360381019061049491906124bb565b611399565b6040516104a69190612189565b60405180910390f35b3480156104bb57600080fd5b506104c4611424565b6040516104d1919061206e565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc919061248e565b6114b6565b60405161050e9190612189565b60405180910390f35b34801561052357600080fd5b5061053e600480360381019061053991906121a4565b6114d6565b6040516105569c9b9a99989796959493929190612563565b60405180910390f35b34801561056b57600080fd5b506105866004803603810190610581919061212e565b611605565b6040516105939190612189565b60405180910390f35b3480156105a857600080fd5b506105b1611628565b6040516105be919061237b565b60405180910390f35b3480156105d357600080fd5b506105ee60048036038101906105e99190612624565b611630565b6040516105fb919061237b565b60405180910390f35b34801561061057600080fd5b5061062b600480360381019061062691906126ba565b6116b7565b604051610638919061237b565b60405180910390f35b60606003805461065090612749565b80601f016020809104026020016040519081016040528092919081815260200182805461067c90612749565b80156106c95780601f1061069e576101008083540402835291602001916106c9565b820191906000526020600020905b8154815290600101906020018083116106ac57829003601f168201915b5050505050905090565b6000806106de6117cb565b90506106eb8185856117d3565b600191505092915050565b600a6020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600301805461076b90612749565b80601f016020809104026020016040519081016040528092919081815260200182805461079790612749565b80156107e45780601f106107b9576101008083540402835291602001916107e4565b820191906000526020600020905b8154815290600101906020018083116107c757829003601f168201915b5050505050905084565b6000803411610832576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610829906127ec565b60405180910390fd5b6001871015610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086d90612858565b60405180910390fd5b651cae8c13e0008711156108bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b6906128c4565b60405180910390fd5b6313de43558587633b9aca006108d59190612913565b6108df9190612984565b1015610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091790612a01565b60405180910390fd5b84861115610963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095a90612a6d565b60405180910390fd5b6000600a60008a81526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0490612ad9565b60405180910390fd5b60096000815480929190610a2090612af9565b9190505591506000600860008481526020019081526020016000209050338160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508981600101819055503481600501819055508688633b9aca00610aa39190612913565b610aad9190612984565b81600601819055508881600701819055508842610aca9190612b41565b8160080181905550828160000181905550858160090160026101000a81548160ff021916908315150217905550848482600a019182610b0a929190612d5b565b50610b398260020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16346117e5565b610b76818360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600234610b6f9190612984565b6001611867565b610bb3818360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600234610bac9190612984565b6000611867565b7f6e5c598b821d7fa8550e5fea58ab6e27c59e1cbe1df75a8591aa0c453b49e10a83604051610be2919061237b565b60405180910390a15050979650505050505050565b60065481565b600b5481565b6000806008600084815260200190815260200160002090506000600a600083600101548152602001908152602001600020905081600801544211610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7390612e9d565b60405180910390fd5b600015158260090160009054906101000a900460ff16151514610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb90612f09565b60405180910390fd5b600080600080600090505b8560040154811015610d505785600301600082815260200190815260200160002091508160010160009054906101000a900460ff1615610d3057816002015484610d299190612b41565b9350610d43565b816002015483610d409190612b41565b92505b8080600101915050610cdf565b508460060154610d5e61129e565b610d689190612913565b8284610d749190612b41565b633b9aca00610d839190612913565b1015610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb90612f75565b60405180910390fd5b818310159550858015610e455750600760008560020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610f53578360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166005600060066000815480929190610e8690612af9565b91905055815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008660020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b610f7b6040518060600160405280603081526020016132fb6030913984848860040154611968565b60018560090160006101000a81548160ff021916908315150217905550858560090160016101000a81548160ff0219169083151502179055507f926ee3a021d24f18cfab444988fa0338bcaa0f1e0d7c2211c07d10cbad6772948787604051610fe5929190612f95565b60405180910390a1600086610ffa5782610ffc565b835b905060008761100b578461100d565b835b9050600080600090505b88600401548110156110d05788600301600082815260200190815260200160002094508460010160009054906101000a900460ff1615158a1515036110c3576000848660020154856110699190612913565b6110739190612984565b90506110b3308760030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168389600201546110ae9190612b41565b611a0a565b80836110bf9190612b41565b9250505b8080600101915050611017565b50600081836110df9190612fbe565b9050600081111561111a57611119308960020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611a0a565b5b60005b6006548110156111e35760006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600061116961129e565b61117283611351565b8d600501546111819190612913565b61118b9190612984565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111d3573d6000803e3d6000fd5b505050808060010191505061111d565b508860090160029054906101000a900460ff1615611290578860020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1397c6e8b8b600a016040518363ffffffff1660e01b815260040161125d929190613076565b600060405180830381600087803b15801561127757600080fd5b505af115801561128b573d6000803e3d6000fd5b505050505b505050505050505050919050565b6000600254905090565b6000806112b36117cb565b90506112c0858285611afe565b6112cb858585611a0a565b60019150509392505050565b60006012905090565b600060086000858152602001908152602001600020905061130381338585611867565b50505050565b600181565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b651cae8c13e00081565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006113a58484611605565b9050801561141d578373ffffffffffffffffffffffffffffffffffffffff1663216ed6ad3385856040518463ffffffff1660e01b81526004016113ea939291906130a6565b600060405180830381600087803b15801561140457600080fd5b505af1158015611418573d6000803e3d6000fd5b505050505b9392505050565b60606004805461143390612749565b80601f016020809104026020016040519081016040528092919081815260200182805461145f90612749565b80156114ac5780601f10611481576101008083540402835291602001916114ac565b820191906000526020600020905b81548152906001019060200180831161148f57829003601f168201915b5050505050905090565b60076020528060005260406000206000915054906101000a900460ff1681565b60086020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154908060050154908060060154908060070154908060080154908060090160009054906101000a900460ff16908060090160019054906101000a900460ff16908060090160029054906101000a900460ff169080600a01805461158290612749565b80601f01602080910402602001604051908101604052809291908181526020018280546115ae90612749565b80156115fb5780601f106115d0576101008083540402835291602001916115fb565b820191906000526020600020905b8154815290600101906020018083116115de57829003601f168201915b505050505090508c565b6000806116106117cb565b905061161d818585611a0a565b600191505092915050565b6313de435581565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600b60008154809291906116cc90612af9565b9190505590506000600a60008381526020019081526020016000209050848160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550338160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818160000181905550838382600301918261178b929190613143565b507f60b94e7764708712b927071922e2d834b79011347c7b80aed74caeeece2eed4c826040516117bb919061237b565b60405180910390a1509392505050565b600033905090565b6117e08383836001611b92565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118575760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161184e9190612473565b60405180910390fd5b61186360008383611d69565b5050565b83600801544211156118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a59061325f565b60405180910390fd5b6118b9833084611a0a565b60008460040160008154809291906118d090612af9565b91905055905060008560030160008381526020019081526020016000209050848160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828160010160006101000a81548160ff021916908315150217905550838160020181905550818160000181905550505050505050565b611a0484848484604051602401611982949392919061327f565b6040516020818303038152906040527fa7a87853000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f8e565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a7c5760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611a739190612473565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611aee5760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611ae59190612473565b60405180910390fd5b611af9838383611d69565b505050565b6000611b0a8484611630565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611b8c5781811015611b7c578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611b73939291906130a6565b60405180910390fd5b611b8b84848484036000611b92565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c045760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611bfb9190612473565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c765760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611c6d9190612473565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015611d63578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611d5a919061237b565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611dbb578060026000828254611daf9190612b41565b92505081905550611e8e565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611e47578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611e3e939291906130a6565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ed75780600260008282540392505081905550611f24565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f81919061237b565b60405180910390a3505050565b611fa581611f9d611fa8611fc9565b63ffffffff16565b50565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b611fd4819050919050565b611fdc6132cb565b565b600081519050919050565b600082825260208201905092915050565b60005b83811015612018578082015181840152602081019050611ffd565b60008484015250505050565b6000601f19601f8301169050919050565b600061204082611fde565b61204a8185611fe9565b935061205a818560208601611ffa565b61206381612024565b840191505092915050565b600060208201905081810360008301526120888184612035565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006120c58261209a565b9050919050565b6120d5816120ba565b81146120e057600080fd5b50565b6000813590506120f2816120cc565b92915050565b6000819050919050565b61210b816120f8565b811461211657600080fd5b50565b60008135905061212881612102565b92915050565b6000806040838503121561214557612144612090565b5b6000612153858286016120e3565b925050602061216485828601612119565b9150509250929050565b60008115159050919050565b6121838161216e565b82525050565b600060208201905061219e600083018461217a565b92915050565b6000602082840312156121ba576121b9612090565b5b60006121c884828501612119565b91505092915050565b6121da816120f8565b82525050565b6121e9816120ba565b82525050565b600060808201905061220460008301876121d1565b61221160208301866121e0565b61221e60408301856121e0565b81810360608301526122308184612035565b905095945050505050565b6122448161216e565b811461224f57600080fd5b50565b6000813590506122618161223b565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261228c5761228b612267565b5b8235905067ffffffffffffffff8111156122a9576122a861226c565b5b6020830191508360018202830111156122c5576122c4612271565b5b9250929050565b600080600080600080600060c0888a0312156122eb576122ea612090565b5b60006122f98a828b01612119565b975050602061230a8a828b01612119565b965050604061231b8a828b01612119565b955050606061232c8a828b01612119565b945050608061233d8a828b01612252565b93505060a088013567ffffffffffffffff81111561235e5761235d612095565b5b61236a8a828b01612276565b925092505092959891949750929550565b600060208201905061239060008301846121d1565b92915050565b6000806000606084860312156123af576123ae612090565b5b60006123bd868287016120e3565b93505060206123ce868287016120e3565b92505060406123df86828701612119565b9150509250925092565b600060ff82169050919050565b6123ff816123e9565b82525050565b600060208201905061241a60008301846123f6565b92915050565b60008060006060848603121561243957612438612090565b5b600061244786828701612119565b935050602061245886828701612119565b925050604061246986828701612252565b9150509250925092565b600060208201905061248860008301846121e0565b92915050565b6000602082840312156124a4576124a3612090565b5b60006124b2848285016120e3565b91505092915050565b6000806000606084860312156124d4576124d3612090565b5b60006124e2868287016120e3565b93505060206124f386828701612119565b925050604061250486828701612119565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b60006125358261250e565b61253f8185612519565b935061254f818560208601611ffa565b61255881612024565b840191505092915050565b600061018082019050612579600083018f6121d1565b612586602083018e6121d1565b612593604083018d6121e0565b6125a0606083018c6121d1565b6125ad608083018b6121d1565b6125ba60a083018a6121d1565b6125c760c08301896121d1565b6125d460e08301886121d1565b6125e261010083018761217a565b6125f061012083018661217a565b6125fe61014083018561217a565b818103610160830152612611818461252a565b90509d9c50505050505050505050505050565b6000806040838503121561263b5761263a612090565b5b6000612649858286016120e3565b925050602061265a858286016120e3565b9150509250929050565b60008083601f84011261267a57612679612267565b5b8235905067ffffffffffffffff8111156126975761269661226c565b5b6020830191508360018202830111156126b3576126b2612271565b5b9250929050565b6000806000604084860312156126d3576126d2612090565b5b60006126e1868287016120e3565b935050602084013567ffffffffffffffff81111561270257612701612095565b5b61270e86828701612664565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061276157607f821691505b6020821081036127745761277361271a565b5b50919050565b7f46656520697320726571756972656420746f20696e6974696174652076616c6960008201527f646174696f6e20706f6f6c000000000000000000000000000000000000000000602082015250565b60006127d6602b83611fe9565b91506127e18261277a565b604082019050919050565b60006020820190508181036000830152612805816127c9565b9050919050565b7f4475726174696f6e20697320746f6f2073686f72740000000000000000000000600082015250565b6000612842601583611fe9565b915061284d8261280c565b602082019050919050565b6000602082019050818103600083015261287181612835565b9050919050565b7f4475726174696f6e20697320746f6f206c6f6e67000000000000000000000000600082015250565b60006128ae601483611fe9565b91506128b982612878565b602082019050919050565b600060208201905081810360008301526128dd816128a1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061291e826120f8565b9150612929836120f8565b9250828202612937816120f8565b9150828204841483151761294e5761294d6128e4565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061298f826120f8565b915061299a836120f8565b9250826129aa576129a9612955565b5b828204905092915050565b7f51756f72756d2069732062656c6f77206d696e696d756d000000000000000000600082015250565b60006129eb601783611fe9565b91506129f6826129b5565b602082019050919050565b60006020820190508181036000830152612a1a816129de565b9050919050565b7f51756f72756d2069732067726561746572207468616e206f6e65000000000000600082015250565b6000612a57601a83611fe9565b9150612a6282612a21565b602082019050919050565b60006020820190508181036000830152612a8681612a4a565b9050919050565b7f54617267657420706f7374206e6f7420666f756e640000000000000000000000600082015250565b6000612ac3601583611fe9565b9150612ace82612a8d565b602082019050919050565b60006020820190508181036000830152612af281612ab6565b9050919050565b6000612b04826120f8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612b3657612b356128e4565b5b600182019050919050565b6000612b4c826120f8565b9150612b57836120f8565b9250828201905080821115612b6f57612b6e6128e4565b5b92915050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612c117fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612bd4565b612c1b8683612bd4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612c58612c53612c4e846120f8565b612c33565b6120f8565b9050919050565b6000819050919050565b612c7283612c3d565b612c86612c7e82612c5f565b848454612be1565b825550505050565b600090565b612c9b612c8e565b612ca6818484612c69565b505050565b5b81811015612cca57612cbf600082612c93565b600181019050612cac565b5050565b601f821115612d0f57612ce081612baf565b612ce984612bc4565b81016020851015612cf8578190505b612d0c612d0485612bc4565b830182612cab565b50505b505050565b600082821c905092915050565b6000612d3260001984600802612d14565b1980831691505092915050565b6000612d4b8383612d21565b9150826002028217905092915050565b612d658383612b75565b67ffffffffffffffff811115612d7e57612d7d612b80565b5b612d888254612749565b612d93828285612cce565b6000601f831160018114612dc25760008415612db0578287013590505b612dba8582612d3f565b865550612e22565b601f198416612dd086612baf565b60005b82811015612df857848901358255600182019150602085019450602081019050612dd3565b86831015612e155784890135612e11601f891682612d21565b8355505b6001600288020188555050505b50505050505050565b7f506f6f6c20656e642074696d6520686173206e6f74207965742061727269766560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e87602183611fe9565b9150612e9282612e2b565b604082019050919050565b60006020820190508181036000830152612eb681612e7a565b9050919050565b7f506f6f6c20697320616c7265616479207265736f6c7665640000000000000000600082015250565b6000612ef3601883611fe9565b9150612efe82612ebd565b602082019050919050565b60006020820190508181036000830152612f2281612ee6565b9050919050565b7f51756f72756d20666f72207468697320706f6f6c20776173206e6f74206d6574600082015250565b6000612f5f602083611fe9565b9150612f6a82612f29565b602082019050919050565b60006020820190508181036000830152612f8e81612f52565b9050919050565b6000604082019050612faa60008301856121d1565b612fb7602083018461217a565b9392505050565b6000612fc9826120f8565b9150612fd4836120f8565b9250828203905081811115612fec57612feb6128e4565b5b92915050565b60008154612fff81612749565b6130098186612519565b94506001821660008114613024576001811461303a5761306d565b60ff19831686528115156020028601935061306d565b61304385612baf565b60005b8381101561306557815481890152600182019150602081019050613046565b808801955050505b50505092915050565b600060408201905061308b600083018561217a565b818103602083015261309d8184612ff2565b90509392505050565b60006060820190506130bb60008301866121e0565b6130c860208301856121d1565b6130d560408301846121d1565b949350505050565b600082905092915050565b60008190508160005260206000209050919050565b601f82111561313e5761310f816130e8565b61311884612bc4565b81016020851015613127578190505b61313b61313385612bc4565b830182612cab565b50505b505050565b61314d83836130dd565b67ffffffffffffffff81111561316657613165612b80565b5b6131708254612749565b61317b8282856130fd565b6000601f8311600181146131aa5760008415613198578287013590505b6131a28582612d3f565b86555061320a565b601f1984166131b8866130e8565b60005b828110156131e0578489013582556001820191506020850194506020810190506131bb565b868310156131fd57848901356131f9601f891682612d21565b8355505b6001600288020188555050505b50505050505050565b7f506f6f6c20656e642074696d6520686173207061737365640000000000000000600082015250565b6000613249601883611fe9565b915061325482613213565b602082019050919050565b600060208201905081810360008301526132788161323c565b9050919050565b600060808201905081810360008301526132998187612035565b90506132a860208301866121d1565b6132b560408301856121d1565b6132c260608301846121d1565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fdfe7374616b6564466f723a2025642c207374616b6564416761696e73743a2025642c207374616b65436f756e743a202564a26469706673582212204aed0732d16704c2940d3e42d7f895f3d9e744959416cb2c6c5dd7a729b3e22464736f6c63430008180033", + "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600a81526020017f52657075746174696f6e000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f524550000000000000000000000000000000000000000000000000000000000081525081600390816200008f919062000324565b508060049081620000a1919062000324565b5050506200040b565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200012c57607f821691505b602082108103620001425762000141620000e4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620001ac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200016d565b620001b886836200016d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000205620001ff620001f984620001d0565b620001da565b620001d0565b9050919050565b6000819050919050565b6200022183620001e4565b6200023962000230826200020c565b8484546200017a565b825550505050565b600090565b6200025062000241565b6200025d81848462000216565b505050565b5b8181101562000285576200027960008262000246565b60018101905062000263565b5050565b601f821115620002d4576200029e8162000148565b620002a9846200015d565b81016020851015620002b9578190505b620002d1620002c8856200015d565b83018262000262565b50505b505050565b600082821c905092915050565b6000620002f960001984600802620002d9565b1980831691505092915050565b6000620003148383620002e6565b9150826002028217905092915050565b6200032f82620000aa565b67ffffffffffffffff8111156200034b576200034a620000b5565b5b62000357825462000113565b6200036482828562000289565b600060209050601f8311600181146200039c576000841562000387578287015190505b62000393858262000306565b86555062000403565b601f198416620003ac8662000148565b60005b82811015620003d657848901518255600182019150602085019450602081019050620003af565b86831015620003f65784890151620003f2601f891682620002e6565b8355505b6001600288020188555050505b505050505050565b613541806200041b6000396000f3fe60806040526004361061014b5760003560e01c8063642b5bfb116100b6578063a23362791161006f578063a2336279146104e7578063a9059cbb1461052f578063afa845601461056c578063d6ba43841461059c578063dd62ed3e146105c7578063ff869240146106045761014b565b8063642b5bfb146103af5780636db5c8fd146103da57806370a0823114610405578063883802741461044257806395d89b411461047f578063a230c524146104aa5761014b565b806318160ddd1161010857806318160ddd1461028b57806323b872dd146102b6578063313ce567146102f3578063561b24631461031e57806356715761146103475780635daf08ca146103725761014b565b806306fdde0314610150578063095ea7b31461017b5780630b1e7f83146101b857806311aee380146101f857806317906c2e1461022357806317c182171461024e575b600080fd5b34801561015c57600080fd5b50610165610641565b6040516101729190612205565b60405180910390f35b34801561018757600080fd5b506101a2600480360381019061019d91906122c5565b6106d3565b6040516101af9190612320565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da919061233b565b6106f6565b6040516101ef9493929190612386565b60405180910390f35b34801561020457600080fd5b5061020d6107ee565b60405161021a91906123d2565b60405180910390f35b34801561022f57600080fd5b506102386107f4565b60405161024591906123d2565b60405180910390f35b34801561025a57600080fd5b506102756004803603810190610270919061233b565b6107fa565b6040516102829190612320565b60405180910390f35b34801561029757600080fd5b506102a0610fcd565b6040516102ad91906123d2565b60405180910390f35b3480156102c257600080fd5b506102dd60048036038101906102d891906123ed565b610fd7565b6040516102ea9190612320565b60405180910390f35b3480156102ff57600080fd5b50610308611006565b604051610315919061245c565b60405180910390f35b34801561032a57600080fd5b50610345600480360381019061034091906124a3565b61100f565b005b34801561035357600080fd5b5061035c61103a565b60405161036991906123d2565b60405180910390f35b34801561037e57600080fd5b506103996004803603810190610394919061233b565b61103f565b6040516103a691906124f6565b60405180910390f35b3480156103bb57600080fd5b506103c4611072565b6040516103d191906123d2565b60405180910390f35b3480156103e657600080fd5b506103ef611078565b6040516103fc91906123d2565b60405180910390f35b34801561041157600080fd5b5061042c60048036038101906104279190612511565b611082565b60405161043991906123d2565b60405180910390f35b34801561044e57600080fd5b506104696004803603810190610464919061253e565b6110ca565b6040516104769190612320565b60405180910390f35b34801561048b57600080fd5b50610494611155565b6040516104a19190612205565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc9190612511565b6111e7565b6040516104de9190612320565b60405180910390f35b3480156104f357600080fd5b5061050e6004803603810190610509919061233b565b611207565b6040516105269c9b9a99989796959493929190612646565b60405180910390f35b34801561053b57600080fd5b50610556600480360381019061055191906122c5565b61136f565b6040516105639190612320565b60405180910390f35b6105866004803603810190610581919061276e565b611392565b60405161059391906123d2565b60405180910390f35b3480156105a857600080fd5b506105b1611812565b6040516105be91906123d2565b60405180910390f35b3480156105d357600080fd5b506105ee60048036038101906105e99190612844565b61181a565b6040516105fb91906123d2565b60405180910390f35b34801561061057600080fd5b5061062b600480360381019061062691906128da565b6118a1565b60405161063891906123d2565b60405180910390f35b60606003805461065090612969565b80601f016020809104026020016040519081016040528092919081815260200182805461067c90612969565b80156106c95780601f1061069e576101008083540402835291602001916106c9565b820191906000526020600020905b8154815290600101906020018083116106ac57829003601f168201915b5050505050905090565b6000806106de6119b5565b90506106eb8185856119bd565b600191505092915050565b600a6020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600301805461076b90612969565b80601f016020809104026020016040519081016040528092919081815260200182805461079790612969565b80156107e45780601f106107b9576101008083540402835291602001916107e4565b820191906000526020600020905b8154815290600101906020018083116107c757829003601f168201915b5050505050905084565b60065481565b600b5481565b6000806008600084815260200190815260200160002090506000600a600083600101548152602001908152602001600020905081600a01544211610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086a90612a0c565b60405180910390fd5b6000151582600b0160009054906101000a900460ff161515146108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c290612a78565b60405180910390fd5b600080600080600090505b85600401548110156109475785600301600082815260200190815260200160002091508160010160009054906101000a900460ff1615610927578160020154846109209190612ac7565b935061093a565b8160020154836109379190612ac7565b92505b80806001019150506108d6565b508460050160000154610958610fcd565b6109629190612afb565b828461096e9190612ac7565b633b9aca0061097d9190612afb565b10156109be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b590612b89565b60405180910390fd5b818310159550858015610a3f5750600760008560020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610b4d578360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166005600060066000815480929190610a8090612ba9565b91905055815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008660020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600185600b0160006101000a81548160ff0219169083151502179055508585600b0160016101000a81548160ff0219169083151502179055507f926ee3a021d24f18cfab444988fa0338bcaa0f1e0d7c2211c07d10cbad6772948787604051610bb7929190612bf1565b60405180910390a1600086610bcc5782610bce565b835b9050600087610bdd5784610bdf565b835b9050600080600090505b8860040154811015610dff57886003016000828152602001908152602001600020945060008560030160149054906101000a900460ff1680610c3c57508960050160020160009054906101000a900460ff165b905060008660030160149054906101000a900460ff16610c63578a60050160010154610c66565b60645b90508660010160009054906101000a900460ff1615158c151503610d2757600082610c92576000610cc5565b606482610c9f9190612c49565b87878a60020154610cb09190612afb565b610cba9190612c49565b610cc49190612afb565b5b90506000610cd230611082565b9050610d12308a60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848c60020154610d0d9190612ac7565b6119cf565b8186610d1e9190612ac7565b95505050610df0565b60006064826064610d389190612c7a565b8960020154610d479190612afb565b610d519190612c49565b90506000610d5e30611082565b90506000821115610d9957610d98308a60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846119cf565b5b83610ddf57600060648e600501600101548b60020154610db99190612afb565b610dc39190612c49565b9050610dcf3082611bf4565b8087610ddb9190612ac7565b9650505b8186610deb9190612ac7565b955050505b50508080600101915050610be9565b5060008183610e0e9190612c7a565b90506000811115610e4957610e48308960020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836119cf565b5b60005b600654811015610f125760006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000610e98610fcd565b610ea183611082565b8d60080154610eb09190612afb565b610eba9190612c49565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f02573d6000803e3d6000fd5b5050508080600101915050610e4c565b5088600b0160029054906101000a900460ff1615610fbf578860020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1397c6e8b8b600c016040518363ffffffff1660e01b8152600401610f8c929190612d47565b600060405180830381600087803b158015610fa657600080fd5b505af1158015610fba573d6000803e3d6000fd5b505050505b505050505050505050919050565b6000600254905090565b600080610fe26119b5565b9050610fef858285611c76565b610ffa858585611d0a565b60019150509392505050565b60006012905090565b6000600860008581526020019081526020016000209050611034813385856000611dfe565b50505050565b600181565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b651cae8c13e00081565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006110d6848461136f565b9050801561114e578373ffffffffffffffffffffffffffffffffffffffff1663216ed6ad3385856040518463ffffffff1660e01b815260040161111b93929190612d77565b600060405180830381600087803b15801561113557600080fd5b505af1158015611149573d6000803e3d6000fd5b505050505b9392505050565b60606004805461116490612969565b80601f016020809104026020016040519081016040528092919081815260200182805461119090612969565b80156111dd5780601f106111b2576101008083540402835291602001916111dd565b820191906000526020600020905b8154815290600101906020018083116111c057829003601f168201915b5050505050905090565b60076020528060005260406000206000915054906101000a900460ff1681565b60086020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154908060050160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff1615151515815250509080600801549080600901549080600a01549080600b0160009054906101000a900460ff169080600b0160019054906101000a900460ff169080600b0160029054906101000a900460ff169080600c0180546112ec90612969565b80601f016020809104026020016040519081016040528092919081815260200182805461131890612969565b80156113655780601f1061133a57610100808354040283529160200191611365565b820191906000526020600020905b81548152906001019060200180831161134857829003601f168201915b505050505090508c565b60008061137a6119b5565b9050611387818585611d0a565b600191505092915050565b60008034116113d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cd90612e20565b60405180910390fd5b600189101561141a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141190612e8c565b60405180910390fd5b651cae8c13e000891115611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90612ef8565b60405180910390fd5b6313de43558789633b9aca006114799190612afb565b6114839190612c49565b10156114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb90612f64565b60405180910390fd5b86881115611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe90612fd0565b60405180910390fd5b606486111561154b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115429061303c565b60405180910390fd5b6000600a60008c81526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec906130a8565b60405180910390fd5b6009600081548092919061160890612ba9565b9190505591506000600860008481526020019081526020016000209050338160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b8160010181905550348160080181905550888a633b9aca0061168b9190612afb565b6116959190612c49565b8160050160000181905550878160050160010181905550868160050160020160006101000a81548160ff0219169083151502179055508a81600901819055508a426116e09190612ac7565b81600a01819055508281600001819055508581600b0160026101000a81548160ff021916908315150217905550848482600c019182611720929190613299565b5061174f8260020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1634611f1c565b61178d818360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166002346117859190612c49565b600180611dfe565b6117cc818360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166002346117c39190612c49565b60006001611dfe565b7f6e5c598b821d7fa8550e5fea58ab6e27c59e1cbe1df75a8591aa0c453b49e10a836040516117fb91906123d2565b60405180910390a150509998505050505050505050565b6313de435581565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600b60008154809291906118b690612ba9565b9190505590506000600a60008381526020019081526020016000209050848160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550338160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081816000018190555083838260030191826119759291906133cf565b507f60b94e7764708712b927071922e2d834b79011347c7b80aed74caeeece2eed4c826040516119a591906123d2565b60405180910390a1509392505050565b600033905090565b6119ca8383836001611f9e565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a21578060026000828254611a159190612ac7565b92505081905550611af4565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611aad578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611aa493929190612d77565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b3d5780600260008282540392505081905550611b8a565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611be791906123d2565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c665760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611c5d91906124f6565b60405180910390fd5b611c72826000836119cf565b5050565b6000611c82848461181a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611d045781811015611cf4578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611ceb93929190612d77565b60405180910390fd5b611d0384848484036000611f9e565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d7c5760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611d7391906124f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dee5760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611de591906124f6565b60405180910390fd5b611df98383836119cf565b505050565b84600a0154421115611e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3c906134eb565b60405180910390fd5b611e508430856119cf565b6000856004016000815480929190611e6790612ba9565b91905055905060008660030160008381526020019081526020016000209050858160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838160010160006101000a81548160ff021916908315150217905550848160020181905550818160000181905550828160030160146101000a81548160ff02191690831515021790555050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f8e5760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611f8591906124f6565b60405180910390fd5b611f9a600083836119cf565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036120105760006040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161200791906124f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120825760006040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161207991906124f6565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550801561216f578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161216691906123d2565b60405180910390a35b50505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156121af578082015181840152602081019050612194565b60008484015250505050565b6000601f19601f8301169050919050565b60006121d782612175565b6121e18185612180565b93506121f1818560208601612191565b6121fa816121bb565b840191505092915050565b6000602082019050818103600083015261221f81846121cc565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061225c82612231565b9050919050565b61226c81612251565b811461227757600080fd5b50565b60008135905061228981612263565b92915050565b6000819050919050565b6122a28161228f565b81146122ad57600080fd5b50565b6000813590506122bf81612299565b92915050565b600080604083850312156122dc576122db612227565b5b60006122ea8582860161227a565b92505060206122fb858286016122b0565b9150509250929050565b60008115159050919050565b61231a81612305565b82525050565b60006020820190506123356000830184612311565b92915050565b60006020828403121561235157612350612227565b5b600061235f848285016122b0565b91505092915050565b6123718161228f565b82525050565b61238081612251565b82525050565b600060808201905061239b6000830187612368565b6123a86020830186612377565b6123b56040830185612377565b81810360608301526123c781846121cc565b905095945050505050565b60006020820190506123e76000830184612368565b92915050565b60008060006060848603121561240657612405612227565b5b60006124148682870161227a565b93505060206124258682870161227a565b9250506040612436868287016122b0565b9150509250925092565b600060ff82169050919050565b61245681612440565b82525050565b6000602082019050612471600083018461244d565b92915050565b61248081612305565b811461248b57600080fd5b50565b60008135905061249d81612477565b92915050565b6000806000606084860312156124bc576124bb612227565b5b60006124ca868287016122b0565b93505060206124db868287016122b0565b92505060406124ec8682870161248e565b9150509250925092565b600060208201905061250b6000830184612377565b92915050565b60006020828403121561252757612526612227565b5b60006125358482850161227a565b91505092915050565b60008060006060848603121561255757612556612227565b5b60006125658682870161227a565b9350506020612576868287016122b0565b9250506040612587868287016122b0565b9150509250925092565b61259a8161228f565b82525050565b6125a981612305565b82525050565b6060820160008201516125c56000850182612591565b5060208201516125d86020850182612591565b5060408201516125eb60408501826125a0565b50505050565b600081519050919050565b600082825260208201905092915050565b6000612618826125f1565b61262281856125fc565b9350612632818560208601612191565b61263b816121bb565b840191505092915050565b60006101c08201905061265c600083018f612368565b612669602083018e612368565b612676604083018d612377565b612683606083018c612368565b612690608083018b6125af565b61269d60e083018a612368565b6126ab610100830189612368565b6126b9610120830188612368565b6126c7610140830187612311565b6126d5610160830186612311565b6126e3610180830185612311565b8181036101a08301526126f6818461260d565b90509d9c50505050505050505050505050565b600080fd5b600080fd5b600080fd5b60008083601f84011261272e5761272d612709565b5b8235905067ffffffffffffffff81111561274b5761274a61270e565b5b60208301915083600182028301111561276757612766612713565b5b9250929050565b60008060008060008060008060006101008a8c03121561279157612790612227565b5b600061279f8c828d016122b0565b99505060206127b08c828d016122b0565b98505060406127c18c828d016122b0565b97505060606127d28c828d016122b0565b96505060806127e38c828d016122b0565b95505060a06127f48c828d0161248e565b94505060c06128058c828d0161248e565b93505060e08a013567ffffffffffffffff8111156128265761282561222c565b5b6128328c828d01612718565b92509250509295985092959850929598565b6000806040838503121561285b5761285a612227565b5b60006128698582860161227a565b925050602061287a8582860161227a565b9150509250929050565b60008083601f84011261289a57612899612709565b5b8235905067ffffffffffffffff8111156128b7576128b661270e565b5b6020830191508360018202830111156128d3576128d2612713565b5b9250929050565b6000806000604084860312156128f3576128f2612227565b5b60006129018682870161227a565b935050602084013567ffffffffffffffff8111156129225761292161222c565b5b61292e86828701612884565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061298157607f821691505b6020821081036129945761299361293a565b5b50919050565b7f506f6f6c20656e642074696d6520686173206e6f74207965742061727269766560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006129f6602183612180565b9150612a018261299a565b604082019050919050565b60006020820190508181036000830152612a25816129e9565b9050919050565b7f506f6f6c20697320616c7265616479207265736f6c7665640000000000000000600082015250565b6000612a62601883612180565b9150612a6d82612a2c565b602082019050919050565b60006020820190508181036000830152612a9181612a55565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ad28261228f565b9150612add8361228f565b9250828201905080821115612af557612af4612a98565b5b92915050565b6000612b068261228f565b9150612b118361228f565b9250828202612b1f8161228f565b91508282048414831517612b3657612b35612a98565b5b5092915050565b7f51756f72756d20666f72207468697320706f6f6c20776173206e6f74206d6574600082015250565b6000612b73602083612180565b9150612b7e82612b3d565b602082019050919050565b60006020820190508181036000830152612ba281612b66565b9050919050565b6000612bb48261228f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612be657612be5612a98565b5b600182019050919050565b6000604082019050612c066000830185612368565b612c136020830184612311565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612c548261228f565b9150612c5f8361228f565b925082612c6f57612c6e612c1a565b5b828204905092915050565b6000612c858261228f565b9150612c908361228f565b9250828203905081811115612ca857612ca7612a98565b5b92915050565b60008190508160005260206000209050919050565b60008154612cd081612969565b612cda81866125fc565b94506001821660008114612cf55760018114612d0b57612d3e565b60ff198316865281151560200286019350612d3e565b612d1485612cae565b60005b83811015612d3657815481890152600182019150602081019050612d17565b808801955050505b50505092915050565b6000604082019050612d5c6000830185612311565b8181036020830152612d6e8184612cc3565b90509392505050565b6000606082019050612d8c6000830186612377565b612d996020830185612368565b612da66040830184612368565b949350505050565b7f46656520697320726571756972656420746f20696e6974696174652076616c6960008201527f646174696f6e20706f6f6c000000000000000000000000000000000000000000602082015250565b6000612e0a602b83612180565b9150612e1582612dae565b604082019050919050565b60006020820190508181036000830152612e3981612dfd565b9050919050565b7f4475726174696f6e20697320746f6f2073686f72740000000000000000000000600082015250565b6000612e76601583612180565b9150612e8182612e40565b602082019050919050565b60006020820190508181036000830152612ea581612e69565b9050919050565b7f4475726174696f6e20697320746f6f206c6f6e67000000000000000000000000600082015250565b6000612ee2601483612180565b9150612eed82612eac565b602082019050919050565b60006020820190508181036000830152612f1181612ed5565b9050919050565b7f51756f72756d2069732062656c6f77206d696e696d756d000000000000000000600082015250565b6000612f4e601783612180565b9150612f5982612f18565b602082019050919050565b60006020820190508181036000830152612f7d81612f41565b9050919050565b7f51756f72756d2069732067726561746572207468616e206f6e65000000000000600082015250565b6000612fba601a83612180565b9150612fc582612f84565b602082019050919050565b60006020820190508181036000830152612fe981612fad565b9050919050565b7f42696e64696e672070657263656e74206d757374206265203c3d203130300000600082015250565b6000613026601e83612180565b915061303182612ff0565b602082019050919050565b6000602082019050818103600083015261305581613019565b9050919050565b7f54617267657420706f7374206e6f7420666f756e640000000000000000000000600082015250565b6000613092601583612180565b915061309d8261305c565b602082019050919050565b600060208201905081810360008301526130c181613085565b9050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020601f8301049050919050565b600082821b905092915050565b60006008830261314f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613112565b6131598683613112565b95508019841693508086168417925050509392505050565b6000819050919050565b600061319661319161318c8461228f565b613171565b61228f565b9050919050565b6000819050919050565b6131b08361317b565b6131c46131bc8261319d565b84845461311f565b825550505050565b600090565b6131d96131cc565b6131e48184846131a7565b505050565b5b81811015613208576131fd6000826131d1565b6001810190506131ea565b5050565b601f82111561324d5761321e81612cae565b61322784613102565b81016020851015613236578190505b61324a61324285613102565b8301826131e9565b50505b505050565b600082821c905092915050565b600061327060001984600802613252565b1980831691505092915050565b6000613289838361325f565b9150826002028217905092915050565b6132a383836130c8565b67ffffffffffffffff8111156132bc576132bb6130d3565b5b6132c68254612969565b6132d182828561320c565b6000601f83116001811461330057600084156132ee578287013590505b6132f8858261327d565b865550613360565b601f19841661330e86612cae565b60005b8281101561333657848901358255600182019150602085019450602081019050613311565b86831015613353578489013561334f601f89168261325f565b8355505b6001600288020188555050505b50505050505050565b600082905092915050565b60008190508160005260206000209050919050565b601f8211156133ca5761339b81613374565b6133a484613102565b810160208510156133b3578190505b6133c76133bf85613102565b8301826131e9565b50505b505050565b6133d98383613369565b67ffffffffffffffff8111156133f2576133f16130d3565b5b6133fc8254612969565b613407828285613389565b6000601f8311600181146134365760008415613424578287013590505b61342e858261327d565b865550613496565b601f19841661344486613374565b60005b8281101561346c57848901358255600182019150602085019450602081019050613447565b868310156134895784890135613485601f89168261325f565b8355505b6001600288020188555050505b50505050505050565b7f506f6f6c20656e642074696d6520686173207061737365640000000000000000600082015250565b60006134d5601883612180565b91506134e08261349f565b602082019050919050565b60006020820190508181036000830152613504816134c8565b905091905056fea26469706673582212200cee382ddb66b4d4d20bc418a8ccb063063ecccfc95166f78e6144d6d77bbf6864736f6c63430008180033", + "deployedBytecode": "0x60806040526004361061014b5760003560e01c8063642b5bfb116100b6578063a23362791161006f578063a2336279146104e7578063a9059cbb1461052f578063afa845601461056c578063d6ba43841461059c578063dd62ed3e146105c7578063ff869240146106045761014b565b8063642b5bfb146103af5780636db5c8fd146103da57806370a0823114610405578063883802741461044257806395d89b411461047f578063a230c524146104aa5761014b565b806318160ddd1161010857806318160ddd1461028b57806323b872dd146102b6578063313ce567146102f3578063561b24631461031e57806356715761146103475780635daf08ca146103725761014b565b806306fdde0314610150578063095ea7b31461017b5780630b1e7f83146101b857806311aee380146101f857806317906c2e1461022357806317c182171461024e575b600080fd5b34801561015c57600080fd5b50610165610641565b6040516101729190612205565b60405180910390f35b34801561018757600080fd5b506101a2600480360381019061019d91906122c5565b6106d3565b6040516101af9190612320565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da919061233b565b6106f6565b6040516101ef9493929190612386565b60405180910390f35b34801561020457600080fd5b5061020d6107ee565b60405161021a91906123d2565b60405180910390f35b34801561022f57600080fd5b506102386107f4565b60405161024591906123d2565b60405180910390f35b34801561025a57600080fd5b506102756004803603810190610270919061233b565b6107fa565b6040516102829190612320565b60405180910390f35b34801561029757600080fd5b506102a0610fcd565b6040516102ad91906123d2565b60405180910390f35b3480156102c257600080fd5b506102dd60048036038101906102d891906123ed565b610fd7565b6040516102ea9190612320565b60405180910390f35b3480156102ff57600080fd5b50610308611006565b604051610315919061245c565b60405180910390f35b34801561032a57600080fd5b50610345600480360381019061034091906124a3565b61100f565b005b34801561035357600080fd5b5061035c61103a565b60405161036991906123d2565b60405180910390f35b34801561037e57600080fd5b506103996004803603810190610394919061233b565b61103f565b6040516103a691906124f6565b60405180910390f35b3480156103bb57600080fd5b506103c4611072565b6040516103d191906123d2565b60405180910390f35b3480156103e657600080fd5b506103ef611078565b6040516103fc91906123d2565b60405180910390f35b34801561041157600080fd5b5061042c60048036038101906104279190612511565b611082565b60405161043991906123d2565b60405180910390f35b34801561044e57600080fd5b506104696004803603810190610464919061253e565b6110ca565b6040516104769190612320565b60405180910390f35b34801561048b57600080fd5b50610494611155565b6040516104a19190612205565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc9190612511565b6111e7565b6040516104de9190612320565b60405180910390f35b3480156104f357600080fd5b5061050e6004803603810190610509919061233b565b611207565b6040516105269c9b9a99989796959493929190612646565b60405180910390f35b34801561053b57600080fd5b50610556600480360381019061055191906122c5565b61136f565b6040516105639190612320565b60405180910390f35b6105866004803603810190610581919061276e565b611392565b60405161059391906123d2565b60405180910390f35b3480156105a857600080fd5b506105b1611812565b6040516105be91906123d2565b60405180910390f35b3480156105d357600080fd5b506105ee60048036038101906105e99190612844565b61181a565b6040516105fb91906123d2565b60405180910390f35b34801561061057600080fd5b5061062b600480360381019061062691906128da565b6118a1565b60405161063891906123d2565b60405180910390f35b60606003805461065090612969565b80601f016020809104026020016040519081016040528092919081815260200182805461067c90612969565b80156106c95780601f1061069e576101008083540402835291602001916106c9565b820191906000526020600020905b8154815290600101906020018083116106ac57829003601f168201915b5050505050905090565b6000806106de6119b5565b90506106eb8185856119bd565b600191505092915050565b600a6020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600301805461076b90612969565b80601f016020809104026020016040519081016040528092919081815260200182805461079790612969565b80156107e45780601f106107b9576101008083540402835291602001916107e4565b820191906000526020600020905b8154815290600101906020018083116107c757829003601f168201915b5050505050905084565b60065481565b600b5481565b6000806008600084815260200190815260200160002090506000600a600083600101548152602001908152602001600020905081600a01544211610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086a90612a0c565b60405180910390fd5b6000151582600b0160009054906101000a900460ff161515146108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c290612a78565b60405180910390fd5b600080600080600090505b85600401548110156109475785600301600082815260200190815260200160002091508160010160009054906101000a900460ff1615610927578160020154846109209190612ac7565b935061093a565b8160020154836109379190612ac7565b92505b80806001019150506108d6565b508460050160000154610958610fcd565b6109629190612afb565b828461096e9190612ac7565b633b9aca0061097d9190612afb565b10156109be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b590612b89565b60405180910390fd5b818310159550858015610a3f5750600760008560020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610b4d578360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166005600060066000815480929190610a8090612ba9565b91905055815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008660020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600185600b0160006101000a81548160ff0219169083151502179055508585600b0160016101000a81548160ff0219169083151502179055507f926ee3a021d24f18cfab444988fa0338bcaa0f1e0d7c2211c07d10cbad6772948787604051610bb7929190612bf1565b60405180910390a1600086610bcc5782610bce565b835b9050600087610bdd5784610bdf565b835b9050600080600090505b8860040154811015610dff57886003016000828152602001908152602001600020945060008560030160149054906101000a900460ff1680610c3c57508960050160020160009054906101000a900460ff165b905060008660030160149054906101000a900460ff16610c63578a60050160010154610c66565b60645b90508660010160009054906101000a900460ff1615158c151503610d2757600082610c92576000610cc5565b606482610c9f9190612c49565b87878a60020154610cb09190612afb565b610cba9190612c49565b610cc49190612afb565b5b90506000610cd230611082565b9050610d12308a60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848c60020154610d0d9190612ac7565b6119cf565b8186610d1e9190612ac7565b95505050610df0565b60006064826064610d389190612c7a565b8960020154610d479190612afb565b610d519190612c49565b90506000610d5e30611082565b90506000821115610d9957610d98308a60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846119cf565b5b83610ddf57600060648e600501600101548b60020154610db99190612afb565b610dc39190612c49565b9050610dcf3082611bf4565b8087610ddb9190612ac7565b9650505b8186610deb9190612ac7565b955050505b50508080600101915050610be9565b5060008183610e0e9190612c7a565b90506000811115610e4957610e48308960020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836119cf565b5b60005b600654811015610f125760006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000610e98610fcd565b610ea183611082565b8d60080154610eb09190612afb565b610eba9190612c49565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f02573d6000803e3d6000fd5b5050508080600101915050610e4c565b5088600b0160029054906101000a900460ff1615610fbf578860020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1397c6e8b8b600c016040518363ffffffff1660e01b8152600401610f8c929190612d47565b600060405180830381600087803b158015610fa657600080fd5b505af1158015610fba573d6000803e3d6000fd5b505050505b505050505050505050919050565b6000600254905090565b600080610fe26119b5565b9050610fef858285611c76565b610ffa858585611d0a565b60019150509392505050565b60006012905090565b6000600860008581526020019081526020016000209050611034813385856000611dfe565b50505050565b600181565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b651cae8c13e00081565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006110d6848461136f565b9050801561114e578373ffffffffffffffffffffffffffffffffffffffff1663216ed6ad3385856040518463ffffffff1660e01b815260040161111b93929190612d77565b600060405180830381600087803b15801561113557600080fd5b505af1158015611149573d6000803e3d6000fd5b505050505b9392505050565b60606004805461116490612969565b80601f016020809104026020016040519081016040528092919081815260200182805461119090612969565b80156111dd5780601f106111b2576101008083540402835291602001916111dd565b820191906000526020600020905b8154815290600101906020018083116111c057829003601f168201915b5050505050905090565b60076020528060005260406000206000915054906101000a900460ff1681565b60086020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154908060050160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff1615151515815250509080600801549080600901549080600a01549080600b0160009054906101000a900460ff169080600b0160019054906101000a900460ff169080600b0160029054906101000a900460ff169080600c0180546112ec90612969565b80601f016020809104026020016040519081016040528092919081815260200182805461131890612969565b80156113655780601f1061133a57610100808354040283529160200191611365565b820191906000526020600020905b81548152906001019060200180831161134857829003601f168201915b505050505090508c565b60008061137a6119b5565b9050611387818585611d0a565b600191505092915050565b60008034116113d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cd90612e20565b60405180910390fd5b600189101561141a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141190612e8c565b60405180910390fd5b651cae8c13e000891115611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90612ef8565b60405180910390fd5b6313de43558789633b9aca006114799190612afb565b6114839190612c49565b10156114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb90612f64565b60405180910390fd5b86881115611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe90612fd0565b60405180910390fd5b606486111561154b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115429061303c565b60405180910390fd5b6000600a60008c81526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec906130a8565b60405180910390fd5b6009600081548092919061160890612ba9565b9190505591506000600860008481526020019081526020016000209050338160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b8160010181905550348160080181905550888a633b9aca0061168b9190612afb565b6116959190612c49565b8160050160000181905550878160050160010181905550868160050160020160006101000a81548160ff0219169083151502179055508a81600901819055508a426116e09190612ac7565b81600a01819055508281600001819055508581600b0160026101000a81548160ff021916908315150217905550848482600c019182611720929190613299565b5061174f8260020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1634611f1c565b61178d818360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166002346117859190612c49565b600180611dfe565b6117cc818360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166002346117c39190612c49565b60006001611dfe565b7f6e5c598b821d7fa8550e5fea58ab6e27c59e1cbe1df75a8591aa0c453b49e10a836040516117fb91906123d2565b60405180910390a150509998505050505050505050565b6313de435581565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600b60008154809291906118b690612ba9565b9190505590506000600a60008381526020019081526020016000209050848160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550338160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081816000018190555083838260030191826119759291906133cf565b507f60b94e7764708712b927071922e2d834b79011347c7b80aed74caeeece2eed4c826040516119a591906123d2565b60405180910390a1509392505050565b600033905090565b6119ca8383836001611f9e565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a21578060026000828254611a159190612ac7565b92505081905550611af4565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611aad578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611aa493929190612d77565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b3d5780600260008282540392505081905550611b8a565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611be791906123d2565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c665760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611c5d91906124f6565b60405180910390fd5b611c72826000836119cf565b5050565b6000611c82848461181a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611d045781811015611cf4578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611ceb93929190612d77565b60405180910390fd5b611d0384848484036000611f9e565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d7c5760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611d7391906124f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dee5760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611de591906124f6565b60405180910390fd5b611df98383836119cf565b505050565b84600a0154421115611e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3c906134eb565b60405180910390fd5b611e508430856119cf565b6000856004016000815480929190611e6790612ba9565b91905055905060008660030160008381526020019081526020016000209050858160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838160010160006101000a81548160ff021916908315150217905550848160020181905550818160000181905550828160030160146101000a81548160ff02191690831515021790555050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f8e5760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611f8591906124f6565b60405180910390fd5b611f9a600083836119cf565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036120105760006040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161200791906124f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120825760006040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161207991906124f6565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550801561216f578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161216691906123d2565b60405180910390a35b50505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156121af578082015181840152602081019050612194565b60008484015250505050565b6000601f19601f8301169050919050565b60006121d782612175565b6121e18185612180565b93506121f1818560208601612191565b6121fa816121bb565b840191505092915050565b6000602082019050818103600083015261221f81846121cc565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061225c82612231565b9050919050565b61226c81612251565b811461227757600080fd5b50565b60008135905061228981612263565b92915050565b6000819050919050565b6122a28161228f565b81146122ad57600080fd5b50565b6000813590506122bf81612299565b92915050565b600080604083850312156122dc576122db612227565b5b60006122ea8582860161227a565b92505060206122fb858286016122b0565b9150509250929050565b60008115159050919050565b61231a81612305565b82525050565b60006020820190506123356000830184612311565b92915050565b60006020828403121561235157612350612227565b5b600061235f848285016122b0565b91505092915050565b6123718161228f565b82525050565b61238081612251565b82525050565b600060808201905061239b6000830187612368565b6123a86020830186612377565b6123b56040830185612377565b81810360608301526123c781846121cc565b905095945050505050565b60006020820190506123e76000830184612368565b92915050565b60008060006060848603121561240657612405612227565b5b60006124148682870161227a565b93505060206124258682870161227a565b9250506040612436868287016122b0565b9150509250925092565b600060ff82169050919050565b61245681612440565b82525050565b6000602082019050612471600083018461244d565b92915050565b61248081612305565b811461248b57600080fd5b50565b60008135905061249d81612477565b92915050565b6000806000606084860312156124bc576124bb612227565b5b60006124ca868287016122b0565b93505060206124db868287016122b0565b92505060406124ec8682870161248e565b9150509250925092565b600060208201905061250b6000830184612377565b92915050565b60006020828403121561252757612526612227565b5b60006125358482850161227a565b91505092915050565b60008060006060848603121561255757612556612227565b5b60006125658682870161227a565b9350506020612576868287016122b0565b9250506040612587868287016122b0565b9150509250925092565b61259a8161228f565b82525050565b6125a981612305565b82525050565b6060820160008201516125c56000850182612591565b5060208201516125d86020850182612591565b5060408201516125eb60408501826125a0565b50505050565b600081519050919050565b600082825260208201905092915050565b6000612618826125f1565b61262281856125fc565b9350612632818560208601612191565b61263b816121bb565b840191505092915050565b60006101c08201905061265c600083018f612368565b612669602083018e612368565b612676604083018d612377565b612683606083018c612368565b612690608083018b6125af565b61269d60e083018a612368565b6126ab610100830189612368565b6126b9610120830188612368565b6126c7610140830187612311565b6126d5610160830186612311565b6126e3610180830185612311565b8181036101a08301526126f6818461260d565b90509d9c50505050505050505050505050565b600080fd5b600080fd5b600080fd5b60008083601f84011261272e5761272d612709565b5b8235905067ffffffffffffffff81111561274b5761274a61270e565b5b60208301915083600182028301111561276757612766612713565b5b9250929050565b60008060008060008060008060006101008a8c03121561279157612790612227565b5b600061279f8c828d016122b0565b99505060206127b08c828d016122b0565b98505060406127c18c828d016122b0565b97505060606127d28c828d016122b0565b96505060806127e38c828d016122b0565b95505060a06127f48c828d0161248e565b94505060c06128058c828d0161248e565b93505060e08a013567ffffffffffffffff8111156128265761282561222c565b5b6128328c828d01612718565b92509250509295985092959850929598565b6000806040838503121561285b5761285a612227565b5b60006128698582860161227a565b925050602061287a8582860161227a565b9150509250929050565b60008083601f84011261289a57612899612709565b5b8235905067ffffffffffffffff8111156128b7576128b661270e565b5b6020830191508360018202830111156128d3576128d2612713565b5b9250929050565b6000806000604084860312156128f3576128f2612227565b5b60006129018682870161227a565b935050602084013567ffffffffffffffff8111156129225761292161222c565b5b61292e86828701612884565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061298157607f821691505b6020821081036129945761299361293a565b5b50919050565b7f506f6f6c20656e642074696d6520686173206e6f74207965742061727269766560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006129f6602183612180565b9150612a018261299a565b604082019050919050565b60006020820190508181036000830152612a25816129e9565b9050919050565b7f506f6f6c20697320616c7265616479207265736f6c7665640000000000000000600082015250565b6000612a62601883612180565b9150612a6d82612a2c565b602082019050919050565b60006020820190508181036000830152612a9181612a55565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ad28261228f565b9150612add8361228f565b9250828201905080821115612af557612af4612a98565b5b92915050565b6000612b068261228f565b9150612b118361228f565b9250828202612b1f8161228f565b91508282048414831517612b3657612b35612a98565b5b5092915050565b7f51756f72756d20666f72207468697320706f6f6c20776173206e6f74206d6574600082015250565b6000612b73602083612180565b9150612b7e82612b3d565b602082019050919050565b60006020820190508181036000830152612ba281612b66565b9050919050565b6000612bb48261228f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612be657612be5612a98565b5b600182019050919050565b6000604082019050612c066000830185612368565b612c136020830184612311565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612c548261228f565b9150612c5f8361228f565b925082612c6f57612c6e612c1a565b5b828204905092915050565b6000612c858261228f565b9150612c908361228f565b9250828203905081811115612ca857612ca7612a98565b5b92915050565b60008190508160005260206000209050919050565b60008154612cd081612969565b612cda81866125fc565b94506001821660008114612cf55760018114612d0b57612d3e565b60ff198316865281151560200286019350612d3e565b612d1485612cae565b60005b83811015612d3657815481890152600182019150602081019050612d17565b808801955050505b50505092915050565b6000604082019050612d5c6000830185612311565b8181036020830152612d6e8184612cc3565b90509392505050565b6000606082019050612d8c6000830186612377565b612d996020830185612368565b612da66040830184612368565b949350505050565b7f46656520697320726571756972656420746f20696e6974696174652076616c6960008201527f646174696f6e20706f6f6c000000000000000000000000000000000000000000602082015250565b6000612e0a602b83612180565b9150612e1582612dae565b604082019050919050565b60006020820190508181036000830152612e3981612dfd565b9050919050565b7f4475726174696f6e20697320746f6f2073686f72740000000000000000000000600082015250565b6000612e76601583612180565b9150612e8182612e40565b602082019050919050565b60006020820190508181036000830152612ea581612e69565b9050919050565b7f4475726174696f6e20697320746f6f206c6f6e67000000000000000000000000600082015250565b6000612ee2601483612180565b9150612eed82612eac565b602082019050919050565b60006020820190508181036000830152612f1181612ed5565b9050919050565b7f51756f72756d2069732062656c6f77206d696e696d756d000000000000000000600082015250565b6000612f4e601783612180565b9150612f5982612f18565b602082019050919050565b60006020820190508181036000830152612f7d81612f41565b9050919050565b7f51756f72756d2069732067726561746572207468616e206f6e65000000000000600082015250565b6000612fba601a83612180565b9150612fc582612f84565b602082019050919050565b60006020820190508181036000830152612fe981612fad565b9050919050565b7f42696e64696e672070657263656e74206d757374206265203c3d203130300000600082015250565b6000613026601e83612180565b915061303182612ff0565b602082019050919050565b6000602082019050818103600083015261305581613019565b9050919050565b7f54617267657420706f7374206e6f7420666f756e640000000000000000000000600082015250565b6000613092601583612180565b915061309d8261305c565b602082019050919050565b600060208201905081810360008301526130c181613085565b9050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020601f8301049050919050565b600082821b905092915050565b60006008830261314f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613112565b6131598683613112565b95508019841693508086168417925050509392505050565b6000819050919050565b600061319661319161318c8461228f565b613171565b61228f565b9050919050565b6000819050919050565b6131b08361317b565b6131c46131bc8261319d565b84845461311f565b825550505050565b600090565b6131d96131cc565b6131e48184846131a7565b505050565b5b81811015613208576131fd6000826131d1565b6001810190506131ea565b5050565b601f82111561324d5761321e81612cae565b61322784613102565b81016020851015613236578190505b61324a61324285613102565b8301826131e9565b50505b505050565b600082821c905092915050565b600061327060001984600802613252565b1980831691505092915050565b6000613289838361325f565b9150826002028217905092915050565b6132a383836130c8565b67ffffffffffffffff8111156132bc576132bb6130d3565b5b6132c68254612969565b6132d182828561320c565b6000601f83116001811461330057600084156132ee578287013590505b6132f8858261327d565b865550613360565b601f19841661330e86612cae565b60005b8281101561333657848901358255600182019150602085019450602081019050613311565b86831015613353578489013561334f601f89168261325f565b8355505b6001600288020188555050505b50505050505050565b600082905092915050565b60008190508160005260206000209050919050565b601f8211156133ca5761339b81613374565b6133a484613102565b810160208510156133b3578190505b6133c76133bf85613102565b8301826131e9565b50505b505050565b6133d98383613369565b67ffffffffffffffff8111156133f2576133f16130d3565b5b6133fc8254612969565b613407828285613389565b6000601f8311600181146134365760008415613424578287013590505b61342e858261327d565b865550613496565b601f19841661344486613374565b60005b8281101561346c57848901358255600182019150602085019450602081019050613447565b868310156134895784890135613485601f89168261325f565b8355505b6001600288020188555050505b50505050505050565b7f506f6f6c20656e642074696d6520686173207061737365640000000000000000600082015250565b60006134d5601883612180565b91506134e08261349f565b602082019050919050565b60006020820190508181036000830152613504816134c8565b905091905056fea26469706673582212200cee382ddb66b4d4d20bc418a8ccb063063ecccfc95166f78e6144d6d77bbf6864736f6c63430008180033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/client/src/assets/Onboarding.json b/client/src/assets/Onboarding.json index 069d912..a94351d 100644 --- a/client/src/assets/Onboarding.json +++ b/client/src/assets/Onboarding.json @@ -332,8 +332,8 @@ "type": "function" } ], - "bytecode": "0x60c06040523480156200001157600080fd5b5060405162002b4138038062002b41833981810160405281019062000037919062000138565b81818173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508060a08181525050505050506200017f565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000b18262000084565b9050919050565b6000620000c582620000a4565b9050919050565b620000d781620000b8565b8114620000e357600080fd5b50565b600081519050620000f781620000cc565b92915050565b6000819050919050565b6200011281620000fd565b81146200011e57600080fd5b50565b600081519050620001328162000107565b92915050565b600080604083850312156200015257620001516200007f565b5b60006200016285828601620000e6565b9250506020620001758582860162000121565b9150509250929050565b60805160a05161296b620001d6600039600081816102c50152610e3901526000818161085201528181610bb001528181610cb201528181610d9d01528181611099015281816111da01526112a1015261296b6000f3fe6080604052600436106100a75760003560e01c8063854b6a4f11610064578063854b6a4f146101b1578063a035b1fe146101da578063b5b20c0014610205578063c4a9e1161461022e578063d5a44f8614610259578063e1397c6e1461029a576100a7565b80630d0271d6146100ac578063216ed6ad146100c85780635b5cf6d4146100f15780635badbe4c1461011a5780638150d5071461014557806381d12c581461016e575b600080fd5b6100c660048036038101906100c191906115c4565b6102c3565b005b3480156100d457600080fd5b506100ef60048036038101906100ea91906116a5565b6103cf565b005b3480156100fd57600080fd5b50610118600480360381019061011391906116f8565b6104e1565b005b34801561012657600080fd5b5061012f61069b565b60405161013c9190611767565b60405180910390f35b34801561015157600080fd5b5061016c60048036038101906101679190611782565b6106a1565b005b34801561017a57600080fd5b5061019560048036038101906101909190611782565b61092e565b6040516101a897969594939291906118e0565b60405180910390f35b3480156101bd57600080fd5b506101d860048036038101906101d39190611989565b610aba565b005b3480156101e657600080fd5b506101ef610e37565b6040516101fc9190611767565b60405180910390f35b34801561021157600080fd5b5061022c600480360381019061022791906119c9565b610e5b565b005b34801561023a57600080fd5b50610243611021565b6040516102509190611767565b60405180910390f35b34801561026557600080fd5b50610280600480360381019061027b9190611782565b611027565b604051610291959493929190611a09565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190611ab2565b611097565b005b7f0000000000000000000000000000000000000000000000000000000000000000341015610326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161031d90611b5e565b60405180910390fd5b60006003600081548092919061033b90611bad565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503481600101819055506103ad82611362565b816003018190555083838260040191826103c8929190611e3b565b5050505050565b60008211610412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040990611f57565b60405180910390fd5b60006001600081548092919061042790611bad565b91905055905060008060008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838160010181905550824261049b9190611f77565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9826040516104d29190611767565b60405180910390a15050505050565b60006002600085815260200190815260200160002090506000600381111561050c5761050b6117be565b5b8160020160009054906101000a900460ff1660038111156105305761052f6117be565b5b14610570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056790611ff7565b60405180910390fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461061c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061390612089565b60405180910390fd5b60018260020160006101000a81548160ff02191690836003811115610644576106436117be565b5b0217905550838383600501918261065c929190611e3b565b507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc8560405161068c9190611767565b60405180910390a15050505050565b60035481565b600080600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610749576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107409061211b565b60405180910390fd5b8060020154421161078f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610786906121ad565b60405180910390fd5b8060030160019054906101000a900460ff16156107e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d890612219565b60405180910390fd5b8060030160009054906101000a900460ff1615610833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082a906122ab565b60405180910390fd5b60018160030160016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3383600101546040518363ffffffff1660e01b81526004016108af9291906122cb565b6020604051808303816000875af11580156108ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f29190612309565b507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9826040516109229190611767565b60405180910390a15050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff169080600301549080600401805461099690611c5e565b80601f01602080910402602001604051908101604052809291908181526020018280546109c290611c5e565b8015610a0f5780601f106109e457610100808354040283529160200191610a0f565b820191906000526020600020905b8154815290600101906020018083116109f257829003601f168201915b505050505090806005018054610a2490611c5e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5090611c5e565b8015610a9d5780601f10610a7257610100808354040283529160200191610a9d565b820191906000526020600020905b815481529060010190602001808311610a8057829003601f168201915b5050505050908060060160009054906101000a900460ff16905087565b600060026000848152602001908152602001600020905060016003811115610ae557610ae46117be565b5b8160020160009054906101000a900460ff166003811115610b0957610b086117be565b5b14610b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4090612382565b60405180910390fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff02191690836003811115610b8b57610b8a6117be565b5b0217905550828260060160006101000a81548160ff02191690831515021790555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ff8692408360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856005016040518363ffffffff1660e01b8152600401610c30929190612426565b6020604051808303816000875af1158015610c4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c73919061246b565b90507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc8585604051610ca6929190612498565b60405180910390a160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630ce7e299600a8660010154610cfd91906124f0565b8660010154610d0c9190612521565b8460146001600360018d604051602001610d269190611767565b6040516020818303038152906040526040518863ffffffff1660e01b8152600401610d5696959493929190612620565b60206040518083038185885af1158015610d74573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d99919061246b565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663561b246382856001015460016040518463ffffffff1660e01b8152600401610dfd93929190612688565b600060405180830381600087803b158015610e1757600080fd5b505af1158015610e2b573d6000803e3d6000fd5b50505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efa90612731565b60405180910390fd5b8060030160019054906101000a900460ff1615610f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4c90612219565b60405180910390fd5b8060030160009054906101000a900460ff1615610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e906122ab565b60405180910390fd5b8060020154421115610fcc578142610fbf9190611f77565b8160020181905550610fe5565b818160020154610fdc9190611f77565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9836040516110149190611767565b60405180910390a1505050565b60015481565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111c906127c3565b60405180910390fd5b600082828101906111369190611782565b90506000600260008381526020019081526020016000209050846111d6578060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a83600101546111a391906124f0565b9081150290604051600060405180830381858888f193505050501580156111ce573d6000803e3d6000fd5b50505061135d565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ff8692408360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846004016040518363ffffffff1660e01b815260040161125a929190612426565b6020604051808303816000875af1158015611279573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129d919061246b565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630ce7e299600a84600101546112ec91906124f0565b8360146001600360006040518763ffffffff1660e01b8152600401611315959493929190612809565b60206040518083038185885af1158015611333573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611358919061246b565b505050505b505050565b600061136c6113e0565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507fd9e7f38a71691fb1db2da17057c03d381a42a9925350883f10e8e5d0bca4a3b483836040516113d292919061286f565b60405180910390a150919050565b60008060005b6001548110156114645760008082815260200190815260200160002060030160009054906101000a900460ff16611457576000808281526020019081526020016000206002015442116114575760008082815260200190815260200160002060010154826114549190611f77565b91505b80806001019150506113e6565b50600081116114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f906128e4565b60405180910390fd5b600081446114b69190612904565b9050600080600090505b60015481101561154e5760008082815260200190815260200160002060030160009054906101000a900460ff166115415760008082815260200190815260200160002060020154421161154157600080828152602001908152602001600020600101548261152e9190611f77565b9150828211156115405780945061154e565b5b80806001019150506114c0565b5050505090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126115845761158361155f565b5b8235905067ffffffffffffffff8111156115a1576115a0611564565b5b6020830191508360018202830111156115bd576115bc611569565b5b9250929050565b600080602083850312156115db576115da611555565b5b600083013567ffffffffffffffff8111156115f9576115f861155a565b5b6116058582860161156e565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061163c82611611565b9050919050565b61164c81611631565b811461165757600080fd5b50565b60008135905061166981611643565b92915050565b6000819050919050565b6116828161166f565b811461168d57600080fd5b50565b60008135905061169f81611679565b92915050565b6000806000606084860312156116be576116bd611555565b5b60006116cc8682870161165a565b93505060206116dd86828701611690565b92505060406116ee86828701611690565b9150509250925092565b60008060006040848603121561171157611710611555565b5b600061171f86828701611690565b935050602084013567ffffffffffffffff8111156117405761173f61155a565b5b61174c8682870161156e565b92509250509250925092565b6117618161166f565b82525050565b600060208201905061177c6000830184611758565b92915050565b60006020828403121561179857611797611555565b5b60006117a684828501611690565b91505092915050565b6117b881611631565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106117fe576117fd6117be565b5b50565b600081905061180f826117ed565b919050565b600061181f82611801565b9050919050565b61182f81611814565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561186f578082015181840152602081019050611854565b60008484015250505050565b6000601f19601f8301169050919050565b600061189782611835565b6118a18185611840565b93506118b1818560208601611851565b6118ba8161187b565b840191505092915050565b60008115159050919050565b6118da816118c5565b82525050565b600060e0820190506118f5600083018a6117af565b6119026020830189611758565b61190f6040830188611826565b61191c6060830187611758565b818103608083015261192e818661188c565b905081810360a0830152611942818561188c565b905061195160c08301846118d1565b98975050505050505050565b611966816118c5565b811461197157600080fd5b50565b6000813590506119838161195d565b92915050565b600080604083850312156119a05761199f611555565b5b60006119ae85828601611690565b92505060206119bf85828601611974565b9150509250929050565b600080604083850312156119e0576119df611555565b5b60006119ee85828601611690565b92505060206119ff85828601611690565b9150509250929050565b600060a082019050611a1e60008301886117af565b611a2b6020830187611758565b611a386040830186611758565b611a4560608301856118d1565b611a5260808301846118d1565b9695505050505050565b60008083601f840112611a7257611a7161155f565b5b8235905067ffffffffffffffff811115611a8f57611a8e611564565b5b602083019150836001820283011115611aab57611aaa611569565b5b9250929050565b600080600060408486031215611acb57611aca611555565b5b6000611ad986828701611974565b935050602084013567ffffffffffffffff811115611afa57611af961155a565b5b611b0686828701611a5c565b92509250509250925092565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b6000611b48601083611840565b9150611b5382611b12565b602082019050919050565b60006020820190508181036000830152611b7781611b3b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611bb88261166f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611bea57611be9611b7e565b5b600182019050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611c7657607f821691505b602082108103611c8957611c88611c2f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611cf17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611cb4565b611cfb8683611cb4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611d38611d33611d2e8461166f565b611d13565b61166f565b9050919050565b6000819050919050565b611d5283611d1d565b611d66611d5e82611d3f565b848454611cc1565b825550505050565b600090565b611d7b611d6e565b611d86818484611d49565b505050565b5b81811015611daa57611d9f600082611d73565b600181019050611d8c565b5050565b601f821115611def57611dc081611c8f565b611dc984611ca4565b81016020851015611dd8578190505b611dec611de485611ca4565b830182611d8b565b50505b505050565b600082821c905092915050565b6000611e1260001984600802611df4565b1980831691505092915050565b6000611e2b8383611e01565b9150826002028217905092915050565b611e458383611bf5565b67ffffffffffffffff811115611e5e57611e5d611c00565b5b611e688254611c5e565b611e73828285611dae565b6000601f831160018114611ea25760008415611e90578287013590505b611e9a8582611e1f565b865550611f02565b601f198416611eb086611c8f565b60005b82811015611ed857848901358255600182019150602085019450602081019050611eb3565b86831015611ef55784890135611ef1601f891682611e01565b8355505b6001600288020188555050505b50505050505050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b6000611f41601183611840565b9150611f4c82611f0b565b602082019050919050565b60006020820190508181036000830152611f7081611f34565b9050919050565b6000611f828261166f565b9150611f8d8361166f565b9250828201905080821115611fa557611fa4611b7e565b5b92915050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b6000611fe1601883611840565b9150611fec82611fab565b602082019050919050565b6000602082019050818103600083015261201081611fd4565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b6000612073603a83611840565b915061207e82612017565b604082019050919050565b600060208201905081810360008301526120a281612066565b9050919050565b7f576f726b65722063616e206f6e6c79207265636c61696d207468656972206f7760008201527f6e20617661696c6162696c697479207374616b65000000000000000000000000602082015250565b6000612105603483611840565b9150612110826120a9565b604082019050919050565b60006020820190508181036000830152612134816120f8565b9050919050565b7f5374616b65206475726174696f6e20686173206e6f742079657420656c61707360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000612197602283611840565b91506121a28261213b565b604082019050919050565b600060208201905081810360008301526121c68161218a565b9050919050565b7f5374616b652068617320616c7265616479206265656e207265636c61696d6564600082015250565b6000612203602083611840565b915061220e826121cd565b602082019050919050565b60006020820190508181036000830152612232816121f6565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b6000612295602483611840565b91506122a082612239565b604082019050919050565b600060208201905081810360008301526122c481612288565b9050919050565b60006040820190506122e060008301856117af565b6122ed6020830184611758565b9392505050565b6000815190506123038161195d565b92915050565b60006020828403121561231f5761231e611555565b5b600061232d848285016122f4565b91505092915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b600061236c602083611840565b915061237782612336565b602082019050919050565b6000602082019050818103600083015261239b8161235f565b9050919050565b600081546123af81611c5e565b6123b98186611840565b945060018216600081146123d457600181146123ea5761241d565b60ff19831686528115156020028601935061241d565b6123f385611c8f565b60005b83811015612415578154818901526001820191506020810190506123f6565b808801955050505b50505092915050565b600060408201905061243b60008301856117af565b818103602083015261244d81846123a2565b90509392505050565b60008151905061246581611679565b92915050565b60006020828403121561248157612480611555565b5b600061248f84828501612456565b91505092915050565b60006040820190506124ad6000830185611758565b6124ba60208301846118d1565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006124fb8261166f565b91506125068361166f565b925082612516576125156124c1565b5b828204905092915050565b600061252c8261166f565b91506125378361166f565b925082820390508181111561254f5761254e611b7e565b5b92915050565b6000819050919050565b600061257a61257561257084612555565b611d13565b61166f565b9050919050565b61258a8161255f565b82525050565b6000819050919050565b60006125b56125b06125ab84612590565b611d13565b61166f565b9050919050565b6125c58161259a565b82525050565b600081519050919050565b600082825260208201905092915050565b60006125f2826125cb565b6125fc81856125d6565b935061260c818560208601611851565b6126158161187b565b840191505092915050565b600060c0820190506126356000830189611758565b6126426020830188611758565b61264f6040830187612581565b61265c60608301866125bc565b61266960808301856118d1565b81810360a083015261267b81846125e7565b9050979650505050505050565b600060608201905061269d6000830186611758565b6126aa6020830185611758565b6126b760408301846118d1565b949350505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b600061271b603383611840565b9150612726826126bf565b604082019050919050565b6000602082019050818103600083015261274a8161270e565b9050919050565b7f6f6e56616c6964617465206d6179206f6e6c792062652063616c6c656420627960008201527f207468652044414f20636f6e7472616374000000000000000000000000000000602082015250565b60006127ad603183611840565b91506127b882612751565b604082019050919050565b600060208201905081810360008301526127dc816127a0565b9050919050565b50565b60006127f36000836125d6565b91506127fe826127e3565b600082019050919050565b600060c08201905061281e6000830188611758565b61282b6020830187611758565b6128386040830186612581565b61284560608301856125bc565b61285260808301846118d1565b81810360a0830152612863816127e6565b90509695505050505050565b60006040820190506128846000830185611758565b6128916020830184611758565b9392505050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b60006128ce601a83611840565b91506128d982612898565b602082019050919050565b600060208201905081810360008301526128fd816128c1565b9050919050565b600061290f8261166f565b915061291a8361166f565b92508261292a576129296124c1565b5b82820690509291505056fea26469706673582212204794876e5e939ea992894db28eb05c2eb4709b45cc7c385e65df0cfb0a3100a864736f6c63430008180033", - "deployedBytecode": "0x6080604052600436106100a75760003560e01c8063854b6a4f11610064578063854b6a4f146101b1578063a035b1fe146101da578063b5b20c0014610205578063c4a9e1161461022e578063d5a44f8614610259578063e1397c6e1461029a576100a7565b80630d0271d6146100ac578063216ed6ad146100c85780635b5cf6d4146100f15780635badbe4c1461011a5780638150d5071461014557806381d12c581461016e575b600080fd5b6100c660048036038101906100c191906115c4565b6102c3565b005b3480156100d457600080fd5b506100ef60048036038101906100ea91906116a5565b6103cf565b005b3480156100fd57600080fd5b50610118600480360381019061011391906116f8565b6104e1565b005b34801561012657600080fd5b5061012f61069b565b60405161013c9190611767565b60405180910390f35b34801561015157600080fd5b5061016c60048036038101906101679190611782565b6106a1565b005b34801561017a57600080fd5b5061019560048036038101906101909190611782565b61092e565b6040516101a897969594939291906118e0565b60405180910390f35b3480156101bd57600080fd5b506101d860048036038101906101d39190611989565b610aba565b005b3480156101e657600080fd5b506101ef610e37565b6040516101fc9190611767565b60405180910390f35b34801561021157600080fd5b5061022c600480360381019061022791906119c9565b610e5b565b005b34801561023a57600080fd5b50610243611021565b6040516102509190611767565b60405180910390f35b34801561026557600080fd5b50610280600480360381019061027b9190611782565b611027565b604051610291959493929190611a09565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190611ab2565b611097565b005b7f0000000000000000000000000000000000000000000000000000000000000000341015610326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161031d90611b5e565b60405180910390fd5b60006003600081548092919061033b90611bad565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503481600101819055506103ad82611362565b816003018190555083838260040191826103c8929190611e3b565b5050505050565b60008211610412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040990611f57565b60405180910390fd5b60006001600081548092919061042790611bad565b91905055905060008060008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838160010181905550824261049b9190611f77565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9826040516104d29190611767565b60405180910390a15050505050565b60006002600085815260200190815260200160002090506000600381111561050c5761050b6117be565b5b8160020160009054906101000a900460ff1660038111156105305761052f6117be565b5b14610570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056790611ff7565b60405180910390fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461061c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061390612089565b60405180910390fd5b60018260020160006101000a81548160ff02191690836003811115610644576106436117be565b5b0217905550838383600501918261065c929190611e3b565b507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc8560405161068c9190611767565b60405180910390a15050505050565b60035481565b600080600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610749576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107409061211b565b60405180910390fd5b8060020154421161078f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610786906121ad565b60405180910390fd5b8060030160019054906101000a900460ff16156107e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d890612219565b60405180910390fd5b8060030160009054906101000a900460ff1615610833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082a906122ab565b60405180910390fd5b60018160030160016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3383600101546040518363ffffffff1660e01b81526004016108af9291906122cb565b6020604051808303816000875af11580156108ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f29190612309565b507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9826040516109229190611767565b60405180910390a15050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff169080600301549080600401805461099690611c5e565b80601f01602080910402602001604051908101604052809291908181526020018280546109c290611c5e565b8015610a0f5780601f106109e457610100808354040283529160200191610a0f565b820191906000526020600020905b8154815290600101906020018083116109f257829003601f168201915b505050505090806005018054610a2490611c5e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5090611c5e565b8015610a9d5780601f10610a7257610100808354040283529160200191610a9d565b820191906000526020600020905b815481529060010190602001808311610a8057829003601f168201915b5050505050908060060160009054906101000a900460ff16905087565b600060026000848152602001908152602001600020905060016003811115610ae557610ae46117be565b5b8160020160009054906101000a900460ff166003811115610b0957610b086117be565b5b14610b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4090612382565b60405180910390fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff02191690836003811115610b8b57610b8a6117be565b5b0217905550828260060160006101000a81548160ff02191690831515021790555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ff8692408360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856005016040518363ffffffff1660e01b8152600401610c30929190612426565b6020604051808303816000875af1158015610c4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c73919061246b565b90507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc8585604051610ca6929190612498565b60405180910390a160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630ce7e299600a8660010154610cfd91906124f0565b8660010154610d0c9190612521565b8460146001600360018d604051602001610d269190611767565b6040516020818303038152906040526040518863ffffffff1660e01b8152600401610d5696959493929190612620565b60206040518083038185885af1158015610d74573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d99919061246b565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663561b246382856001015460016040518463ffffffff1660e01b8152600401610dfd93929190612688565b600060405180830381600087803b158015610e1757600080fd5b505af1158015610e2b573d6000803e3d6000fd5b50505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efa90612731565b60405180910390fd5b8060030160019054906101000a900460ff1615610f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4c90612219565b60405180910390fd5b8060030160009054906101000a900460ff1615610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e906122ab565b60405180910390fd5b8060020154421115610fcc578142610fbf9190611f77565b8160020181905550610fe5565b818160020154610fdc9190611f77565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9836040516110149190611767565b60405180910390a1505050565b60015481565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111c906127c3565b60405180910390fd5b600082828101906111369190611782565b90506000600260008381526020019081526020016000209050846111d6578060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a83600101546111a391906124f0565b9081150290604051600060405180830381858888f193505050501580156111ce573d6000803e3d6000fd5b50505061135d565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ff8692408360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846004016040518363ffffffff1660e01b815260040161125a929190612426565b6020604051808303816000875af1158015611279573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129d919061246b565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630ce7e299600a84600101546112ec91906124f0565b8360146001600360006040518763ffffffff1660e01b8152600401611315959493929190612809565b60206040518083038185885af1158015611333573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611358919061246b565b505050505b505050565b600061136c6113e0565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507fd9e7f38a71691fb1db2da17057c03d381a42a9925350883f10e8e5d0bca4a3b483836040516113d292919061286f565b60405180910390a150919050565b60008060005b6001548110156114645760008082815260200190815260200160002060030160009054906101000a900460ff16611457576000808281526020019081526020016000206002015442116114575760008082815260200190815260200160002060010154826114549190611f77565b91505b80806001019150506113e6565b50600081116114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f906128e4565b60405180910390fd5b600081446114b69190612904565b9050600080600090505b60015481101561154e5760008082815260200190815260200160002060030160009054906101000a900460ff166115415760008082815260200190815260200160002060020154421161154157600080828152602001908152602001600020600101548261152e9190611f77565b9150828211156115405780945061154e565b5b80806001019150506114c0565b5050505090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126115845761158361155f565b5b8235905067ffffffffffffffff8111156115a1576115a0611564565b5b6020830191508360018202830111156115bd576115bc611569565b5b9250929050565b600080602083850312156115db576115da611555565b5b600083013567ffffffffffffffff8111156115f9576115f861155a565b5b6116058582860161156e565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061163c82611611565b9050919050565b61164c81611631565b811461165757600080fd5b50565b60008135905061166981611643565b92915050565b6000819050919050565b6116828161166f565b811461168d57600080fd5b50565b60008135905061169f81611679565b92915050565b6000806000606084860312156116be576116bd611555565b5b60006116cc8682870161165a565b93505060206116dd86828701611690565b92505060406116ee86828701611690565b9150509250925092565b60008060006040848603121561171157611710611555565b5b600061171f86828701611690565b935050602084013567ffffffffffffffff8111156117405761173f61155a565b5b61174c8682870161156e565b92509250509250925092565b6117618161166f565b82525050565b600060208201905061177c6000830184611758565b92915050565b60006020828403121561179857611797611555565b5b60006117a684828501611690565b91505092915050565b6117b881611631565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106117fe576117fd6117be565b5b50565b600081905061180f826117ed565b919050565b600061181f82611801565b9050919050565b61182f81611814565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561186f578082015181840152602081019050611854565b60008484015250505050565b6000601f19601f8301169050919050565b600061189782611835565b6118a18185611840565b93506118b1818560208601611851565b6118ba8161187b565b840191505092915050565b60008115159050919050565b6118da816118c5565b82525050565b600060e0820190506118f5600083018a6117af565b6119026020830189611758565b61190f6040830188611826565b61191c6060830187611758565b818103608083015261192e818661188c565b905081810360a0830152611942818561188c565b905061195160c08301846118d1565b98975050505050505050565b611966816118c5565b811461197157600080fd5b50565b6000813590506119838161195d565b92915050565b600080604083850312156119a05761199f611555565b5b60006119ae85828601611690565b92505060206119bf85828601611974565b9150509250929050565b600080604083850312156119e0576119df611555565b5b60006119ee85828601611690565b92505060206119ff85828601611690565b9150509250929050565b600060a082019050611a1e60008301886117af565b611a2b6020830187611758565b611a386040830186611758565b611a4560608301856118d1565b611a5260808301846118d1565b9695505050505050565b60008083601f840112611a7257611a7161155f565b5b8235905067ffffffffffffffff811115611a8f57611a8e611564565b5b602083019150836001820283011115611aab57611aaa611569565b5b9250929050565b600080600060408486031215611acb57611aca611555565b5b6000611ad986828701611974565b935050602084013567ffffffffffffffff811115611afa57611af961155a565b5b611b0686828701611a5c565b92509250509250925092565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b6000611b48601083611840565b9150611b5382611b12565b602082019050919050565b60006020820190508181036000830152611b7781611b3b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611bb88261166f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611bea57611be9611b7e565b5b600182019050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611c7657607f821691505b602082108103611c8957611c88611c2f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611cf17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611cb4565b611cfb8683611cb4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611d38611d33611d2e8461166f565b611d13565b61166f565b9050919050565b6000819050919050565b611d5283611d1d565b611d66611d5e82611d3f565b848454611cc1565b825550505050565b600090565b611d7b611d6e565b611d86818484611d49565b505050565b5b81811015611daa57611d9f600082611d73565b600181019050611d8c565b5050565b601f821115611def57611dc081611c8f565b611dc984611ca4565b81016020851015611dd8578190505b611dec611de485611ca4565b830182611d8b565b50505b505050565b600082821c905092915050565b6000611e1260001984600802611df4565b1980831691505092915050565b6000611e2b8383611e01565b9150826002028217905092915050565b611e458383611bf5565b67ffffffffffffffff811115611e5e57611e5d611c00565b5b611e688254611c5e565b611e73828285611dae565b6000601f831160018114611ea25760008415611e90578287013590505b611e9a8582611e1f565b865550611f02565b601f198416611eb086611c8f565b60005b82811015611ed857848901358255600182019150602085019450602081019050611eb3565b86831015611ef55784890135611ef1601f891682611e01565b8355505b6001600288020188555050505b50505050505050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b6000611f41601183611840565b9150611f4c82611f0b565b602082019050919050565b60006020820190508181036000830152611f7081611f34565b9050919050565b6000611f828261166f565b9150611f8d8361166f565b9250828201905080821115611fa557611fa4611b7e565b5b92915050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b6000611fe1601883611840565b9150611fec82611fab565b602082019050919050565b6000602082019050818103600083015261201081611fd4565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b6000612073603a83611840565b915061207e82612017565b604082019050919050565b600060208201905081810360008301526120a281612066565b9050919050565b7f576f726b65722063616e206f6e6c79207265636c61696d207468656972206f7760008201527f6e20617661696c6162696c697479207374616b65000000000000000000000000602082015250565b6000612105603483611840565b9150612110826120a9565b604082019050919050565b60006020820190508181036000830152612134816120f8565b9050919050565b7f5374616b65206475726174696f6e20686173206e6f742079657420656c61707360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000612197602283611840565b91506121a28261213b565b604082019050919050565b600060208201905081810360008301526121c68161218a565b9050919050565b7f5374616b652068617320616c7265616479206265656e207265636c61696d6564600082015250565b6000612203602083611840565b915061220e826121cd565b602082019050919050565b60006020820190508181036000830152612232816121f6565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b6000612295602483611840565b91506122a082612239565b604082019050919050565b600060208201905081810360008301526122c481612288565b9050919050565b60006040820190506122e060008301856117af565b6122ed6020830184611758565b9392505050565b6000815190506123038161195d565b92915050565b60006020828403121561231f5761231e611555565b5b600061232d848285016122f4565b91505092915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b600061236c602083611840565b915061237782612336565b602082019050919050565b6000602082019050818103600083015261239b8161235f565b9050919050565b600081546123af81611c5e565b6123b98186611840565b945060018216600081146123d457600181146123ea5761241d565b60ff19831686528115156020028601935061241d565b6123f385611c8f565b60005b83811015612415578154818901526001820191506020810190506123f6565b808801955050505b50505092915050565b600060408201905061243b60008301856117af565b818103602083015261244d81846123a2565b90509392505050565b60008151905061246581611679565b92915050565b60006020828403121561248157612480611555565b5b600061248f84828501612456565b91505092915050565b60006040820190506124ad6000830185611758565b6124ba60208301846118d1565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006124fb8261166f565b91506125068361166f565b925082612516576125156124c1565b5b828204905092915050565b600061252c8261166f565b91506125378361166f565b925082820390508181111561254f5761254e611b7e565b5b92915050565b6000819050919050565b600061257a61257561257084612555565b611d13565b61166f565b9050919050565b61258a8161255f565b82525050565b6000819050919050565b60006125b56125b06125ab84612590565b611d13565b61166f565b9050919050565b6125c58161259a565b82525050565b600081519050919050565b600082825260208201905092915050565b60006125f2826125cb565b6125fc81856125d6565b935061260c818560208601611851565b6126158161187b565b840191505092915050565b600060c0820190506126356000830189611758565b6126426020830188611758565b61264f6040830187612581565b61265c60608301866125bc565b61266960808301856118d1565b81810360a083015261267b81846125e7565b9050979650505050505050565b600060608201905061269d6000830186611758565b6126aa6020830185611758565b6126b760408301846118d1565b949350505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b600061271b603383611840565b9150612726826126bf565b604082019050919050565b6000602082019050818103600083015261274a8161270e565b9050919050565b7f6f6e56616c6964617465206d6179206f6e6c792062652063616c6c656420627960008201527f207468652044414f20636f6e7472616374000000000000000000000000000000602082015250565b60006127ad603183611840565b91506127b882612751565b604082019050919050565b600060208201905081810360008301526127dc816127a0565b9050919050565b50565b60006127f36000836125d6565b91506127fe826127e3565b600082019050919050565b600060c08201905061281e6000830188611758565b61282b6020830187611758565b6128386040830186612581565b61284560608301856125bc565b61285260808301846118d1565b81810360a0830152612863816127e6565b90509695505050505050565b60006040820190506128846000830185611758565b6128916020830184611758565b9392505050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b60006128ce601a83611840565b91506128d982612898565b602082019050919050565b600060208201905081810360008301526128fd816128c1565b9050919050565b600061290f8261166f565b915061291a8361166f565b92508261292a576129296124c1565b5b82820690509291505056fea26469706673582212204794876e5e939ea992894db28eb05c2eb4709b45cc7c385e65df0cfb0a3100a864736f6c63430008180033", + "bytecode": "0x60c06040523480156200001157600080fd5b5060405162002bc338038062002bc383398181016040528101906200003791906200013a565b8181818073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050508060a081815250505050505062000181565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000b38262000086565b9050919050565b6000620000c782620000a6565b9050919050565b620000d981620000ba565b8114620000e557600080fd5b50565b600081519050620000f981620000ce565b92915050565b6000819050919050565b6200011481620000ff565b81146200012057600080fd5b50565b600081519050620001348162000109565b92915050565b6000806040838503121562000154576200015362000081565b5b60006200016485828601620000e8565b9250506020620001778582860162000123565b9150509250929050565b60805160a0516129eb620001d8600039600081816102c50152610e3e01526000818161085201528181610bb001528181610cb201528181610da20152818161109e015281816111df01526112a601526129eb6000f3fe6080604052600436106100a75760003560e01c8063854b6a4f11610064578063854b6a4f146101b1578063a035b1fe146101da578063b5b20c0014610205578063c4a9e1161461022e578063d5a44f8614610259578063e1397c6e1461029a576100a7565b80630d0271d6146100ac578063216ed6ad146100c85780635b5cf6d4146100f15780635badbe4c1461011a5780638150d5071461014557806381d12c581461016e575b600080fd5b6100c660048036038101906100c191906115cf565b6102c3565b005b3480156100d457600080fd5b506100ef60048036038101906100ea91906116b0565b6103cf565b005b3480156100fd57600080fd5b5061011860048036038101906101139190611703565b6104e1565b005b34801561012657600080fd5b5061012f61069b565b60405161013c9190611772565b60405180910390f35b34801561015157600080fd5b5061016c6004803603810190610167919061178d565b6106a1565b005b34801561017a57600080fd5b506101956004803603810190610190919061178d565b61092e565b6040516101a897969594939291906118eb565b60405180910390f35b3480156101bd57600080fd5b506101d860048036038101906101d39190611994565b610aba565b005b3480156101e657600080fd5b506101ef610e3c565b6040516101fc9190611772565b60405180910390f35b34801561021157600080fd5b5061022c600480360381019061022791906119d4565b610e60565b005b34801561023a57600080fd5b50610243611026565b6040516102509190611772565b60405180910390f35b34801561026557600080fd5b50610280600480360381019061027b919061178d565b61102c565b604051610291959493929190611a14565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190611abd565b61109c565b005b7f0000000000000000000000000000000000000000000000000000000000000000341015610326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161031d90611b69565b60405180910390fd5b60006003600081548092919061033b90611bb8565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503481600101819055506103ad8261136d565b816003018190555083838260040191826103c8929190611e46565b5050505050565b60008211610412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040990611f62565b60405180910390fd5b60006001600081548092919061042790611bb8565b91905055905060008060008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838160010181905550824261049b9190611f82565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9826040516104d29190611772565b60405180910390a15050505050565b60006002600085815260200190815260200160002090506000600381111561050c5761050b6117c9565b5b8160020160009054906101000a900460ff1660038111156105305761052f6117c9565b5b14610570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056790612002565b60405180910390fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461061c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061390612094565b60405180910390fd5b60018260020160006101000a81548160ff02191690836003811115610644576106436117c9565b5b0217905550838383600501918261065c929190611e46565b507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc8560405161068c9190611772565b60405180910390a15050505050565b60035481565b600080600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074090612126565b60405180910390fd5b8060020154421161078f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610786906121b8565b60405180910390fd5b8060030160019054906101000a900460ff16156107e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d890612224565b60405180910390fd5b8060030160009054906101000a900460ff1615610833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082a906122b6565b60405180910390fd5b60018160030160016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3383600101546040518363ffffffff1660e01b81526004016108af9291906122d6565b6020604051808303816000875af11580156108ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f29190612314565b507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9826040516109229190611772565b60405180910390a15050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff169080600301549080600401805461099690611c69565b80601f01602080910402602001604051908101604052809291908181526020018280546109c290611c69565b8015610a0f5780601f106109e457610100808354040283529160200191610a0f565b820191906000526020600020905b8154815290600101906020018083116109f257829003601f168201915b505050505090806005018054610a2490611c69565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5090611c69565b8015610a9d5780601f10610a7257610100808354040283529160200191610a9d565b820191906000526020600020905b815481529060010190602001808311610a8057829003601f168201915b5050505050908060060160009054906101000a900460ff16905087565b600060026000848152602001908152602001600020905060016003811115610ae557610ae46117c9565b5b8160020160009054906101000a900460ff166003811115610b0957610b086117c9565b5b14610b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b409061238d565b60405180910390fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff02191690836003811115610b8b57610b8a6117c9565b5b0217905550828260060160006101000a81548160ff02191690831515021790555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ff8692408360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856005016040518363ffffffff1660e01b8152600401610c30929190612431565b6020604051808303816000875af1158015610c4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c739190612476565b90507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc8585604051610ca69291906124a3565b60405180910390a160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663afa84560600a8660010154610cfd91906124fb565b8660010154610d0c919061252c565b8460146001600360646001808f604051602001610d299190611772565b6040516020818303038152906040526040518a63ffffffff1660e01b8152600401610d5b989796959493929190612666565b60206040518083038185885af1158015610d79573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d9e9190612476565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663561b246382856001015460016040518463ffffffff1660e01b8152600401610e02939291906126eb565b600060405180830381600087803b158015610e1c57600080fd5b505af1158015610e30573d6000803e3d6000fd5b50505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eff90612794565b60405180910390fd5b8060030160019054906101000a900460ff1615610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5190612224565b60405180910390fd5b8060030160009054906101000a900460ff1615610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa3906122b6565b60405180910390fd5b8060020154421115610fd1578142610fc49190611f82565b8160020181905550610fea565b818160020154610fe19190611f82565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9836040516110199190611772565b60405180910390a1505050565b60015481565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461112a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112190612826565b60405180910390fd5b6000828281019061113b919061178d565b90506000600260008381526020019081526020016000209050846111db578060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a83600101546111a891906124fb565b9081150290604051600060405180830381858888f193505050501580156111d3573d6000803e3d6000fd5b505050611368565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ff8692408360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846004016040518363ffffffff1660e01b815260040161125f929190612431565b6020604051808303816000875af115801561127e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a29190612476565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663afa84560600a84600101546112f191906124fb565b836014600160036064600160006040518963ffffffff1660e01b8152600401611320979695949392919061286c565b60206040518083038185885af115801561133e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906113639190612476565b505050505b505050565b60006113776113eb565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507fd9e7f38a71691fb1db2da17057c03d381a42a9925350883f10e8e5d0bca4a3b483836040516113dd9291906128ef565b60405180910390a150919050565b60008060005b60015481101561146f5760008082815260200190815260200160002060030160009054906101000a900460ff166114625760008082815260200190815260200160002060020154421161146257600080828152602001908152602001600020600101548261145f9190611f82565b91505b80806001019150506113f1565b50600081116114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90612964565b60405180910390fd5b600081446114c19190612984565b9050600080600090505b6001548110156115595760008082815260200190815260200160002060030160009054906101000a900460ff1661154c5760008082815260200190815260200160002060020154421161154c5760008082815260200190815260200160002060010154826115399190611f82565b91508282111561154b57809450611559565b5b80806001019150506114cb565b5050505090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261158f5761158e61156a565b5b8235905067ffffffffffffffff8111156115ac576115ab61156f565b5b6020830191508360018202830111156115c8576115c7611574565b5b9250929050565b600080602083850312156115e6576115e5611560565b5b600083013567ffffffffffffffff81111561160457611603611565565b5b61161085828601611579565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006116478261161c565b9050919050565b6116578161163c565b811461166257600080fd5b50565b6000813590506116748161164e565b92915050565b6000819050919050565b61168d8161167a565b811461169857600080fd5b50565b6000813590506116aa81611684565b92915050565b6000806000606084860312156116c9576116c8611560565b5b60006116d786828701611665565b93505060206116e88682870161169b565b92505060406116f98682870161169b565b9150509250925092565b60008060006040848603121561171c5761171b611560565b5b600061172a8682870161169b565b935050602084013567ffffffffffffffff81111561174b5761174a611565565b5b61175786828701611579565b92509250509250925092565b61176c8161167a565b82525050565b60006020820190506117876000830184611763565b92915050565b6000602082840312156117a3576117a2611560565b5b60006117b18482850161169b565b91505092915050565b6117c38161163c565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110611809576118086117c9565b5b50565b600081905061181a826117f8565b919050565b600061182a8261180c565b9050919050565b61183a8161181f565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561187a57808201518184015260208101905061185f565b60008484015250505050565b6000601f19601f8301169050919050565b60006118a282611840565b6118ac818561184b565b93506118bc81856020860161185c565b6118c581611886565b840191505092915050565b60008115159050919050565b6118e5816118d0565b82525050565b600060e082019050611900600083018a6117ba565b61190d6020830189611763565b61191a6040830188611831565b6119276060830187611763565b81810360808301526119398186611897565b905081810360a083015261194d8185611897565b905061195c60c08301846118dc565b98975050505050505050565b611971816118d0565b811461197c57600080fd5b50565b60008135905061198e81611968565b92915050565b600080604083850312156119ab576119aa611560565b5b60006119b98582860161169b565b92505060206119ca8582860161197f565b9150509250929050565b600080604083850312156119eb576119ea611560565b5b60006119f98582860161169b565b9250506020611a0a8582860161169b565b9150509250929050565b600060a082019050611a2960008301886117ba565b611a366020830187611763565b611a436040830186611763565b611a5060608301856118dc565b611a5d60808301846118dc565b9695505050505050565b60008083601f840112611a7d57611a7c61156a565b5b8235905067ffffffffffffffff811115611a9a57611a9961156f565b5b602083019150836001820283011115611ab657611ab5611574565b5b9250929050565b600080600060408486031215611ad657611ad5611560565b5b6000611ae48682870161197f565b935050602084013567ffffffffffffffff811115611b0557611b04611565565b5b611b1186828701611a67565b92509250509250925092565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b6000611b5360108361184b565b9150611b5e82611b1d565b602082019050919050565b60006020820190508181036000830152611b8281611b46565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611bc38261167a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611bf557611bf4611b89565b5b600182019050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611c8157607f821691505b602082108103611c9457611c93611c3a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611cfc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611cbf565b611d068683611cbf565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611d43611d3e611d398461167a565b611d1e565b61167a565b9050919050565b6000819050919050565b611d5d83611d28565b611d71611d6982611d4a565b848454611ccc565b825550505050565b600090565b611d86611d79565b611d91818484611d54565b505050565b5b81811015611db557611daa600082611d7e565b600181019050611d97565b5050565b601f821115611dfa57611dcb81611c9a565b611dd484611caf565b81016020851015611de3578190505b611df7611def85611caf565b830182611d96565b50505b505050565b600082821c905092915050565b6000611e1d60001984600802611dff565b1980831691505092915050565b6000611e368383611e0c565b9150826002028217905092915050565b611e508383611c00565b67ffffffffffffffff811115611e6957611e68611c0b565b5b611e738254611c69565b611e7e828285611db9565b6000601f831160018114611ead5760008415611e9b578287013590505b611ea58582611e2a565b865550611f0d565b601f198416611ebb86611c9a565b60005b82811015611ee357848901358255600182019150602085019450602081019050611ebe565b86831015611f005784890135611efc601f891682611e0c565b8355505b6001600288020188555050505b50505050505050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b6000611f4c60118361184b565b9150611f5782611f16565b602082019050919050565b60006020820190508181036000830152611f7b81611f3f565b9050919050565b6000611f8d8261167a565b9150611f988361167a565b9250828201905080821115611fb057611faf611b89565b5b92915050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b6000611fec60188361184b565b9150611ff782611fb6565b602082019050919050565b6000602082019050818103600083015261201b81611fdf565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b600061207e603a8361184b565b915061208982612022565b604082019050919050565b600060208201905081810360008301526120ad81612071565b9050919050565b7f576f726b65722063616e206f6e6c79207265636c61696d207468656972206f7760008201527f6e20617661696c6162696c697479207374616b65000000000000000000000000602082015250565b600061211060348361184b565b915061211b826120b4565b604082019050919050565b6000602082019050818103600083015261213f81612103565b9050919050565b7f5374616b65206475726174696f6e20686173206e6f742079657420656c61707360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b60006121a260228361184b565b91506121ad82612146565b604082019050919050565b600060208201905081810360008301526121d181612195565b9050919050565b7f5374616b652068617320616c7265616479206265656e207265636c61696d6564600082015250565b600061220e60208361184b565b9150612219826121d8565b602082019050919050565b6000602082019050818103600083015261223d81612201565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b60006122a060248361184b565b91506122ab82612244565b604082019050919050565b600060208201905081810360008301526122cf81612293565b9050919050565b60006040820190506122eb60008301856117ba565b6122f86020830184611763565b9392505050565b60008151905061230e81611968565b92915050565b60006020828403121561232a57612329611560565b5b6000612338848285016122ff565b91505092915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b600061237760208361184b565b915061238282612341565b602082019050919050565b600060208201905081810360008301526123a68161236a565b9050919050565b600081546123ba81611c69565b6123c4818661184b565b945060018216600081146123df57600181146123f557612428565b60ff198316865281151560200286019350612428565b6123fe85611c9a565b60005b8381101561242057815481890152600182019150602081019050612401565b808801955050505b50505092915050565b600060408201905061244660008301856117ba565b818103602083015261245881846123ad565b90509392505050565b60008151905061247081611684565b92915050565b60006020828403121561248c5761248b611560565b5b600061249a84828501612461565b91505092915050565b60006040820190506124b86000830185611763565b6124c560208301846118dc565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006125068261167a565b91506125118361167a565b925082612521576125206124cc565b5b828204905092915050565b60006125378261167a565b91506125428361167a565b925082820390508181111561255a57612559611b89565b5b92915050565b6000819050919050565b600061258561258061257b84612560565b611d1e565b61167a565b9050919050565b6125958161256a565b82525050565b6000819050919050565b60006125c06125bb6125b68461259b565b611d1e565b61167a565b9050919050565b6125d0816125a5565b82525050565b6000819050919050565b60006125fb6125f66125f1846125d6565b611d1e565b61167a565b9050919050565b61260b816125e0565b82525050565b600081519050919050565b600082825260208201905092915050565b600061263882612611565b612642818561261c565b935061265281856020860161185c565b61265b81611886565b840191505092915050565b60006101008201905061267c600083018b611763565b612689602083018a611763565b612696604083018961258c565b6126a360608301886125c7565b6126b06080830187612602565b6126bd60a08301866118dc565b6126ca60c08301856118dc565b81810360e08301526126dc818461262d565b90509998505050505050505050565b60006060820190506127006000830186611763565b61270d6020830185611763565b61271a60408301846118dc565b949350505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b600061277e60338361184b565b915061278982612722565b604082019050919050565b600060208201905081810360008301526127ad81612771565b9050919050565b7f6f6e56616c6964617465206d6179206f6e6c792062652063616c6c656420627960008201527f207468652044414f20636f6e7472616374000000000000000000000000000000602082015250565b600061281060318361184b565b915061281b826127b4565b604082019050919050565b6000602082019050818103600083015261283f81612803565b9050919050565b50565b600061285660008361261c565b915061286182612846565b600082019050919050565b600061010082019050612882600083018a611763565b61288f6020830189611763565b61289c604083018861258c565b6128a960608301876125c7565b6128b66080830186612602565b6128c360a08301856118dc565b6128d060c08301846118dc565b81810360e08301526128e181612849565b905098975050505050505050565b60006040820190506129046000830185611763565b6129116020830184611763565b9392505050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b600061294e601a8361184b565b915061295982612918565b602082019050919050565b6000602082019050818103600083015261297d81612941565b9050919050565b600061298f8261167a565b915061299a8361167a565b9250826129aa576129a96124cc565b5b82820690509291505056fea2646970667358221220ab6a16dd52dfafb8bfa0bc3893432526a237335975fbb0f1444b9fa2ff0c542c64736f6c63430008180033", + "deployedBytecode": "0x6080604052600436106100a75760003560e01c8063854b6a4f11610064578063854b6a4f146101b1578063a035b1fe146101da578063b5b20c0014610205578063c4a9e1161461022e578063d5a44f8614610259578063e1397c6e1461029a576100a7565b80630d0271d6146100ac578063216ed6ad146100c85780635b5cf6d4146100f15780635badbe4c1461011a5780638150d5071461014557806381d12c581461016e575b600080fd5b6100c660048036038101906100c191906115cf565b6102c3565b005b3480156100d457600080fd5b506100ef60048036038101906100ea91906116b0565b6103cf565b005b3480156100fd57600080fd5b5061011860048036038101906101139190611703565b6104e1565b005b34801561012657600080fd5b5061012f61069b565b60405161013c9190611772565b60405180910390f35b34801561015157600080fd5b5061016c6004803603810190610167919061178d565b6106a1565b005b34801561017a57600080fd5b506101956004803603810190610190919061178d565b61092e565b6040516101a897969594939291906118eb565b60405180910390f35b3480156101bd57600080fd5b506101d860048036038101906101d39190611994565b610aba565b005b3480156101e657600080fd5b506101ef610e3c565b6040516101fc9190611772565b60405180910390f35b34801561021157600080fd5b5061022c600480360381019061022791906119d4565b610e60565b005b34801561023a57600080fd5b50610243611026565b6040516102509190611772565b60405180910390f35b34801561026557600080fd5b50610280600480360381019061027b919061178d565b61102c565b604051610291959493929190611a14565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190611abd565b61109c565b005b7f0000000000000000000000000000000000000000000000000000000000000000341015610326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161031d90611b69565b60405180910390fd5b60006003600081548092919061033b90611bb8565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503481600101819055506103ad8261136d565b816003018190555083838260040191826103c8929190611e46565b5050505050565b60008211610412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040990611f62565b60405180910390fd5b60006001600081548092919061042790611bb8565b91905055905060008060008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838160010181905550824261049b9190611f82565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9826040516104d29190611772565b60405180910390a15050505050565b60006002600085815260200190815260200160002090506000600381111561050c5761050b6117c9565b5b8160020160009054906101000a900460ff1660038111156105305761052f6117c9565b5b14610570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056790612002565b60405180910390fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461061c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061390612094565b60405180910390fd5b60018260020160006101000a81548160ff02191690836003811115610644576106436117c9565b5b0217905550838383600501918261065c929190611e46565b507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc8560405161068c9190611772565b60405180910390a15050505050565b60035481565b600080600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074090612126565b60405180910390fd5b8060020154421161078f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610786906121b8565b60405180910390fd5b8060030160019054906101000a900460ff16156107e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d890612224565b60405180910390fd5b8060030160009054906101000a900460ff1615610833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082a906122b6565b60405180910390fd5b60018160030160016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3383600101546040518363ffffffff1660e01b81526004016108af9291906122d6565b6020604051808303816000875af11580156108ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f29190612314565b507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9826040516109229190611772565b60405180910390a15050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff169080600301549080600401805461099690611c69565b80601f01602080910402602001604051908101604052809291908181526020018280546109c290611c69565b8015610a0f5780601f106109e457610100808354040283529160200191610a0f565b820191906000526020600020905b8154815290600101906020018083116109f257829003601f168201915b505050505090806005018054610a2490611c69565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5090611c69565b8015610a9d5780601f10610a7257610100808354040283529160200191610a9d565b820191906000526020600020905b815481529060010190602001808311610a8057829003601f168201915b5050505050908060060160009054906101000a900460ff16905087565b600060026000848152602001908152602001600020905060016003811115610ae557610ae46117c9565b5b8160020160009054906101000a900460ff166003811115610b0957610b086117c9565b5b14610b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b409061238d565b60405180910390fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff02191690836003811115610b8b57610b8a6117c9565b5b0217905550828260060160006101000a81548160ff02191690831515021790555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ff8692408360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856005016040518363ffffffff1660e01b8152600401610c30929190612431565b6020604051808303816000875af1158015610c4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c739190612476565b90507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc8585604051610ca69291906124a3565b60405180910390a160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663afa84560600a8660010154610cfd91906124fb565b8660010154610d0c919061252c565b8460146001600360646001808f604051602001610d299190611772565b6040516020818303038152906040526040518a63ffffffff1660e01b8152600401610d5b989796959493929190612666565b60206040518083038185885af1158015610d79573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d9e9190612476565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663561b246382856001015460016040518463ffffffff1660e01b8152600401610e02939291906126eb565b600060405180830381600087803b158015610e1c57600080fd5b505af1158015610e30573d6000803e3d6000fd5b50505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eff90612794565b60405180910390fd5b8060030160019054906101000a900460ff1615610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5190612224565b60405180910390fd5b8060030160009054906101000a900460ff1615610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa3906122b6565b60405180910390fd5b8060020154421115610fd1578142610fc49190611f82565b8160020181905550610fea565b818160020154610fe19190611f82565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9836040516110199190611772565b60405180910390a1505050565b60015481565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461112a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112190612826565b60405180910390fd5b6000828281019061113b919061178d565b90506000600260008381526020019081526020016000209050846111db578060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a83600101546111a891906124fb565b9081150290604051600060405180830381858888f193505050501580156111d3573d6000803e3d6000fd5b505050611368565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ff8692408360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846004016040518363ffffffff1660e01b815260040161125f929190612431565b6020604051808303816000875af115801561127e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a29190612476565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663afa84560600a84600101546112f191906124fb565b836014600160036064600160006040518963ffffffff1660e01b8152600401611320979695949392919061286c565b60206040518083038185885af115801561133e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906113639190612476565b505050505b505050565b60006113776113eb565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507fd9e7f38a71691fb1db2da17057c03d381a42a9925350883f10e8e5d0bca4a3b483836040516113dd9291906128ef565b60405180910390a150919050565b60008060005b60015481101561146f5760008082815260200190815260200160002060030160009054906101000a900460ff166114625760008082815260200190815260200160002060020154421161146257600080828152602001908152602001600020600101548261145f9190611f82565b91505b80806001019150506113f1565b50600081116114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90612964565b60405180910390fd5b600081446114c19190612984565b9050600080600090505b6001548110156115595760008082815260200190815260200160002060030160009054906101000a900460ff1661154c5760008082815260200190815260200160002060020154421161154c5760008082815260200190815260200160002060010154826115399190611f82565b91508282111561154b57809450611559565b5b80806001019150506114cb565b5050505090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261158f5761158e61156a565b5b8235905067ffffffffffffffff8111156115ac576115ab61156f565b5b6020830191508360018202830111156115c8576115c7611574565b5b9250929050565b600080602083850312156115e6576115e5611560565b5b600083013567ffffffffffffffff81111561160457611603611565565b5b61161085828601611579565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006116478261161c565b9050919050565b6116578161163c565b811461166257600080fd5b50565b6000813590506116748161164e565b92915050565b6000819050919050565b61168d8161167a565b811461169857600080fd5b50565b6000813590506116aa81611684565b92915050565b6000806000606084860312156116c9576116c8611560565b5b60006116d786828701611665565b93505060206116e88682870161169b565b92505060406116f98682870161169b565b9150509250925092565b60008060006040848603121561171c5761171b611560565b5b600061172a8682870161169b565b935050602084013567ffffffffffffffff81111561174b5761174a611565565b5b61175786828701611579565b92509250509250925092565b61176c8161167a565b82525050565b60006020820190506117876000830184611763565b92915050565b6000602082840312156117a3576117a2611560565b5b60006117b18482850161169b565b91505092915050565b6117c38161163c565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110611809576118086117c9565b5b50565b600081905061181a826117f8565b919050565b600061182a8261180c565b9050919050565b61183a8161181f565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561187a57808201518184015260208101905061185f565b60008484015250505050565b6000601f19601f8301169050919050565b60006118a282611840565b6118ac818561184b565b93506118bc81856020860161185c565b6118c581611886565b840191505092915050565b60008115159050919050565b6118e5816118d0565b82525050565b600060e082019050611900600083018a6117ba565b61190d6020830189611763565b61191a6040830188611831565b6119276060830187611763565b81810360808301526119398186611897565b905081810360a083015261194d8185611897565b905061195c60c08301846118dc565b98975050505050505050565b611971816118d0565b811461197c57600080fd5b50565b60008135905061198e81611968565b92915050565b600080604083850312156119ab576119aa611560565b5b60006119b98582860161169b565b92505060206119ca8582860161197f565b9150509250929050565b600080604083850312156119eb576119ea611560565b5b60006119f98582860161169b565b9250506020611a0a8582860161169b565b9150509250929050565b600060a082019050611a2960008301886117ba565b611a366020830187611763565b611a436040830186611763565b611a5060608301856118dc565b611a5d60808301846118dc565b9695505050505050565b60008083601f840112611a7d57611a7c61156a565b5b8235905067ffffffffffffffff811115611a9a57611a9961156f565b5b602083019150836001820283011115611ab657611ab5611574565b5b9250929050565b600080600060408486031215611ad657611ad5611560565b5b6000611ae48682870161197f565b935050602084013567ffffffffffffffff811115611b0557611b04611565565b5b611b1186828701611a67565b92509250509250925092565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b6000611b5360108361184b565b9150611b5e82611b1d565b602082019050919050565b60006020820190508181036000830152611b8281611b46565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611bc38261167a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611bf557611bf4611b89565b5b600182019050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611c8157607f821691505b602082108103611c9457611c93611c3a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611cfc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611cbf565b611d068683611cbf565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611d43611d3e611d398461167a565b611d1e565b61167a565b9050919050565b6000819050919050565b611d5d83611d28565b611d71611d6982611d4a565b848454611ccc565b825550505050565b600090565b611d86611d79565b611d91818484611d54565b505050565b5b81811015611db557611daa600082611d7e565b600181019050611d97565b5050565b601f821115611dfa57611dcb81611c9a565b611dd484611caf565b81016020851015611de3578190505b611df7611def85611caf565b830182611d96565b50505b505050565b600082821c905092915050565b6000611e1d60001984600802611dff565b1980831691505092915050565b6000611e368383611e0c565b9150826002028217905092915050565b611e508383611c00565b67ffffffffffffffff811115611e6957611e68611c0b565b5b611e738254611c69565b611e7e828285611db9565b6000601f831160018114611ead5760008415611e9b578287013590505b611ea58582611e2a565b865550611f0d565b601f198416611ebb86611c9a565b60005b82811015611ee357848901358255600182019150602085019450602081019050611ebe565b86831015611f005784890135611efc601f891682611e0c565b8355505b6001600288020188555050505b50505050505050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b6000611f4c60118361184b565b9150611f5782611f16565b602082019050919050565b60006020820190508181036000830152611f7b81611f3f565b9050919050565b6000611f8d8261167a565b9150611f988361167a565b9250828201905080821115611fb057611faf611b89565b5b92915050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b6000611fec60188361184b565b9150611ff782611fb6565b602082019050919050565b6000602082019050818103600083015261201b81611fdf565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b600061207e603a8361184b565b915061208982612022565b604082019050919050565b600060208201905081810360008301526120ad81612071565b9050919050565b7f576f726b65722063616e206f6e6c79207265636c61696d207468656972206f7760008201527f6e20617661696c6162696c697479207374616b65000000000000000000000000602082015250565b600061211060348361184b565b915061211b826120b4565b604082019050919050565b6000602082019050818103600083015261213f81612103565b9050919050565b7f5374616b65206475726174696f6e20686173206e6f742079657420656c61707360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b60006121a260228361184b565b91506121ad82612146565b604082019050919050565b600060208201905081810360008301526121d181612195565b9050919050565b7f5374616b652068617320616c7265616479206265656e207265636c61696d6564600082015250565b600061220e60208361184b565b9150612219826121d8565b602082019050919050565b6000602082019050818103600083015261223d81612201565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b60006122a060248361184b565b91506122ab82612244565b604082019050919050565b600060208201905081810360008301526122cf81612293565b9050919050565b60006040820190506122eb60008301856117ba565b6122f86020830184611763565b9392505050565b60008151905061230e81611968565b92915050565b60006020828403121561232a57612329611560565b5b6000612338848285016122ff565b91505092915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b600061237760208361184b565b915061238282612341565b602082019050919050565b600060208201905081810360008301526123a68161236a565b9050919050565b600081546123ba81611c69565b6123c4818661184b565b945060018216600081146123df57600181146123f557612428565b60ff198316865281151560200286019350612428565b6123fe85611c9a565b60005b8381101561242057815481890152600182019150602081019050612401565b808801955050505b50505092915050565b600060408201905061244660008301856117ba565b818103602083015261245881846123ad565b90509392505050565b60008151905061247081611684565b92915050565b60006020828403121561248c5761248b611560565b5b600061249a84828501612461565b91505092915050565b60006040820190506124b86000830185611763565b6124c560208301846118dc565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006125068261167a565b91506125118361167a565b925082612521576125206124cc565b5b828204905092915050565b60006125378261167a565b91506125428361167a565b925082820390508181111561255a57612559611b89565b5b92915050565b6000819050919050565b600061258561258061257b84612560565b611d1e565b61167a565b9050919050565b6125958161256a565b82525050565b6000819050919050565b60006125c06125bb6125b68461259b565b611d1e565b61167a565b9050919050565b6125d0816125a5565b82525050565b6000819050919050565b60006125fb6125f66125f1846125d6565b611d1e565b61167a565b9050919050565b61260b816125e0565b82525050565b600081519050919050565b600082825260208201905092915050565b600061263882612611565b612642818561261c565b935061265281856020860161185c565b61265b81611886565b840191505092915050565b60006101008201905061267c600083018b611763565b612689602083018a611763565b612696604083018961258c565b6126a360608301886125c7565b6126b06080830187612602565b6126bd60a08301866118dc565b6126ca60c08301856118dc565b81810360e08301526126dc818461262d565b90509998505050505050505050565b60006060820190506127006000830186611763565b61270d6020830185611763565b61271a60408301846118dc565b949350505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b600061277e60338361184b565b915061278982612722565b604082019050919050565b600060208201905081810360008301526127ad81612771565b9050919050565b7f6f6e56616c6964617465206d6179206f6e6c792062652063616c6c656420627960008201527f207468652044414f20636f6e7472616374000000000000000000000000000000602082015250565b600061281060318361184b565b915061281b826127b4565b604082019050919050565b6000602082019050818103600083015261283f81612803565b9050919050565b50565b600061285660008361261c565b915061286182612846565b600082019050919050565b600061010082019050612882600083018a611763565b61288f6020830189611763565b61289c604083018861258c565b6128a960608301876125c7565b6128b66080830186612602565b6128c360a08301856118dc565b6128d060c08301846118dc565b81810360e08301526128e181612849565b905098975050505050505050565b60006040820190506129046000830185611763565b6129116020830184611763565b9392505050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b600061294e601a8361184b565b915061295982612918565b602082019050919050565b6000602082019050818103600083015261297d81612941565b9050919050565b600061298f8261167a565b915061299a8361167a565b9250826129aa576129a96124cc565b5b82820690509291505056fea2646970667358221220ab6a16dd52dfafb8bfa0bc3893432526a237335975fbb0f1444b9fa2ff0c542c64736f6c63430008180033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/client/src/assets/Work1.json b/client/src/assets/Work1.json index 38fdea5..0e4225b 100644 --- a/client/src/assets/Work1.json +++ b/client/src/assets/Work1.json @@ -314,8 +314,8 @@ "type": "function" } ], - "bytecode": "0x60c06040523480156200001157600080fd5b506040516200259838038062002598833981810160405281019062000037919062000138565b81818173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508060a08181525050505050506200017f565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000b18262000084565b9050919050565b6000620000c582620000a4565b9050919050565b620000d781620000b8565b8114620000e357600080fd5b50565b600081519050620000f781620000cc565b92915050565b6000819050919050565b6200011281620000fd565b81146200011e57600080fd5b50565b600081519050620001328162000107565b92915050565b600080604083850312156200015257620001516200007f565b5b60006200016285828601620000e6565b9250506020620001758582860162000121565b9150509250929050565b60805160a0516123d7620001c1600039600081816102910152610dc901526000818161081e01528181610b7c01528181610c7e0152610d2d01526123d76000f3fe60806040526004361061009c5760003560e01c806381d12c581161006457806381d12c5814610163578063854b6a4f146101a6578063a035b1fe146101cf578063b5b20c00146101fa578063c4a9e11614610223578063d5a44f861461024e5761009c565b80630d0271d6146100a1578063216ed6ad146100bd5780635b5cf6d4146100e65780635badbe4c1461010f5780638150d5071461013a575b600080fd5b6100bb60048036038101906100b69190611289565b61028f565b005b3480156100c957600080fd5b506100e460048036038101906100df919061136a565b61039b565b005b3480156100f257600080fd5b5061010d600480360381019061010891906113bd565b6104ad565b005b34801561011b57600080fd5b50610124610667565b604051610131919061142c565b60405180910390f35b34801561014657600080fd5b50610161600480360381019061015c9190611447565b61066d565b005b34801561016f57600080fd5b5061018a60048036038101906101859190611447565b6108fa565b60405161019d97969594939291906115a5565b60405180910390f35b3480156101b257600080fd5b506101cd60048036038101906101c8919061164e565b610a86565b005b3480156101db57600080fd5b506101e4610dc7565b6040516101f1919061142c565b60405180910390f35b34801561020657600080fd5b50610221600480360381019061021c919061168e565b610deb565b005b34801561022f57600080fd5b50610238610fb1565b604051610245919061142c565b60405180910390f35b34801561025a57600080fd5b5061027560048036038101906102709190611447565b610fb7565b6040516102869594939291906116ce565b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000003410156102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e99061176d565b60405180910390fd5b600060036000815480929190610307906117bc565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034816001018190555061037982611027565b81600301819055508383826004019182610394929190611a4a565b5050505050565b600082116103de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103d590611b66565b60405180910390fd5b6000600160008154809291906103f3906117bc565b91905055905060008060008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083816001018190555082426104679190611b86565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98260405161049e919061142c565b60405180910390a15050505050565b6000600260008581526020019081526020016000209050600060038111156104d8576104d7611483565b5b8160020160009054906101000a900460ff1660038111156104fc576104fb611483565b5b1461053c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053390611c06565b60405180910390fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105df90611c98565b60405180910390fd5b60018260020160006101000a81548160ff021916908360038111156106105761060f611483565b5b02179055508383836005019182610628929190611a4a565b507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc85604051610658919061142c565b60405180910390a15050505050565b60035481565b600080600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070c90611d2a565b60405180910390fd5b8060020154421161075b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075290611dbc565b60405180910390fd5b8060030160019054906101000a900460ff16156107ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a490611e28565b60405180910390fd5b8060030160009054906101000a900460ff16156107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690611eba565b60405180910390fd5b60018160030160016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3383600101546040518363ffffffff1660e01b815260040161087b929190611eda565b6020604051808303816000875af115801561089a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108be9190611f18565b507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9826040516108ee919061142c565b60405180910390a15050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060030154908060040180546109629061186d565b80601f016020809104026020016040519081016040528092919081815260200182805461098e9061186d565b80156109db5780601f106109b0576101008083540402835291602001916109db565b820191906000526020600020905b8154815290600101906020018083116109be57829003601f168201915b5050505050908060050180546109f09061186d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1c9061186d565b8015610a695780601f10610a3e57610100808354040283529160200191610a69565b820191906000526020600020905b815481529060010190602001808311610a4c57829003601f168201915b5050505050908060060160009054906101000a900460ff16905087565b600060026000848152602001908152602001600020905060016003811115610ab157610ab0611483565b5b8160020160009054906101000a900460ff166003811115610ad557610ad4611483565b5b14610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c90611f91565b60405180910390fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff02191690836003811115610b5757610b56611483565b5b0217905550828260060160006101000a81548160ff02191690831515021790555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ff8692408360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856005016040518363ffffffff1660e01b8152600401610bfc929190612035565b6020604051808303816000875af1158015610c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3f919061207a565b90507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc8585604051610c729291906120a7565b60405180910390a160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630ce7e29985600101548460146001600360006040518763ffffffff1660e01b8152600401610ce695949392919061217d565b60206040518083038185885af1158015610d04573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d29919061207a565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663561b246382856001015460016040518463ffffffff1660e01b8152600401610d8d939291906121e3565b600060405180830381600087803b158015610da757600080fd5b505af1158015610dbb573d6000803e3d6000fd5b50505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a9061228c565b60405180910390fd5b8060030160019054906101000a900460ff1615610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc90611e28565b60405180910390fd5b8060030160009054906101000a900460ff1615610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e90611eba565b60405180910390fd5b8060020154421115610f5c578142610f4f9190611b86565b8160020181905550610f75565b818160020154610f6c9190611b86565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e983604051610fa4919061142c565b60405180910390a1505050565b60015481565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b60006110316110a5565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507fd9e7f38a71691fb1db2da17057c03d381a42a9925350883f10e8e5d0bca4a3b483836040516110979291906122ac565b60405180910390a150919050565b60008060005b6001548110156111295760008082815260200190815260200160002060030160009054906101000a900460ff1661111c5760008082815260200190815260200160002060020154421161111c5760008082815260200190815260200160002060010154826111199190611b86565b91505b80806001019150506110ab565b506000811161116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490612321565b60405180910390fd5b6000814461117b9190612370565b9050600080600090505b6001548110156112135760008082815260200190815260200160002060030160009054906101000a900460ff16611206576000808281526020019081526020016000206002015442116112065760008082815260200190815260200160002060010154826111f39190611b86565b91508282111561120557809450611213565b5b8080600101915050611185565b5050505090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261124957611248611224565b5b8235905067ffffffffffffffff81111561126657611265611229565b5b6020830191508360018202830111156112825761128161122e565b5b9250929050565b600080602083850312156112a05761129f61121a565b5b600083013567ffffffffffffffff8111156112be576112bd61121f565b5b6112ca85828601611233565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611301826112d6565b9050919050565b611311816112f6565b811461131c57600080fd5b50565b60008135905061132e81611308565b92915050565b6000819050919050565b61134781611334565b811461135257600080fd5b50565b6000813590506113648161133e565b92915050565b6000806000606084860312156113835761138261121a565b5b60006113918682870161131f565b93505060206113a286828701611355565b92505060406113b386828701611355565b9150509250925092565b6000806000604084860312156113d6576113d561121a565b5b60006113e486828701611355565b935050602084013567ffffffffffffffff8111156114055761140461121f565b5b61141186828701611233565b92509250509250925092565b61142681611334565b82525050565b6000602082019050611441600083018461141d565b92915050565b60006020828403121561145d5761145c61121a565b5b600061146b84828501611355565b91505092915050565b61147d816112f6565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106114c3576114c2611483565b5b50565b60008190506114d4826114b2565b919050565b60006114e4826114c6565b9050919050565b6114f4816114d9565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611534578082015181840152602081019050611519565b60008484015250505050565b6000601f19601f8301169050919050565b600061155c826114fa565b6115668185611505565b9350611576818560208601611516565b61157f81611540565b840191505092915050565b60008115159050919050565b61159f8161158a565b82525050565b600060e0820190506115ba600083018a611474565b6115c7602083018961141d565b6115d460408301886114eb565b6115e1606083018761141d565b81810360808301526115f38186611551565b905081810360a08301526116078185611551565b905061161660c0830184611596565b98975050505050505050565b61162b8161158a565b811461163657600080fd5b50565b60008135905061164881611622565b92915050565b600080604083850312156116655761166461121a565b5b600061167385828601611355565b925050602061168485828601611639565b9150509250929050565b600080604083850312156116a5576116a461121a565b5b60006116b385828601611355565b92505060206116c485828601611355565b9150509250929050565b600060a0820190506116e36000830188611474565b6116f0602083018761141d565b6116fd604083018661141d565b61170a6060830185611596565b6117176080830184611596565b9695505050505050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b6000611757601083611505565b915061176282611721565b602082019050919050565b600060208201905081810360008301526117868161174a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006117c782611334565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036117f9576117f861178d565b5b600182019050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061188557607f821691505b6020821081036118985761189761183e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026119007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826118c3565b61190a86836118c3565b95508019841693508086168417925050509392505050565b6000819050919050565b600061194761194261193d84611334565b611922565b611334565b9050919050565b6000819050919050565b6119618361192c565b61197561196d8261194e565b8484546118d0565b825550505050565b600090565b61198a61197d565b611995818484611958565b505050565b5b818110156119b9576119ae600082611982565b60018101905061199b565b5050565b601f8211156119fe576119cf8161189e565b6119d8846118b3565b810160208510156119e7578190505b6119fb6119f3856118b3565b83018261199a565b50505b505050565b600082821c905092915050565b6000611a2160001984600802611a03565b1980831691505092915050565b6000611a3a8383611a10565b9150826002028217905092915050565b611a548383611804565b67ffffffffffffffff811115611a6d57611a6c61180f565b5b611a77825461186d565b611a828282856119bd565b6000601f831160018114611ab15760008415611a9f578287013590505b611aa98582611a2e565b865550611b11565b601f198416611abf8661189e565b60005b82811015611ae757848901358255600182019150602085019450602081019050611ac2565b86831015611b045784890135611b00601f891682611a10565b8355505b6001600288020188555050505b50505050505050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b6000611b50601183611505565b9150611b5b82611b1a565b602082019050919050565b60006020820190508181036000830152611b7f81611b43565b9050919050565b6000611b9182611334565b9150611b9c83611334565b9250828201905080821115611bb457611bb361178d565b5b92915050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b6000611bf0601883611505565b9150611bfb82611bba565b602082019050919050565b60006020820190508181036000830152611c1f81611be3565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b6000611c82603a83611505565b9150611c8d82611c26565b604082019050919050565b60006020820190508181036000830152611cb181611c75565b9050919050565b7f576f726b65722063616e206f6e6c79207265636c61696d207468656972206f7760008201527f6e20617661696c6162696c697479207374616b65000000000000000000000000602082015250565b6000611d14603483611505565b9150611d1f82611cb8565b604082019050919050565b60006020820190508181036000830152611d4381611d07565b9050919050565b7f5374616b65206475726174696f6e20686173206e6f742079657420656c61707360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000611da6602283611505565b9150611db182611d4a565b604082019050919050565b60006020820190508181036000830152611dd581611d99565b9050919050565b7f5374616b652068617320616c7265616479206265656e207265636c61696d6564600082015250565b6000611e12602083611505565b9150611e1d82611ddc565b602082019050919050565b60006020820190508181036000830152611e4181611e05565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b6000611ea4602483611505565b9150611eaf82611e48565b604082019050919050565b60006020820190508181036000830152611ed381611e97565b9050919050565b6000604082019050611eef6000830185611474565b611efc602083018461141d565b9392505050565b600081519050611f1281611622565b92915050565b600060208284031215611f2e57611f2d61121a565b5b6000611f3c84828501611f03565b91505092915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b6000611f7b602083611505565b9150611f8682611f45565b602082019050919050565b60006020820190508181036000830152611faa81611f6e565b9050919050565b60008154611fbe8161186d565b611fc88186611505565b94506001821660008114611fe35760018114611ff95761202c565b60ff19831686528115156020028601935061202c565b6120028561189e565b60005b8381101561202457815481890152600182019150602081019050612005565b808801955050505b50505092915050565b600060408201905061204a6000830185611474565b818103602083015261205c8184611fb1565b90509392505050565b6000815190506120748161133e565b92915050565b6000602082840312156120905761208f61121a565b5b600061209e84828501612065565b91505092915050565b60006040820190506120bc600083018561141d565b6120c96020830184611596565b9392505050565b6000819050919050565b60006120f56120f06120eb846120d0565b611922565b611334565b9050919050565b612105816120da565b82525050565b6000819050919050565b600061213061212b6121268461210b565b611922565b611334565b9050919050565b61214081612115565b82525050565b600082825260208201905092915050565b50565b6000612167600083612146565b915061217282612157565b600082019050919050565b600060c082019050612192600083018861141d565b61219f602083018761141d565b6121ac60408301866120fc565b6121b96060830185612137565b6121c66080830184611596565b81810360a08301526121d78161215a565b90509695505050505050565b60006060820190506121f8600083018661141d565b612205602083018561141d565b6122126040830184611596565b949350505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b6000612276603383611505565b91506122818261221a565b604082019050919050565b600060208201905081810360008301526122a581612269565b9050919050565b60006040820190506122c1600083018561141d565b6122ce602083018461141d565b9392505050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b600061230b601a83611505565b9150612316826122d5565b602082019050919050565b6000602082019050818103600083015261233a816122fe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061237b82611334565b915061238683611334565b92508261239657612395612341565b5b82820690509291505056fea264697066735822122007b3397627cc60f1bdbe1c89373f9aae2944d982f1e086ee64b326fce7c8e0cf64736f6c63430008180033", - "deployedBytecode": "0x60806040526004361061009c5760003560e01c806381d12c581161006457806381d12c5814610163578063854b6a4f146101a6578063a035b1fe146101cf578063b5b20c00146101fa578063c4a9e11614610223578063d5a44f861461024e5761009c565b80630d0271d6146100a1578063216ed6ad146100bd5780635b5cf6d4146100e65780635badbe4c1461010f5780638150d5071461013a575b600080fd5b6100bb60048036038101906100b69190611289565b61028f565b005b3480156100c957600080fd5b506100e460048036038101906100df919061136a565b61039b565b005b3480156100f257600080fd5b5061010d600480360381019061010891906113bd565b6104ad565b005b34801561011b57600080fd5b50610124610667565b604051610131919061142c565b60405180910390f35b34801561014657600080fd5b50610161600480360381019061015c9190611447565b61066d565b005b34801561016f57600080fd5b5061018a60048036038101906101859190611447565b6108fa565b60405161019d97969594939291906115a5565b60405180910390f35b3480156101b257600080fd5b506101cd60048036038101906101c8919061164e565b610a86565b005b3480156101db57600080fd5b506101e4610dc7565b6040516101f1919061142c565b60405180910390f35b34801561020657600080fd5b50610221600480360381019061021c919061168e565b610deb565b005b34801561022f57600080fd5b50610238610fb1565b604051610245919061142c565b60405180910390f35b34801561025a57600080fd5b5061027560048036038101906102709190611447565b610fb7565b6040516102869594939291906116ce565b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000003410156102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e99061176d565b60405180910390fd5b600060036000815480929190610307906117bc565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034816001018190555061037982611027565b81600301819055508383826004019182610394929190611a4a565b5050505050565b600082116103de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103d590611b66565b60405180910390fd5b6000600160008154809291906103f3906117bc565b91905055905060008060008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083816001018190555082426104679190611b86565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98260405161049e919061142c565b60405180910390a15050505050565b6000600260008581526020019081526020016000209050600060038111156104d8576104d7611483565b5b8160020160009054906101000a900460ff1660038111156104fc576104fb611483565b5b1461053c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053390611c06565b60405180910390fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105df90611c98565b60405180910390fd5b60018260020160006101000a81548160ff021916908360038111156106105761060f611483565b5b02179055508383836005019182610628929190611a4a565b507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc85604051610658919061142c565b60405180910390a15050505050565b60035481565b600080600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070c90611d2a565b60405180910390fd5b8060020154421161075b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075290611dbc565b60405180910390fd5b8060030160019054906101000a900460ff16156107ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a490611e28565b60405180910390fd5b8060030160009054906101000a900460ff16156107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690611eba565b60405180910390fd5b60018160030160016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3383600101546040518363ffffffff1660e01b815260040161087b929190611eda565b6020604051808303816000875af115801561089a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108be9190611f18565b507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9826040516108ee919061142c565b60405180910390a15050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060030154908060040180546109629061186d565b80601f016020809104026020016040519081016040528092919081815260200182805461098e9061186d565b80156109db5780601f106109b0576101008083540402835291602001916109db565b820191906000526020600020905b8154815290600101906020018083116109be57829003601f168201915b5050505050908060050180546109f09061186d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1c9061186d565b8015610a695780601f10610a3e57610100808354040283529160200191610a69565b820191906000526020600020905b815481529060010190602001808311610a4c57829003601f168201915b5050505050908060060160009054906101000a900460ff16905087565b600060026000848152602001908152602001600020905060016003811115610ab157610ab0611483565b5b8160020160009054906101000a900460ff166003811115610ad557610ad4611483565b5b14610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c90611f91565b60405180910390fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff02191690836003811115610b5757610b56611483565b5b0217905550828260060160006101000a81548160ff02191690831515021790555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ff8692408360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856005016040518363ffffffff1660e01b8152600401610bfc929190612035565b6020604051808303816000875af1158015610c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3f919061207a565b90507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc8585604051610c729291906120a7565b60405180910390a160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630ce7e29985600101548460146001600360006040518763ffffffff1660e01b8152600401610ce695949392919061217d565b60206040518083038185885af1158015610d04573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d29919061207a565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663561b246382856001015460016040518463ffffffff1660e01b8152600401610d8d939291906121e3565b600060405180830381600087803b158015610da757600080fd5b505af1158015610dbb573d6000803e3d6000fd5b50505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a9061228c565b60405180910390fd5b8060030160019054906101000a900460ff1615610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc90611e28565b60405180910390fd5b8060030160009054906101000a900460ff1615610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e90611eba565b60405180910390fd5b8060020154421115610f5c578142610f4f9190611b86565b8160020181905550610f75565b818160020154610f6c9190611b86565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e983604051610fa4919061142c565b60405180910390a1505050565b60015481565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b60006110316110a5565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507fd9e7f38a71691fb1db2da17057c03d381a42a9925350883f10e8e5d0bca4a3b483836040516110979291906122ac565b60405180910390a150919050565b60008060005b6001548110156111295760008082815260200190815260200160002060030160009054906101000a900460ff1661111c5760008082815260200190815260200160002060020154421161111c5760008082815260200190815260200160002060010154826111199190611b86565b91505b80806001019150506110ab565b506000811161116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490612321565b60405180910390fd5b6000814461117b9190612370565b9050600080600090505b6001548110156112135760008082815260200190815260200160002060030160009054906101000a900460ff16611206576000808281526020019081526020016000206002015442116112065760008082815260200190815260200160002060010154826111f39190611b86565b91508282111561120557809450611213565b5b8080600101915050611185565b5050505090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261124957611248611224565b5b8235905067ffffffffffffffff81111561126657611265611229565b5b6020830191508360018202830111156112825761128161122e565b5b9250929050565b600080602083850312156112a05761129f61121a565b5b600083013567ffffffffffffffff8111156112be576112bd61121f565b5b6112ca85828601611233565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611301826112d6565b9050919050565b611311816112f6565b811461131c57600080fd5b50565b60008135905061132e81611308565b92915050565b6000819050919050565b61134781611334565b811461135257600080fd5b50565b6000813590506113648161133e565b92915050565b6000806000606084860312156113835761138261121a565b5b60006113918682870161131f565b93505060206113a286828701611355565b92505060406113b386828701611355565b9150509250925092565b6000806000604084860312156113d6576113d561121a565b5b60006113e486828701611355565b935050602084013567ffffffffffffffff8111156114055761140461121f565b5b61141186828701611233565b92509250509250925092565b61142681611334565b82525050565b6000602082019050611441600083018461141d565b92915050565b60006020828403121561145d5761145c61121a565b5b600061146b84828501611355565b91505092915050565b61147d816112f6565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106114c3576114c2611483565b5b50565b60008190506114d4826114b2565b919050565b60006114e4826114c6565b9050919050565b6114f4816114d9565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611534578082015181840152602081019050611519565b60008484015250505050565b6000601f19601f8301169050919050565b600061155c826114fa565b6115668185611505565b9350611576818560208601611516565b61157f81611540565b840191505092915050565b60008115159050919050565b61159f8161158a565b82525050565b600060e0820190506115ba600083018a611474565b6115c7602083018961141d565b6115d460408301886114eb565b6115e1606083018761141d565b81810360808301526115f38186611551565b905081810360a08301526116078185611551565b905061161660c0830184611596565b98975050505050505050565b61162b8161158a565b811461163657600080fd5b50565b60008135905061164881611622565b92915050565b600080604083850312156116655761166461121a565b5b600061167385828601611355565b925050602061168485828601611639565b9150509250929050565b600080604083850312156116a5576116a461121a565b5b60006116b385828601611355565b92505060206116c485828601611355565b9150509250929050565b600060a0820190506116e36000830188611474565b6116f0602083018761141d565b6116fd604083018661141d565b61170a6060830185611596565b6117176080830184611596565b9695505050505050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b6000611757601083611505565b915061176282611721565b602082019050919050565b600060208201905081810360008301526117868161174a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006117c782611334565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036117f9576117f861178d565b5b600182019050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061188557607f821691505b6020821081036118985761189761183e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026119007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826118c3565b61190a86836118c3565b95508019841693508086168417925050509392505050565b6000819050919050565b600061194761194261193d84611334565b611922565b611334565b9050919050565b6000819050919050565b6119618361192c565b61197561196d8261194e565b8484546118d0565b825550505050565b600090565b61198a61197d565b611995818484611958565b505050565b5b818110156119b9576119ae600082611982565b60018101905061199b565b5050565b601f8211156119fe576119cf8161189e565b6119d8846118b3565b810160208510156119e7578190505b6119fb6119f3856118b3565b83018261199a565b50505b505050565b600082821c905092915050565b6000611a2160001984600802611a03565b1980831691505092915050565b6000611a3a8383611a10565b9150826002028217905092915050565b611a548383611804565b67ffffffffffffffff811115611a6d57611a6c61180f565b5b611a77825461186d565b611a828282856119bd565b6000601f831160018114611ab15760008415611a9f578287013590505b611aa98582611a2e565b865550611b11565b601f198416611abf8661189e565b60005b82811015611ae757848901358255600182019150602085019450602081019050611ac2565b86831015611b045784890135611b00601f891682611a10565b8355505b6001600288020188555050505b50505050505050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b6000611b50601183611505565b9150611b5b82611b1a565b602082019050919050565b60006020820190508181036000830152611b7f81611b43565b9050919050565b6000611b9182611334565b9150611b9c83611334565b9250828201905080821115611bb457611bb361178d565b5b92915050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b6000611bf0601883611505565b9150611bfb82611bba565b602082019050919050565b60006020820190508181036000830152611c1f81611be3565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b6000611c82603a83611505565b9150611c8d82611c26565b604082019050919050565b60006020820190508181036000830152611cb181611c75565b9050919050565b7f576f726b65722063616e206f6e6c79207265636c61696d207468656972206f7760008201527f6e20617661696c6162696c697479207374616b65000000000000000000000000602082015250565b6000611d14603483611505565b9150611d1f82611cb8565b604082019050919050565b60006020820190508181036000830152611d4381611d07565b9050919050565b7f5374616b65206475726174696f6e20686173206e6f742079657420656c61707360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000611da6602283611505565b9150611db182611d4a565b604082019050919050565b60006020820190508181036000830152611dd581611d99565b9050919050565b7f5374616b652068617320616c7265616479206265656e207265636c61696d6564600082015250565b6000611e12602083611505565b9150611e1d82611ddc565b602082019050919050565b60006020820190508181036000830152611e4181611e05565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b6000611ea4602483611505565b9150611eaf82611e48565b604082019050919050565b60006020820190508181036000830152611ed381611e97565b9050919050565b6000604082019050611eef6000830185611474565b611efc602083018461141d565b9392505050565b600081519050611f1281611622565b92915050565b600060208284031215611f2e57611f2d61121a565b5b6000611f3c84828501611f03565b91505092915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b6000611f7b602083611505565b9150611f8682611f45565b602082019050919050565b60006020820190508181036000830152611faa81611f6e565b9050919050565b60008154611fbe8161186d565b611fc88186611505565b94506001821660008114611fe35760018114611ff95761202c565b60ff19831686528115156020028601935061202c565b6120028561189e565b60005b8381101561202457815481890152600182019150602081019050612005565b808801955050505b50505092915050565b600060408201905061204a6000830185611474565b818103602083015261205c8184611fb1565b90509392505050565b6000815190506120748161133e565b92915050565b6000602082840312156120905761208f61121a565b5b600061209e84828501612065565b91505092915050565b60006040820190506120bc600083018561141d565b6120c96020830184611596565b9392505050565b6000819050919050565b60006120f56120f06120eb846120d0565b611922565b611334565b9050919050565b612105816120da565b82525050565b6000819050919050565b600061213061212b6121268461210b565b611922565b611334565b9050919050565b61214081612115565b82525050565b600082825260208201905092915050565b50565b6000612167600083612146565b915061217282612157565b600082019050919050565b600060c082019050612192600083018861141d565b61219f602083018761141d565b6121ac60408301866120fc565b6121b96060830185612137565b6121c66080830184611596565b81810360a08301526121d78161215a565b90509695505050505050565b60006060820190506121f8600083018661141d565b612205602083018561141d565b6122126040830184611596565b949350505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b6000612276603383611505565b91506122818261221a565b604082019050919050565b600060208201905081810360008301526122a581612269565b9050919050565b60006040820190506122c1600083018561141d565b6122ce602083018461141d565b9392505050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b600061230b601a83611505565b9150612316826122d5565b602082019050919050565b6000602082019050818103600083015261233a816122fe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061237b82611334565b915061238683611334565b92508261239657612395612341565b5b82820690509291505056fea264697066735822122007b3397627cc60f1bdbe1c89373f9aae2944d982f1e086ee64b326fce7c8e0cf64736f6c63430008180033", + "bytecode": "0x60c06040523480156200001157600080fd5b50604051620025f8380380620025f883398181016040528101906200003791906200013a565b8181818073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050508060a081815250505050505062000181565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000b38262000086565b9050919050565b6000620000c782620000a6565b9050919050565b620000d981620000ba565b8114620000e557600080fd5b50565b600081519050620000f981620000ce565b92915050565b6000819050919050565b6200011481620000ff565b81146200012057600080fd5b50565b600081519050620001348162000109565b92915050565b6000806040838503121562000154576200015362000081565b5b60006200016485828601620000e8565b9250506020620001778582860162000123565b9150509250929050565b60805160a051612435620001c3600039600081816102910152610dcf01526000818161081e01528181610b7c01528181610c7e0152610d3301526124356000f3fe60806040526004361061009c5760003560e01c806381d12c581161006457806381d12c5814610163578063854b6a4f146101a6578063a035b1fe146101cf578063b5b20c00146101fa578063c4a9e11614610223578063d5a44f861461024e5761009c565b80630d0271d6146100a1578063216ed6ad146100bd5780635b5cf6d4146100e65780635badbe4c1461010f5780638150d5071461013a575b600080fd5b6100bb60048036038101906100b6919061128f565b61028f565b005b3480156100c957600080fd5b506100e460048036038101906100df9190611370565b61039b565b005b3480156100f257600080fd5b5061010d600480360381019061010891906113c3565b6104ad565b005b34801561011b57600080fd5b50610124610667565b6040516101319190611432565b60405180910390f35b34801561014657600080fd5b50610161600480360381019061015c919061144d565b61066d565b005b34801561016f57600080fd5b5061018a6004803603810190610185919061144d565b6108fa565b60405161019d97969594939291906115ab565b60405180910390f35b3480156101b257600080fd5b506101cd60048036038101906101c89190611654565b610a86565b005b3480156101db57600080fd5b506101e4610dcd565b6040516101f19190611432565b60405180910390f35b34801561020657600080fd5b50610221600480360381019061021c9190611694565b610df1565b005b34801561022f57600080fd5b50610238610fb7565b6040516102459190611432565b60405180910390f35b34801561025a57600080fd5b506102756004803603810190610270919061144d565b610fbd565b6040516102869594939291906116d4565b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000003410156102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e990611773565b60405180910390fd5b600060036000815480929190610307906117c2565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503481600101819055506103798261102d565b81600301819055508383826004019182610394929190611a50565b5050505050565b600082116103de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103d590611b6c565b60405180910390fd5b6000600160008154809291906103f3906117c2565b91905055905060008060008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083816001018190555082426104679190611b8c565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98260405161049e9190611432565b60405180910390a15050505050565b6000600260008581526020019081526020016000209050600060038111156104d8576104d7611489565b5b8160020160009054906101000a900460ff1660038111156104fc576104fb611489565b5b1461053c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053390611c0c565b60405180910390fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105df90611c9e565b60405180910390fd5b60018260020160006101000a81548160ff021916908360038111156106105761060f611489565b5b02179055508383836005019182610628929190611a50565b507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc856040516106589190611432565b60405180910390a15050505050565b60035481565b600080600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070c90611d30565b60405180910390fd5b8060020154421161075b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075290611dc2565b60405180910390fd5b8060030160019054906101000a900460ff16156107ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a490611e2e565b60405180910390fd5b8060030160009054906101000a900460ff16156107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690611ec0565b60405180910390fd5b60018160030160016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3383600101546040518363ffffffff1660e01b815260040161087b929190611ee0565b6020604051808303816000875af115801561089a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108be9190611f1e565b507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9826040516108ee9190611432565b60405180910390a15050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff169080600301549080600401805461096290611873565b80601f016020809104026020016040519081016040528092919081815260200182805461098e90611873565b80156109db5780601f106109b0576101008083540402835291602001916109db565b820191906000526020600020905b8154815290600101906020018083116109be57829003601f168201915b5050505050908060050180546109f090611873565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1c90611873565b8015610a695780601f10610a3e57610100808354040283529160200191610a69565b820191906000526020600020905b815481529060010190602001808311610a4c57829003601f168201915b5050505050908060060160009054906101000a900460ff16905087565b600060026000848152602001908152602001600020905060016003811115610ab157610ab0611489565b5b8160020160009054906101000a900460ff166003811115610ad557610ad4611489565b5b14610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c90611f97565b60405180910390fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff02191690836003811115610b5757610b56611489565b5b0217905550828260060160006101000a81548160ff02191690831515021790555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ff8692408360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856005016040518363ffffffff1660e01b8152600401610bfc92919061203b565b6020604051808303816000875af1158015610c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3f9190612080565b90507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc8585604051610c729291906120ad565b60405180910390a160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663afa845608560010154846014600160036064600160006040518963ffffffff1660e01b8152600401610cec97969594939291906121be565b60206040518083038185885af1158015610d0a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d2f9190612080565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663561b246382856001015460016040518463ffffffff1660e01b8152600401610d9393929190612241565b600060405180830381600087803b158015610dad57600080fd5b505af1158015610dc1573d6000803e3d6000fd5b50505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e90906122ea565b60405180910390fd5b8060030160019054906101000a900460ff1615610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290611e2e565b60405180910390fd5b8060030160009054906101000a900460ff1615610f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3490611ec0565b60405180910390fd5b8060020154421115610f62578142610f559190611b8c565b8160020181905550610f7b565b818160020154610f729190611b8c565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e983604051610faa9190611432565b60405180910390a1505050565b60015481565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b60006110376110ab565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507fd9e7f38a71691fb1db2da17057c03d381a42a9925350883f10e8e5d0bca4a3b4838360405161109d92919061230a565b60405180910390a150919050565b60008060005b60015481101561112f5760008082815260200190815260200160002060030160009054906101000a900460ff166111225760008082815260200190815260200160002060020154421161112257600080828152602001908152602001600020600101548261111f9190611b8c565b91505b80806001019150506110b1565b5060008111611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a9061237f565b60405180910390fd5b6000814461118191906123ce565b9050600080600090505b6001548110156112195760008082815260200190815260200160002060030160009054906101000a900460ff1661120c5760008082815260200190815260200160002060020154421161120c5760008082815260200190815260200160002060010154826111f99190611b8c565b91508282111561120b57809450611219565b5b808060010191505061118b565b5050505090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261124f5761124e61122a565b5b8235905067ffffffffffffffff81111561126c5761126b61122f565b5b60208301915083600182028301111561128857611287611234565b5b9250929050565b600080602083850312156112a6576112a5611220565b5b600083013567ffffffffffffffff8111156112c4576112c3611225565b5b6112d085828601611239565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611307826112dc565b9050919050565b611317816112fc565b811461132257600080fd5b50565b6000813590506113348161130e565b92915050565b6000819050919050565b61134d8161133a565b811461135857600080fd5b50565b60008135905061136a81611344565b92915050565b60008060006060848603121561138957611388611220565b5b600061139786828701611325565b93505060206113a88682870161135b565b92505060406113b98682870161135b565b9150509250925092565b6000806000604084860312156113dc576113db611220565b5b60006113ea8682870161135b565b935050602084013567ffffffffffffffff81111561140b5761140a611225565b5b61141786828701611239565b92509250509250925092565b61142c8161133a565b82525050565b60006020820190506114476000830184611423565b92915050565b60006020828403121561146357611462611220565b5b60006114718482850161135b565b91505092915050565b611483816112fc565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106114c9576114c8611489565b5b50565b60008190506114da826114b8565b919050565b60006114ea826114cc565b9050919050565b6114fa816114df565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561153a57808201518184015260208101905061151f565b60008484015250505050565b6000601f19601f8301169050919050565b600061156282611500565b61156c818561150b565b935061157c81856020860161151c565b61158581611546565b840191505092915050565b60008115159050919050565b6115a581611590565b82525050565b600060e0820190506115c0600083018a61147a565b6115cd6020830189611423565b6115da60408301886114f1565b6115e76060830187611423565b81810360808301526115f98186611557565b905081810360a083015261160d8185611557565b905061161c60c083018461159c565b98975050505050505050565b61163181611590565b811461163c57600080fd5b50565b60008135905061164e81611628565b92915050565b6000806040838503121561166b5761166a611220565b5b60006116798582860161135b565b925050602061168a8582860161163f565b9150509250929050565b600080604083850312156116ab576116aa611220565b5b60006116b98582860161135b565b92505060206116ca8582860161135b565b9150509250929050565b600060a0820190506116e9600083018861147a565b6116f66020830187611423565b6117036040830186611423565b611710606083018561159c565b61171d608083018461159c565b9695505050505050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b600061175d60108361150b565b915061176882611727565b602082019050919050565b6000602082019050818103600083015261178c81611750565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006117cd8261133a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036117ff576117fe611793565b5b600182019050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061188b57607f821691505b60208210810361189e5761189d611844565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026119067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826118c9565b61191086836118c9565b95508019841693508086168417925050509392505050565b6000819050919050565b600061194d6119486119438461133a565b611928565b61133a565b9050919050565b6000819050919050565b61196783611932565b61197b61197382611954565b8484546118d6565b825550505050565b600090565b611990611983565b61199b81848461195e565b505050565b5b818110156119bf576119b4600082611988565b6001810190506119a1565b5050565b601f821115611a04576119d5816118a4565b6119de846118b9565b810160208510156119ed578190505b611a016119f9856118b9565b8301826119a0565b50505b505050565b600082821c905092915050565b6000611a2760001984600802611a09565b1980831691505092915050565b6000611a408383611a16565b9150826002028217905092915050565b611a5a838361180a565b67ffffffffffffffff811115611a7357611a72611815565b5b611a7d8254611873565b611a888282856119c3565b6000601f831160018114611ab75760008415611aa5578287013590505b611aaf8582611a34565b865550611b17565b601f198416611ac5866118a4565b60005b82811015611aed57848901358255600182019150602085019450602081019050611ac8565b86831015611b0a5784890135611b06601f891682611a16565b8355505b6001600288020188555050505b50505050505050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b6000611b5660118361150b565b9150611b6182611b20565b602082019050919050565b60006020820190508181036000830152611b8581611b49565b9050919050565b6000611b978261133a565b9150611ba28361133a565b9250828201905080821115611bba57611bb9611793565b5b92915050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b6000611bf660188361150b565b9150611c0182611bc0565b602082019050919050565b60006020820190508181036000830152611c2581611be9565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b6000611c88603a8361150b565b9150611c9382611c2c565b604082019050919050565b60006020820190508181036000830152611cb781611c7b565b9050919050565b7f576f726b65722063616e206f6e6c79207265636c61696d207468656972206f7760008201527f6e20617661696c6162696c697479207374616b65000000000000000000000000602082015250565b6000611d1a60348361150b565b9150611d2582611cbe565b604082019050919050565b60006020820190508181036000830152611d4981611d0d565b9050919050565b7f5374616b65206475726174696f6e20686173206e6f742079657420656c61707360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000611dac60228361150b565b9150611db782611d50565b604082019050919050565b60006020820190508181036000830152611ddb81611d9f565b9050919050565b7f5374616b652068617320616c7265616479206265656e207265636c61696d6564600082015250565b6000611e1860208361150b565b9150611e2382611de2565b602082019050919050565b60006020820190508181036000830152611e4781611e0b565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b6000611eaa60248361150b565b9150611eb582611e4e565b604082019050919050565b60006020820190508181036000830152611ed981611e9d565b9050919050565b6000604082019050611ef5600083018561147a565b611f026020830184611423565b9392505050565b600081519050611f1881611628565b92915050565b600060208284031215611f3457611f33611220565b5b6000611f4284828501611f09565b91505092915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b6000611f8160208361150b565b9150611f8c82611f4b565b602082019050919050565b60006020820190508181036000830152611fb081611f74565b9050919050565b60008154611fc481611873565b611fce818661150b565b94506001821660008114611fe95760018114611fff57612032565b60ff198316865281151560200286019350612032565b612008856118a4565b60005b8381101561202a5781548189015260018201915060208101905061200b565b808801955050505b50505092915050565b6000604082019050612050600083018561147a565b81810360208301526120628184611fb7565b90509392505050565b60008151905061207a81611344565b92915050565b60006020828403121561209657612095611220565b5b60006120a48482850161206b565b91505092915050565b60006040820190506120c26000830185611423565b6120cf602083018461159c565b9392505050565b6000819050919050565b60006120fb6120f66120f1846120d6565b611928565b61133a565b9050919050565b61210b816120e0565b82525050565b6000819050919050565b600061213661213161212c84612111565b611928565b61133a565b9050919050565b6121468161211b565b82525050565b6000819050919050565b600061217161216c6121678461214c565b611928565b61133a565b9050919050565b61218181612156565b82525050565b600082825260208201905092915050565b50565b60006121a8600083612187565b91506121b382612198565b600082019050919050565b6000610100820190506121d4600083018a611423565b6121e16020830189611423565b6121ee6040830188612102565b6121fb606083018761213d565b6122086080830186612178565b61221560a083018561159c565b61222260c083018461159c565b81810360e08301526122338161219b565b905098975050505050505050565b60006060820190506122566000830186611423565b6122636020830185611423565b612270604083018461159c565b949350505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b60006122d460338361150b565b91506122df82612278565b604082019050919050565b60006020820190508181036000830152612303816122c7565b9050919050565b600060408201905061231f6000830185611423565b61232c6020830184611423565b9392505050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b6000612369601a8361150b565b915061237482612333565b602082019050919050565b600060208201905081810360008301526123988161235c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006123d98261133a565b91506123e48361133a565b9250826123f4576123f361239f565b5b82820690509291505056fea264697066735822122081a1351176171d238bb5dd7f44de133b9be34bb6a719ad23a3e25da886bd36e764736f6c63430008180033", + "deployedBytecode": "0x60806040526004361061009c5760003560e01c806381d12c581161006457806381d12c5814610163578063854b6a4f146101a6578063a035b1fe146101cf578063b5b20c00146101fa578063c4a9e11614610223578063d5a44f861461024e5761009c565b80630d0271d6146100a1578063216ed6ad146100bd5780635b5cf6d4146100e65780635badbe4c1461010f5780638150d5071461013a575b600080fd5b6100bb60048036038101906100b6919061128f565b61028f565b005b3480156100c957600080fd5b506100e460048036038101906100df9190611370565b61039b565b005b3480156100f257600080fd5b5061010d600480360381019061010891906113c3565b6104ad565b005b34801561011b57600080fd5b50610124610667565b6040516101319190611432565b60405180910390f35b34801561014657600080fd5b50610161600480360381019061015c919061144d565b61066d565b005b34801561016f57600080fd5b5061018a6004803603810190610185919061144d565b6108fa565b60405161019d97969594939291906115ab565b60405180910390f35b3480156101b257600080fd5b506101cd60048036038101906101c89190611654565b610a86565b005b3480156101db57600080fd5b506101e4610dcd565b6040516101f19190611432565b60405180910390f35b34801561020657600080fd5b50610221600480360381019061021c9190611694565b610df1565b005b34801561022f57600080fd5b50610238610fb7565b6040516102459190611432565b60405180910390f35b34801561025a57600080fd5b506102756004803603810190610270919061144d565b610fbd565b6040516102869594939291906116d4565b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000003410156102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e990611773565b60405180910390fd5b600060036000815480929190610307906117c2565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503481600101819055506103798261102d565b81600301819055508383826004019182610394929190611a50565b5050505050565b600082116103de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103d590611b6c565b60405180910390fd5b6000600160008154809291906103f3906117c2565b91905055905060008060008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083816001018190555082426104679190611b8c565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98260405161049e9190611432565b60405180910390a15050505050565b6000600260008581526020019081526020016000209050600060038111156104d8576104d7611489565b5b8160020160009054906101000a900460ff1660038111156104fc576104fb611489565b5b1461053c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053390611c0c565b60405180910390fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105df90611c9e565b60405180910390fd5b60018260020160006101000a81548160ff021916908360038111156106105761060f611489565b5b02179055508383836005019182610628929190611a50565b507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc856040516106589190611432565b60405180910390a15050505050565b60035481565b600080600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070c90611d30565b60405180910390fd5b8060020154421161075b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075290611dc2565b60405180910390fd5b8060030160019054906101000a900460ff16156107ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a490611e2e565b60405180910390fd5b8060030160009054906101000a900460ff16156107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690611ec0565b60405180910390fd5b60018160030160016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3383600101546040518363ffffffff1660e01b815260040161087b929190611ee0565b6020604051808303816000875af115801561089a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108be9190611f1e565b507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9826040516108ee9190611432565b60405180910390a15050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff169080600301549080600401805461096290611873565b80601f016020809104026020016040519081016040528092919081815260200182805461098e90611873565b80156109db5780601f106109b0576101008083540402835291602001916109db565b820191906000526020600020905b8154815290600101906020018083116109be57829003601f168201915b5050505050908060050180546109f090611873565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1c90611873565b8015610a695780601f10610a3e57610100808354040283529160200191610a69565b820191906000526020600020905b815481529060010190602001808311610a4c57829003601f168201915b5050505050908060060160009054906101000a900460ff16905087565b600060026000848152602001908152602001600020905060016003811115610ab157610ab0611489565b5b8160020160009054906101000a900460ff166003811115610ad557610ad4611489565b5b14610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c90611f97565b60405180910390fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff02191690836003811115610b5757610b56611489565b5b0217905550828260060160006101000a81548160ff02191690831515021790555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ff8692408360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856005016040518363ffffffff1660e01b8152600401610bfc92919061203b565b6020604051808303816000875af1158015610c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3f9190612080565b90507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc8585604051610c729291906120ad565b60405180910390a160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663afa845608560010154846014600160036064600160006040518963ffffffff1660e01b8152600401610cec97969594939291906121be565b60206040518083038185885af1158015610d0a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d2f9190612080565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663561b246382856001015460016040518463ffffffff1660e01b8152600401610d9393929190612241565b600060405180830381600087803b158015610dad57600080fd5b505af1158015610dc1573d6000803e3d6000fd5b50505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e90906122ea565b60405180910390fd5b8060030160019054906101000a900460ff1615610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290611e2e565b60405180910390fd5b8060030160009054906101000a900460ff1615610f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3490611ec0565b60405180910390fd5b8060020154421115610f62578142610f559190611b8c565b8160020181905550610f7b565b818160020154610f729190611b8c565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e983604051610faa9190611432565b60405180910390a1505050565b60015481565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b60006110376110ab565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507fd9e7f38a71691fb1db2da17057c03d381a42a9925350883f10e8e5d0bca4a3b4838360405161109d92919061230a565b60405180910390a150919050565b60008060005b60015481101561112f5760008082815260200190815260200160002060030160009054906101000a900460ff166111225760008082815260200190815260200160002060020154421161112257600080828152602001908152602001600020600101548261111f9190611b8c565b91505b80806001019150506110b1565b5060008111611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a9061237f565b60405180910390fd5b6000814461118191906123ce565b9050600080600090505b6001548110156112195760008082815260200190815260200160002060030160009054906101000a900460ff1661120c5760008082815260200190815260200160002060020154421161120c5760008082815260200190815260200160002060010154826111f99190611b8c565b91508282111561120b57809450611219565b5b808060010191505061118b565b5050505090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261124f5761124e61122a565b5b8235905067ffffffffffffffff81111561126c5761126b61122f565b5b60208301915083600182028301111561128857611287611234565b5b9250929050565b600080602083850312156112a6576112a5611220565b5b600083013567ffffffffffffffff8111156112c4576112c3611225565b5b6112d085828601611239565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611307826112dc565b9050919050565b611317816112fc565b811461132257600080fd5b50565b6000813590506113348161130e565b92915050565b6000819050919050565b61134d8161133a565b811461135857600080fd5b50565b60008135905061136a81611344565b92915050565b60008060006060848603121561138957611388611220565b5b600061139786828701611325565b93505060206113a88682870161135b565b92505060406113b98682870161135b565b9150509250925092565b6000806000604084860312156113dc576113db611220565b5b60006113ea8682870161135b565b935050602084013567ffffffffffffffff81111561140b5761140a611225565b5b61141786828701611239565b92509250509250925092565b61142c8161133a565b82525050565b60006020820190506114476000830184611423565b92915050565b60006020828403121561146357611462611220565b5b60006114718482850161135b565b91505092915050565b611483816112fc565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106114c9576114c8611489565b5b50565b60008190506114da826114b8565b919050565b60006114ea826114cc565b9050919050565b6114fa816114df565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561153a57808201518184015260208101905061151f565b60008484015250505050565b6000601f19601f8301169050919050565b600061156282611500565b61156c818561150b565b935061157c81856020860161151c565b61158581611546565b840191505092915050565b60008115159050919050565b6115a581611590565b82525050565b600060e0820190506115c0600083018a61147a565b6115cd6020830189611423565b6115da60408301886114f1565b6115e76060830187611423565b81810360808301526115f98186611557565b905081810360a083015261160d8185611557565b905061161c60c083018461159c565b98975050505050505050565b61163181611590565b811461163c57600080fd5b50565b60008135905061164e81611628565b92915050565b6000806040838503121561166b5761166a611220565b5b60006116798582860161135b565b925050602061168a8582860161163f565b9150509250929050565b600080604083850312156116ab576116aa611220565b5b60006116b98582860161135b565b92505060206116ca8582860161135b565b9150509250929050565b600060a0820190506116e9600083018861147a565b6116f66020830187611423565b6117036040830186611423565b611710606083018561159c565b61171d608083018461159c565b9695505050505050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b600061175d60108361150b565b915061176882611727565b602082019050919050565b6000602082019050818103600083015261178c81611750565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006117cd8261133a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036117ff576117fe611793565b5b600182019050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061188b57607f821691505b60208210810361189e5761189d611844565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026119067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826118c9565b61191086836118c9565b95508019841693508086168417925050509392505050565b6000819050919050565b600061194d6119486119438461133a565b611928565b61133a565b9050919050565b6000819050919050565b61196783611932565b61197b61197382611954565b8484546118d6565b825550505050565b600090565b611990611983565b61199b81848461195e565b505050565b5b818110156119bf576119b4600082611988565b6001810190506119a1565b5050565b601f821115611a04576119d5816118a4565b6119de846118b9565b810160208510156119ed578190505b611a016119f9856118b9565b8301826119a0565b50505b505050565b600082821c905092915050565b6000611a2760001984600802611a09565b1980831691505092915050565b6000611a408383611a16565b9150826002028217905092915050565b611a5a838361180a565b67ffffffffffffffff811115611a7357611a72611815565b5b611a7d8254611873565b611a888282856119c3565b6000601f831160018114611ab75760008415611aa5578287013590505b611aaf8582611a34565b865550611b17565b601f198416611ac5866118a4565b60005b82811015611aed57848901358255600182019150602085019450602081019050611ac8565b86831015611b0a5784890135611b06601f891682611a16565b8355505b6001600288020188555050505b50505050505050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b6000611b5660118361150b565b9150611b6182611b20565b602082019050919050565b60006020820190508181036000830152611b8581611b49565b9050919050565b6000611b978261133a565b9150611ba28361133a565b9250828201905080821115611bba57611bb9611793565b5b92915050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b6000611bf660188361150b565b9150611c0182611bc0565b602082019050919050565b60006020820190508181036000830152611c2581611be9565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b6000611c88603a8361150b565b9150611c9382611c2c565b604082019050919050565b60006020820190508181036000830152611cb781611c7b565b9050919050565b7f576f726b65722063616e206f6e6c79207265636c61696d207468656972206f7760008201527f6e20617661696c6162696c697479207374616b65000000000000000000000000602082015250565b6000611d1a60348361150b565b9150611d2582611cbe565b604082019050919050565b60006020820190508181036000830152611d4981611d0d565b9050919050565b7f5374616b65206475726174696f6e20686173206e6f742079657420656c61707360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000611dac60228361150b565b9150611db782611d50565b604082019050919050565b60006020820190508181036000830152611ddb81611d9f565b9050919050565b7f5374616b652068617320616c7265616479206265656e207265636c61696d6564600082015250565b6000611e1860208361150b565b9150611e2382611de2565b602082019050919050565b60006020820190508181036000830152611e4781611e0b565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b6000611eaa60248361150b565b9150611eb582611e4e565b604082019050919050565b60006020820190508181036000830152611ed981611e9d565b9050919050565b6000604082019050611ef5600083018561147a565b611f026020830184611423565b9392505050565b600081519050611f1881611628565b92915050565b600060208284031215611f3457611f33611220565b5b6000611f4284828501611f09565b91505092915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b6000611f8160208361150b565b9150611f8c82611f4b565b602082019050919050565b60006020820190508181036000830152611fb081611f74565b9050919050565b60008154611fc481611873565b611fce818661150b565b94506001821660008114611fe95760018114611fff57612032565b60ff198316865281151560200286019350612032565b612008856118a4565b60005b8381101561202a5781548189015260018201915060208101905061200b565b808801955050505b50505092915050565b6000604082019050612050600083018561147a565b81810360208301526120628184611fb7565b90509392505050565b60008151905061207a81611344565b92915050565b60006020828403121561209657612095611220565b5b60006120a48482850161206b565b91505092915050565b60006040820190506120c26000830185611423565b6120cf602083018461159c565b9392505050565b6000819050919050565b60006120fb6120f66120f1846120d6565b611928565b61133a565b9050919050565b61210b816120e0565b82525050565b6000819050919050565b600061213661213161212c84612111565b611928565b61133a565b9050919050565b6121468161211b565b82525050565b6000819050919050565b600061217161216c6121678461214c565b611928565b61133a565b9050919050565b61218181612156565b82525050565b600082825260208201905092915050565b50565b60006121a8600083612187565b91506121b382612198565b600082019050919050565b6000610100820190506121d4600083018a611423565b6121e16020830189611423565b6121ee6040830188612102565b6121fb606083018761213d565b6122086080830186612178565b61221560a083018561159c565b61222260c083018461159c565b81810360e08301526122338161219b565b905098975050505050505050565b60006060820190506122566000830186611423565b6122636020830185611423565b612270604083018461159c565b949350505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b60006122d460338361150b565b91506122df82612278565b604082019050919050565b60006020820190508181036000830152612303816122c7565b9050919050565b600060408201905061231f6000830185611423565b61232c6020830184611423565b9392505050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b6000612369601a8361150b565b915061237482612333565b602082019050919050565b600060208201905081810360008301526123988161235c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006123d98261133a565b91506123e48361133a565b9250826123f4576123f361239f565b5b82820690509291505056fea264697066735822122081a1351176171d238bb5dd7f44de133b9be34bb6a719ad23a3e25da886bd36e764736f6c63430008180033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/client/src/contract-addresses.json b/client/src/contract-addresses.json index 5714bc4..a36d9db 100644 --- a/client/src/contract-addresses.json +++ b/client/src/contract-addresses.json @@ -1,8 +1,8 @@ { "localhost": { - "DAO": "0x9151C9bA7b159B13C9ae51042eac73115D898657", - "Work1": "0xef57508e07F8b6460f7a3aD14ceE0Be23Bb93055", - "Onboarding": "0x5865349932DDf62D7593061bB5463E9D72Fd6b7d" + "DAO": "0xadB35d0E9d7B33441C7ED26add5D42F873430790", + "Work1": "0xb3FaD3422e1Edf2f7035952aa0f8760df466213a", + "Onboarding": "0xd7a4eDcC2Fbc139DfD88E25a996a8a9Dd385B1f0" }, "sepolia": { "DAO": "0x8Cb4ab513A863ac29e855c85064ea53dec7dA24C", diff --git a/ethereum/contract-addresses.json b/ethereum/contract-addresses.json index 5714bc4..a36d9db 100644 --- a/ethereum/contract-addresses.json +++ b/ethereum/contract-addresses.json @@ -1,8 +1,8 @@ { "localhost": { - "DAO": "0x9151C9bA7b159B13C9ae51042eac73115D898657", - "Work1": "0xef57508e07F8b6460f7a3aD14ceE0Be23Bb93055", - "Onboarding": "0x5865349932DDf62D7593061bB5463E9D72Fd6b7d" + "DAO": "0xadB35d0E9d7B33441C7ED26add5D42F873430790", + "Work1": "0xb3FaD3422e1Edf2f7035952aa0f8760df466213a", + "Onboarding": "0xd7a4eDcC2Fbc139DfD88E25a996a8a9Dd385B1f0" }, "sepolia": { "DAO": "0x8Cb4ab513A863ac29e855c85064ea53dec7dA24C", diff --git a/ethereum/contracts/DAO.sol b/ethereum/contracts/DAO.sol index 261cdb6..eaf53b9 100644 --- a/ethereum/contracts/DAO.sol +++ b/ethereum/contracts/DAO.sol @@ -19,6 +19,13 @@ struct Stake { bool inFavor; uint256 amount; address sender; + bool fromMint; +} + +struct ValidationPoolParams { + uint quorumPPB; + uint bindingPercent; + bool redistributeLosingStakes; } struct ValidationPool { @@ -27,8 +34,8 @@ struct ValidationPool { address sender; mapping(uint => Stake) stakes; uint stakeCount; + ValidationPoolParams params; uint256 fee; - uint quorumPPB; uint duration; uint endTime; bool resolved; @@ -49,16 +56,13 @@ contract DAO is ERC20("Reputation", "REP") { mapping(uint => Post) public posts; uint public postCount; - // ufixed8x1 constant mintingRatio = 1; - // ufixed8x1 constant quorum = 0; - // ufixed8x1 constant stakeForAuthor = 0.5; - // ufixed8x1 constant winningRatio = 0.5; - // TODO: Make parameters adjustable + // TODO: possible parameter for minting ratio + // TODO: possible parameter for stakeForAuthor + // TODO: possible parameter for winningRatio // TODO: Add forum parameters uint public constant minDuration = 1; // 1 second uint public constant maxDuration = 365_000_000 days; // 1 million years - uint public constant minQuorumPPB = 333_333_333; // Parts per billion event PostAdded(uint postIndex); @@ -80,12 +84,13 @@ contract DAO is ERC20("Reputation", "REP") { /// Accept fee to initiate a validation pool /// TODO: Handle multiple authors - /// TODO: Constrain duration to allowable range function initiateValidationPool( uint postIndex, uint duration, uint quorumNumerator, uint quorumDenominator, + uint bindingPercent, + bool redistributeLosingStakes, bool callbackOnValidate, bytes calldata callbackData ) external payable returns (uint poolIndex) { @@ -101,6 +106,7 @@ contract DAO is ERC20("Reputation", "REP") { quorumNumerator <= quorumDenominator, "Quorum is greater than one" ); + require(bindingPercent <= 100, "Binding percent must be <= 100"); Post storage post = posts[postIndex]; require(post.author != address(0), "Target post not found"); poolIndex = validationPoolCount++; @@ -108,7 +114,11 @@ contract DAO is ERC20("Reputation", "REP") { pool.sender = msg.sender; pool.postIndex = postIndex; pool.fee = msg.value; - pool.quorumPPB = (1_000_000_000 * quorumNumerator) / quorumDenominator; + pool.params.quorumPPB = + (1_000_000_000 * quorumNumerator) / + quorumDenominator; + pool.params.bindingPercent = bindingPercent; + pool.params.redistributeLosingStakes = redistributeLosingStakes; pool.duration = duration; pool.endTime = block.timestamp + duration; pool.id = poolIndex; @@ -123,8 +133,8 @@ contract DAO is ERC20("Reputation", "REP") { // TODO: Make stakeForAuthor an adjustable parameter _mint(post.author, msg.value); // TODO: We need a way to exclude this pending reputation from the total supply when computing fee distribution - _stake(pool, post.author, msg.value / 2, true); - _stake(pool, post.author, msg.value / 2, false); + _stake(pool, post.author, msg.value / 2, true, true); + _stake(pool, post.author, msg.value / 2, false, true); emit ValidationPoolInitiated(poolIndex); } @@ -133,22 +143,24 @@ contract DAO is ERC20("Reputation", "REP") { ValidationPool storage pool, address sender, uint256 amount, - bool inFavor + bool inFavor, + bool fromMint ) internal { require(block.timestamp <= pool.endTime, "Pool end time has passed"); - _transfer(sender, address(this), amount); + _update(sender, address(this), amount); uint stakeIndex = pool.stakeCount++; Stake storage s = pool.stakes[stakeIndex]; s.sender = sender; s.inFavor = inFavor; s.amount = amount; s.id = stakeIndex; + s.fromMint = fromMint; } /// Accept reputation stakes toward a validation pool function stake(uint poolIndex, uint256 amount, bool inFavor) public { ValidationPool storage pool = validationPools[poolIndex]; - _stake(pool, msg.sender, amount, inFavor); + _stake(pool, msg.sender, amount, inFavor, false); } /// Evaluate outcome of a validation pool @@ -174,7 +186,7 @@ contract DAO is ERC20("Reputation", "REP") { // Check that quorum is met require( 1_000_000_000 * (stakedFor + stakedAgainst) >= - totalSupply() * pool.quorumPPB, + totalSupply() * pool.params.quorumPPB, "Quorum for this pool was not met" ); // A tie is resolved in favor of the validation pool. @@ -185,32 +197,51 @@ contract DAO is ERC20("Reputation", "REP") { members[memberCount++] = post.author; isMember[post.author] = true; } - console.log( - "stakedFor: %d, stakedAgainst: %d, stakeCount: %d", - stakedFor, - stakedAgainst, - pool.stakeCount - ); pool.resolved = true; pool.outcome = votePasses; emit ValidationPoolResolved(poolIndex, votePasses); - // Value of losing stakes should be di stributed among winners, in proportion to their stakes + // Value of losing stakes should be distributed among winners, in proportion to their stakes uint256 amountFromWinners = votePasses ? stakedFor : stakedAgainst; uint256 amountFromLosers = votePasses ? stakedAgainst : stakedFor; - uint256 totalRewards; + // Only bindingPercent % should be redistributed + // Stake senders should get (100-bindingPercent) % back + uint256 totalAllocated; for (uint i = 0; i < pool.stakeCount; i++) { s = pool.stakes[i]; + bool redistributeLosingStakes = s.fromMint || + pool.params.redistributeLosingStakes; + uint bindingPercent = s.fromMint ? 100 : pool.params.bindingPercent; if (votePasses == s.inFavor) { - uint256 reward = (amountFromLosers * s.amount) / - amountFromWinners; - _transfer(address(this), s.sender, s.amount + reward); - totalRewards += reward; + // Winning stake + // If this stake is from the minted fee, always redistribute it to the winners + uint reward = redistributeLosingStakes + ? ((s.amount * amountFromLosers) / amountFromWinners) * + (bindingPercent / 100) + : 0; + uint balance = balanceOf(address(this)); + _update(address(this), s.sender, s.amount + reward); + totalAllocated += reward; + } else { + // Losing stake + uint refund = (s.amount * (100 - bindingPercent)) / 100; + uint balance = balanceOf(address(this)); + if (refund > 0) { + _update(address(this), s.sender, refund); + } + // If this stake is from the minted fee, don't burn it + if (!redistributeLosingStakes) { + uint amountToBurn = (s.amount * + pool.params.bindingPercent) / 100; + _burn(address(this), amountToBurn); + totalAllocated += amountToBurn; + } + totalAllocated += refund; } } - // Due to rounding, there may be some reward left over. Include this as a reward to the author. - uint256 remainder = amountFromLosers - totalRewards; + // Due to rounding, there may be some REP left over. Include this as a reward to the author. + uint256 remainder = amountFromLosers - totalAllocated; if (remainder > 0) { - _transfer(address(this), post.author, remainder); + _update(address(this), post.author, remainder); } // Distribute fee proportionatly among all reputation holders for (uint i = 0; i < memberCount; i++) { @@ -240,3 +271,13 @@ contract DAO is ERC20("Reputation", "REP") { ); } } + +/// Convenience contract to extend for other contracts that will be initialized to +/// interact with a DAO contract. +contract DAOContract { + DAO immutable dao; + + constructor(DAO dao_) { + dao = dao_; + } +} diff --git a/ethereum/contracts/Onboarding.sol b/ethereum/contracts/Onboarding.sol index 049f19f..dca9500 100644 --- a/ethereum/contracts/Onboarding.sol +++ b/ethereum/contracts/Onboarding.sol @@ -27,7 +27,16 @@ contract Onboarding is WorkContract, IOnValidate { // Initiate validation pool uint poolIndex = dao.initiateValidationPool{ value: request.fee - request.fee / 10 - }(postIndex, POOL_DURATION, 1, 3, true, abi.encode(requestIndex)); + }( + postIndex, + POOL_DURATION, + 1, + 3, + 100, + true, + true, + abi.encode(requestIndex) + ); dao.stake(poolIndex, stake.amount, true); } @@ -53,6 +62,8 @@ contract Onboarding is WorkContract, IOnValidate { POOL_DURATION, 1, 3, + 100, + true, false, "" ); diff --git a/ethereum/contracts/Proposal.sol b/ethereum/contracts/Proposal.sol new file mode 100644 index 0000000..cd880fc --- /dev/null +++ b/ethereum/contracts/Proposal.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: Unlicense +pragma solidity ^0.8.24; + +import "./DAO.sol"; + +contract Proposals is DAOContract { + struct Attestation { + address sender; + uint amount; + } + + enum Stage { + Proposal, + Referendum0, + Referendum1, + Referendum100, + Closed + } + struct Proposal { + address sender; + string contentId; + uint startTime; + Stage stage; + mapping(uint => Attestation) attestations; + uint attestationCount; + } + + mapping(uint => Proposal) proposals; + uint proposalCount; + + constructor(DAO dao) DAOContract(dao) {} + + function propose( + string calldata contentId + ) external returns (uint proposalIndex) { + proposalIndex = proposalCount++; + Proposal storage proposal = proposals[proposalIndex]; + proposal.startTime = block.timestamp; + proposal.contentId = contentId; + } + + function attest(uint proposalIndex, uint amount) external { + // Since this is non-binding, non-encumbering, we only need to verify that + // the sender actually has the rep they claim to stake. + require( + dao.balanceOf(msg.sender) >= amount, + "Sender has insufficient REP balance" + ); + Proposal storage proposal = proposals[proposalIndex]; + uint attestationIndex = proposal.attestationCount++; + Attestation storage attestation = proposal.attestations[ + attestationIndex + ]; + attestation.sender = msg.sender; + attestation.amount = amount; + } + + function evaluateAttestation(uint proposalIndex) external returns (bool) { + Proposal storage proposal = proposals[proposalIndex]; + require( + proposal.stage == Stage.Proposal, + "Attestation only pertains to Proposal stage" + ); + uint totalAttestation; + for (uint i = 0; i < proposal.attestationCount; i++) { + totalAttestation += proposal.attestations[i].amount; + } + bool meetsAttestation = 10 * totalAttestation >= dao.totalSupply(); + if (!meetsAttestation) { + if (block.timestamp > proposal.startTime + 365 days) { + proposal.stage = Stage.Closed; + return false; + } + return false; + } + + // Initiate validation pool + proposal.stage = Stage.Referendum0; + // TODO: make referendum0 duration a parameter + } +} diff --git a/ethereum/contracts/WorkContract.sol b/ethereum/contracts/WorkContract.sol index 2c6b468..585ba33 100644 --- a/ethereum/contracts/WorkContract.sol +++ b/ethereum/contracts/WorkContract.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.24; import "./DAO.sol"; import "./IAcceptAvailability.sol"; -abstract contract WorkContract is IAcceptAvailability { +abstract contract WorkContract is DAOContract, IAcceptAvailability { struct AvailabilityStake { address worker; uint256 amount; @@ -30,7 +30,6 @@ abstract contract WorkContract is IAcceptAvailability { bool approval; } - DAO immutable dao; uint public immutable price; mapping(uint => AvailabilityStake) public stakes; uint public stakeCount; @@ -44,8 +43,7 @@ abstract contract WorkContract is IAcceptAvailability { event WorkEvidenceSubmitted(uint requestIndex); event WorkApprovalSubmitted(uint requestIndex, bool approval); - constructor(DAO dao_, uint price_) { - dao = dao_; + constructor(DAO dao, uint price_) DAOContract(dao) { price = price_; } @@ -180,6 +178,8 @@ abstract contract WorkContract is IAcceptAvailability { POOL_DURATION, 1, 3, + 100, + true, false, "" ); diff --git a/ethereum/test/DAO.js b/ethereum/test/DAO.js index b6a5dda..ca81102 100644 --- a/ethereum/test/DAO.js +++ b/ethereum/test/DAO.js @@ -44,18 +44,21 @@ describe('DAO', () => { describe('Validation Pool', () => { let dao; let account1; + let account2; const POOL_DURATION = 3600; // 1 hour const POOL_FEE = 100; const callbackData = ethers.AbiCoder.defaultAbiCoder().encode([], []); beforeEach(async () => { - ({ dao, account1 } = await loadFixture(deploy)); + ({ dao, account1, account2 } = await loadFixture(deploy)); await dao.addPost(account1, 'content-id'); const init = () => dao.initiateValidationPool( 0, POOL_DURATION, 1, 3, + 100, + true, false, callbackData, { value: POOL_FEE }, @@ -75,6 +78,8 @@ describe('DAO', () => { POOL_DURATION, 1, 3, + 100, + true, false, callbackData, ); @@ -88,6 +93,8 @@ describe('DAO', () => { POOL_DURATION, 1, 4, + 100, + true, false, callbackData, { value: POOL_FEE }, @@ -102,6 +109,8 @@ describe('DAO', () => { POOL_DURATION, 11, 10, + 100, + true, false, callbackData, { value: POOL_FEE }, @@ -116,6 +125,8 @@ describe('DAO', () => { 0, 1, 3, + 100, + true, false, callbackData, { value: POOL_FEE }, @@ -130,6 +141,8 @@ describe('DAO', () => { 40000000000000, 1, 3, + 100, + true, false, callbackData, { value: POOL_FEE }, @@ -137,12 +150,30 @@ describe('DAO', () => { await expect(init()).to.be.revertedWith('Duration is too long'); }); + it('should not be able to initiate a validation pool with bindingPercent above 100', async () => { + const setup = await loadFixture(deploy); + const init = () => setup.dao.initiateValidationPool( + 0, + POOL_DURATION, + 1, + 3, + 101, + true, + false, + callbackData, + { value: POOL_FEE }, + ); + await expect(init()).to.be.revertedWith('Binding percent must be <= 100'); + }); + it('should be able to initiate a second validation pool', async () => { const init = () => dao.initiateValidationPool( 0, POOL_DURATION, 1, 3, + 100, + true, false, callbackData, { value: POOL_FEE }, @@ -161,77 +192,21 @@ describe('DAO', () => { }); }); - describe('Evaluate outcome', () => { - it('should not be able to evaluate outcome before duration has elapsed', async () => { - await expect(dao.evaluateOutcome(0)).to.be.revertedWith('Pool end time has not yet arrived'); - }); - - it('should be able to evaluate outcome after duration has elapsed', async () => { - time.increase(POOL_DURATION + 1); - await expect(dao.evaluateOutcome(0)).to.emit(dao, 'ValidationPoolResolved').withArgs(0, true); - expect(await dao.memberCount()).to.equal(1); - expect(await dao.balanceOf(account1)).to.equal(100); - const pool = await dao.validationPools(0); - expect(pool.resolved).to.be.true; - expect(pool.outcome).to.be.true; - }); - - it('should not be able to evaluate outcome more than once', async () => { - time.increase(POOL_DURATION + 1); - await expect(dao.evaluateOutcome(0)).to.emit(dao, 'ValidationPoolResolved').withArgs(0, true); - await expect(dao.evaluateOutcome(0)).to.be.revertedWith('Pool is already resolved'); - }); - - it('should be able to evaluate outcome of second validation pool', async () => { - const init = () => dao.initiateValidationPool( - 0, - POOL_DURATION, - 1, - 3, - false, - callbackData, - { value: POOL_FEE }, - ); - await expect(init()).to.emit(dao, 'ValidationPoolInitiated').withArgs(1); - expect(await dao.validationPoolCount()).to.equal(2); - time.increase(POOL_DURATION + 1); - await expect(dao.evaluateOutcome(0)).to.emit(dao, 'ValidationPoolResolved').withArgs(0, true); - expect(await dao.balanceOf(account1)).to.equal(100); - await expect(dao.evaluateOutcome(1)).to.emit(dao, 'ValidationPoolResolved').withArgs(1, true); - expect(await dao.balanceOf(account1)).to.equal(200); - }); - - it('should not be able to evaluate outcome if quorum is not met', async () => { - time.increase(POOL_DURATION + 1); - await expect(dao.evaluateOutcome(0)).to.emit(dao, 'ValidationPoolResolved').withArgs(0, true); - - const init = () => dao.initiateValidationPool( - 0, - POOL_DURATION, - 1, - 1, - false, - callbackData, - { value: POOL_FEE }, - ); - await expect(init()).to.emit(dao, 'ValidationPoolInitiated').withArgs(1); - expect(await dao.validationPoolCount()).to.equal(2); - time.increase(POOL_DURATION + 1); - await expect(dao.evaluateOutcome(1)).to.be.revertedWith('Quorum for this pool was not met'); - }); - }); - describe('Stake', async () => { beforeEach(async () => { time.increase(POOL_DURATION + 1); + console.log('evaluating first pool'); await dao.evaluateOutcome(0); expect(await dao.balanceOf(account1)).to.equal(100); expect(await dao.balanceOf(dao.target)).to.equal(0); + console.log('initiating second pool'); await dao.initiateValidationPool( 0, POOL_DURATION, 1, 3, + 100, + true, false, callbackData, { value: POOL_FEE }, @@ -240,10 +215,12 @@ describe('DAO', () => { }); it('should be able to stake before validation pool has elapsed', async () => { + console.log('staking on second pool'); await dao.stake(1, 10, true); expect(await dao.balanceOf(account1)).to.equal(90); expect(await dao.balanceOf(dao.target)).to.equal(110); time.increase(POOL_DURATION + 1); + console.log('evaluating second pool'); await expect(dao.evaluateOutcome(1)).to.emit(dao, 'ValidationPoolResolved').withArgs(1, true); expect(await dao.balanceOf(dao.target)).to.equal(0); expect(await dao.balanceOf(account1)).to.equal(200); @@ -266,5 +243,194 @@ describe('DAO', () => { expect(pool.outcome).to.be.false; }); }); + + describe('Evaluate outcome', () => { + it('should not be able to evaluate outcome before duration has elapsed', async () => { + await expect(dao.evaluateOutcome(0)).to.be.revertedWith('Pool end time has not yet arrived'); + }); + + it('should be able to evaluate outcome after duration has elapsed', async () => { + expect(await dao.balanceOf(dao.target)).to.equal(100); + time.increase(POOL_DURATION + 1); + await expect(dao.evaluateOutcome(0)).to.emit(dao, 'ValidationPoolResolved').withArgs(0, true); + expect(await dao.memberCount()).to.equal(1); + expect(await dao.balanceOf(account1)).to.equal(100); + const pool = await dao.validationPools(0); + expect(pool.resolved).to.be.true; + expect(pool.outcome).to.be.true; + }); + + it('should not be able to evaluate outcome more than once', async () => { + time.increase(POOL_DURATION + 1); + await expect(dao.evaluateOutcome(0)).to.emit(dao, 'ValidationPoolResolved').withArgs(0, true); + await expect(dao.evaluateOutcome(0)).to.be.revertedWith('Pool is already resolved'); + }); + + it('should be able to evaluate outcome of second validation pool', async () => { + const init = () => dao.initiateValidationPool( + 0, + POOL_DURATION, + 1, + 3, + 100, + true, + false, + callbackData, + { value: POOL_FEE }, + ); + await expect(init()).to.emit(dao, 'ValidationPoolInitiated').withArgs(1); + expect(await dao.validationPoolCount()).to.equal(2); + time.increase(POOL_DURATION + 1); + await expect(dao.evaluateOutcome(0)).to.emit(dao, 'ValidationPoolResolved').withArgs(0, true); + expect(await dao.balanceOf(account1)).to.equal(100); + await expect(dao.evaluateOutcome(1)).to.emit(dao, 'ValidationPoolResolved').withArgs(1, true); + expect(await dao.balanceOf(account1)).to.equal(200); + }); + + it('should not be able to evaluate outcome if quorum is not met', async () => { + time.increase(POOL_DURATION + 1); + await expect(dao.evaluateOutcome(0)).to.emit(dao, 'ValidationPoolResolved').withArgs(0, true); + + const init = () => dao.initiateValidationPool( + 0, + POOL_DURATION, + 1, + 1, + 100, + true, + false, + callbackData, + { value: POOL_FEE }, + ); + await expect(init()).to.emit(dao, 'ValidationPoolInitiated').withArgs(1); + expect(await dao.validationPoolCount()).to.equal(2); + time.increase(POOL_DURATION + 1); + await expect(dao.evaluateOutcome(1)).to.be.revertedWith('Quorum for this pool was not met'); + }); + + describe('Validation pool options', () => { + beforeEach(async () => { + time.increase(POOL_DURATION + 1); + await dao.evaluateOutcome(0); + await dao.addPost(account2, 'content-id'); + const init = () => dao.initiateValidationPool( + 1, + POOL_DURATION, + 1, + 3, + 100, + true, + false, + callbackData, + { value: POOL_FEE }, + ); + await expect(init()).to.emit(dao, 'ValidationPoolInitiated').withArgs(1); + time.increase(POOL_DURATION + 1); + await dao.evaluateOutcome(1); + }); + + it('Binding validation pool should redistribute stakes', async () => { + const init = () => dao.initiateValidationPool( + 0, + POOL_DURATION, + 1, + 3, + 100, + true, + false, + callbackData, + { value: POOL_FEE }, + ); + await expect(init()).to.emit(dao, 'ValidationPoolInitiated').withArgs(2); + await dao.connect(account1).stake(2, 10, true); + await dao.connect(account2).stake(2, 10, false); + expect(await dao.balanceOf(account1)).to.equal(90); + expect(await dao.balanceOf(account2)).to.equal(90); + expect(await dao.balanceOf(dao.target)).to.equal(120); + time.increase(POOL_DURATION + 1); + await dao.evaluateOutcome(2); + expect(await dao.balanceOf(account1)).to.equal(210); + expect(await dao.balanceOf(account2)).to.equal(90); + expect(await dao.balanceOf(dao.target)).to.equal(0); + }); + + it('Non binding validation pool should not redistribute stakes', async () => { + const init = () => dao.initiateValidationPool( + 0, + POOL_DURATION, + 1, + 3, + 0, + true, + false, + callbackData, + { value: POOL_FEE }, + ); + await expect(init()).to.emit(dao, 'ValidationPoolInitiated').withArgs(2); + await dao.connect(account1).stake(2, 10, true); + await dao.connect(account2).stake(2, 10, false); + expect(await dao.balanceOf(account1)).to.equal(90); + expect(await dao.balanceOf(account2)).to.equal(90); + expect(await dao.balanceOf(dao.target)).to.equal(120); + time.increase(POOL_DURATION + 1); + await dao.evaluateOutcome(2); + expect(await dao.balanceOf(account1)).to.equal(200); + expect(await dao.balanceOf(account2)).to.equal(100); + expect(await dao.balanceOf(dao.target)).to.equal(0); + }); + + it('Partially binding validation pool should redistribute some stakes', async () => { + const init = () => dao.initiateValidationPool( + 0, + POOL_DURATION, + 1, + 3, + 50, + true, + false, + callbackData, + { value: POOL_FEE }, + ); + await expect(init()).to.emit(dao, 'ValidationPoolInitiated').withArgs(2); + await dao.connect(account1).stake(2, 10, true); + await dao.connect(account2).stake(2, 10, false); + expect(await dao.balanceOf(account1)).to.equal(90); + expect(await dao.balanceOf(account2)).to.equal(90); + expect(await dao.balanceOf(dao.target)).to.equal(120); + time.increase(POOL_DURATION + 1); + await dao.evaluateOutcome(2); + expect(await dao.balanceOf(account1)).to.equal(205); + expect(await dao.balanceOf(account2)).to.equal(95); + expect(await dao.balanceOf(dao.target)).to.equal(0); + expect(await dao.totalSupply()).to.equal(300); + }); + + it('If redistributeLosingStakes is false, validation pool should burn binding portion of losing stakes', async () => { + const init = () => dao.initiateValidationPool( + 0, + POOL_DURATION, + 1, + 3, + 50, + false, + false, + callbackData, + { value: POOL_FEE }, + ); + await expect(init()).to.emit(dao, 'ValidationPoolInitiated').withArgs(2); + await dao.connect(account1).stake(2, 10, true); + await dao.connect(account2).stake(2, 10, false); + expect(await dao.balanceOf(account1)).to.equal(90); + expect(await dao.balanceOf(account2)).to.equal(90); + expect(await dao.balanceOf(dao.target)).to.equal(120); + time.increase(POOL_DURATION + 1); + await dao.evaluateOutcome(2); + expect(await dao.balanceOf(account1)).to.equal(200); + expect(await dao.balanceOf(account2)).to.equal(95); + expect(await dao.balanceOf(dao.target)).to.equal(0); + expect(await dao.totalSupply()).to.equal(295); + }); + }); + }); }); }); diff --git a/ethereum/test/Onboarding.js b/ethereum/test/Onboarding.js index 82576a7..1577db2 100644 --- a/ethereum/test/Onboarding.js +++ b/ethereum/test/Onboarding.js @@ -19,7 +19,7 @@ describe('Onboarding', () => { await dao.addPost(account1, 'content-id'); const callbackData = ethers.AbiCoder.defaultAbiCoder().encode([], []); - await dao.initiateValidationPool(0, 60, 1, 3, false, callbackData, { value: 100 }); + await dao.initiateValidationPool(0, 60, 1, 3, 100, true, false, callbackData, { value: 100 }); await time.increase(61); await dao.evaluateOutcome(0); expect(await dao.balanceOf(account1)).to.equal(100); diff --git a/ethereum/test/Work1.js b/ethereum/test/Work1.js index 25c896c..0c616a9 100644 --- a/ethereum/test/Work1.js +++ b/ethereum/test/Work1.js @@ -19,7 +19,7 @@ describe('Work1', () => { await dao.addPost(account1, 'some-content-id'); const callbackData = ethers.AbiCoder.defaultAbiCoder().encode([], []); - await dao.initiateValidationPool(0, 60, 1, 3, false, callbackData, { value: 100 }); + await dao.initiateValidationPool(0, 60, 1, 3, 100, true, false, callbackData, { value: 100 }); await time.increase(61); await dao.evaluateOutcome(0);