From add6963073888ff91b7d7e6f7d0d8163142845c3 Mon Sep 17 00:00:00 2001 From: KahanMajmudar Date: Wed, 11 Dec 2024 07:18:57 +0000 Subject: [PATCH 1/5] allows for optional staking --- run_service.py | 2 +- utils.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/run_service.py b/run_service.py index 30b0a62..a10a850 100644 --- a/run_service.py +++ b/run_service.py @@ -103,7 +103,7 @@ def get_service_template(config: MechQuickstartConfig) -> ServiceTemplate: "nft": "bafybeifgj3kackzfoq4fxjiuousm6epgwx7jbc3n2gjwzjgvtbbz7fc3su", "cost_of_bond": COST_OF_BOND, "threshold": 1, - "use_staking": True, + "use_staking": config.use_staking, "fund_requirements": FundRequirementsTemplate( { "agent": AGENT_TOPUP, diff --git a/utils.py b/utils.py index ed4d2ba..02c4a62 100644 --- a/utils.py +++ b/utils.py @@ -320,6 +320,11 @@ def get_local_config() -> MechQuickstartConfig: mech_quickstart_config.gnosis_rpc = input( f"Please enter a {ChainType.from_id(mech_quickstart_config.home_chain_id).name} RPC URL: " ) + + if mech_quickstart_config.use_staking is None: + mech_quickstart_config.use_staking = input_with_default_value( + "Do you wish to use staking for your service? (True/False)" , False + ) if mech_quickstart_config.mech_hash is None: mech_hash = ( From d1a3935994cdfb60574867d0be0887f3da3d69e1 Mon Sep 17 00:00:00 2001 From: KahanMajmudar Date: Wed, 11 Dec 2024 11:28:01 +0000 Subject: [PATCH 2/5] updated staking address in env vars based on user preference --- run_service.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/run_service.py b/run_service.py index a10a850..bf29b80 100644 --- a/run_service.py +++ b/run_service.py @@ -28,6 +28,7 @@ from dotenv import load_dotenv from halo import Halo +from web3.constants import ADDRESS_ZERO from operate.account.user import UserAccount from operate.cli import OperateApp from operate.ledger.profiles import CONTRACTS, STAKING, OLAS @@ -309,6 +310,11 @@ def main() -> None: "SERVICE_REGISTRY_ADDRESS": CONTRACTS[home_chain_type]["service_registry"], "STAKING_TOKEN_CONTRACT_ADDRESS": STAKING[home_chain_type]["mech_marketplace"], "MECH_MARKETPLACE_ADDRESS": CHAIN_TO_MARKETPLACE[home_chain_type], + "MECH_STAKING_INSTANCE_ADDRESS": ( + STAKING[ChainType.GNOSIS]["mech_marketplace"] + if mech_quickstart_config.use_staking + else ADDRESS_ZERO + ), # TODO: no way to update this atm after its provided, user is expected to update the file itself. "API_KEYS": json.dumps(api_keys, separators=(',', ':')), "AGENT_ID": str(mech_quickstart_config.agent_id), From 76c51760fd6958be5b352941506b8f31ee9c9dd0 Mon Sep 17 00:00:00 2001 From: KahanMajmudar Date: Fri, 13 Dec 2024 11:37:46 +0000 Subject: [PATCH 3/5] updates the method to create marketplace mechs --- contracts/MechAgentFactory.json | 539 -------------------------------- contracts/MechFactoryBasic.json | 83 +++++ utils.py | 26 +- 3 files changed, 96 insertions(+), 552 deletions(-) delete mode 100644 contracts/MechAgentFactory.json create mode 100644 contracts/MechFactoryBasic.json diff --git a/contracts/MechAgentFactory.json b/contracts/MechAgentFactory.json deleted file mode 100644 index bfbc437..0000000 --- a/contracts/MechAgentFactory.json +++ /dev/null @@ -1,539 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "MechMarketplace", - "sourceName": "contracts/MechMarketplace.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_agentRegistry", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "operator", - "type": "address" - } - ], - "name": "AgentInstanceRegistered", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "AgentInstancesSlotsFilled", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "agentId", - "type": "uint256" - } - ], - "name": "AgentNotFound", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "agentId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "AgentNotInService", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "componentId", - "type": "uint256" - } - ], - "name": "ComponentNotFound", - "type": "error" - }, - { - "inputs": [], - "name": "HashExists", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "sent", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expected", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "IncorrectAgentBondingValue", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "sent", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expected", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "IncorrectRegistrationDepositValue", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "manager", - "type": "address" - } - ], - "name": "ManagerOnly", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "provided", - "type": "address" - }, - { - "internalType": "address", - "name": "expected", - "type": "address" - }, - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "OnlyOwnServiceMultisig", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "OperatorHasNoInstances", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "provided", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "max", - "type": "uint256" - } - ], - "name": "Overflow", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "OwnerOnly", - "type": "error" - }, - { - "inputs": [], - "name": "Paused", - "type": "error" - }, - { - "inputs": [], - "name": "ReentrancyGuard", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "ServiceMustBeInactive", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "TransferFailed", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "multisig", - "type": "address" - } - ], - "name": "UnauthorizedMultisig", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "agentId", - "type": "uint256" - } - ], - "name": "WrongAgentId", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "numValues1", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "numValues2", - "type": "uint256" - } - ], - "name": "WrongArrayLength", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "WrongOperator", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "state", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "WrongServiceState", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "currentThreshold", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minThreshold", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxThreshold", - "type": "uint256" - } - ], - "name": "WrongThreshold", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroValue", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "mech", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "agentId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "price", - "type": "uint256" - } - ], - "name": "CreateMech", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "OwnerUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "Pause", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "Unpause", - "type": "event" - }, - { - "inputs": [], - "name": "VERSION", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "agentRegistry", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "changeOwner", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "agentOwner", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "agentHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "price", - "type": "uint256" - }, - { - "internalType": "address", - "name": "mechMarketplace", - "type": "address" - } - ], - "name": "create", - "outputs": [ - { - "internalType": "uint256", - "name": "agentId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "mech", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/contracts/MechFactoryBasic.json b/contracts/MechFactoryBasic.json new file mode 100644 index 0000000..b000be1 --- /dev/null +++ b/contracts/MechFactoryBasic.json @@ -0,0 +1,83 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "MechFactoryBasic", + "sourceName": "contracts/MechFactoryBasic.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "mech", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "serviceId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "CreateBasicMech", + "type": "event" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "mechMarketplace", + "type": "address" + }, + { + "internalType": "address", + "name": "serviceRegistry", + "type": "address" + }, + { + "internalType": "uint256", + "name": "serviceId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "payload", + "type": "bytes" + } + ], + "name": "createMech", + "outputs": [ + { + "internalType": "address", + "name": "mech", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6080604052348015600e575f5ffd5b50613b7b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c80632732cb0214610038578063ffa1ad7414610075575b5f5ffd5b61004b610046366004610231565b6100be565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100b16040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161006c919061034b565b5f81516020146100cc575f5ffd5b5f828060200190518101906100e1919061039e565b604080514260208201523391810191909152606081018690529091505f90608001604051602081830303815290604052805190602001209050808686848a60405161012b906101cf565b73ffffffffffffffffffffffffffffffffffffffff94851681526020810193909352604083019190915290911660608201526080018190604051809103905ff590508015801561017d573d5f5f3e3d5ffd5b50925081858473ffffffffffffffffffffffffffffffffffffffff167f79e4ff7d5767c146d78373d8c8f9824aa5b3e949c3aeabbaceec4c4ee748080660405160405180910390a45050949350505050565b613790806103b683390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146101ff575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f5f60808587031215610244575f5ffd5b61024d856101dc565b935061025b602086016101dc565b925060408501359150606085013567ffffffffffffffff81111561027d575f5ffd5b8501601f8101871361028d575f5ffd5b803567ffffffffffffffff8111156102a7576102a7610204565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561031357610313610204565b60405281815282820160200189101561032a575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f602082840312156103ae575f5ffd5b505191905056fe60c06040525f5f556001600655348015610017575f5ffd5b50604051613790380380613790833981016040819052610036916105ab565b83836001600160a01b03821661005f5760405163d92e233d60e01b815260040160405180910390fd5b805f0361007f57604051637c946ed760e01b815260040160405180910390fd5b604080516001600160a01b03841660208201529081018290525f9060600160408051601f1981840301815290829052630846d5ff60e31b82526004820184905291505f9081906001600160a01b03861690634236aff89060240160e060405180830381865afa1580156100f4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101189190610602565b9650505050509250505f6001600160a01b0316826001600160a01b0316036101535760405163d92e233d60e01b815260040160405180910390fd5b600481600581111561016757610167610690565b146101a75780600581111561017e5761017e610690565b604051633c053f9d60e21b81526004810191909152602481018590526044015b60405180910390fd5b6101b0836102ad565b5050506001600160a01b03831691506101de90505760405163d92e233d60e01b815260040160405180910390fd5b6040516331a9108f60e11b8152600481018490525f906001600160a01b03861690636352211e90602401602060405180830381865afa158015610223573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061024791906106a4565b90506001600160a01b03811661027357604051630ede975960e01b81526004810185905260240161019e565b600580546001600160a01b0319166001600160a01b03841617905560018390554660a05261029f61030f565b6080525061078c9350505050565b6102b56103d7565b51156103035760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015260640161019e565b61030c8161043f565b50565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f493aeac1d921aa02a044029e7fe4be43b1a4e80b40706fa5819e8fbb0d093525604051806040016040528060058152602001640312e312e360dc1b81525060405160200161038091906106c4565b60408051601f1981840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b606061043a610435604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b610503565b905090565b5f61044982610558565b90505f8151602083015ff090506104af604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6001600160a01b0316816001600160a01b0316146104fe5760405162461bcd60e51b815260206004820152600c60248201526b15dc9a5d194819985a5b195960a21b604482015260640161019e565b505050565b6060813b6001811161052457505060408051602081019091525f8152919050565b8061052e8161070d565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016105689190610722565b8260405160200161057a92919061073b565b6040516020818303038152906040529050919050565b80516001600160a01b03811681146105a6575f5ffd5b919050565b5f5f5f5f608085870312156105be575f5ffd5b6105c785610590565b60208601516040870151919550935091506105e460608601610590565b905092959194509250565b805163ffffffff811681146105a6575f5ffd5b5f5f5f5f5f5f5f60e0888a031215610618575f5ffd5b87516001600160601b038116811461062e575f5ffd5b965061063c60208901610590565b955060408801519450610651606089016105ef565b935061065f608089016105ef565b925061066d60a089016105ef565b915060c088015160068110610680575f5ffd5b8091505092959891949750929550565b634e487b7160e01b5f52602160045260245ffd5b5f602082840312156106b4575f5ffd5b6106bd82610590565b9392505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52601160045260245ffd5b5f8161071b5761071b6106f9565b505f190190565b80820180821115610735576107356106f9565b92915050565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201525f600e820181905282518060208501600f85015e5f9201600f019182525092915050565b60805160a051612fd56107bb5f395f818161055801526114b601525f818161086701526114eb0152612fd55ff3fe608060405260043610610278575f3560e01c8063a035b1fe1161014b578063d843b7f4116100c6578063f5dcb7bb1161007c578063f698da2511610062578063f698da2514610856578063fc0c546a14610889578063ffa1ad741461089d575f5ffd5b8063f5dcb7bb14610804578063f6171e4414610837575f5ffd5b8063e7d915cf116100ac578063e7d915cf1461078c578063ed24911d146107ab578063f23a6e61146107bf575f5ffd5b8063d843b7f41461071f578063d8a4676f14610760575f5ffd5b8063b0d691fe1161011b578063bdf8631711610101578063bdf86317146106b3578063c7dec3fc146106c8578063cbd6407a146106f4575f5ffd5b8063b0d691fe14610646578063bc197c811461066c575f5ffd5b8063a035b1fe146105ea578063a4f9edbf146105ff578063a669aaf91461061e578063affed0e014610633575f5ffd5b806358ce0909116101f557806391b7f5ed116101ab5780639a8a0592116101915780639a8a0592146105475780639c5e95901461057a5780639ec4a5bf146105cb575f5ffd5b806391b7f5ed146104fd578063982c0db31461051c575f5ffd5b806379412518116101db57806379412518146104685780637af734731461047b5780638fb847ef146104bc575f5ffd5b806358ce09091461040d5780636d70f7ae14610439575f5ffd5b806317d70f7c1161024a5780633a871cdd116102305780633a871cdd146103ba5780634954bbf1146103d95780634ada3e61146103f8575f5ffd5b806317d70f7c1461037b5780631bbbeeb81461038f575f5ffd5b806223de2914610283578062427c54146102a9578063150b7a02146102e75780631626ba7e1461035c575f5ffd5b3661027f57005b5f5ffd5b34801561028e575f5ffd5b506102a761029d3660046124d4565b5050505050505050565b005b3480156102b4575f5ffd5b506102d46102c3366004612583565b60086020525f908152604090205481565b6040519081526020015b60405180910390f35b3480156102f2575f5ffd5b5061032b61030136600461259e565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016102de565b348015610367575f5ffd5b5061032b6103763660046126e2565b6108e5565b348015610386575f5ffd5b506102d4610a88565b34801561039a575f5ffd5b506102d46103a9366004612583565b60076020525f908152604090205481565b3480156103c5575f5ffd5b506102d46103d4366004612726565b610aac565b3480156103e4575f5ffd5b506102a76103f3366004612775565b610ae8565b348015610403575f5ffd5b506102d460035481565b348015610418575f5ffd5b5061042c6104273660046127d2565b610cdc565b6040516102de91906127f2565b348015610444575f5ffd5b50610458610453366004612583565b610e33565b60405190151581526020016102de565b6102a7610476366004612834565b610f26565b348015610486575f5ffd5b506102d4610495366004612583565b73ffffffffffffffffffffffffffffffffffffffff165f9081526007602052604090205490565b3480156104c7575f5ffd5b506102d46104d6366004612583565b73ffffffffffffffffffffffffffffffffffffffff165f9081526008602052604090205490565b348015610508575f5ffd5b506102a761051736600461288a565b610fa9565b348015610527575f5ffd5b506102d4610536366004612583565b60096020525f908152604090205481565b348015610552575f5ffd5b506102d47f000000000000000000000000000000000000000000000000000000000000000081565b348015610585575f5ffd5b506005546105a69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102de565b3480156105d6575f5ffd5b506102d46105e5366004612834565b611097565b3480156105f5575f5ffd5b506102d460015481565b34801561060a575f5ffd5b506102a76106193660046128a1565b61114b565b348015610629575f5ffd5b506102d460045481565b34801561063e575f5ffd5b505f546102d4565b348015610651575f5ffd5b50730576a174d229e3cfa37253523e645a78a0c91b576105a6565b348015610677575f5ffd5b5061032b61068636600461291c565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b3480156106be575f5ffd5b506102d460025481565b3480156106d3575f5ffd5b506106e76106e23660046129bf565b6111c7565b6040516102de9190612a7d565b3480156106ff575f5ffd5b506102d461070e366004612583565b600c6020525f908152604090205481565b34801561072a575f5ffd5b506105a661073936600461288a565b600b6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801561076b575f5ffd5b5061077f61077a36600461288a565b6112b1565b6040516102de9190612abc565b348015610797575f5ffd5b506102a76107a636600461288a565b611387565b3480156107b6575f5ffd5b506102d46114b3565b3480156107ca575f5ffd5b5061032b6107d9366004612afb565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b34801561080f575f5ffd5b506102d47f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b348015610842575f5ffd5b506102d46108513660046127d2565b61150d565b348015610861575f5ffd5b506102d47f000000000000000000000000000000000000000000000000000000000000000081565b348015610894575f5ffd5b506105a661152f565b3480156108a8575f5ffd5b506106e76040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b5f5f5f5f61090585602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f03610a1b578285830160200161092682610e33565b158015610949575073ffffffffffffffffffffffffffffffffffffffff82163014155b1561097c57507fffffffff000000000000000000000000000000000000000000000000000000009450610a829350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e906109d0908b908590600401612b72565b602060405180830381865afa1580156109eb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0f9190612b8a565b95505050505050610a82565b610a2a6104538783868661154c565b15610a5b57507f1626ba7e000000000000000000000000000000000000000000000000000000009250610a82915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f5f610a92611568565b806020019051810190610aa59190612bc9565b9392505050565b5f610ab5611637565b610abf84846116b6565b9050610ace6040850185612bf5565b90505f03610adf57610adf8461178a565b610aa582611808565b610af133610e33565b80610b0f575033730576a174d229e3cfa37253523e645a78a0c91b57145b610ba0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b60016006541115610bdd576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260065560055473ffffffffffffffffffffffffffffffffffffffff16610c31576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610c3c858561187c565b805190915015610cd0576005546040517f56d0819e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906356d0819e90610ca2908890859088908890600401612c56565b5f604051808303815f87803b158015610cb9575f5ffd5b505af1158015610ccb573d5f5f3e3d5ffd5b505050505b50506001600655505050565b6002546060905f849003610cee578093505b80610cf98486612cc4565b1115610d4657610d098385612cc4565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610b97565b8315610e2c578367ffffffffffffffff811115610d6557610d6561260c565b604051908082528060200260200182016040528015610d8e578160200160208202803683370190505b505f808052600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e4549193505b84811015610de1575f828152600a60205260409020600101549150600101610dbe565b505f5b85811015610e295781848281518110610dff57610dff612cd7565b6020908102919091018101919091525f838152600a90915260409020600101549150600101610de4565b50505b5092915050565b5f5f5f610e3e611568565b806020019051810190610e519190612bc9565b6040517f4236aff80000000000000000000000000000000000000000000000000000000081526004810182905291935091505f9073ffffffffffffffffffffffffffffffffffffffff841690634236aff89060240160e060405180830381865afa158015610ec1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee59190612d17565b50505050509150508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149350505050919050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610f99576005546040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610b97565b610fa4838383611a91565b505050565b610fb233610e33565b80610fd0575033730576a174d229e3cfa37253523e645a78a0c91b57145b61105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e747261637400006064820152608401610b97565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b5f6110a06114b3565b8484846040516020016110b593929190612dae565b6040516020818303038152906040528051906020012060405160200161110d9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b611153611568565b51156111bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a6564000000000000000000000000006044820152606401610b97565b6111c481611c39565b50565b60606111d233610e33565b806111f0575033730576a174d229e3cfa37253523e645a78a0c91b57145b61127c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e747261637400006064820152608401610b97565b5f6112968787878787156112905787611da9565b5a611da9565b92509050806112a757815160208301fd5b5095945050505050565b5f818152600b602052604081205473ffffffffffffffffffffffffffffffffffffffff1615611382575f828152600a60205260408082208151808301928390529160029082845b8154815260200190600101908083116112f85750505050509050805f6002811061132457611324612cd7565b602002015115801561133857506020810151155b801561136d57505f8052600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3548314155b1561137b5760029150611380565b600191505b505b919050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146113fa576005546040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610b97565b5f818152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff1680611455576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61145f8183611eac565b8073ffffffffffffffffffffffffffffffffffffffff167fa36a540c5fea3a5e69d4b1c2247b28a93fd183ef1314af26a8db7b3ae080bcd0836040516114a791815260200190565b60405180910390a25050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146114e8576114e3611fff565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b600a602052815f5260405f208160028110611526575f80fd5b01549150829050565b5f5f611539611568565b806020019051810190610a829190612dec565b5f5f5f61155b878787876120fd565b915091506112a7816121e5565b60606114e36116326040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b612397565b33730576a174d229e3cfa37253523e645a78a0c91b57146116b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610b97565b565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c81207f1626ba7e0000000000000000000000000000000000000000000000000000000061175082611717610140880188612bf5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506108e592505050565b7fffffffff000000000000000000000000000000000000000000000000000000001614611781576001915050610a82565b505f9392505050565b5f80546020830135918061179d83612e07565b91905055146111c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610b97565b80156111c4576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f8114611870576040519150601f19603f3d011682016040523d82523d5f602084013e611875565b606091505b5050505050565b5f828152600b60205260408082205460055491517ff2e433bf0000000000000000000000000000000000000000000000000000000081526004810186905260609373ffffffffffffffffffffffffffffffffffffffff928316939092169063f2e433bf906024016080604051808303815f875af11580156118ff573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119239190612e3e565b602081015190915073ffffffffffffffffffffffffffffffffffffffff161561194d575050610a82565b73ffffffffffffffffffffffffffffffffffffffff82166119e35760055473ffffffffffffffffffffffffffffffffffffffff161561198e57806040015191505b73ffffffffffffffffffffffffffffffffffffffff82166119de576040517ffe23980400000000000000000000000000000000000000000000000000000000815260048101869052602401610b97565b6119ed565b6119ed8286611eac565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600860205260408120805486955091611a2083612e07565b909155505060048054905f611a3483612e07565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b708685604051611a81929190612b72565b60405180910390a2505092915050565b611a9c3482846123ec565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600760205260408120805491611acc83612e07565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f908152600960205260408120805491611b0183612e07565b90915550505f818152600b6020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055600a9091528082207f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e480546001830181905590859055808452918320849055600280547f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e394929392909190611bc883612e07565b909155505060038054905f611bdc83612e07565b91905055508573ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8587604051611c29929190612b72565b60405180910390a2505050505050565b5f611c4382612436565b90505f8151602083015ff09050611d156040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c656400000000000000000000000000000000000000006044820152606401610b97565b5f60606001846001811115611dc057611dc0612a8f565b03611e34578673ffffffffffffffffffffffffffffffffffffffff168386604051611deb9190612ed8565b5f604051808303818686f4925050503d805f8114611e24576040519150601f19603f3d011682016040523d82523d5f602084013e611e29565b606091505b509092509050611ea2565b8673ffffffffffffffffffffffffffffffffffffffff16838787604051611e5b9190612ed8565b5f60405180830381858888f193505050503d805f8114611e96576040519150601f19603f3d011682016040523d82523d5f602084013e611e9b565b606091505b5090925090505b9550959350505050565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600960205260408120805491611edc83612ee3565b909155505060028054905f611ef083612ee3565b90915550505f818152600a60205260408082208151808301928390529160029082845b815481526020019060010190808311611f135750505050509050805f60028110611f3f57611f3f612cd7565b6020020151158015611f5357506020810151155b8015611f8857505f8052600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3548214155b15611fc2576040517ffe23980400000000000000000000000000000000000000000000000000000000815260048101839052602401610b97565b6020818101805183515f908152600a9093526040808420600190810192909255935191518352838320919091559281529081208181559091015550565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f493aeac1d921aa02a044029e7fe4be43b1a4e80b40706fa5819e8fbb0d0935256040518060400160405280600581526020017f312e312e300000000000000000000000000000000000000000000000000000008152506040516020016120889190612a7d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561213257505f905060036121dc565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612183573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166121d6575f600192509250506121dc565b91505f90505b94509492505050565b5f8160048111156121f8576121f8612a8f565b036122005750565b600181600481111561221457612214612a8f565b0361227b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b97565b600281600481111561228f5761228f612a8f565b036122f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b97565b600381600481111561230a5761230a612a8f565b036111c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610b97565b6060813b600181116123b857505060408051602081019091525f8152919050565b806123c281612ee3565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b600154831015610fa4576001546040517fb4897828000000000000000000000000000000000000000000000000000000008152610b97918591600401918252602082015260400190565b6060815160016124469190612cc4565b82604051602001612458929190612f17565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c4575f5ffd5b5f5f83601f84011261249f575f5ffd5b50813567ffffffffffffffff8111156124b6575f5ffd5b6020830191508360208285010111156124cd575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60c0898b0312156124eb575f5ffd5b88356124f68161246e565b975060208901356125068161246e565b965060408901356125168161246e565b955060608901359450608089013567ffffffffffffffff811115612538575f5ffd5b6125448b828c0161248f565b90955093505060a089013567ffffffffffffffff811115612563575f5ffd5b61256f8b828c0161248f565b999c989b5096995094979396929594505050565b5f60208284031215612593575f5ffd5b8135610aa58161246e565b5f5f5f5f5f608086880312156125b2575f5ffd5b85356125bd8161246e565b945060208601356125cd8161246e565b935060408601359250606086013567ffffffffffffffff8111156125ef575f5ffd5b6125fb8882890161248f565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112612648575f5ffd5b813567ffffffffffffffff8111156126625761266261260c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810167ffffffffffffffff811182821017156126af576126af61260c565b6040528181528382016020018510156126c6575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f604083850312156126f3575f5ffd5b82359150602083013567ffffffffffffffff811115612710575f5ffd5b61271c85828601612639565b9150509250929050565b5f5f5f60608486031215612738575f5ffd5b833567ffffffffffffffff81111561274e575f5ffd5b84016101608187031215612760575f5ffd5b95602085013595506040909401359392505050565b5f5f5f5f60808587031215612788575f5ffd5b84359350602085013567ffffffffffffffff8111156127a5575f5ffd5b6127b187828801612639565b93505060408501356127c28161246e565b9396929550929360600135925050565b5f5f604083850312156127e3575f5ffd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b8181101561282957835183526020938401939092019160010161280b565b509095945050505050565b5f5f5f60608486031215612846575f5ffd5b83356128518161246e565b9250602084013567ffffffffffffffff81111561286c575f5ffd5b61287886828701612639565b93969395505050506040919091013590565b5f6020828403121561289a575f5ffd5b5035919050565b5f602082840312156128b1575f5ffd5b813567ffffffffffffffff8111156128c7575f5ffd5b6128d384828501612639565b949350505050565b5f5f83601f8401126128eb575f5ffd5b50813567ffffffffffffffff811115612902575f5ffd5b6020830191508360208260051b85010111156124cd575f5ffd5b5f5f5f5f5f5f5f5f60a0898b031215612933575f5ffd5b883561293e8161246e565b9750602089013561294e8161246e565b9650604089013567ffffffffffffffff811115612969575f5ffd5b6129758b828c016128db565b909750955050606089013567ffffffffffffffff811115612994575f5ffd5b6129a08b828c016128db565b909550935050608089013567ffffffffffffffff811115612563575f5ffd5b5f5f5f5f5f60a086880312156129d3575f5ffd5b85356129de8161246e565b945060208601359350604086013567ffffffffffffffff811115612a00575f5ffd5b612a0c88828901612639565b935050606086013560028110612a20575f5ffd5b949793965091946080013592915050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610aa56020830184612a31565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6020810160038310612af5577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b5f5f5f5f5f5f60a08789031215612b10575f5ffd5b8635612b1b8161246e565b95506020870135612b2b8161246e565b94506040870135935060608701359250608087013567ffffffffffffffff811115612b54575f5ffd5b612b6089828a0161248f565b979a9699509497509295939492505050565b828152604060208201525f6128d36040830184612a31565b5f60208284031215612b9a575f5ffd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610aa5575f5ffd5b5f5f60408385031215612bda575f5ffd5b8251612be58161246e565b6020939093015192949293505050565b5f5f83357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612c28575f5ffd5b83018035915067ffffffffffffffff821115612c42575f5ffd5b6020019150368190038213156124cd575f5ffd5b848152608060208201525f612c6e6080830186612a31565b73ffffffffffffffffffffffffffffffffffffffff949094166040830152506060015292915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610a8257610a82612c97565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805163ffffffff81168114611382575f5ffd5b5f5f5f5f5f5f5f60e0888a031215612d2d575f5ffd5b87516bffffffffffffffffffffffff81168114612d48575f5ffd5b6020890151909750612d598161246e565b60408901519096509450612d6f60608901612d04565b9350612d7d60808901612d04565b9250612d8b60a08901612d04565b915060c088015160068110612d9e575f5ffd5b8091505092959891949750929550565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201525f612ddc6060830185612a31565b9050826040830152949350505050565b5f60208284031215612dfc575f5ffd5b8151610aa58161246e565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612e3757612e37612c97565b5060010190565b5f6080828403128015612e4f575f5ffd5b506040516080810167ffffffffffffffff81118282101715612e7357612e7361260c565b6040528251612e818161246e565b81526020830151612e918161246e565b60208201526040830151612ea48161246e565b6040820152612eb560608401612d04565b60608201529392505050565b5f81518060208401855e5f93019283525090919050565b5f610aa58284612ec1565b5f81612ef157612ef1612c97565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f6128d3600f830184612ec156fea2646970667358221220745f1a38f2fe83d82c8402a3eb9298ed88a0a021f9cd53260a6519db40953fc864736f6c634300081c0033a2646970667358221220884a98a5a4309369b992b99aea71dad108db7a9e4928c141f6a680b1db04060b64736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610034575f3560e01c80632732cb0214610038578063ffa1ad7414610075575b5f5ffd5b61004b610046366004610231565b6100be565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100b16040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161006c919061034b565b5f81516020146100cc575f5ffd5b5f828060200190518101906100e1919061039e565b604080514260208201523391810191909152606081018690529091505f90608001604051602081830303815290604052805190602001209050808686848a60405161012b906101cf565b73ffffffffffffffffffffffffffffffffffffffff94851681526020810193909352604083019190915290911660608201526080018190604051809103905ff590508015801561017d573d5f5f3e3d5ffd5b50925081858473ffffffffffffffffffffffffffffffffffffffff167f79e4ff7d5767c146d78373d8c8f9824aa5b3e949c3aeabbaceec4c4ee748080660405160405180910390a45050949350505050565b613790806103b683390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146101ff575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f5f60808587031215610244575f5ffd5b61024d856101dc565b935061025b602086016101dc565b925060408501359150606085013567ffffffffffffffff81111561027d575f5ffd5b8501601f8101871361028d575f5ffd5b803567ffffffffffffffff8111156102a7576102a7610204565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561031357610313610204565b60405281815282820160200189101561032a575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f602082840312156103ae575f5ffd5b505191905056fe60c06040525f5f556001600655348015610017575f5ffd5b50604051613790380380613790833981016040819052610036916105ab565b83836001600160a01b03821661005f5760405163d92e233d60e01b815260040160405180910390fd5b805f0361007f57604051637c946ed760e01b815260040160405180910390fd5b604080516001600160a01b03841660208201529081018290525f9060600160408051601f1981840301815290829052630846d5ff60e31b82526004820184905291505f9081906001600160a01b03861690634236aff89060240160e060405180830381865afa1580156100f4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101189190610602565b9650505050509250505f6001600160a01b0316826001600160a01b0316036101535760405163d92e233d60e01b815260040160405180910390fd5b600481600581111561016757610167610690565b146101a75780600581111561017e5761017e610690565b604051633c053f9d60e21b81526004810191909152602481018590526044015b60405180910390fd5b6101b0836102ad565b5050506001600160a01b03831691506101de90505760405163d92e233d60e01b815260040160405180910390fd5b6040516331a9108f60e11b8152600481018490525f906001600160a01b03861690636352211e90602401602060405180830381865afa158015610223573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061024791906106a4565b90506001600160a01b03811661027357604051630ede975960e01b81526004810185905260240161019e565b600580546001600160a01b0319166001600160a01b03841617905560018390554660a05261029f61030f565b6080525061078c9350505050565b6102b56103d7565b51156103035760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015260640161019e565b61030c8161043f565b50565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f493aeac1d921aa02a044029e7fe4be43b1a4e80b40706fa5819e8fbb0d093525604051806040016040528060058152602001640312e312e360dc1b81525060405160200161038091906106c4565b60408051601f1981840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b606061043a610435604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b610503565b905090565b5f61044982610558565b90505f8151602083015ff090506104af604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6001600160a01b0316816001600160a01b0316146104fe5760405162461bcd60e51b815260206004820152600c60248201526b15dc9a5d194819985a5b195960a21b604482015260640161019e565b505050565b6060813b6001811161052457505060408051602081019091525f8152919050565b8061052e8161070d565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016105689190610722565b8260405160200161057a92919061073b565b6040516020818303038152906040529050919050565b80516001600160a01b03811681146105a6575f5ffd5b919050565b5f5f5f5f608085870312156105be575f5ffd5b6105c785610590565b60208601516040870151919550935091506105e460608601610590565b905092959194509250565b805163ffffffff811681146105a6575f5ffd5b5f5f5f5f5f5f5f60e0888a031215610618575f5ffd5b87516001600160601b038116811461062e575f5ffd5b965061063c60208901610590565b955060408801519450610651606089016105ef565b935061065f608089016105ef565b925061066d60a089016105ef565b915060c088015160068110610680575f5ffd5b8091505092959891949750929550565b634e487b7160e01b5f52602160045260245ffd5b5f602082840312156106b4575f5ffd5b6106bd82610590565b9392505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52601160045260245ffd5b5f8161071b5761071b6106f9565b505f190190565b80820180821115610735576107356106f9565b92915050565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201525f600e820181905282518060208501600f85015e5f9201600f019182525092915050565b60805160a051612fd56107bb5f395f818161055801526114b601525f818161086701526114eb0152612fd55ff3fe608060405260043610610278575f3560e01c8063a035b1fe1161014b578063d843b7f4116100c6578063f5dcb7bb1161007c578063f698da2511610062578063f698da2514610856578063fc0c546a14610889578063ffa1ad741461089d575f5ffd5b8063f5dcb7bb14610804578063f6171e4414610837575f5ffd5b8063e7d915cf116100ac578063e7d915cf1461078c578063ed24911d146107ab578063f23a6e61146107bf575f5ffd5b8063d843b7f41461071f578063d8a4676f14610760575f5ffd5b8063b0d691fe1161011b578063bdf8631711610101578063bdf86317146106b3578063c7dec3fc146106c8578063cbd6407a146106f4575f5ffd5b8063b0d691fe14610646578063bc197c811461066c575f5ffd5b8063a035b1fe146105ea578063a4f9edbf146105ff578063a669aaf91461061e578063affed0e014610633575f5ffd5b806358ce0909116101f557806391b7f5ed116101ab5780639a8a0592116101915780639a8a0592146105475780639c5e95901461057a5780639ec4a5bf146105cb575f5ffd5b806391b7f5ed146104fd578063982c0db31461051c575f5ffd5b806379412518116101db57806379412518146104685780637af734731461047b5780638fb847ef146104bc575f5ffd5b806358ce09091461040d5780636d70f7ae14610439575f5ffd5b806317d70f7c1161024a5780633a871cdd116102305780633a871cdd146103ba5780634954bbf1146103d95780634ada3e61146103f8575f5ffd5b806317d70f7c1461037b5780631bbbeeb81461038f575f5ffd5b806223de2914610283578062427c54146102a9578063150b7a02146102e75780631626ba7e1461035c575f5ffd5b3661027f57005b5f5ffd5b34801561028e575f5ffd5b506102a761029d3660046124d4565b5050505050505050565b005b3480156102b4575f5ffd5b506102d46102c3366004612583565b60086020525f908152604090205481565b6040519081526020015b60405180910390f35b3480156102f2575f5ffd5b5061032b61030136600461259e565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016102de565b348015610367575f5ffd5b5061032b6103763660046126e2565b6108e5565b348015610386575f5ffd5b506102d4610a88565b34801561039a575f5ffd5b506102d46103a9366004612583565b60076020525f908152604090205481565b3480156103c5575f5ffd5b506102d46103d4366004612726565b610aac565b3480156103e4575f5ffd5b506102a76103f3366004612775565b610ae8565b348015610403575f5ffd5b506102d460035481565b348015610418575f5ffd5b5061042c6104273660046127d2565b610cdc565b6040516102de91906127f2565b348015610444575f5ffd5b50610458610453366004612583565b610e33565b60405190151581526020016102de565b6102a7610476366004612834565b610f26565b348015610486575f5ffd5b506102d4610495366004612583565b73ffffffffffffffffffffffffffffffffffffffff165f9081526007602052604090205490565b3480156104c7575f5ffd5b506102d46104d6366004612583565b73ffffffffffffffffffffffffffffffffffffffff165f9081526008602052604090205490565b348015610508575f5ffd5b506102a761051736600461288a565b610fa9565b348015610527575f5ffd5b506102d4610536366004612583565b60096020525f908152604090205481565b348015610552575f5ffd5b506102d47f000000000000000000000000000000000000000000000000000000000000000081565b348015610585575f5ffd5b506005546105a69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102de565b3480156105d6575f5ffd5b506102d46105e5366004612834565b611097565b3480156105f5575f5ffd5b506102d460015481565b34801561060a575f5ffd5b506102a76106193660046128a1565b61114b565b348015610629575f5ffd5b506102d460045481565b34801561063e575f5ffd5b505f546102d4565b348015610651575f5ffd5b50730576a174d229e3cfa37253523e645a78a0c91b576105a6565b348015610677575f5ffd5b5061032b61068636600461291c565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b3480156106be575f5ffd5b506102d460025481565b3480156106d3575f5ffd5b506106e76106e23660046129bf565b6111c7565b6040516102de9190612a7d565b3480156106ff575f5ffd5b506102d461070e366004612583565b600c6020525f908152604090205481565b34801561072a575f5ffd5b506105a661073936600461288a565b600b6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801561076b575f5ffd5b5061077f61077a36600461288a565b6112b1565b6040516102de9190612abc565b348015610797575f5ffd5b506102a76107a636600461288a565b611387565b3480156107b6575f5ffd5b506102d46114b3565b3480156107ca575f5ffd5b5061032b6107d9366004612afb565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b34801561080f575f5ffd5b506102d47f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b348015610842575f5ffd5b506102d46108513660046127d2565b61150d565b348015610861575f5ffd5b506102d47f000000000000000000000000000000000000000000000000000000000000000081565b348015610894575f5ffd5b506105a661152f565b3480156108a8575f5ffd5b506106e76040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b5f5f5f5f61090585602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f03610a1b578285830160200161092682610e33565b158015610949575073ffffffffffffffffffffffffffffffffffffffff82163014155b1561097c57507fffffffff000000000000000000000000000000000000000000000000000000009450610a829350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e906109d0908b908590600401612b72565b602060405180830381865afa1580156109eb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0f9190612b8a565b95505050505050610a82565b610a2a6104538783868661154c565b15610a5b57507f1626ba7e000000000000000000000000000000000000000000000000000000009250610a82915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f5f610a92611568565b806020019051810190610aa59190612bc9565b9392505050565b5f610ab5611637565b610abf84846116b6565b9050610ace6040850185612bf5565b90505f03610adf57610adf8461178a565b610aa582611808565b610af133610e33565b80610b0f575033730576a174d229e3cfa37253523e645a78a0c91b57145b610ba0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b60016006541115610bdd576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260065560055473ffffffffffffffffffffffffffffffffffffffff16610c31576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610c3c858561187c565b805190915015610cd0576005546040517f56d0819e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906356d0819e90610ca2908890859088908890600401612c56565b5f604051808303815f87803b158015610cb9575f5ffd5b505af1158015610ccb573d5f5f3e3d5ffd5b505050505b50506001600655505050565b6002546060905f849003610cee578093505b80610cf98486612cc4565b1115610d4657610d098385612cc4565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610b97565b8315610e2c578367ffffffffffffffff811115610d6557610d6561260c565b604051908082528060200260200182016040528015610d8e578160200160208202803683370190505b505f808052600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e4549193505b84811015610de1575f828152600a60205260409020600101549150600101610dbe565b505f5b85811015610e295781848281518110610dff57610dff612cd7565b6020908102919091018101919091525f838152600a90915260409020600101549150600101610de4565b50505b5092915050565b5f5f5f610e3e611568565b806020019051810190610e519190612bc9565b6040517f4236aff80000000000000000000000000000000000000000000000000000000081526004810182905291935091505f9073ffffffffffffffffffffffffffffffffffffffff841690634236aff89060240160e060405180830381865afa158015610ec1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee59190612d17565b50505050509150508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149350505050919050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610f99576005546040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610b97565b610fa4838383611a91565b505050565b610fb233610e33565b80610fd0575033730576a174d229e3cfa37253523e645a78a0c91b57145b61105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e747261637400006064820152608401610b97565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b5f6110a06114b3565b8484846040516020016110b593929190612dae565b6040516020818303038152906040528051906020012060405160200161110d9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b611153611568565b51156111bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a6564000000000000000000000000006044820152606401610b97565b6111c481611c39565b50565b60606111d233610e33565b806111f0575033730576a174d229e3cfa37253523e645a78a0c91b57145b61127c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e747261637400006064820152608401610b97565b5f6112968787878787156112905787611da9565b5a611da9565b92509050806112a757815160208301fd5b5095945050505050565b5f818152600b602052604081205473ffffffffffffffffffffffffffffffffffffffff1615611382575f828152600a60205260408082208151808301928390529160029082845b8154815260200190600101908083116112f85750505050509050805f6002811061132457611324612cd7565b602002015115801561133857506020810151155b801561136d57505f8052600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3548314155b1561137b5760029150611380565b600191505b505b919050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146113fa576005546040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610b97565b5f818152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff1680611455576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61145f8183611eac565b8073ffffffffffffffffffffffffffffffffffffffff167fa36a540c5fea3a5e69d4b1c2247b28a93fd183ef1314af26a8db7b3ae080bcd0836040516114a791815260200190565b60405180910390a25050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146114e8576114e3611fff565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b600a602052815f5260405f208160028110611526575f80fd5b01549150829050565b5f5f611539611568565b806020019051810190610a829190612dec565b5f5f5f61155b878787876120fd565b915091506112a7816121e5565b60606114e36116326040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b612397565b33730576a174d229e3cfa37253523e645a78a0c91b57146116b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610b97565b565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c81207f1626ba7e0000000000000000000000000000000000000000000000000000000061175082611717610140880188612bf5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506108e592505050565b7fffffffff000000000000000000000000000000000000000000000000000000001614611781576001915050610a82565b505f9392505050565b5f80546020830135918061179d83612e07565b91905055146111c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610b97565b80156111c4576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f8114611870576040519150601f19603f3d011682016040523d82523d5f602084013e611875565b606091505b5050505050565b5f828152600b60205260408082205460055491517ff2e433bf0000000000000000000000000000000000000000000000000000000081526004810186905260609373ffffffffffffffffffffffffffffffffffffffff928316939092169063f2e433bf906024016080604051808303815f875af11580156118ff573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119239190612e3e565b602081015190915073ffffffffffffffffffffffffffffffffffffffff161561194d575050610a82565b73ffffffffffffffffffffffffffffffffffffffff82166119e35760055473ffffffffffffffffffffffffffffffffffffffff161561198e57806040015191505b73ffffffffffffffffffffffffffffffffffffffff82166119de576040517ffe23980400000000000000000000000000000000000000000000000000000000815260048101869052602401610b97565b6119ed565b6119ed8286611eac565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600860205260408120805486955091611a2083612e07565b909155505060048054905f611a3483612e07565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b708685604051611a81929190612b72565b60405180910390a2505092915050565b611a9c3482846123ec565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600760205260408120805491611acc83612e07565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f908152600960205260408120805491611b0183612e07565b90915550505f818152600b6020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055600a9091528082207f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e480546001830181905590859055808452918320849055600280547f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e394929392909190611bc883612e07565b909155505060038054905f611bdc83612e07565b91905055508573ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8587604051611c29929190612b72565b60405180910390a2505050505050565b5f611c4382612436565b90505f8151602083015ff09050611d156040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c656400000000000000000000000000000000000000006044820152606401610b97565b5f60606001846001811115611dc057611dc0612a8f565b03611e34578673ffffffffffffffffffffffffffffffffffffffff168386604051611deb9190612ed8565b5f604051808303818686f4925050503d805f8114611e24576040519150601f19603f3d011682016040523d82523d5f602084013e611e29565b606091505b509092509050611ea2565b8673ffffffffffffffffffffffffffffffffffffffff16838787604051611e5b9190612ed8565b5f60405180830381858888f193505050503d805f8114611e96576040519150601f19603f3d011682016040523d82523d5f602084013e611e9b565b606091505b5090925090505b9550959350505050565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600960205260408120805491611edc83612ee3565b909155505060028054905f611ef083612ee3565b90915550505f818152600a60205260408082208151808301928390529160029082845b815481526020019060010190808311611f135750505050509050805f60028110611f3f57611f3f612cd7565b6020020151158015611f5357506020810151155b8015611f8857505f8052600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3548214155b15611fc2576040517ffe23980400000000000000000000000000000000000000000000000000000000815260048101839052602401610b97565b6020818101805183515f908152600a9093526040808420600190810192909255935191518352838320919091559281529081208181559091015550565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f493aeac1d921aa02a044029e7fe4be43b1a4e80b40706fa5819e8fbb0d0935256040518060400160405280600581526020017f312e312e300000000000000000000000000000000000000000000000000000008152506040516020016120889190612a7d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561213257505f905060036121dc565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612183573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166121d6575f600192509250506121dc565b91505f90505b94509492505050565b5f8160048111156121f8576121f8612a8f565b036122005750565b600181600481111561221457612214612a8f565b0361227b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b97565b600281600481111561228f5761228f612a8f565b036122f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b97565b600381600481111561230a5761230a612a8f565b036111c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610b97565b6060813b600181116123b857505060408051602081019091525f8152919050565b806123c281612ee3565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b600154831015610fa4576001546040517fb4897828000000000000000000000000000000000000000000000000000000008152610b97918591600401918252602082015260400190565b6060815160016124469190612cc4565b82604051602001612458929190612f17565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c4575f5ffd5b5f5f83601f84011261249f575f5ffd5b50813567ffffffffffffffff8111156124b6575f5ffd5b6020830191508360208285010111156124cd575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60c0898b0312156124eb575f5ffd5b88356124f68161246e565b975060208901356125068161246e565b965060408901356125168161246e565b955060608901359450608089013567ffffffffffffffff811115612538575f5ffd5b6125448b828c0161248f565b90955093505060a089013567ffffffffffffffff811115612563575f5ffd5b61256f8b828c0161248f565b999c989b5096995094979396929594505050565b5f60208284031215612593575f5ffd5b8135610aa58161246e565b5f5f5f5f5f608086880312156125b2575f5ffd5b85356125bd8161246e565b945060208601356125cd8161246e565b935060408601359250606086013567ffffffffffffffff8111156125ef575f5ffd5b6125fb8882890161248f565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112612648575f5ffd5b813567ffffffffffffffff8111156126625761266261260c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810167ffffffffffffffff811182821017156126af576126af61260c565b6040528181528382016020018510156126c6575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f604083850312156126f3575f5ffd5b82359150602083013567ffffffffffffffff811115612710575f5ffd5b61271c85828601612639565b9150509250929050565b5f5f5f60608486031215612738575f5ffd5b833567ffffffffffffffff81111561274e575f5ffd5b84016101608187031215612760575f5ffd5b95602085013595506040909401359392505050565b5f5f5f5f60808587031215612788575f5ffd5b84359350602085013567ffffffffffffffff8111156127a5575f5ffd5b6127b187828801612639565b93505060408501356127c28161246e565b9396929550929360600135925050565b5f5f604083850312156127e3575f5ffd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b8181101561282957835183526020938401939092019160010161280b565b509095945050505050565b5f5f5f60608486031215612846575f5ffd5b83356128518161246e565b9250602084013567ffffffffffffffff81111561286c575f5ffd5b61287886828701612639565b93969395505050506040919091013590565b5f6020828403121561289a575f5ffd5b5035919050565b5f602082840312156128b1575f5ffd5b813567ffffffffffffffff8111156128c7575f5ffd5b6128d384828501612639565b949350505050565b5f5f83601f8401126128eb575f5ffd5b50813567ffffffffffffffff811115612902575f5ffd5b6020830191508360208260051b85010111156124cd575f5ffd5b5f5f5f5f5f5f5f5f60a0898b031215612933575f5ffd5b883561293e8161246e565b9750602089013561294e8161246e565b9650604089013567ffffffffffffffff811115612969575f5ffd5b6129758b828c016128db565b909750955050606089013567ffffffffffffffff811115612994575f5ffd5b6129a08b828c016128db565b909550935050608089013567ffffffffffffffff811115612563575f5ffd5b5f5f5f5f5f60a086880312156129d3575f5ffd5b85356129de8161246e565b945060208601359350604086013567ffffffffffffffff811115612a00575f5ffd5b612a0c88828901612639565b935050606086013560028110612a20575f5ffd5b949793965091946080013592915050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610aa56020830184612a31565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6020810160038310612af5577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b5f5f5f5f5f5f60a08789031215612b10575f5ffd5b8635612b1b8161246e565b95506020870135612b2b8161246e565b94506040870135935060608701359250608087013567ffffffffffffffff811115612b54575f5ffd5b612b6089828a0161248f565b979a9699509497509295939492505050565b828152604060208201525f6128d36040830184612a31565b5f60208284031215612b9a575f5ffd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610aa5575f5ffd5b5f5f60408385031215612bda575f5ffd5b8251612be58161246e565b6020939093015192949293505050565b5f5f83357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612c28575f5ffd5b83018035915067ffffffffffffffff821115612c42575f5ffd5b6020019150368190038213156124cd575f5ffd5b848152608060208201525f612c6e6080830186612a31565b73ffffffffffffffffffffffffffffffffffffffff949094166040830152506060015292915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610a8257610a82612c97565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805163ffffffff81168114611382575f5ffd5b5f5f5f5f5f5f5f60e0888a031215612d2d575f5ffd5b87516bffffffffffffffffffffffff81168114612d48575f5ffd5b6020890151909750612d598161246e565b60408901519096509450612d6f60608901612d04565b9350612d7d60808901612d04565b9250612d8b60a08901612d04565b915060c088015160068110612d9e575f5ffd5b8091505092959891949750929550565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201525f612ddc6060830185612a31565b9050826040830152949350505050565b5f60208284031215612dfc575f5ffd5b8151610aa58161246e565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612e3757612e37612c97565b5060010190565b5f6080828403128015612e4f575f5ffd5b506040516080810167ffffffffffffffff81118282101715612e7357612e7361260c565b6040528251612e818161246e565b81526020830151612e918161246e565b60208201526040830151612ea48161246e565b6040820152612eb560608401612d04565b60608201529392505050565b5f81518060208401855e5f93019283525090919050565b5f610aa58284612ec1565b5f81612ef157612ef1612c97565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f6128d3600f830184612ec156fea2646970667358221220745f1a38f2fe83d82c8402a3eb9298ed88a0a021f9cd53260a6519db40953fc864736f6c634300081c0033a2646970667358221220884a98a5a4309369b992b99aea71dad108db7a9e4928c141f6a680b1db04060b64736f6c634300081c0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/utils.py b/utils.py index 02c4a62..055dad3 100644 --- a/utils.py +++ b/utils.py @@ -28,6 +28,7 @@ from operate.services.service import Service from operate.types import ChainType, ServiceTemplate, LedgerType, ConfigurationTemplate from operate.utils.gnosis import SafeOperation +from operate.ledger.profiles import CONTRACTS # Set decimal precision getcontext().prec = 18 @@ -483,8 +484,9 @@ def unit_to_wei(unit: float) -> int: ChainType.GNOSIS: "0x4554fE75c1f5576c1d7F765B2A036c199Adae329", } -CHAIN_TO_AGENT_FACTORY = { - ChainType.GNOSIS: "0x6D8CbEbCAD7397c63347D44448147Db05E7d17B0", +# @todo update after mainnet deployment +CHAIN_TO_MECH_FACTORY = { + ChainType.GNOSIS: "", } def fetch_token_price(url: str, headers: dict) -> t.Optional[float]: @@ -507,7 +509,7 @@ def deploy_mech(sftxb: EthSafeTxBuilder, local_config: MechQuickstartConfig, ser """Deploy the Mech service.""" print_section("Creating a new Mech On Chain") chain_type = ChainType.from_id(int(local_config.home_chain_id)) - path = OPERATE_HOME / Path("../contracts/MechAgentFactory.json") + path = OPERATE_HOME / Path("../contracts/MechFactoryBasic.json") abi = json.loads(path.read_text())["abi"] instance = web3.Web3() @@ -516,26 +518,24 @@ def deploy_mech(sftxb: EthSafeTxBuilder, local_config: MechQuickstartConfig, ser # better to be configurable and part of local config mech_request_price = unit_to_wei(0.01) contract = instance.eth.contract(address=Web3.to_checksum_address(mech_marketplace_address), abi=abi) - data = contract.encodeABI("create", args=[ - service.chain_configs[service.home_chain_id].chain_data.multisig, - bytes.fromhex(local_config.metadata_hash.lstrip("f01701220")), - mech_request_price, - mech_marketplace_address + data = contract.encodeABI("createMech", args=[ + mech_marketplace_address, + CONTRACTS[local_config.home_chain_id]["service_registry"], + service.chain_data.token, + Web3.to_hex(Web3.to_bytes(mech_request_price)).rjust(66, '0'), ]) tx_dict = { - "to": CHAIN_TO_AGENT_FACTORY[chain_type], + "to": CHAIN_TO_MECH_FACTORY[chain_type], "data": data, "value": 0, "operation": SafeOperation.CALL, } receipt = sftxb.new_tx().add(tx_dict).settle() - event = contract.events.CreateMech().process_receipt(receipt)[0] - mech_address, agent_id = event["args"]["mech"], event["args"]["agentId"] + event = contract.events.CreateBasicMech().process_receipt(receipt)[0] + mech_address = event["args"]["mech"] print(f"Mech address: {mech_address}") - print(f"Agent ID: {agent_id}") local_config.mech_address = mech_address - local_config.agent_id = agent_id local_config.store() def generate_mech_config(local_config: MechQuickstartConfig) -> dict: From 6682be327b8982a82d9bc438f58e58f796eb1fb7 Mon Sep 17 00:00:00 2001 From: KahanMajmudar Date: Fri, 13 Dec 2024 14:42:22 +0000 Subject: [PATCH 4/5] make create mech working --- utils.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/utils.py b/utils.py index 055dad3..63223e6 100644 --- a/utils.py +++ b/utils.py @@ -486,7 +486,7 @@ def unit_to_wei(unit: float) -> int: # @todo update after mainnet deployment CHAIN_TO_MECH_FACTORY = { - ChainType.GNOSIS: "", + ChainType.GNOSIS: "0x72FA6a00692BF99a8FCe97B9815302a02FA1E3D4", } def fetch_token_price(url: str, headers: dict) -> t.Optional[float]: @@ -520,9 +520,9 @@ def deploy_mech(sftxb: EthSafeTxBuilder, local_config: MechQuickstartConfig, ser contract = instance.eth.contract(address=Web3.to_checksum_address(mech_marketplace_address), abi=abi) data = contract.encodeABI("createMech", args=[ mech_marketplace_address, - CONTRACTS[local_config.home_chain_id]["service_registry"], - service.chain_data.token, - Web3.to_hex(Web3.to_bytes(mech_request_price)).rjust(66, '0'), + CONTRACTS[ChainType.from_id(local_config.home_chain_id)]["service_registry"], + service.chain_configs[str(local_config.home_chain_id)].chain_data.token, + mech_request_price.to_bytes(32, byteorder='big'), ]) tx_dict = { "to": CHAIN_TO_MECH_FACTORY[chain_type], From f98d2b1578acce4f155229b7b6f4003c3b375365 Mon Sep 17 00:00:00 2001 From: KahanMajmudar Date: Wed, 18 Dec 2024 11:33:36 +0000 Subject: [PATCH 5/5] updates the agent mech creation process based on the latest mech marketplace contract --- contracts/MechFactoryBasic.json | 83 ---- contracts/MechMarketplace.json | 722 +++++++++++++++++++++++++++++--- utils.py | 18 +- 3 files changed, 671 insertions(+), 152 deletions(-) delete mode 100644 contracts/MechFactoryBasic.json diff --git a/contracts/MechFactoryBasic.json b/contracts/MechFactoryBasic.json deleted file mode 100644 index b000be1..0000000 --- a/contracts/MechFactoryBasic.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "MechFactoryBasic", - "sourceName": "contracts/MechFactoryBasic.sol", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "mech", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "price", - "type": "uint256" - } - ], - "name": "CreateBasicMech", - "type": "event" - }, - { - "inputs": [], - "name": "VERSION", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "mechMarketplace", - "type": "address" - }, - { - "internalType": "address", - "name": "serviceRegistry", - "type": "address" - }, - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "payload", - "type": "bytes" - } - ], - "name": "createMech", - "outputs": [ - { - "internalType": "address", - "name": "mech", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x6080604052348015600e575f5ffd5b50613b7b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c80632732cb0214610038578063ffa1ad7414610075575b5f5ffd5b61004b610046366004610231565b6100be565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100b16040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161006c919061034b565b5f81516020146100cc575f5ffd5b5f828060200190518101906100e1919061039e565b604080514260208201523391810191909152606081018690529091505f90608001604051602081830303815290604052805190602001209050808686848a60405161012b906101cf565b73ffffffffffffffffffffffffffffffffffffffff94851681526020810193909352604083019190915290911660608201526080018190604051809103905ff590508015801561017d573d5f5f3e3d5ffd5b50925081858473ffffffffffffffffffffffffffffffffffffffff167f79e4ff7d5767c146d78373d8c8f9824aa5b3e949c3aeabbaceec4c4ee748080660405160405180910390a45050949350505050565b613790806103b683390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146101ff575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f5f60808587031215610244575f5ffd5b61024d856101dc565b935061025b602086016101dc565b925060408501359150606085013567ffffffffffffffff81111561027d575f5ffd5b8501601f8101871361028d575f5ffd5b803567ffffffffffffffff8111156102a7576102a7610204565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561031357610313610204565b60405281815282820160200189101561032a575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f602082840312156103ae575f5ffd5b505191905056fe60c06040525f5f556001600655348015610017575f5ffd5b50604051613790380380613790833981016040819052610036916105ab565b83836001600160a01b03821661005f5760405163d92e233d60e01b815260040160405180910390fd5b805f0361007f57604051637c946ed760e01b815260040160405180910390fd5b604080516001600160a01b03841660208201529081018290525f9060600160408051601f1981840301815290829052630846d5ff60e31b82526004820184905291505f9081906001600160a01b03861690634236aff89060240160e060405180830381865afa1580156100f4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101189190610602565b9650505050509250505f6001600160a01b0316826001600160a01b0316036101535760405163d92e233d60e01b815260040160405180910390fd5b600481600581111561016757610167610690565b146101a75780600581111561017e5761017e610690565b604051633c053f9d60e21b81526004810191909152602481018590526044015b60405180910390fd5b6101b0836102ad565b5050506001600160a01b03831691506101de90505760405163d92e233d60e01b815260040160405180910390fd5b6040516331a9108f60e11b8152600481018490525f906001600160a01b03861690636352211e90602401602060405180830381865afa158015610223573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061024791906106a4565b90506001600160a01b03811661027357604051630ede975960e01b81526004810185905260240161019e565b600580546001600160a01b0319166001600160a01b03841617905560018390554660a05261029f61030f565b6080525061078c9350505050565b6102b56103d7565b51156103035760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015260640161019e565b61030c8161043f565b50565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f493aeac1d921aa02a044029e7fe4be43b1a4e80b40706fa5819e8fbb0d093525604051806040016040528060058152602001640312e312e360dc1b81525060405160200161038091906106c4565b60408051601f1981840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b606061043a610435604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b610503565b905090565b5f61044982610558565b90505f8151602083015ff090506104af604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6001600160a01b0316816001600160a01b0316146104fe5760405162461bcd60e51b815260206004820152600c60248201526b15dc9a5d194819985a5b195960a21b604482015260640161019e565b505050565b6060813b6001811161052457505060408051602081019091525f8152919050565b8061052e8161070d565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016105689190610722565b8260405160200161057a92919061073b565b6040516020818303038152906040529050919050565b80516001600160a01b03811681146105a6575f5ffd5b919050565b5f5f5f5f608085870312156105be575f5ffd5b6105c785610590565b60208601516040870151919550935091506105e460608601610590565b905092959194509250565b805163ffffffff811681146105a6575f5ffd5b5f5f5f5f5f5f5f60e0888a031215610618575f5ffd5b87516001600160601b038116811461062e575f5ffd5b965061063c60208901610590565b955060408801519450610651606089016105ef565b935061065f608089016105ef565b925061066d60a089016105ef565b915060c088015160068110610680575f5ffd5b8091505092959891949750929550565b634e487b7160e01b5f52602160045260245ffd5b5f602082840312156106b4575f5ffd5b6106bd82610590565b9392505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52601160045260245ffd5b5f8161071b5761071b6106f9565b505f190190565b80820180821115610735576107356106f9565b92915050565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201525f600e820181905282518060208501600f85015e5f9201600f019182525092915050565b60805160a051612fd56107bb5f395f818161055801526114b601525f818161086701526114eb0152612fd55ff3fe608060405260043610610278575f3560e01c8063a035b1fe1161014b578063d843b7f4116100c6578063f5dcb7bb1161007c578063f698da2511610062578063f698da2514610856578063fc0c546a14610889578063ffa1ad741461089d575f5ffd5b8063f5dcb7bb14610804578063f6171e4414610837575f5ffd5b8063e7d915cf116100ac578063e7d915cf1461078c578063ed24911d146107ab578063f23a6e61146107bf575f5ffd5b8063d843b7f41461071f578063d8a4676f14610760575f5ffd5b8063b0d691fe1161011b578063bdf8631711610101578063bdf86317146106b3578063c7dec3fc146106c8578063cbd6407a146106f4575f5ffd5b8063b0d691fe14610646578063bc197c811461066c575f5ffd5b8063a035b1fe146105ea578063a4f9edbf146105ff578063a669aaf91461061e578063affed0e014610633575f5ffd5b806358ce0909116101f557806391b7f5ed116101ab5780639a8a0592116101915780639a8a0592146105475780639c5e95901461057a5780639ec4a5bf146105cb575f5ffd5b806391b7f5ed146104fd578063982c0db31461051c575f5ffd5b806379412518116101db57806379412518146104685780637af734731461047b5780638fb847ef146104bc575f5ffd5b806358ce09091461040d5780636d70f7ae14610439575f5ffd5b806317d70f7c1161024a5780633a871cdd116102305780633a871cdd146103ba5780634954bbf1146103d95780634ada3e61146103f8575f5ffd5b806317d70f7c1461037b5780631bbbeeb81461038f575f5ffd5b806223de2914610283578062427c54146102a9578063150b7a02146102e75780631626ba7e1461035c575f5ffd5b3661027f57005b5f5ffd5b34801561028e575f5ffd5b506102a761029d3660046124d4565b5050505050505050565b005b3480156102b4575f5ffd5b506102d46102c3366004612583565b60086020525f908152604090205481565b6040519081526020015b60405180910390f35b3480156102f2575f5ffd5b5061032b61030136600461259e565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016102de565b348015610367575f5ffd5b5061032b6103763660046126e2565b6108e5565b348015610386575f5ffd5b506102d4610a88565b34801561039a575f5ffd5b506102d46103a9366004612583565b60076020525f908152604090205481565b3480156103c5575f5ffd5b506102d46103d4366004612726565b610aac565b3480156103e4575f5ffd5b506102a76103f3366004612775565b610ae8565b348015610403575f5ffd5b506102d460035481565b348015610418575f5ffd5b5061042c6104273660046127d2565b610cdc565b6040516102de91906127f2565b348015610444575f5ffd5b50610458610453366004612583565b610e33565b60405190151581526020016102de565b6102a7610476366004612834565b610f26565b348015610486575f5ffd5b506102d4610495366004612583565b73ffffffffffffffffffffffffffffffffffffffff165f9081526007602052604090205490565b3480156104c7575f5ffd5b506102d46104d6366004612583565b73ffffffffffffffffffffffffffffffffffffffff165f9081526008602052604090205490565b348015610508575f5ffd5b506102a761051736600461288a565b610fa9565b348015610527575f5ffd5b506102d4610536366004612583565b60096020525f908152604090205481565b348015610552575f5ffd5b506102d47f000000000000000000000000000000000000000000000000000000000000000081565b348015610585575f5ffd5b506005546105a69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102de565b3480156105d6575f5ffd5b506102d46105e5366004612834565b611097565b3480156105f5575f5ffd5b506102d460015481565b34801561060a575f5ffd5b506102a76106193660046128a1565b61114b565b348015610629575f5ffd5b506102d460045481565b34801561063e575f5ffd5b505f546102d4565b348015610651575f5ffd5b50730576a174d229e3cfa37253523e645a78a0c91b576105a6565b348015610677575f5ffd5b5061032b61068636600461291c565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b3480156106be575f5ffd5b506102d460025481565b3480156106d3575f5ffd5b506106e76106e23660046129bf565b6111c7565b6040516102de9190612a7d565b3480156106ff575f5ffd5b506102d461070e366004612583565b600c6020525f908152604090205481565b34801561072a575f5ffd5b506105a661073936600461288a565b600b6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801561076b575f5ffd5b5061077f61077a36600461288a565b6112b1565b6040516102de9190612abc565b348015610797575f5ffd5b506102a76107a636600461288a565b611387565b3480156107b6575f5ffd5b506102d46114b3565b3480156107ca575f5ffd5b5061032b6107d9366004612afb565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b34801561080f575f5ffd5b506102d47f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b348015610842575f5ffd5b506102d46108513660046127d2565b61150d565b348015610861575f5ffd5b506102d47f000000000000000000000000000000000000000000000000000000000000000081565b348015610894575f5ffd5b506105a661152f565b3480156108a8575f5ffd5b506106e76040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b5f5f5f5f61090585602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f03610a1b578285830160200161092682610e33565b158015610949575073ffffffffffffffffffffffffffffffffffffffff82163014155b1561097c57507fffffffff000000000000000000000000000000000000000000000000000000009450610a829350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e906109d0908b908590600401612b72565b602060405180830381865afa1580156109eb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0f9190612b8a565b95505050505050610a82565b610a2a6104538783868661154c565b15610a5b57507f1626ba7e000000000000000000000000000000000000000000000000000000009250610a82915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f5f610a92611568565b806020019051810190610aa59190612bc9565b9392505050565b5f610ab5611637565b610abf84846116b6565b9050610ace6040850185612bf5565b90505f03610adf57610adf8461178a565b610aa582611808565b610af133610e33565b80610b0f575033730576a174d229e3cfa37253523e645a78a0c91b57145b610ba0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b60016006541115610bdd576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260065560055473ffffffffffffffffffffffffffffffffffffffff16610c31576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610c3c858561187c565b805190915015610cd0576005546040517f56d0819e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906356d0819e90610ca2908890859088908890600401612c56565b5f604051808303815f87803b158015610cb9575f5ffd5b505af1158015610ccb573d5f5f3e3d5ffd5b505050505b50506001600655505050565b6002546060905f849003610cee578093505b80610cf98486612cc4565b1115610d4657610d098385612cc4565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610b97565b8315610e2c578367ffffffffffffffff811115610d6557610d6561260c565b604051908082528060200260200182016040528015610d8e578160200160208202803683370190505b505f808052600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e4549193505b84811015610de1575f828152600a60205260409020600101549150600101610dbe565b505f5b85811015610e295781848281518110610dff57610dff612cd7565b6020908102919091018101919091525f838152600a90915260409020600101549150600101610de4565b50505b5092915050565b5f5f5f610e3e611568565b806020019051810190610e519190612bc9565b6040517f4236aff80000000000000000000000000000000000000000000000000000000081526004810182905291935091505f9073ffffffffffffffffffffffffffffffffffffffff841690634236aff89060240160e060405180830381865afa158015610ec1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee59190612d17565b50505050509150508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149350505050919050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610f99576005546040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610b97565b610fa4838383611a91565b505050565b610fb233610e33565b80610fd0575033730576a174d229e3cfa37253523e645a78a0c91b57145b61105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e747261637400006064820152608401610b97565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b5f6110a06114b3565b8484846040516020016110b593929190612dae565b6040516020818303038152906040528051906020012060405160200161110d9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b611153611568565b51156111bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a6564000000000000000000000000006044820152606401610b97565b6111c481611c39565b50565b60606111d233610e33565b806111f0575033730576a174d229e3cfa37253523e645a78a0c91b57145b61127c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e747261637400006064820152608401610b97565b5f6112968787878787156112905787611da9565b5a611da9565b92509050806112a757815160208301fd5b5095945050505050565b5f818152600b602052604081205473ffffffffffffffffffffffffffffffffffffffff1615611382575f828152600a60205260408082208151808301928390529160029082845b8154815260200190600101908083116112f85750505050509050805f6002811061132457611324612cd7565b602002015115801561133857506020810151155b801561136d57505f8052600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3548314155b1561137b5760029150611380565b600191505b505b919050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146113fa576005546040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610b97565b5f818152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff1680611455576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61145f8183611eac565b8073ffffffffffffffffffffffffffffffffffffffff167fa36a540c5fea3a5e69d4b1c2247b28a93fd183ef1314af26a8db7b3ae080bcd0836040516114a791815260200190565b60405180910390a25050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146114e8576114e3611fff565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b600a602052815f5260405f208160028110611526575f80fd5b01549150829050565b5f5f611539611568565b806020019051810190610a829190612dec565b5f5f5f61155b878787876120fd565b915091506112a7816121e5565b60606114e36116326040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b612397565b33730576a174d229e3cfa37253523e645a78a0c91b57146116b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610b97565b565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c81207f1626ba7e0000000000000000000000000000000000000000000000000000000061175082611717610140880188612bf5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506108e592505050565b7fffffffff000000000000000000000000000000000000000000000000000000001614611781576001915050610a82565b505f9392505050565b5f80546020830135918061179d83612e07565b91905055146111c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610b97565b80156111c4576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f8114611870576040519150601f19603f3d011682016040523d82523d5f602084013e611875565b606091505b5050505050565b5f828152600b60205260408082205460055491517ff2e433bf0000000000000000000000000000000000000000000000000000000081526004810186905260609373ffffffffffffffffffffffffffffffffffffffff928316939092169063f2e433bf906024016080604051808303815f875af11580156118ff573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119239190612e3e565b602081015190915073ffffffffffffffffffffffffffffffffffffffff161561194d575050610a82565b73ffffffffffffffffffffffffffffffffffffffff82166119e35760055473ffffffffffffffffffffffffffffffffffffffff161561198e57806040015191505b73ffffffffffffffffffffffffffffffffffffffff82166119de576040517ffe23980400000000000000000000000000000000000000000000000000000000815260048101869052602401610b97565b6119ed565b6119ed8286611eac565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600860205260408120805486955091611a2083612e07565b909155505060048054905f611a3483612e07565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b708685604051611a81929190612b72565b60405180910390a2505092915050565b611a9c3482846123ec565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600760205260408120805491611acc83612e07565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f908152600960205260408120805491611b0183612e07565b90915550505f818152600b6020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055600a9091528082207f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e480546001830181905590859055808452918320849055600280547f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e394929392909190611bc883612e07565b909155505060038054905f611bdc83612e07565b91905055508573ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8587604051611c29929190612b72565b60405180910390a2505050505050565b5f611c4382612436565b90505f8151602083015ff09050611d156040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c656400000000000000000000000000000000000000006044820152606401610b97565b5f60606001846001811115611dc057611dc0612a8f565b03611e34578673ffffffffffffffffffffffffffffffffffffffff168386604051611deb9190612ed8565b5f604051808303818686f4925050503d805f8114611e24576040519150601f19603f3d011682016040523d82523d5f602084013e611e29565b606091505b509092509050611ea2565b8673ffffffffffffffffffffffffffffffffffffffff16838787604051611e5b9190612ed8565b5f60405180830381858888f193505050503d805f8114611e96576040519150601f19603f3d011682016040523d82523d5f602084013e611e9b565b606091505b5090925090505b9550959350505050565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600960205260408120805491611edc83612ee3565b909155505060028054905f611ef083612ee3565b90915550505f818152600a60205260408082208151808301928390529160029082845b815481526020019060010190808311611f135750505050509050805f60028110611f3f57611f3f612cd7565b6020020151158015611f5357506020810151155b8015611f8857505f8052600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3548214155b15611fc2576040517ffe23980400000000000000000000000000000000000000000000000000000000815260048101839052602401610b97565b6020818101805183515f908152600a9093526040808420600190810192909255935191518352838320919091559281529081208181559091015550565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f493aeac1d921aa02a044029e7fe4be43b1a4e80b40706fa5819e8fbb0d0935256040518060400160405280600581526020017f312e312e300000000000000000000000000000000000000000000000000000008152506040516020016120889190612a7d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561213257505f905060036121dc565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612183573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166121d6575f600192509250506121dc565b91505f90505b94509492505050565b5f8160048111156121f8576121f8612a8f565b036122005750565b600181600481111561221457612214612a8f565b0361227b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b97565b600281600481111561228f5761228f612a8f565b036122f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b97565b600381600481111561230a5761230a612a8f565b036111c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610b97565b6060813b600181116123b857505060408051602081019091525f8152919050565b806123c281612ee3565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b600154831015610fa4576001546040517fb4897828000000000000000000000000000000000000000000000000000000008152610b97918591600401918252602082015260400190565b6060815160016124469190612cc4565b82604051602001612458929190612f17565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c4575f5ffd5b5f5f83601f84011261249f575f5ffd5b50813567ffffffffffffffff8111156124b6575f5ffd5b6020830191508360208285010111156124cd575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60c0898b0312156124eb575f5ffd5b88356124f68161246e565b975060208901356125068161246e565b965060408901356125168161246e565b955060608901359450608089013567ffffffffffffffff811115612538575f5ffd5b6125448b828c0161248f565b90955093505060a089013567ffffffffffffffff811115612563575f5ffd5b61256f8b828c0161248f565b999c989b5096995094979396929594505050565b5f60208284031215612593575f5ffd5b8135610aa58161246e565b5f5f5f5f5f608086880312156125b2575f5ffd5b85356125bd8161246e565b945060208601356125cd8161246e565b935060408601359250606086013567ffffffffffffffff8111156125ef575f5ffd5b6125fb8882890161248f565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112612648575f5ffd5b813567ffffffffffffffff8111156126625761266261260c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810167ffffffffffffffff811182821017156126af576126af61260c565b6040528181528382016020018510156126c6575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f604083850312156126f3575f5ffd5b82359150602083013567ffffffffffffffff811115612710575f5ffd5b61271c85828601612639565b9150509250929050565b5f5f5f60608486031215612738575f5ffd5b833567ffffffffffffffff81111561274e575f5ffd5b84016101608187031215612760575f5ffd5b95602085013595506040909401359392505050565b5f5f5f5f60808587031215612788575f5ffd5b84359350602085013567ffffffffffffffff8111156127a5575f5ffd5b6127b187828801612639565b93505060408501356127c28161246e565b9396929550929360600135925050565b5f5f604083850312156127e3575f5ffd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b8181101561282957835183526020938401939092019160010161280b565b509095945050505050565b5f5f5f60608486031215612846575f5ffd5b83356128518161246e565b9250602084013567ffffffffffffffff81111561286c575f5ffd5b61287886828701612639565b93969395505050506040919091013590565b5f6020828403121561289a575f5ffd5b5035919050565b5f602082840312156128b1575f5ffd5b813567ffffffffffffffff8111156128c7575f5ffd5b6128d384828501612639565b949350505050565b5f5f83601f8401126128eb575f5ffd5b50813567ffffffffffffffff811115612902575f5ffd5b6020830191508360208260051b85010111156124cd575f5ffd5b5f5f5f5f5f5f5f5f60a0898b031215612933575f5ffd5b883561293e8161246e565b9750602089013561294e8161246e565b9650604089013567ffffffffffffffff811115612969575f5ffd5b6129758b828c016128db565b909750955050606089013567ffffffffffffffff811115612994575f5ffd5b6129a08b828c016128db565b909550935050608089013567ffffffffffffffff811115612563575f5ffd5b5f5f5f5f5f60a086880312156129d3575f5ffd5b85356129de8161246e565b945060208601359350604086013567ffffffffffffffff811115612a00575f5ffd5b612a0c88828901612639565b935050606086013560028110612a20575f5ffd5b949793965091946080013592915050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610aa56020830184612a31565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6020810160038310612af5577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b5f5f5f5f5f5f60a08789031215612b10575f5ffd5b8635612b1b8161246e565b95506020870135612b2b8161246e565b94506040870135935060608701359250608087013567ffffffffffffffff811115612b54575f5ffd5b612b6089828a0161248f565b979a9699509497509295939492505050565b828152604060208201525f6128d36040830184612a31565b5f60208284031215612b9a575f5ffd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610aa5575f5ffd5b5f5f60408385031215612bda575f5ffd5b8251612be58161246e565b6020939093015192949293505050565b5f5f83357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612c28575f5ffd5b83018035915067ffffffffffffffff821115612c42575f5ffd5b6020019150368190038213156124cd575f5ffd5b848152608060208201525f612c6e6080830186612a31565b73ffffffffffffffffffffffffffffffffffffffff949094166040830152506060015292915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610a8257610a82612c97565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805163ffffffff81168114611382575f5ffd5b5f5f5f5f5f5f5f60e0888a031215612d2d575f5ffd5b87516bffffffffffffffffffffffff81168114612d48575f5ffd5b6020890151909750612d598161246e565b60408901519096509450612d6f60608901612d04565b9350612d7d60808901612d04565b9250612d8b60a08901612d04565b915060c088015160068110612d9e575f5ffd5b8091505092959891949750929550565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201525f612ddc6060830185612a31565b9050826040830152949350505050565b5f60208284031215612dfc575f5ffd5b8151610aa58161246e565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612e3757612e37612c97565b5060010190565b5f6080828403128015612e4f575f5ffd5b506040516080810167ffffffffffffffff81118282101715612e7357612e7361260c565b6040528251612e818161246e565b81526020830151612e918161246e565b60208201526040830151612ea48161246e565b6040820152612eb560608401612d04565b60608201529392505050565b5f81518060208401855e5f93019283525090919050565b5f610aa58284612ec1565b5f81612ef157612ef1612c97565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f6128d3600f830184612ec156fea2646970667358221220745f1a38f2fe83d82c8402a3eb9298ed88a0a021f9cd53260a6519db40953fc864736f6c634300081c0033a2646970667358221220884a98a5a4309369b992b99aea71dad108db7a9e4928c141f6a680b1db04060b64736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610034575f3560e01c80632732cb0214610038578063ffa1ad7414610075575b5f5ffd5b61004b610046366004610231565b6100be565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100b16040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161006c919061034b565b5f81516020146100cc575f5ffd5b5f828060200190518101906100e1919061039e565b604080514260208201523391810191909152606081018690529091505f90608001604051602081830303815290604052805190602001209050808686848a60405161012b906101cf565b73ffffffffffffffffffffffffffffffffffffffff94851681526020810193909352604083019190915290911660608201526080018190604051809103905ff590508015801561017d573d5f5f3e3d5ffd5b50925081858473ffffffffffffffffffffffffffffffffffffffff167f79e4ff7d5767c146d78373d8c8f9824aa5b3e949c3aeabbaceec4c4ee748080660405160405180910390a45050949350505050565b613790806103b683390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146101ff575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f5f60808587031215610244575f5ffd5b61024d856101dc565b935061025b602086016101dc565b925060408501359150606085013567ffffffffffffffff81111561027d575f5ffd5b8501601f8101871361028d575f5ffd5b803567ffffffffffffffff8111156102a7576102a7610204565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561031357610313610204565b60405281815282820160200189101561032a575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f602082840312156103ae575f5ffd5b505191905056fe60c06040525f5f556001600655348015610017575f5ffd5b50604051613790380380613790833981016040819052610036916105ab565b83836001600160a01b03821661005f5760405163d92e233d60e01b815260040160405180910390fd5b805f0361007f57604051637c946ed760e01b815260040160405180910390fd5b604080516001600160a01b03841660208201529081018290525f9060600160408051601f1981840301815290829052630846d5ff60e31b82526004820184905291505f9081906001600160a01b03861690634236aff89060240160e060405180830381865afa1580156100f4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101189190610602565b9650505050509250505f6001600160a01b0316826001600160a01b0316036101535760405163d92e233d60e01b815260040160405180910390fd5b600481600581111561016757610167610690565b146101a75780600581111561017e5761017e610690565b604051633c053f9d60e21b81526004810191909152602481018590526044015b60405180910390fd5b6101b0836102ad565b5050506001600160a01b03831691506101de90505760405163d92e233d60e01b815260040160405180910390fd5b6040516331a9108f60e11b8152600481018490525f906001600160a01b03861690636352211e90602401602060405180830381865afa158015610223573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061024791906106a4565b90506001600160a01b03811661027357604051630ede975960e01b81526004810185905260240161019e565b600580546001600160a01b0319166001600160a01b03841617905560018390554660a05261029f61030f565b6080525061078c9350505050565b6102b56103d7565b51156103035760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015260640161019e565b61030c8161043f565b50565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f493aeac1d921aa02a044029e7fe4be43b1a4e80b40706fa5819e8fbb0d093525604051806040016040528060058152602001640312e312e360dc1b81525060405160200161038091906106c4565b60408051601f1981840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b606061043a610435604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b610503565b905090565b5f61044982610558565b90505f8151602083015ff090506104af604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6001600160a01b0316816001600160a01b0316146104fe5760405162461bcd60e51b815260206004820152600c60248201526b15dc9a5d194819985a5b195960a21b604482015260640161019e565b505050565b6060813b6001811161052457505060408051602081019091525f8152919050565b8061052e8161070d565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016105689190610722565b8260405160200161057a92919061073b565b6040516020818303038152906040529050919050565b80516001600160a01b03811681146105a6575f5ffd5b919050565b5f5f5f5f608085870312156105be575f5ffd5b6105c785610590565b60208601516040870151919550935091506105e460608601610590565b905092959194509250565b805163ffffffff811681146105a6575f5ffd5b5f5f5f5f5f5f5f60e0888a031215610618575f5ffd5b87516001600160601b038116811461062e575f5ffd5b965061063c60208901610590565b955060408801519450610651606089016105ef565b935061065f608089016105ef565b925061066d60a089016105ef565b915060c088015160068110610680575f5ffd5b8091505092959891949750929550565b634e487b7160e01b5f52602160045260245ffd5b5f602082840312156106b4575f5ffd5b6106bd82610590565b9392505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52601160045260245ffd5b5f8161071b5761071b6106f9565b505f190190565b80820180821115610735576107356106f9565b92915050565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201525f600e820181905282518060208501600f85015e5f9201600f019182525092915050565b60805160a051612fd56107bb5f395f818161055801526114b601525f818161086701526114eb0152612fd55ff3fe608060405260043610610278575f3560e01c8063a035b1fe1161014b578063d843b7f4116100c6578063f5dcb7bb1161007c578063f698da2511610062578063f698da2514610856578063fc0c546a14610889578063ffa1ad741461089d575f5ffd5b8063f5dcb7bb14610804578063f6171e4414610837575f5ffd5b8063e7d915cf116100ac578063e7d915cf1461078c578063ed24911d146107ab578063f23a6e61146107bf575f5ffd5b8063d843b7f41461071f578063d8a4676f14610760575f5ffd5b8063b0d691fe1161011b578063bdf8631711610101578063bdf86317146106b3578063c7dec3fc146106c8578063cbd6407a146106f4575f5ffd5b8063b0d691fe14610646578063bc197c811461066c575f5ffd5b8063a035b1fe146105ea578063a4f9edbf146105ff578063a669aaf91461061e578063affed0e014610633575f5ffd5b806358ce0909116101f557806391b7f5ed116101ab5780639a8a0592116101915780639a8a0592146105475780639c5e95901461057a5780639ec4a5bf146105cb575f5ffd5b806391b7f5ed146104fd578063982c0db31461051c575f5ffd5b806379412518116101db57806379412518146104685780637af734731461047b5780638fb847ef146104bc575f5ffd5b806358ce09091461040d5780636d70f7ae14610439575f5ffd5b806317d70f7c1161024a5780633a871cdd116102305780633a871cdd146103ba5780634954bbf1146103d95780634ada3e61146103f8575f5ffd5b806317d70f7c1461037b5780631bbbeeb81461038f575f5ffd5b806223de2914610283578062427c54146102a9578063150b7a02146102e75780631626ba7e1461035c575f5ffd5b3661027f57005b5f5ffd5b34801561028e575f5ffd5b506102a761029d3660046124d4565b5050505050505050565b005b3480156102b4575f5ffd5b506102d46102c3366004612583565b60086020525f908152604090205481565b6040519081526020015b60405180910390f35b3480156102f2575f5ffd5b5061032b61030136600461259e565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016102de565b348015610367575f5ffd5b5061032b6103763660046126e2565b6108e5565b348015610386575f5ffd5b506102d4610a88565b34801561039a575f5ffd5b506102d46103a9366004612583565b60076020525f908152604090205481565b3480156103c5575f5ffd5b506102d46103d4366004612726565b610aac565b3480156103e4575f5ffd5b506102a76103f3366004612775565b610ae8565b348015610403575f5ffd5b506102d460035481565b348015610418575f5ffd5b5061042c6104273660046127d2565b610cdc565b6040516102de91906127f2565b348015610444575f5ffd5b50610458610453366004612583565b610e33565b60405190151581526020016102de565b6102a7610476366004612834565b610f26565b348015610486575f5ffd5b506102d4610495366004612583565b73ffffffffffffffffffffffffffffffffffffffff165f9081526007602052604090205490565b3480156104c7575f5ffd5b506102d46104d6366004612583565b73ffffffffffffffffffffffffffffffffffffffff165f9081526008602052604090205490565b348015610508575f5ffd5b506102a761051736600461288a565b610fa9565b348015610527575f5ffd5b506102d4610536366004612583565b60096020525f908152604090205481565b348015610552575f5ffd5b506102d47f000000000000000000000000000000000000000000000000000000000000000081565b348015610585575f5ffd5b506005546105a69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102de565b3480156105d6575f5ffd5b506102d46105e5366004612834565b611097565b3480156105f5575f5ffd5b506102d460015481565b34801561060a575f5ffd5b506102a76106193660046128a1565b61114b565b348015610629575f5ffd5b506102d460045481565b34801561063e575f5ffd5b505f546102d4565b348015610651575f5ffd5b50730576a174d229e3cfa37253523e645a78a0c91b576105a6565b348015610677575f5ffd5b5061032b61068636600461291c565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b3480156106be575f5ffd5b506102d460025481565b3480156106d3575f5ffd5b506106e76106e23660046129bf565b6111c7565b6040516102de9190612a7d565b3480156106ff575f5ffd5b506102d461070e366004612583565b600c6020525f908152604090205481565b34801561072a575f5ffd5b506105a661073936600461288a565b600b6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801561076b575f5ffd5b5061077f61077a36600461288a565b6112b1565b6040516102de9190612abc565b348015610797575f5ffd5b506102a76107a636600461288a565b611387565b3480156107b6575f5ffd5b506102d46114b3565b3480156107ca575f5ffd5b5061032b6107d9366004612afb565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b34801561080f575f5ffd5b506102d47f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b348015610842575f5ffd5b506102d46108513660046127d2565b61150d565b348015610861575f5ffd5b506102d47f000000000000000000000000000000000000000000000000000000000000000081565b348015610894575f5ffd5b506105a661152f565b3480156108a8575f5ffd5b506106e76040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b5f5f5f5f61090585602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f03610a1b578285830160200161092682610e33565b158015610949575073ffffffffffffffffffffffffffffffffffffffff82163014155b1561097c57507fffffffff000000000000000000000000000000000000000000000000000000009450610a829350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e906109d0908b908590600401612b72565b602060405180830381865afa1580156109eb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0f9190612b8a565b95505050505050610a82565b610a2a6104538783868661154c565b15610a5b57507f1626ba7e000000000000000000000000000000000000000000000000000000009250610a82915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f5f610a92611568565b806020019051810190610aa59190612bc9565b9392505050565b5f610ab5611637565b610abf84846116b6565b9050610ace6040850185612bf5565b90505f03610adf57610adf8461178a565b610aa582611808565b610af133610e33565b80610b0f575033730576a174d229e3cfa37253523e645a78a0c91b57145b610ba0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b60016006541115610bdd576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260065560055473ffffffffffffffffffffffffffffffffffffffff16610c31576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610c3c858561187c565b805190915015610cd0576005546040517f56d0819e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906356d0819e90610ca2908890859088908890600401612c56565b5f604051808303815f87803b158015610cb9575f5ffd5b505af1158015610ccb573d5f5f3e3d5ffd5b505050505b50506001600655505050565b6002546060905f849003610cee578093505b80610cf98486612cc4565b1115610d4657610d098385612cc4565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610b97565b8315610e2c578367ffffffffffffffff811115610d6557610d6561260c565b604051908082528060200260200182016040528015610d8e578160200160208202803683370190505b505f808052600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e4549193505b84811015610de1575f828152600a60205260409020600101549150600101610dbe565b505f5b85811015610e295781848281518110610dff57610dff612cd7565b6020908102919091018101919091525f838152600a90915260409020600101549150600101610de4565b50505b5092915050565b5f5f5f610e3e611568565b806020019051810190610e519190612bc9565b6040517f4236aff80000000000000000000000000000000000000000000000000000000081526004810182905291935091505f9073ffffffffffffffffffffffffffffffffffffffff841690634236aff89060240160e060405180830381865afa158015610ec1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee59190612d17565b50505050509150508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149350505050919050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610f99576005546040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610b97565b610fa4838383611a91565b505050565b610fb233610e33565b80610fd0575033730576a174d229e3cfa37253523e645a78a0c91b57145b61105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e747261637400006064820152608401610b97565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b5f6110a06114b3565b8484846040516020016110b593929190612dae565b6040516020818303038152906040528051906020012060405160200161110d9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b611153611568565b51156111bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a6564000000000000000000000000006044820152606401610b97565b6111c481611c39565b50565b60606111d233610e33565b806111f0575033730576a174d229e3cfa37253523e645a78a0c91b57145b61127c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e747261637400006064820152608401610b97565b5f6112968787878787156112905787611da9565b5a611da9565b92509050806112a757815160208301fd5b5095945050505050565b5f818152600b602052604081205473ffffffffffffffffffffffffffffffffffffffff1615611382575f828152600a60205260408082208151808301928390529160029082845b8154815260200190600101908083116112f85750505050509050805f6002811061132457611324612cd7565b602002015115801561133857506020810151155b801561136d57505f8052600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3548314155b1561137b5760029150611380565b600191505b505b919050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146113fa576005546040517fe56895c000000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610b97565b5f818152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff1680611455576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61145f8183611eac565b8073ffffffffffffffffffffffffffffffffffffffff167fa36a540c5fea3a5e69d4b1c2247b28a93fd183ef1314af26a8db7b3ae080bcd0836040516114a791815260200190565b60405180910390a25050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146114e8576114e3611fff565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b600a602052815f5260405f208160028110611526575f80fd5b01549150829050565b5f5f611539611568565b806020019051810190610a829190612dec565b5f5f5f61155b878787876120fd565b915091506112a7816121e5565b60606114e36116326040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b612397565b33730576a174d229e3cfa37253523e645a78a0c91b57146116b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610b97565b565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c81207f1626ba7e0000000000000000000000000000000000000000000000000000000061175082611717610140880188612bf5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506108e592505050565b7fffffffff000000000000000000000000000000000000000000000000000000001614611781576001915050610a82565b505f9392505050565b5f80546020830135918061179d83612e07565b91905055146111c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610b97565b80156111c4576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f8114611870576040519150601f19603f3d011682016040523d82523d5f602084013e611875565b606091505b5050505050565b5f828152600b60205260408082205460055491517ff2e433bf0000000000000000000000000000000000000000000000000000000081526004810186905260609373ffffffffffffffffffffffffffffffffffffffff928316939092169063f2e433bf906024016080604051808303815f875af11580156118ff573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119239190612e3e565b602081015190915073ffffffffffffffffffffffffffffffffffffffff161561194d575050610a82565b73ffffffffffffffffffffffffffffffffffffffff82166119e35760055473ffffffffffffffffffffffffffffffffffffffff161561198e57806040015191505b73ffffffffffffffffffffffffffffffffffffffff82166119de576040517ffe23980400000000000000000000000000000000000000000000000000000000815260048101869052602401610b97565b6119ed565b6119ed8286611eac565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600860205260408120805486955091611a2083612e07565b909155505060048054905f611a3483612e07565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b708685604051611a81929190612b72565b60405180910390a2505092915050565b611a9c3482846123ec565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600760205260408120805491611acc83612e07565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f908152600960205260408120805491611b0183612e07565b90915550505f818152600b6020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055600a9091528082207f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e480546001830181905590859055808452918320849055600280547f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e394929392909190611bc883612e07565b909155505060038054905f611bdc83612e07565b91905055508573ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8587604051611c29929190612b72565b60405180910390a2505050505050565b5f611c4382612436565b90505f8151602083015ff09050611d156040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c656400000000000000000000000000000000000000006044820152606401610b97565b5f60606001846001811115611dc057611dc0612a8f565b03611e34578673ffffffffffffffffffffffffffffffffffffffff168386604051611deb9190612ed8565b5f604051808303818686f4925050503d805f8114611e24576040519150601f19603f3d011682016040523d82523d5f602084013e611e29565b606091505b509092509050611ea2565b8673ffffffffffffffffffffffffffffffffffffffff16838787604051611e5b9190612ed8565b5f60405180830381858888f193505050503d805f8114611e96576040519150601f19603f3d011682016040523d82523d5f602084013e611e9b565b606091505b5090925090505b9550959350505050565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600960205260408120805491611edc83612ee3565b909155505060028054905f611ef083612ee3565b90915550505f818152600a60205260408082208151808301928390529160029082845b815481526020019060010190808311611f135750505050509050805f60028110611f3f57611f3f612cd7565b6020020151158015611f5357506020810151155b8015611f8857505f8052600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3548214155b15611fc2576040517ffe23980400000000000000000000000000000000000000000000000000000000815260048101839052602401610b97565b6020818101805183515f908152600a9093526040808420600190810192909255935191518352838320919091559281529081208181559091015550565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f493aeac1d921aa02a044029e7fe4be43b1a4e80b40706fa5819e8fbb0d0935256040518060400160405280600581526020017f312e312e300000000000000000000000000000000000000000000000000000008152506040516020016120889190612a7d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561213257505f905060036121dc565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612183573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166121d6575f600192509250506121dc565b91505f90505b94509492505050565b5f8160048111156121f8576121f8612a8f565b036122005750565b600181600481111561221457612214612a8f565b0361227b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b97565b600281600481111561228f5761228f612a8f565b036122f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b97565b600381600481111561230a5761230a612a8f565b036111c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610b97565b6060813b600181116123b857505060408051602081019091525f8152919050565b806123c281612ee3565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b600154831015610fa4576001546040517fb4897828000000000000000000000000000000000000000000000000000000008152610b97918591600401918252602082015260400190565b6060815160016124469190612cc4565b82604051602001612458929190612f17565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c4575f5ffd5b5f5f83601f84011261249f575f5ffd5b50813567ffffffffffffffff8111156124b6575f5ffd5b6020830191508360208285010111156124cd575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60c0898b0312156124eb575f5ffd5b88356124f68161246e565b975060208901356125068161246e565b965060408901356125168161246e565b955060608901359450608089013567ffffffffffffffff811115612538575f5ffd5b6125448b828c0161248f565b90955093505060a089013567ffffffffffffffff811115612563575f5ffd5b61256f8b828c0161248f565b999c989b5096995094979396929594505050565b5f60208284031215612593575f5ffd5b8135610aa58161246e565b5f5f5f5f5f608086880312156125b2575f5ffd5b85356125bd8161246e565b945060208601356125cd8161246e565b935060408601359250606086013567ffffffffffffffff8111156125ef575f5ffd5b6125fb8882890161248f565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112612648575f5ffd5b813567ffffffffffffffff8111156126625761266261260c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810167ffffffffffffffff811182821017156126af576126af61260c565b6040528181528382016020018510156126c6575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f604083850312156126f3575f5ffd5b82359150602083013567ffffffffffffffff811115612710575f5ffd5b61271c85828601612639565b9150509250929050565b5f5f5f60608486031215612738575f5ffd5b833567ffffffffffffffff81111561274e575f5ffd5b84016101608187031215612760575f5ffd5b95602085013595506040909401359392505050565b5f5f5f5f60808587031215612788575f5ffd5b84359350602085013567ffffffffffffffff8111156127a5575f5ffd5b6127b187828801612639565b93505060408501356127c28161246e565b9396929550929360600135925050565b5f5f604083850312156127e3575f5ffd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b8181101561282957835183526020938401939092019160010161280b565b509095945050505050565b5f5f5f60608486031215612846575f5ffd5b83356128518161246e565b9250602084013567ffffffffffffffff81111561286c575f5ffd5b61287886828701612639565b93969395505050506040919091013590565b5f6020828403121561289a575f5ffd5b5035919050565b5f602082840312156128b1575f5ffd5b813567ffffffffffffffff8111156128c7575f5ffd5b6128d384828501612639565b949350505050565b5f5f83601f8401126128eb575f5ffd5b50813567ffffffffffffffff811115612902575f5ffd5b6020830191508360208260051b85010111156124cd575f5ffd5b5f5f5f5f5f5f5f5f60a0898b031215612933575f5ffd5b883561293e8161246e565b9750602089013561294e8161246e565b9650604089013567ffffffffffffffff811115612969575f5ffd5b6129758b828c016128db565b909750955050606089013567ffffffffffffffff811115612994575f5ffd5b6129a08b828c016128db565b909550935050608089013567ffffffffffffffff811115612563575f5ffd5b5f5f5f5f5f60a086880312156129d3575f5ffd5b85356129de8161246e565b945060208601359350604086013567ffffffffffffffff811115612a00575f5ffd5b612a0c88828901612639565b935050606086013560028110612a20575f5ffd5b949793965091946080013592915050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610aa56020830184612a31565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6020810160038310612af5577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b5f5f5f5f5f5f60a08789031215612b10575f5ffd5b8635612b1b8161246e565b95506020870135612b2b8161246e565b94506040870135935060608701359250608087013567ffffffffffffffff811115612b54575f5ffd5b612b6089828a0161248f565b979a9699509497509295939492505050565b828152604060208201525f6128d36040830184612a31565b5f60208284031215612b9a575f5ffd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610aa5575f5ffd5b5f5f60408385031215612bda575f5ffd5b8251612be58161246e565b6020939093015192949293505050565b5f5f83357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612c28575f5ffd5b83018035915067ffffffffffffffff821115612c42575f5ffd5b6020019150368190038213156124cd575f5ffd5b848152608060208201525f612c6e6080830186612a31565b73ffffffffffffffffffffffffffffffffffffffff949094166040830152506060015292915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610a8257610a82612c97565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805163ffffffff81168114611382575f5ffd5b5f5f5f5f5f5f5f60e0888a031215612d2d575f5ffd5b87516bffffffffffffffffffffffff81168114612d48575f5ffd5b6020890151909750612d598161246e565b60408901519096509450612d6f60608901612d04565b9350612d7d60808901612d04565b9250612d8b60a08901612d04565b915060c088015160068110612d9e575f5ffd5b8091505092959891949750929550565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201525f612ddc6060830185612a31565b9050826040830152949350505050565b5f60208284031215612dfc575f5ffd5b8151610aa58161246e565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612e3757612e37612c97565b5060010190565b5f6080828403128015612e4f575f5ffd5b506040516080810167ffffffffffffffff81118282101715612e7357612e7361260c565b6040528251612e818161246e565b81526020830151612e918161246e565b60208201526040830151612ea48161246e565b6040820152612eb560608401612d04565b60608201529392505050565b5f81518060208401855e5f93019283525090919050565b5f610aa58284612ec1565b5f81612ef157612ef1612c97565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f6128d3600f830184612ec156fea2646970667358221220745f1a38f2fe83d82c8402a3eb9298ed88a0a021f9cd53260a6519db40953fc864736f6c634300081c0033a2646970667358221220884a98a5a4309369b992b99aea71dad108db7a9e4928c141f6a680b1db04060b64736f6c634300081c0033", - "linkReferences": {}, - "deployedLinkReferences": {} -} \ No newline at end of file diff --git a/contracts/MechMarketplace.json b/contracts/MechMarketplace.json index 63cc2ef..e74c615 100644 --- a/contracts/MechMarketplace.json +++ b/contracts/MechMarketplace.json @@ -5,6 +5,11 @@ "abi": [ { "inputs": [ + { + "internalType": "address", + "name": "_serviceRegistry", + "type": "address" + }, { "internalType": "address", "name": "_stakingFactory", @@ -12,18 +17,18 @@ }, { "internalType": "address", - "name": "_karmaProxy", + "name": "_karma", "type": "address" }, { - "internalType": "uint256", - "name": "_minResponseTimeout", - "type": "uint256" + "internalType": "address", + "name": "_wrappedNativeToken", + "type": "address" }, { - "internalType": "uint256", - "name": "_maxResponseTimeout", - "type": "uint256" + "internalType": "address", + "name": "_buyBackBurner", + "type": "address" } ], "stateMutability": "nonpayable", @@ -40,6 +45,38 @@ "name": "AlreadyDelivered", "type": "error" }, + { + "inputs": [], + "name": "AlreadyInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "NotContract", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "NotEnoughPaid", + "type": "error" + }, { "inputs": [ { @@ -114,6 +151,28 @@ "name": "ReentrancyGuard", "type": "error" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "name": "RequestIdNotFound", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "name": "RequestPaid", + "type": "error" + }, { "inputs": [ { @@ -130,6 +189,32 @@ "name": "ServiceNotStaked", "type": "error" }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "TransferFailed", + "type": "error" + }, { "inputs": [ { @@ -141,6 +226,38 @@ "name": "UnauthorizedAccount", "type": "error" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "numValues1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "numValues2", + "type": "uint256" + } + ], + "name": "WrongArrayLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "state", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "serviceId", + "type": "uint256" + } + ], + "name": "WrongServiceState", + "type": "error" + }, { "inputs": [], "name": "ZeroAddress", @@ -157,11 +274,74 @@ { "indexed": true, "internalType": "address", - "name": "factory", + "name": "mech", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "serviceId", + "type": "uint256" + } + ], + "name": "CreateMech", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "deliveryMech", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "payment", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "name": "DeliveryPaymentProcessed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "collectedFees", + "type": "uint256" + } + ], + "name": "Drained", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", "type": "address" } ], - "name": "FactoryUpdated", + "name": "ImplementationUpdated", "type": "event" }, { @@ -196,11 +376,48 @@ "internalType": "bytes", "name": "data", "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "mechPayment", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "marketplaceFee", + "type": "uint256" } ], "name": "MarketplaceDeliver", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "minResponseTimeout", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "maxResponseTimeout", + "type": "uint256" + } + ], + "name": "MarketplaceParamsUpdated", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -238,17 +455,11 @@ { "indexed": true, "internalType": "address", - "name": "mech", + "name": "owner", "type": "address" - }, - { - "indexed": false, - "internalType": "bool", - "name": "status", - "type": "bool" } ], - "name": "MechRegistrationStatusChanged", + "name": "OwnerUpdated", "type": "event" }, { @@ -256,18 +467,18 @@ "inputs": [ { "indexed": false, - "internalType": "uint256", - "name": "minResponseTimeout", - "type": "uint256" + "internalType": "address[]", + "name": "mechFactories", + "type": "address[]" }, { "indexed": false, - "internalType": "uint256", - "name": "maxResponseTimeout", - "type": "uint256" + "internalType": "bool[]", + "name": "statuses", + "type": "bool[]" } ], - "name": "MinMaxResponseTimeoutUpdated", + "name": "SetMechFactoryStatuses", "type": "event" }, { @@ -276,11 +487,17 @@ { "indexed": true, "internalType": "address", - "name": "owner", + "name": "mech", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "OwnerUpdated", + "name": "Withdraw", "type": "event" }, { @@ -296,6 +513,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "MECH_MARKETPLACE_PROXY", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "VERSION", @@ -309,6 +539,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "buyBackBurner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "chainId", @@ -322,6 +565,55 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "changeImplementation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newMinResponseTimeout", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newMaxResponseTimeout", + "type": "uint256" + } + ], + "name": "changeMarketplaceParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "changeOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -343,9 +635,87 @@ "name": "checkMech", "outputs": [ { - "internalType": "address", + "internalType": "address", + "name": "multisig", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "requester", + "type": "address" + }, + { + "internalType": "address", + "name": "requesterStakingInstance", + "type": "address" + }, + { + "internalType": "uint256", + "name": "requesterServiceId", + "type": "uint256" + } + ], + "name": "checkRequester", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingInstance", + "type": "address" + }, + { + "internalType": "uint256", + "name": "serviceId", + "type": "uint256" + } + ], + "name": "checkServiceAndGetMultisig", + "outputs": [ + { + "internalType": "address", + "name": "multisig", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingInstance", + "type": "address" + }, + { + "internalType": "uint256", + "name": "serviceId", + "type": "uint256" + } + ], + "name": "checkStakingInstance", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collectedFees", + "outputs": [ + { + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -354,42 +724,30 @@ { "inputs": [ { - "internalType": "address", - "name": "requester", - "type": "address" + "internalType": "uint256", + "name": "serviceId", + "type": "uint256" }, { "internalType": "address", - "name": "requesterStakingInstance", + "name": "mechFactory", "type": "address" }, { - "internalType": "uint256", - "name": "requesterServiceId", - "type": "uint256" + "internalType": "bytes", + "name": "payload", + "type": "bytes" } ], - "name": "checkRequester", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + "name": "create", + "outputs": [ { "internalType": "address", - "name": "stakingInstance", + "name": "mech", "type": "address" - }, - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" } ], - "name": "checkStakingInstance", - "outputs": [], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { @@ -433,6 +791,45 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "drain", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "fee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "agentMech", + "type": "address" + } + ], + "name": "getAgentMechDeliveriesCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -493,9 +890,14 @@ "type": "address" }, { - "internalType": "uint32", + "internalType": "uint256", "name": "responseTimeout", - "type": "uint32" + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "payment", + "type": "uint256" } ], "internalType": "struct MechDelivery", @@ -510,7 +912,7 @@ "inputs": [ { "internalType": "address", - "name": "mechService", + "name": "mechServiceMultisig", "type": "address" } ], @@ -592,9 +994,70 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_minResponseTimeout", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxResponseTimeout", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], - "name": "karmaProxy", + "name": "karma", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapAgentMechDeliveryCounts", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapAgentMechFactories", "outputs": [ { "internalType": "address", @@ -624,6 +1087,44 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapMechBalances", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapMechFactories", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -707,9 +1208,14 @@ "type": "address" }, { - "internalType": "uint32", + "internalType": "uint256", "name": "responseTimeout", - "type": "uint32" + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "payment", + "type": "uint256" } ], "stateMutability": "view", @@ -741,6 +1247,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "numMechs", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "numTotalRequests", @@ -767,6 +1286,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -816,6 +1348,56 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [], + "name": "serviceRegistry", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "mechFactories", + "type": "address[]" + }, + { + "internalType": "bool[]", + "name": "statuses", + "type": "bool[]" + } + ], + "name": "setMechFactoryStatuses", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "setMechs", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "stakingFactory", @@ -828,10 +1410,30 @@ ], "stateMutability": "view", "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "wrappedNativeToken", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" } ], - "bytecode": "0x", - "deployedBytecode": "0x", + "bytecode": "0x6101606040526001600755348015610015575f5ffd5b50604051613c19380380613c19833981016040819052610034916101ca565b6001600160a01b038516158061005157506001600160a01b038416155b8061006357506001600160a01b038316155b8061007557506001600160a01b038216155b8061008757506001600160a01b038116155b156100a55760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038086166101005284811660e05283811660c052828116610120528116610140524660a0526100d96100e7565b608052506102609350505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7ff376b6313a0837eb351511248cfe7dcc1cd26c49b8e0a47e1eb369dd62c425db604051806040016040528060058152602001640312e312e360dc1b815250604051602001610158919061022b565b60408051601f1981840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b80516001600160a01b03811681146101c5575f5ffd5b919050565b5f5f5f5f5f60a086880312156101de575f5ffd5b6101e7866101af565b94506101f5602087016101af565b9350610203604087016101af565b9250610211606087016101af565b915061021f608087016101af565b90509295509295909350565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161391b6102fe5f395f8181610721015261217701525f818161045e015281816121a60152612c7a01525f818161098c0152818161134d015261173001525f818161053e0152610f0101525f81816106ad01528181611a9701528181611cad01526127e101525f81816108090152612a3101525f8181610c2b0152612a66015261391b5ff3fe608060405260043610610318575f3560e01c806380d859111161019c578063cbcf252a116100e7578063e679803511610092578063f2e433bf1161006d578063f2e433bf14610ab5578063f5dcb7bb14610be7578063f698da2514610c1a578063ffa1ad7414610c4d575f5ffd5b8063e679803514610a43578063e8eca22d14610a6e578063ed24911d14610aa1575f5ffd5b8063ddca3f43116100c2578063ddca3f4314610a05578063ded8128614610a19578063e0cb19e814610a2e575f5ffd5b8063cbcf252a1461097b578063cbd6407a146109ae578063d8a4676f146109d9575f5ffd5b80639ec4a5bf11610147578063bdf8631711610122578063bdf863171461087c578063c69f6f9f14610891578063cb261bec146108d2575f5ffd5b80639ec4a5bf1461082b578063a6f9dae11461084a578063ad16ee7314610869575f5ffd5b80639003adfe116101775780639003adfe146107cf5780639890220b146107e45780639a8a0592146107f8575f5ffd5b806380d85911146107435780638da5cb5b146107625780638fb847ef1461078e575f5ffd5b8063291347681161026757806356d0819e1161021257806371db00c4116101ed57806371db00c41461067d57806374a8569b1461069c5780637af73473146106cf578063803551a914610710575f5ffd5b806356d0819e146105fe57806357c0762d1461061d57806360b24e0a1461063c575f5ffd5b806346fbcbb21161024257806346fbcbb21461059f5780634ada3e61146105be578063551399bb146105d3575f5ffd5b8063291347681461052d5780633ccfd60b1461056057806343be964314610574575f5ffd5b806317a68dd8116102c75780631a4d8fc8116102a25780631a4d8fc8146104c45780631bbbeeb8146104e3578063203a993c1461050e575f5ffd5b806317a68dd81461042e57806317fcb39b1461044d578063187cc7f2146104a5575f5ffd5b80630ed8078b116102f75780630ed8078b146103bc5780630f41196a146103db57806313999914146103f0575f5ffd5b8062427c541461031c57806305b040b21461035a578063087f08d41461039b575b5f5ffd5b348015610327575f5ffd5b50610347610336366004612e1a565b600a6020525f908152604090205481565b6040519081526020015b60405180910390f35b348015610365575f5ffd5b50610347610374366004612e1a565b73ffffffffffffffffffffffffffffffffffffffff165f908152600b602052604090205490565b3480156103a6575f5ffd5b506103ba6103b5366004612f7d565b610ca2565b005b3480156103c7575f5ffd5b506103ba6103d6366004613042565b610ebc565b3480156103e6575f5ffd5b5061034760015481565b3480156103fb575f5ffd5b5061041e61040a366004612e1a565b600e6020525f908152604090205460ff1681565b6040519015158152602001610351565b348015610439575f5ffd5b506103ba610448366004612e1a565b6110b8565b348015610458575f5ffd5b506104807f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610351565b3480156104b0575f5ffd5b506104806104bf36600461306c565b6111df565b3480156104cf575f5ffd5b506103ba6104de366004613083565b611214565b3480156104ee575f5ffd5b506103476104fd366004612e1a565b60096020525f908152604090205481565b348015610519575f5ffd5b50610480610528366004613042565b611300565b348015610538575f5ffd5b506104807f000000000000000000000000000000000000000000000000000000000000000081565b34801561056b575f5ffd5b506103ba61150f565b34801561057f575f5ffd5b5061034761058e366004612e1a565b600c6020525f908152604090205481565b3480156105aa575f5ffd5b506104806105b936600461314b565b61166e565b3480156105c9575f5ffd5b5061034760055481565b3480156105de575f5ffd5b506103476105ed366004612e1a565b600b6020525f908152604090205481565b348015610609575f5ffd5b506103ba6106183660046131a0565b6118a9565b348015610628575f5ffd5b506103ba6106373660046131fd565b611dc0565b348015610647575f5ffd5b50610347610656366004612e1a565b73ffffffffffffffffffffffffffffffffffffffff165f908152600c602052604090205490565b348015610688575f5ffd5b50610480610697366004613083565b611e84565b3480156106a7575f5ffd5b506104807f000000000000000000000000000000000000000000000000000000000000000081565b3480156106da575f5ffd5b506103476106e9366004612e1a565b73ffffffffffffffffffffffffffffffffffffffff165f9081526009602052604090205490565b34801561071b575f5ffd5b506104807f000000000000000000000000000000000000000000000000000000000000000081565b34801561074e575f5ffd5b506103ba61075d3660046131fd565b612024565b34801561076d575f5ffd5b506008546104809073ffffffffffffffffffffffffffffffffffffffff1681565b348015610799575f5ffd5b506103476107a8366004612e1a565b73ffffffffffffffffffffffffffffffffffffffff165f908152600a602052604090205490565b3480156107da575f5ffd5b5061034760035481565b3480156107ef575f5ffd5b506103ba6120ae565b348015610803575f5ffd5b506103477f000000000000000000000000000000000000000000000000000000000000000081565b348015610836575f5ffd5b50610347610845366004613226565b61224c565b348015610855575f5ffd5b506103ba610864366004612e1a565b612302565b61034761087736600461327c565b612430565b348015610887575f5ffd5b5061034760045481565b34801561089c575f5ffd5b506104806108ab366004612e1a565b600f6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156108dd575f5ffd5b506109356108ec36600461306c565b600d6020525f90815260409020805460018201546002830154600384015460049094015473ffffffffffffffffffffffffffffffffffffffff9384169492841693909116919085565b6040805173ffffffffffffffffffffffffffffffffffffffff9687168152948616602086015292909416918301919091526060820152608081019190915260a001610351565b348015610986575f5ffd5b506104807f000000000000000000000000000000000000000000000000000000000000000081565b3480156109b9575f5ffd5b506103476109c8366004612e1a565b60116020525f908152604090205481565b3480156109e4575f5ffd5b506109f86109f336600461306c565b61297d565b6040516103519190613336565b348015610a10575f5ffd5b506103475f5481565b348015610a24575f5ffd5b5061034760025481565b348015610a39575f5ffd5b5061034760065481565b348015610a4e575f5ffd5b50610347610a5d366004612e1a565b60106020525f908152604090205481565b348015610a79575f5ffd5b506103477fe6194b93a7bff0a54130ed8cd277223408a77f3e48bb5104a9db96d334f962ca81565b348015610aac575f5ffd5b50610347612a2e565b348015610ac0575f5ffd5b50610b64610acf36600461306c565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152505f908152600d6020908152604091829020825160a081018452815473ffffffffffffffffffffffffffffffffffffffff9081168252600183015481169382019390935260028201549092169282019290925260038201546060820152600490910154608082015290565b60405161035191905f60a08201905073ffffffffffffffffffffffffffffffffffffffff835116825273ffffffffffffffffffffffffffffffffffffffff602084015116602083015273ffffffffffffffffffffffffffffffffffffffff6040840151166040830152606083015160608301526080830151608083015292915050565b348015610bf2575f5ffd5b506103477f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b348015610c25575f5ffd5b506103477f000000000000000000000000000000000000000000000000000000000000000081565b348015610c58575f5ffd5b50610c956040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161035191906133c1565b60085473ffffffffffffffffffffffffffffffffffffffff163314610d1a576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044015b60405180910390fd5b8051825114610d6257815181516040517f8151c11000000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d11565b5f5b8251811015610e7e575f73ffffffffffffffffffffffffffffffffffffffff16838281518110610d9657610d966133d3565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610deb576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818181518110610dfd57610dfd6133d3565b6020026020010151600e5f858481518110610e1a57610e1a6133d3565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610d64565b507f8cc6be981009d13170c616af494b7d671ed2d84b7e6891e4c8f21fe065c00dfc8282604051610eb0929190613400565b60405180910390a15050565b6040517f479e372e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063479e372e90602401602060405180830381865afa158015610f46573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6a9190613498565b610fb8576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610d11565b6040517ffd0bba8c000000000000000000000000000000000000000000000000000000008152600481018290525f9073ffffffffffffffffffffffffffffffffffffffff84169063fd0bba8c90602401602060405180830381865afa158015611023573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104791906134b3565b9050600181600281111561105d5761105d613309565b146110b3576040517fcaf8924d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101839052604401610d11565b505050565b60085473ffffffffffffffffffffffffffffffffffffffff16331461112b576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610d11565b73ffffffffffffffffffffffffffffffffffffffff8116611178576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe6194b93a7bff0a54130ed8cd277223408a77f3e48bb5104a9db96d334f962ca81905560405173ffffffffffffffffffffffffffffffffffffffff8216907f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03905f90a250565b601281815481106111ee575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b80156112b2575f6112258383611300565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112ac576040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808616600483015282166024820152604401610d11565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216156110b3576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff831661144b576040517f4236aff8000000000000000000000000000000000000000000000000000000008152600481018390525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634236aff89060240160e060405180830381865afa1580156113a7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113cb91906134e9565b949750939550600494506113df9350505050565b8160058111156113f1576113f1613309565b146114455780600581111561140857611408613309565b6040517ff014fe74000000000000000000000000000000000000000000000000000000008152600481019190915260248101849052604401610d11565b50611509565b6114558383610ebc565b6040517f82a8ea58000000000000000000000000000000000000000000000000000000008152600481018390525f9073ffffffffffffffffffffffffffffffffffffffff8516906382a8ea58906024015f60405180830381865afa1580156114bf573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526115049190810190613580565b519150505b92915050565b6001600754111561154c576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600755335f908152601060205260408120549081900361159c576040517f32b2baa3000000000000000000000000000000000000000000000000000000008152336004820152602401610d11565b6040515f90339083908381818185875af1925050503d805f81146115db576040519150601f19603f3d011682016040523d82523d5f602084013e6115e0565b606091505b5050905080611630576040517fcd3f16590000000000000000000000000000000000000000000000000000000081525f600482015230602482015233604482015260648101839052608401610d11565b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a250506001600755565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600e602052604081205460ff166116e4576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610d11565b6040517f2732cb0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690632732cb029061175c9030907f00000000000000000000000000000000000000000000000000000000000000009089908890600401613689565b6020604051808303815f875af1158015611778573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179c91906136e3565b905073ffffffffffffffffffffffffffffffffffffffff81166117eb576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8082165f818152600f602052604080822080549488167fffffffffffffffffffffffff0000000000000000000000000000000000000000958616179055601280546001810182558184527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344401805490951684179094559254600655915186927f0dab9459b2f129b692750bed5cc716b07a2fb19ba9fe0a0dc378428a6204036791a39392505050565b600160075411156118e6576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026007555f6118f7338484611e84565b5f868152600d6020526040902080549192509073ffffffffffffffffffffffffffffffffffffffff1680611957576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600282015473ffffffffffffffffffffffffffffffffffffffff16338190036119ae576040517f32b2baa3000000000000000000000000000000000000000000000000000000008152336004820152602401610d11565b600183015473ffffffffffffffffffffffffffffffffffffffff1615611a03576040517f5b7e830100000000000000000000000000000000000000000000000000000000815260048101899052602401610d11565b73ffffffffffffffffffffffffffffffffffffffff82163314611baf578260030154421115611b6e576040517f4225d37a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248301527f00000000000000000000000000000000000000000000000000000000000000001690634225d37a906044015f604051808303815f87803b158015611ad8575f5ffd5b505af1158015611aea573d5f5f3e3d5ffd5b50506040517fe7d915cf000000000000000000000000000000000000000000000000000000008152600481018b905273ffffffffffffffffffffffffffffffffffffffff8516925063e7d915cf91506024015f604051808303815f87803b158015611b53575f5ffd5b505af1158015611b65573d5f5f3e3d5ffd5b50505050611baf565b60038301546040517f177d0c790000000000000000000000000000000000000000000000000000000081526004810191909152426024820152604401610d11565b6001830180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905560048054905f611bea8361372b565b909155505073ffffffffffffffffffffffffffffffffffffffff81165f908152600a60205260408120805491611c1f8361375f565b9091555050335f908152600b60205260408120805491611c3e8361375f565b909155505073ffffffffffffffffffffffffffffffffffffffff84165f908152600c60205260408120805491611c738361375f565b90915550506040517f4225d37a000000000000000000000000000000000000000000000000000000008152336004820152600160248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634225d37a906044015f604051808303815f87803b158015611d03575f5ffd5b505af1158015611d15573d5f5f3e3d5ffd5b505050505f5f611d29338660040154612a88565b915091508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f11e005e94e7fe3e65c3476728664cce8c02a074d70cfb51e10f8c7df60f3d6268d8d8787604051611da79493929190613796565b60405180910390a4505060016007555050505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff163314611e33576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610d11565b611e3e838383612b4a565b60408051848152602081018490529081018290527f64d0972bd5d0c2828d80911b61084d86d61214c3081656ca3a720047a88320359060600160405180910390a1505050565b5f815f03611ebe576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8481165f908152600f602052604090205416611f33576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610d11565b611f3d8383611300565b6040517f6d70f7ae00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808316600483015291925090851690636d70f7ae90602401602060405180830381865afa158015611fab573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fcf9190613498565b61201d576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610d11565b9392505050565b60085473ffffffffffffffffffffffffffffffffffffffff1615612074576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61207f838383612b4a565b5050600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905550565b600160075411156120eb576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026007556003545f81900361212d576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60035561213a81612c78565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af11580156121ec573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122109190613498565b506040518181527fdef931299fe61d176f949118058530c1f3f539dcb6950b4e372c9b835c33ca079060200160405180910390a1506001600755565b5f612255612a2e565b3085858560405160200161226c94939291906137c1565b604051602081830303815290604052805190602001206040516020016122c49291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b60085473ffffffffffffffffffffffffffffffffffffffff163314612375576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610d11565b73ffffffffffffffffffffffffffffffffffffffff81166123c2576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b905f90a250565b5f6001600754111561246e576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260075573ffffffffffffffffffffffffffffffffffffffff87166124c0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148015612510575073ffffffffffffffffffffffffffffffffffffffff861615155b1561255f576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87166004820152602401610d11565b73ffffffffffffffffffffffffffffffffffffffff871633036125b0576040517f32b2baa3000000000000000000000000000000000000000000000000000000008152336004820152602401610d11565b6001548210806125c1575060025482115b1561260e576001546002546040517feb373cfe0000000000000000000000000000000000000000000000000000000081526004810185905260248101929092526044820152606401610d11565b63ffffffff61261d428461381c565b111561266d5761262d428361381c565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019190915263ffffffff6024820152604401610d11565b87515f036126a7576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126b2878787611e84565b506126be338585611214565b335f818152601160205260409020546126d991908a9061224c565b335f9081526011602052604081208054929350906126f68361375f565b90915550505f818152600d6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8916178155612750428461381c565b60038201556002810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633908117909155346004808401919091556040517f55e7d0440000000000000000000000000000000000000000000000000000000081529081019190915273ffffffffffffffffffffffffffffffffffffffff8981166024830152600160448301527f000000000000000000000000000000000000000000000000000000000000000016906355e7d044906064015f604051808303815f87803b158015612822575f5ffd5b505af1158015612834573d5f5f3e3d5ffd5b5050335f9081526009602052604081208054935091506128538361375f565b909155505060048054905f6128678361375f565b909155505060058054905f61287b8361375f565b90915550506040517f5f117ea900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff891690635f117ea9906128d890339034908e90889060040161382f565b5f604051808303815f87803b1580156128ef575f5ffd5b505af1158015612901573d5f5f3e3d5ffd5b505050508773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4827c9fc8074fe94dd4939d4228739ff43d7072a6504a6f413ffa4967c120175848c604051612964929190613863565b60405180910390a3506001600755979650505050505050565b5f818152600d60209081526040808320815160a081018352815473ffffffffffffffffffffffffffffffffffffffff908116808352600184015482169583019590955260028301541692810192909252600381015460608301526004015460808201529015612a2857602081015173ffffffffffffffffffffffffffffffffffffffff16612a23578060600151421115612a1a5760029150612a28565b60019150612a28565b600391505b50919050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614612a6357612a5e612cf8565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f808215612b43576127105f5484612aa09190613883565b612aaa919061389a565b9050612ab681846138d2565b9150815f03612af1576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84165f9081526010602052604081208054849290612b2590849061381c565b925050819055508060035f828254612b3d919061381c565b90915550505b9250929050565b821580612b55575081155b80612b5e575080155b15612b95576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710831115612bdc576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526127106024820152604401610d11565b80821115612c20576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d11565b63ffffffff811115612c6b576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810182905263ffffffff6024820152604401610d11565b5f92909255600155600255565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015612cde575f5ffd5b505af1158015612cf0573d5f5f3e3d5ffd5b505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7ff376b6313a0837eb351511248cfe7dcc1cd26c49b8e0a47e1eb369dd62c425db6040518060400160405280600581526020017f312e312e30000000000000000000000000000000000000000000000000000000815250604051602001612d8191906133c1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff81168114612e17575f5ffd5b50565b5f60208284031215612e2a575f5ffd5b813561201d81612df6565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160c0810167ffffffffffffffff81118282101715612e8557612e85612e35565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612ed257612ed2612e35565b604052919050565b5f67ffffffffffffffff821115612ef357612ef3612e35565b5060051b60200190565b8015158114612e17575f5ffd5b5f82601f830112612f19575f5ffd5b8135612f2c612f2782612eda565b612e8b565b8082825260208201915060208360051b860101925085831115612f4d575f5ffd5b602085015b83811015612f73578035612f6581612efd565b835260209283019201612f52565b5095945050505050565b5f5f60408385031215612f8e575f5ffd5b823567ffffffffffffffff811115612fa4575f5ffd5b8301601f81018513612fb4575f5ffd5b8035612fc2612f2782612eda565b8082825260208201915060208360051b850101925087831115612fe3575f5ffd5b6020840193505b8284101561300e578335612ffd81612df6565b825260209384019390910190612fea565b9450505050602083013567ffffffffffffffff81111561302c575f5ffd5b61303885828601612f0a565b9150509250929050565b5f5f60408385031215613053575f5ffd5b823561305e81612df6565b946020939093013593505050565b5f6020828403121561307c575f5ffd5b5035919050565b5f5f5f60608486031215613095575f5ffd5b83356130a081612df6565b925060208401356130b081612df6565b929592945050506040919091013590565b5f82601f8301126130d0575f5ffd5b813567ffffffffffffffff8111156130ea576130ea612e35565b61311b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612e8b565b81815284602083860101111561312f575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f6060848603121561315d575f5ffd5b83359250602084013561316f81612df6565b9150604084013567ffffffffffffffff81111561318a575f5ffd5b613196868287016130c1565b9150509250925092565b5f5f5f5f608085870312156131b3575f5ffd5b84359350602085013567ffffffffffffffff8111156131d0575f5ffd5b6131dc878288016130c1565b93505060408501356131ed81612df6565b9396929550929360600135925050565b5f5f5f6060848603121561320f575f5ffd5b505081359360208301359350604090920135919050565b5f5f5f60608486031215613238575f5ffd5b833561324381612df6565b9250602084013567ffffffffffffffff81111561325e575f5ffd5b61326a868287016130c1565b93969395505050506040919091013590565b5f5f5f5f5f5f5f60e0888a031215613292575f5ffd5b873567ffffffffffffffff8111156132a8575f5ffd5b6132b48a828b016130c1565b97505060208801356132c581612df6565b955060408801356132d581612df6565b94506060880135935060808801356132ec81612df6565b9699959850939692959460a0840135945060c09093013592915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b602081016004831061336f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61201d6020830184613375565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283519082018190525f9060208501906060840190835b8181101561344f57835173ffffffffffffffffffffffffffffffffffffffff1683526020938401939092019160010161341b565b5050838103602080860191909152855180835291810192508501905f5b8181101561348c578251151584526020938401939092019160010161346c565b50919695505050505050565b5f602082840312156134a8575f5ffd5b815161201d81612efd565b5f602082840312156134c3575f5ffd5b81516003811061201d575f5ffd5b805163ffffffff811681146134e4575f5ffd5b919050565b5f5f5f5f5f5f5f60e0888a0312156134ff575f5ffd5b87516bffffffffffffffffffffffff8116811461351a575f5ffd5b602089015190975061352b81612df6565b60408901519096509450613541606089016134d1565b935061354f608089016134d1565b925061355d60a089016134d1565b915060c088015160068110613570575f5ffd5b8091505092959891949750929550565b5f60208284031215613590575f5ffd5b815167ffffffffffffffff8111156135a6575f5ffd5b820160c081850312156135b7575f5ffd5b6135bf612e62565b81516135ca81612df6565b815260208201516135da81612df6565b6020820152604082015167ffffffffffffffff8111156135f8575f5ffd5b8201601f81018613613608575f5ffd5b8051613616612f2782612eda565b8082825260208201915060208360051b850101925088831115613637575f5ffd5b6020840193505b8284101561365957835182526020938401939091019061363e565b6040850152505050606082810151908201526080808301519082015260a091820151918101919091529392505050565b73ffffffffffffffffffffffffffffffffffffffff8516815273ffffffffffffffffffffffffffffffffffffffff84166020820152826040820152608060608201525f6136d96080830184613375565b9695505050505050565b5f602082840312156136f3575f5ffd5b815161201d81612df6565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f81613739576137396136fe565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361378f5761378f6136fe565b5060010190565b848152608060208201525f6137ae6080830186613375565b6040830194909452506060015292915050565b73ffffffffffffffffffffffffffffffffffffffff8516815273ffffffffffffffffffffffffffffffffffffffff84166020820152608060408201525f61380b6080830185613375565b905082606083015295945050505050565b80820180821115611509576115096136fe565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152608060408201525f61380b6080830185613375565b828152604060208201525f61387b6040830184613375565b949350505050565b8082028115828204841417611509576115096136fe565b5f826138cd577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611509576115096136fe56fea26469706673582212203c0ede0c555751294a34f57c346e0f6f674b2031d0fec3e4394df5406b142fae64736f6c634300081c0033", + "deployedBytecode": "0x608060405260043610610318575f3560e01c806380d859111161019c578063cbcf252a116100e7578063e679803511610092578063f2e433bf1161006d578063f2e433bf14610ab5578063f5dcb7bb14610be7578063f698da2514610c1a578063ffa1ad7414610c4d575f5ffd5b8063e679803514610a43578063e8eca22d14610a6e578063ed24911d14610aa1575f5ffd5b8063ddca3f43116100c2578063ddca3f4314610a05578063ded8128614610a19578063e0cb19e814610a2e575f5ffd5b8063cbcf252a1461097b578063cbd6407a146109ae578063d8a4676f146109d9575f5ffd5b80639ec4a5bf11610147578063bdf8631711610122578063bdf863171461087c578063c69f6f9f14610891578063cb261bec146108d2575f5ffd5b80639ec4a5bf1461082b578063a6f9dae11461084a578063ad16ee7314610869575f5ffd5b80639003adfe116101775780639003adfe146107cf5780639890220b146107e45780639a8a0592146107f8575f5ffd5b806380d85911146107435780638da5cb5b146107625780638fb847ef1461078e575f5ffd5b8063291347681161026757806356d0819e1161021257806371db00c4116101ed57806371db00c41461067d57806374a8569b1461069c5780637af73473146106cf578063803551a914610710575f5ffd5b806356d0819e146105fe57806357c0762d1461061d57806360b24e0a1461063c575f5ffd5b806346fbcbb21161024257806346fbcbb21461059f5780634ada3e61146105be578063551399bb146105d3575f5ffd5b8063291347681461052d5780633ccfd60b1461056057806343be964314610574575f5ffd5b806317a68dd8116102c75780631a4d8fc8116102a25780631a4d8fc8146104c45780631bbbeeb8146104e3578063203a993c1461050e575f5ffd5b806317a68dd81461042e57806317fcb39b1461044d578063187cc7f2146104a5575f5ffd5b80630ed8078b116102f75780630ed8078b146103bc5780630f41196a146103db57806313999914146103f0575f5ffd5b8062427c541461031c57806305b040b21461035a578063087f08d41461039b575b5f5ffd5b348015610327575f5ffd5b50610347610336366004612e1a565b600a6020525f908152604090205481565b6040519081526020015b60405180910390f35b348015610365575f5ffd5b50610347610374366004612e1a565b73ffffffffffffffffffffffffffffffffffffffff165f908152600b602052604090205490565b3480156103a6575f5ffd5b506103ba6103b5366004612f7d565b610ca2565b005b3480156103c7575f5ffd5b506103ba6103d6366004613042565b610ebc565b3480156103e6575f5ffd5b5061034760015481565b3480156103fb575f5ffd5b5061041e61040a366004612e1a565b600e6020525f908152604090205460ff1681565b6040519015158152602001610351565b348015610439575f5ffd5b506103ba610448366004612e1a565b6110b8565b348015610458575f5ffd5b506104807f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610351565b3480156104b0575f5ffd5b506104806104bf36600461306c565b6111df565b3480156104cf575f5ffd5b506103ba6104de366004613083565b611214565b3480156104ee575f5ffd5b506103476104fd366004612e1a565b60096020525f908152604090205481565b348015610519575f5ffd5b50610480610528366004613042565b611300565b348015610538575f5ffd5b506104807f000000000000000000000000000000000000000000000000000000000000000081565b34801561056b575f5ffd5b506103ba61150f565b34801561057f575f5ffd5b5061034761058e366004612e1a565b600c6020525f908152604090205481565b3480156105aa575f5ffd5b506104806105b936600461314b565b61166e565b3480156105c9575f5ffd5b5061034760055481565b3480156105de575f5ffd5b506103476105ed366004612e1a565b600b6020525f908152604090205481565b348015610609575f5ffd5b506103ba6106183660046131a0565b6118a9565b348015610628575f5ffd5b506103ba6106373660046131fd565b611dc0565b348015610647575f5ffd5b50610347610656366004612e1a565b73ffffffffffffffffffffffffffffffffffffffff165f908152600c602052604090205490565b348015610688575f5ffd5b50610480610697366004613083565b611e84565b3480156106a7575f5ffd5b506104807f000000000000000000000000000000000000000000000000000000000000000081565b3480156106da575f5ffd5b506103476106e9366004612e1a565b73ffffffffffffffffffffffffffffffffffffffff165f9081526009602052604090205490565b34801561071b575f5ffd5b506104807f000000000000000000000000000000000000000000000000000000000000000081565b34801561074e575f5ffd5b506103ba61075d3660046131fd565b612024565b34801561076d575f5ffd5b506008546104809073ffffffffffffffffffffffffffffffffffffffff1681565b348015610799575f5ffd5b506103476107a8366004612e1a565b73ffffffffffffffffffffffffffffffffffffffff165f908152600a602052604090205490565b3480156107da575f5ffd5b5061034760035481565b3480156107ef575f5ffd5b506103ba6120ae565b348015610803575f5ffd5b506103477f000000000000000000000000000000000000000000000000000000000000000081565b348015610836575f5ffd5b50610347610845366004613226565b61224c565b348015610855575f5ffd5b506103ba610864366004612e1a565b612302565b61034761087736600461327c565b612430565b348015610887575f5ffd5b5061034760045481565b34801561089c575f5ffd5b506104806108ab366004612e1a565b600f6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156108dd575f5ffd5b506109356108ec36600461306c565b600d6020525f90815260409020805460018201546002830154600384015460049094015473ffffffffffffffffffffffffffffffffffffffff9384169492841693909116919085565b6040805173ffffffffffffffffffffffffffffffffffffffff9687168152948616602086015292909416918301919091526060820152608081019190915260a001610351565b348015610986575f5ffd5b506104807f000000000000000000000000000000000000000000000000000000000000000081565b3480156109b9575f5ffd5b506103476109c8366004612e1a565b60116020525f908152604090205481565b3480156109e4575f5ffd5b506109f86109f336600461306c565b61297d565b6040516103519190613336565b348015610a10575f5ffd5b506103475f5481565b348015610a24575f5ffd5b5061034760025481565b348015610a39575f5ffd5b5061034760065481565b348015610a4e575f5ffd5b50610347610a5d366004612e1a565b60106020525f908152604090205481565b348015610a79575f5ffd5b506103477fe6194b93a7bff0a54130ed8cd277223408a77f3e48bb5104a9db96d334f962ca81565b348015610aac575f5ffd5b50610347612a2e565b348015610ac0575f5ffd5b50610b64610acf36600461306c565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152505f908152600d6020908152604091829020825160a081018452815473ffffffffffffffffffffffffffffffffffffffff9081168252600183015481169382019390935260028201549092169282019290925260038201546060820152600490910154608082015290565b60405161035191905f60a08201905073ffffffffffffffffffffffffffffffffffffffff835116825273ffffffffffffffffffffffffffffffffffffffff602084015116602083015273ffffffffffffffffffffffffffffffffffffffff6040840151166040830152606083015160608301526080830151608083015292915050565b348015610bf2575f5ffd5b506103477f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b348015610c25575f5ffd5b506103477f000000000000000000000000000000000000000000000000000000000000000081565b348015610c58575f5ffd5b50610c956040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161035191906133c1565b60085473ffffffffffffffffffffffffffffffffffffffff163314610d1a576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044015b60405180910390fd5b8051825114610d6257815181516040517f8151c11000000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d11565b5f5b8251811015610e7e575f73ffffffffffffffffffffffffffffffffffffffff16838281518110610d9657610d966133d3565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610deb576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818181518110610dfd57610dfd6133d3565b6020026020010151600e5f858481518110610e1a57610e1a6133d3565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610d64565b507f8cc6be981009d13170c616af494b7d671ed2d84b7e6891e4c8f21fe065c00dfc8282604051610eb0929190613400565b60405180910390a15050565b6040517f479e372e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063479e372e90602401602060405180830381865afa158015610f46573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6a9190613498565b610fb8576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610d11565b6040517ffd0bba8c000000000000000000000000000000000000000000000000000000008152600481018290525f9073ffffffffffffffffffffffffffffffffffffffff84169063fd0bba8c90602401602060405180830381865afa158015611023573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104791906134b3565b9050600181600281111561105d5761105d613309565b146110b3576040517fcaf8924d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101839052604401610d11565b505050565b60085473ffffffffffffffffffffffffffffffffffffffff16331461112b576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610d11565b73ffffffffffffffffffffffffffffffffffffffff8116611178576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe6194b93a7bff0a54130ed8cd277223408a77f3e48bb5104a9db96d334f962ca81905560405173ffffffffffffffffffffffffffffffffffffffff8216907f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03905f90a250565b601281815481106111ee575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b80156112b2575f6112258383611300565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112ac576040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808616600483015282166024820152604401610d11565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216156110b3576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff831661144b576040517f4236aff8000000000000000000000000000000000000000000000000000000008152600481018390525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634236aff89060240160e060405180830381865afa1580156113a7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113cb91906134e9565b949750939550600494506113df9350505050565b8160058111156113f1576113f1613309565b146114455780600581111561140857611408613309565b6040517ff014fe74000000000000000000000000000000000000000000000000000000008152600481019190915260248101849052604401610d11565b50611509565b6114558383610ebc565b6040517f82a8ea58000000000000000000000000000000000000000000000000000000008152600481018390525f9073ffffffffffffffffffffffffffffffffffffffff8516906382a8ea58906024015f60405180830381865afa1580156114bf573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526115049190810190613580565b519150505b92915050565b6001600754111561154c576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600755335f908152601060205260408120549081900361159c576040517f32b2baa3000000000000000000000000000000000000000000000000000000008152336004820152602401610d11565b6040515f90339083908381818185875af1925050503d805f81146115db576040519150601f19603f3d011682016040523d82523d5f602084013e6115e0565b606091505b5050905080611630576040517fcd3f16590000000000000000000000000000000000000000000000000000000081525f600482015230602482015233604482015260648101839052608401610d11565b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a250506001600755565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600e602052604081205460ff166116e4576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610d11565b6040517f2732cb0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690632732cb029061175c9030907f00000000000000000000000000000000000000000000000000000000000000009089908890600401613689565b6020604051808303815f875af1158015611778573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179c91906136e3565b905073ffffffffffffffffffffffffffffffffffffffff81166117eb576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8082165f818152600f602052604080822080549488167fffffffffffffffffffffffff0000000000000000000000000000000000000000958616179055601280546001810182558184527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344401805490951684179094559254600655915186927f0dab9459b2f129b692750bed5cc716b07a2fb19ba9fe0a0dc378428a6204036791a39392505050565b600160075411156118e6576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026007555f6118f7338484611e84565b5f868152600d6020526040902080549192509073ffffffffffffffffffffffffffffffffffffffff1680611957576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600282015473ffffffffffffffffffffffffffffffffffffffff16338190036119ae576040517f32b2baa3000000000000000000000000000000000000000000000000000000008152336004820152602401610d11565b600183015473ffffffffffffffffffffffffffffffffffffffff1615611a03576040517f5b7e830100000000000000000000000000000000000000000000000000000000815260048101899052602401610d11565b73ffffffffffffffffffffffffffffffffffffffff82163314611baf578260030154421115611b6e576040517f4225d37a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248301527f00000000000000000000000000000000000000000000000000000000000000001690634225d37a906044015f604051808303815f87803b158015611ad8575f5ffd5b505af1158015611aea573d5f5f3e3d5ffd5b50506040517fe7d915cf000000000000000000000000000000000000000000000000000000008152600481018b905273ffffffffffffffffffffffffffffffffffffffff8516925063e7d915cf91506024015f604051808303815f87803b158015611b53575f5ffd5b505af1158015611b65573d5f5f3e3d5ffd5b50505050611baf565b60038301546040517f177d0c790000000000000000000000000000000000000000000000000000000081526004810191909152426024820152604401610d11565b6001830180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905560048054905f611bea8361372b565b909155505073ffffffffffffffffffffffffffffffffffffffff81165f908152600a60205260408120805491611c1f8361375f565b9091555050335f908152600b60205260408120805491611c3e8361375f565b909155505073ffffffffffffffffffffffffffffffffffffffff84165f908152600c60205260408120805491611c738361375f565b90915550506040517f4225d37a000000000000000000000000000000000000000000000000000000008152336004820152600160248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634225d37a906044015f604051808303815f87803b158015611d03575f5ffd5b505af1158015611d15573d5f5f3e3d5ffd5b505050505f5f611d29338660040154612a88565b915091508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f11e005e94e7fe3e65c3476728664cce8c02a074d70cfb51e10f8c7df60f3d6268d8d8787604051611da79493929190613796565b60405180910390a4505060016007555050505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff163314611e33576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610d11565b611e3e838383612b4a565b60408051848152602081018490529081018290527f64d0972bd5d0c2828d80911b61084d86d61214c3081656ca3a720047a88320359060600160405180910390a1505050565b5f815f03611ebe576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8481165f908152600f602052604090205416611f33576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610d11565b611f3d8383611300565b6040517f6d70f7ae00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808316600483015291925090851690636d70f7ae90602401602060405180830381865afa158015611fab573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fcf9190613498565b61201d576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610d11565b9392505050565b60085473ffffffffffffffffffffffffffffffffffffffff1615612074576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61207f838383612b4a565b5050600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905550565b600160075411156120eb576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026007556003545f81900361212d576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60035561213a81612c78565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af11580156121ec573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122109190613498565b506040518181527fdef931299fe61d176f949118058530c1f3f539dcb6950b4e372c9b835c33ca079060200160405180910390a1506001600755565b5f612255612a2e565b3085858560405160200161226c94939291906137c1565b604051602081830303815290604052805190602001206040516020016122c49291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b60085473ffffffffffffffffffffffffffffffffffffffff163314612375576008546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610d11565b73ffffffffffffffffffffffffffffffffffffffff81166123c2576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b905f90a250565b5f6001600754111561246e576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260075573ffffffffffffffffffffffffffffffffffffffff87166124c0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148015612510575073ffffffffffffffffffffffffffffffffffffffff861615155b1561255f576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87166004820152602401610d11565b73ffffffffffffffffffffffffffffffffffffffff871633036125b0576040517f32b2baa3000000000000000000000000000000000000000000000000000000008152336004820152602401610d11565b6001548210806125c1575060025482115b1561260e576001546002546040517feb373cfe0000000000000000000000000000000000000000000000000000000081526004810185905260248101929092526044820152606401610d11565b63ffffffff61261d428461381c565b111561266d5761262d428361381c565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019190915263ffffffff6024820152604401610d11565b87515f036126a7576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126b2878787611e84565b506126be338585611214565b335f818152601160205260409020546126d991908a9061224c565b335f9081526011602052604081208054929350906126f68361375f565b90915550505f818152600d6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8916178155612750428461381c565b60038201556002810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633908117909155346004808401919091556040517f55e7d0440000000000000000000000000000000000000000000000000000000081529081019190915273ffffffffffffffffffffffffffffffffffffffff8981166024830152600160448301527f000000000000000000000000000000000000000000000000000000000000000016906355e7d044906064015f604051808303815f87803b158015612822575f5ffd5b505af1158015612834573d5f5f3e3d5ffd5b5050335f9081526009602052604081208054935091506128538361375f565b909155505060048054905f6128678361375f565b909155505060058054905f61287b8361375f565b90915550506040517f5f117ea900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff891690635f117ea9906128d890339034908e90889060040161382f565b5f604051808303815f87803b1580156128ef575f5ffd5b505af1158015612901573d5f5f3e3d5ffd5b505050508773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4827c9fc8074fe94dd4939d4228739ff43d7072a6504a6f413ffa4967c120175848c604051612964929190613863565b60405180910390a3506001600755979650505050505050565b5f818152600d60209081526040808320815160a081018352815473ffffffffffffffffffffffffffffffffffffffff908116808352600184015482169583019590955260028301541692810192909252600381015460608301526004015460808201529015612a2857602081015173ffffffffffffffffffffffffffffffffffffffff16612a23578060600151421115612a1a5760029150612a28565b60019150612a28565b600391505b50919050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614612a6357612a5e612cf8565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f808215612b43576127105f5484612aa09190613883565b612aaa919061389a565b9050612ab681846138d2565b9150815f03612af1576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84165f9081526010602052604081208054849290612b2590849061381c565b925050819055508060035f828254612b3d919061381c565b90915550505b9250929050565b821580612b55575081155b80612b5e575080155b15612b95576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710831115612bdc576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526127106024820152604401610d11565b80821115612c20576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d11565b63ffffffff811115612c6b576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810182905263ffffffff6024820152604401610d11565b5f92909255600155600255565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015612cde575f5ffd5b505af1158015612cf0573d5f5f3e3d5ffd5b505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7ff376b6313a0837eb351511248cfe7dcc1cd26c49b8e0a47e1eb369dd62c425db6040518060400160405280600581526020017f312e312e30000000000000000000000000000000000000000000000000000000815250604051602001612d8191906133c1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff81168114612e17575f5ffd5b50565b5f60208284031215612e2a575f5ffd5b813561201d81612df6565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160c0810167ffffffffffffffff81118282101715612e8557612e85612e35565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612ed257612ed2612e35565b604052919050565b5f67ffffffffffffffff821115612ef357612ef3612e35565b5060051b60200190565b8015158114612e17575f5ffd5b5f82601f830112612f19575f5ffd5b8135612f2c612f2782612eda565b612e8b565b8082825260208201915060208360051b860101925085831115612f4d575f5ffd5b602085015b83811015612f73578035612f6581612efd565b835260209283019201612f52565b5095945050505050565b5f5f60408385031215612f8e575f5ffd5b823567ffffffffffffffff811115612fa4575f5ffd5b8301601f81018513612fb4575f5ffd5b8035612fc2612f2782612eda565b8082825260208201915060208360051b850101925087831115612fe3575f5ffd5b6020840193505b8284101561300e578335612ffd81612df6565b825260209384019390910190612fea565b9450505050602083013567ffffffffffffffff81111561302c575f5ffd5b61303885828601612f0a565b9150509250929050565b5f5f60408385031215613053575f5ffd5b823561305e81612df6565b946020939093013593505050565b5f6020828403121561307c575f5ffd5b5035919050565b5f5f5f60608486031215613095575f5ffd5b83356130a081612df6565b925060208401356130b081612df6565b929592945050506040919091013590565b5f82601f8301126130d0575f5ffd5b813567ffffffffffffffff8111156130ea576130ea612e35565b61311b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612e8b565b81815284602083860101111561312f575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f6060848603121561315d575f5ffd5b83359250602084013561316f81612df6565b9150604084013567ffffffffffffffff81111561318a575f5ffd5b613196868287016130c1565b9150509250925092565b5f5f5f5f608085870312156131b3575f5ffd5b84359350602085013567ffffffffffffffff8111156131d0575f5ffd5b6131dc878288016130c1565b93505060408501356131ed81612df6565b9396929550929360600135925050565b5f5f5f6060848603121561320f575f5ffd5b505081359360208301359350604090920135919050565b5f5f5f60608486031215613238575f5ffd5b833561324381612df6565b9250602084013567ffffffffffffffff81111561325e575f5ffd5b61326a868287016130c1565b93969395505050506040919091013590565b5f5f5f5f5f5f5f60e0888a031215613292575f5ffd5b873567ffffffffffffffff8111156132a8575f5ffd5b6132b48a828b016130c1565b97505060208801356132c581612df6565b955060408801356132d581612df6565b94506060880135935060808801356132ec81612df6565b9699959850939692959460a0840135945060c09093013592915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b602081016004831061336f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61201d6020830184613375565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283519082018190525f9060208501906060840190835b8181101561344f57835173ffffffffffffffffffffffffffffffffffffffff1683526020938401939092019160010161341b565b5050838103602080860191909152855180835291810192508501905f5b8181101561348c578251151584526020938401939092019160010161346c565b50919695505050505050565b5f602082840312156134a8575f5ffd5b815161201d81612efd565b5f602082840312156134c3575f5ffd5b81516003811061201d575f5ffd5b805163ffffffff811681146134e4575f5ffd5b919050565b5f5f5f5f5f5f5f60e0888a0312156134ff575f5ffd5b87516bffffffffffffffffffffffff8116811461351a575f5ffd5b602089015190975061352b81612df6565b60408901519096509450613541606089016134d1565b935061354f608089016134d1565b925061355d60a089016134d1565b915060c088015160068110613570575f5ffd5b8091505092959891949750929550565b5f60208284031215613590575f5ffd5b815167ffffffffffffffff8111156135a6575f5ffd5b820160c081850312156135b7575f5ffd5b6135bf612e62565b81516135ca81612df6565b815260208201516135da81612df6565b6020820152604082015167ffffffffffffffff8111156135f8575f5ffd5b8201601f81018613613608575f5ffd5b8051613616612f2782612eda565b8082825260208201915060208360051b850101925088831115613637575f5ffd5b6020840193505b8284101561365957835182526020938401939091019061363e565b6040850152505050606082810151908201526080808301519082015260a091820151918101919091529392505050565b73ffffffffffffffffffffffffffffffffffffffff8516815273ffffffffffffffffffffffffffffffffffffffff84166020820152826040820152608060608201525f6136d96080830184613375565b9695505050505050565b5f602082840312156136f3575f5ffd5b815161201d81612df6565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f81613739576137396136fe565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361378f5761378f6136fe565b5060010190565b848152608060208201525f6137ae6080830186613375565b6040830194909452506060015292915050565b73ffffffffffffffffffffffffffffffffffffffff8516815273ffffffffffffffffffffffffffffffffffffffff84166020820152608060408201525f61380b6080830185613375565b905082606083015295945050505050565b80820180821115611509576115096136fe565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152608060408201525f61380b6080830185613375565b828152604060208201525f61387b6040830184613375565b949350505050565b8082028115828204841417611509576115096136fe565b5f826138cd577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611509576115096136fe56fea26469706673582212203c0ede0c555751294a34f57c346e0f6f674b2031d0fec3e4394df5406b142fae64736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} -} +} \ No newline at end of file diff --git a/utils.py b/utils.py index 63223e6..e51e344 100644 --- a/utils.py +++ b/utils.py @@ -479,14 +479,14 @@ def unit_to_wei(unit: float) -> int: """Convert unit to Wei.""" return int(unit * 1e18) - +# @todo update after mainnet deployment CHAIN_TO_MARKETPLACE = { - ChainType.GNOSIS: "0x4554fE75c1f5576c1d7F765B2A036c199Adae329", + ChainType.GNOSIS: "0x4bfc6ba8413047db0067b9ef9004be8c07d25b51", } # @todo update after mainnet deployment CHAIN_TO_MECH_FACTORY = { - ChainType.GNOSIS: "0x72FA6a00692BF99a8FCe97B9815302a02FA1E3D4", + ChainType.GNOSIS: "0xac33a1cf83fd6890bbdf4b135da5dd6496767ab7", } def fetch_token_price(url: str, headers: dict) -> t.Optional[float]: @@ -509,29 +509,29 @@ def deploy_mech(sftxb: EthSafeTxBuilder, local_config: MechQuickstartConfig, ser """Deploy the Mech service.""" print_section("Creating a new Mech On Chain") chain_type = ChainType.from_id(int(local_config.home_chain_id)) - path = OPERATE_HOME / Path("../contracts/MechFactoryBasic.json") + path = OPERATE_HOME / Path("../contracts/MechMarketplace.json") abi = json.loads(path.read_text())["abi"] instance = web3.Web3() mech_marketplace_address = CHAIN_TO_MARKETPLACE[chain_type] + mech_factory_address = CHAIN_TO_MECH_FACTORY[chain_type] # 0.01xDAI hardcoded for price # better to be configurable and part of local config mech_request_price = unit_to_wei(0.01) contract = instance.eth.contract(address=Web3.to_checksum_address(mech_marketplace_address), abi=abi) - data = contract.encodeABI("createMech", args=[ - mech_marketplace_address, - CONTRACTS[ChainType.from_id(local_config.home_chain_id)]["service_registry"], + data = contract.encodeABI("create", args=[ service.chain_configs[str(local_config.home_chain_id)].chain_data.token, + Web3.to_checksum_address(mech_factory_address), mech_request_price.to_bytes(32, byteorder='big'), ]) tx_dict = { - "to": CHAIN_TO_MECH_FACTORY[chain_type], + "to": CHAIN_TO_MARKETPLACE[chain_type], "data": data, "value": 0, "operation": SafeOperation.CALL, } receipt = sftxb.new_tx().add(tx_dict).settle() - event = contract.events.CreateBasicMech().process_receipt(receipt)[0] + event = contract.events.CreateMech().process_receipt(receipt)[0] mech_address = event["args"]["mech"] print(f"Mech address: {mech_address}")