UNPKG

@lukso/lsp7-contracts

Version:
1,210 lines 91.3 kB
{ "_format": "hh3-artifact-1", "contractName": "LSP7Mintable", "sourceName": "contracts/presets/LSP7Mintable.sol", "abi": [ { "inputs": [ { "internalType": "string", "name": "name_", "type": "string" }, { "internalType": "string", "name": "symbol_", "type": "string" }, { "internalType": "address", "name": "newOwner_", "type": "address" }, { "internalType": "uint256", "name": "lsp4TokenType_", "type": "uint256" }, { "internalType": "bool", "name": "isNonDivisible_", "type": "bool" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "AccessControlBadConfirmation", "type": "error" }, { "inputs": [], "name": "AccessControlCannotSetAdminForDefaultAdminRole", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "bytes32", "name": "neededRole", "type": "bytes32" } ], "name": "AccessControlUnauthorizedAccount", "type": "error" }, { "inputs": [], "name": "ERC725Y_DataKeysValuesEmptyArray", "type": "error" }, { "inputs": [], "name": "ERC725Y_DataKeysValuesLengthMismatch", "type": "error" }, { "inputs": [], "name": "ERC725Y_MsgValueDisallowed", "type": "error" }, { "inputs": [ { "internalType": "bytes", "name": "storedData", "type": "bytes" } ], "name": "InvalidExtensionAddress", "type": "error" }, { "inputs": [ { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "InvalidFunctionSelector", "type": "error" }, { "inputs": [], "name": "LSP4TokenNameNotEditable", "type": "error" }, { "inputs": [], "name": "LSP4TokenSymbolNotEditable", "type": "error" }, { "inputs": [], "name": "LSP4TokenTypeNotEditable", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "uint256", "name": "authorizedAmount", "type": "uint256" }, { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "LSP7AmountExceedsAuthorizedAmount", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "LSP7AmountExceedsBalance", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "callIndex", "type": "uint256" } ], "name": "LSP7BatchCallFailed", "type": "error" }, { "inputs": [], "name": "LSP7CannotSendWithAddressZero", "type": "error" }, { "inputs": [], "name": "LSP7CannotUseAddressZeroAsOperator", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "caller", "type": "address" }, { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "address", "name": "operator", "type": "address" } ], "name": "LSP7DecreaseAllowanceNotAuthorized", "type": "error" }, { "inputs": [], "name": "LSP7DecreasedAllowanceBelowZero", "type": "error" }, { "inputs": [], "name": "LSP7InvalidTransferBatch", "type": "error" }, { "inputs": [], "name": "LSP7MintDisabled", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "tokenReceiver", "type": "address" } ], "name": "LSP7NotifyTokenReceiverContractMissingLSP1Interface", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "tokenReceiver", "type": "address" } ], "name": "LSP7NotifyTokenReceiverIsEOA", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "caller", "type": "address" }, { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "address", "name": "operator", "type": "address" } ], "name": "LSP7RevokeOperatorNotAuthorized", "type": "error" }, { "inputs": [], "name": "LSP7TokenContractCannotHoldValue", "type": "error" }, { "inputs": [], "name": "LSP7TokenOwnerCannotBeOperator", "type": "error" }, { "inputs": [ { "internalType": "bytes4", "name": "functionSelector", "type": "bytes4" } ], "name": "NoExtensionFoundForFunctionSelector", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" } ], "name": "OperatorAllowanceCannotBeIncreasedFromZero", "type": "error" }, { "inputs": [], "name": "OwnableCannotSetZeroAddressAsOwner", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "dataKey", "type": "bytes32" }, { "indexed": false, "internalType": "bytes", "name": "dataValue", "type": "bytes" } ], "name": "DataChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bool", "name": "enabled", "type": "bool" } ], "name": "MintingStatusChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": true, "internalType": "address", "name": "tokenOwner", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "OperatorAuthorizationChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": true, "internalType": "address", "name": "tokenOwner", "type": "address" }, { "indexed": true, "internalType": "bool", "name": "notified", "type": "bool" }, { "indexed": false, "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "OperatorRevoked", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "previousAdminRole", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "newAdminRole", "type": "bytes32" } ], "name": "RoleAdminChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "RoleGranted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "RoleRevoked", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "force", "type": "bool" }, { "indexed": false, "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "Transfer", "type": "event" }, { "stateMutability": "payable", "type": "fallback" }, { "inputs": [], "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MINTER_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "authorizeOperator", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "address", "name": "tokenOwner", "type": "address" } ], "name": "authorizedAmountFor", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenOwner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes[]", "name": "data", "type": "bytes[]" } ], "name": "batchCalls", "outputs": [ { "internalType": "bytes[]", "name": "results", "type": "bytes[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "uint256", "name": "subtractedAmount", "type": "uint256" }, { "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "decreaseAllowance", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "disableMinting", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "dataKey", "type": "bytes32" } ], "name": "getData", "outputs": [ { "internalType": "bytes", "name": "dataValue", "type": "bytes" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32[]", "name": "dataKeys", "type": "bytes32[]" } ], "name": "getDataBatch", "outputs": [ { "internalType": "bytes[]", "name": "dataValues", "type": "bytes[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenOwner", "type": "address" } ], "name": "getOperatorsOf", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" } ], "name": "getRoleAdmin", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "uint256", "name": "index", "type": "uint256" } ], "name": "getRoleMember", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" } ], "name": "getRoleMemberCount", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" } ], "name": "getRoleMembers", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "grantRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "hasRole", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "uint256", "name": "addedAmount", "type": "uint256" }, { "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "increaseAllowance", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "isMintable", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "bool", "name": "force", "type": "bool" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "callerConfirmation", "type": "address" } ], "name": "renounceRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "bool", "name": "notify", "type": "bool" }, { "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "revokeOperator", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "revokeRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "rolesOf", "outputs": [ { "internalType": "bytes32[]", "name": "", "type": "bytes32[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "dataKey", "type": "bytes32" }, { "internalType": "bytes", "name": "dataValue", "type": "bytes" } ], "name": "setData", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "bytes32[]", "name": "dataKeys", "type": "bytes32[]" }, { "internalType": "bytes[]", "name": "dataValues", "type": "bytes[]" } ], "name": "setDataBatch", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "bytes32", "name": "adminRole", "type": "bytes32" } ], "name": "setRoleAdmin", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "bool", "name": "force", "type": "bool" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "transfer", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "from", "type": "address[]" }, { "internalType": "address[]", "name": "to", "type": "address[]" }, { "internalType": "uint256[]", "name": "amount", "type": "uint256[]" }, { "internalType": "bool[]", "name": "force", "type": "bool[]" }, { "internalType": "bytes[]", "name": "data", "type": "bytes[]" } ], "name": "transferBatch", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ], "bytecode": "0x60a060405234801561000f575f5ffd5b506040516144bc3803806144bc83398101604081905261002e91610721565b600185858585858484848481610043336101ea565b6001600160a01b03811661006a576040516306b620db60e21b815260040160405180910390fd5b6100738161020d565b506040805180820190915260048152632936598960e21b60208201526100ba907feafec4d89fa9619884b60000a4d96624a38f7ac2d8d9a604ecf07c12c77e480c9061025c565b6100e47fdeba1e292f8ba88238e10ab3c7f88bd4be4fac56cad5194b6ecceaf653468af18561025c565b61010e7f2f0a68ab07768e01943a599e73362a0e17a63a72e94dd2e384d2c1d4db9327568461025c565b6040805160208101839052610155917fe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb3910160408051601f1981840301815291905261025c565b50505050151560805250505f805461017e93509091506001600160a01b03166102b0565b6102b0565b6009805460ff19168215159081179091556040517f41f386d449eec03c1c3b75bbba9c18df70aa19779ff47f68eab4b6a66fb399d4905f90a280156101df576101df5f51602061449c5f395f51905f526101795f546001600160a01b031690565b505050505050610980565b6102015f51602061449c5f395f51905f525f61032e565b61020a81610393565b50565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f828152600160205260409020610273828261084a565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2826040516102a49190610904565b60405180910390a25050565b5f8281526007602052604081206102c79083610429565b90508015610329576001600160a01b0382165f9081526008602052604090206102f09084610446565b5060405133906001600160a01b0384169085907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a45b505050565b8161034c5760405163d0dc904b60e01b815260040160405180910390fd5b5f82815260066020526040808220805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b5f546001600160a01b03166103a78261020d565b6001600160a01b0381165f9081526008602052604081206103c790610451565b90505f5b8151811015610423575f8282815181106103e7576103e7610939565b60200260200101519050610401818561046460201b60201c565b6001600160a01b0385161561041a5761041a81866102b0565b506001016103cb565b50505050565b5f61043d836001600160a01b0384166104e1565b90505b92915050565b5f61043d83836104e1565b60605f61045d8361052d565b9392505050565b5f82815260076020526040812061047b9083610586565b90508015610329576001600160a01b0382165f9081526008602052604090206104a4908461059a565b5060405133906001600160a01b0384169085907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a4505050565b5f81815260018301602052604081205461052657508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610440565b505f610440565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561057a57602002820191905f5260205f20905b815481526020019060010190808311610566575b50505050509050919050565b5f61043d836001600160a01b0384166105a1565b5f61043d83835b5f818152600183016020526040812054801561067b575f6105c360018361094d565b85549091505f906105d69060019061094d565b9050818114610635575f865f0182815481106105f4576105f4610939565b905f5260205f200154905080875f01848154811061061457610614610939565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806106465761064661096c565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610440565b5f915050610440565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126106a7575f5ffd5b81516001600160401b038111156106c0576106c0610684565b604051601f8201601f19908116603f011681016001600160401b03811182821017156106ee576106ee610684565b604052818152838201602001851015610705575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f5f60a08688031215610735575f5ffd5b85516001600160401b0381111561074a575f5ffd5b61075688828901610698565b602088015190965090506001600160401b03811115610773575f5ffd5b61077f88828901610698565b604088015190955090506001600160a01b038116811461079d575f5ffd5b60608701516080880151919450925080151581146107b9575f5ffd5b809150509295509295909350565b600181811c908216806107db57607f821691505b6020821081036107f957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561032957805f5260205f20601f840160051c810160208510156108245750805b601f840160051c820191505b81811015610843575f8155600101610830565b5050505050565b81516001600160401b0381111561086357610863610684565b6108778161087184546107c7565b846107ff565b6020601f8211600181146108a9575f83156108925750848201515b5f19600385901b1c1916600184901b178455610843565b5f84815260208120601f198516915b828110156108d857878501518255602094850194600190920191016108b8565b50848210156108f557868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b8181038181111561044057634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b608051613b046109985f395f610c980152613b045ff3fe608060405260043610610237575f3560e01c80637580d92011610137578063a217fddf116100af578063d53913931161007e578063d72fc29a11610063578063d72fc29a1461077b578063dedff9c61461079a578063f2fde38b146107b9576102c2565b8063d539139314610729578063d547741f1461075c576102c2565b8063a217fddf146106ac578063a3246ad3146106bf578063b49506fd146106eb578063ca15c8731461070a576102c2565b80637f23690c116101065780639010d07c116100eb5780639010d07c1461065b57806391d148541461067a5780639790242114610699576102c2565b80637f23690c146105fe5780638da5cb5b14610611576102c2565b80637580d9201461058d578063760d9bba146105ac57806378381670146105cb5780637e5cd5c1146105ea576102c2565b806330d0dc37116101ca57806354f6127f116101995780636963d4381161017e5780636963d4381461050c57806370a0823114610538578063715018a614610579576102c2565b806354f6127f146104c157806365aeaa95146104ed576102c2565b806330d0dc3714610444578063313ce5671461046357806336568abe1461048957806346b45af7146104a8576102c2565b80632bc1da82116102065780632bc1da82146103bb5780632d7667c9146103da5780632de94807146103f95780632f2ff15d14610425576102c2565b806301ffc9a71461031d57806318160ddd146103515780631e4e00911461036f578063248a9ca314610390576102c2565b366102c257345f03610290576040517fe5099ee30000000000000000000000000000000000000000000000000000000081526004016102879060208082526004908201525f604082015260600190565b60405180910390fd5b6040517f388f5adc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f36606082826004811015610305576040517fe5099ee3000000000000000000000000000000000000000000000000000000008152600401610287929190612bf9565b505061031183836107d8565b80519350602001915050f35b348015610328575f5ffd5b5061033c610337366004612c45565b61096d565b60405190151581526020015b60405180910390f35b34801561035c575f5ffd5b506002545b604051908152602001610348565b34801561037a575f5ffd5b5061038e610389366004612c84565b610986565b005b34801561039b575f5ffd5b506103616103aa366004612ca4565b5f9081526006602052604090205490565b3480156103c6575f5ffd5b5061038e6103d5366004612df6565b61099f565b3480156103e5575f5ffd5b5061038e6103f4366004613023565b610a52565b348015610404575f5ffd5b50610418610413366004613106565b610b57565b604051610348919061311f565b348015610430575f5ffd5b5061038e61043f366004613161565b610b87565b34801561044f575f5ffd5b5061038e61045e36600461318b565b610ba8565b34801561046e575f5ffd5b50610477610c95565b60405160ff9091168152602001610348565b348015610494575f5ffd5b5061038e6104a3366004613161565b610cc6565b3480156104b3575f5ffd5b5060095461033c9060ff1681565b3480156104cc575f5ffd5b506104e06104db366004612ca4565b610da2565b6040516103489190613242565b3480156104f8575f5ffd5b50610361610507366004613254565b610dad565b348015610517575f5ffd5b5061052b61052636600461327c565b610e44565b60405161034891906132ed565b348015610543575f5ffd5b50610361610552366004613106565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b348015610584575f5ffd5b5061038e610f8f565b348015610598575f5ffd5b5061038e6105a736600461336e565b610fa2565b3480156105b7575f5ffd5b5061038e6105c636600461339f565b610fd8565b3480156105d6575f5ffd5b5061038e6105e5366004613406565b61100d565b3480156105f5575f5ffd5b5061038e611137565b61038e61060c366004613452565b6111cf565b34801561061c575f5ffd5b505f5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610348565b348015610666575f5ffd5b50610636610675366004612c84565b611219565b348015610685575f5ffd5b5061033c610694366004613161565b611237565b61038e6106a7366004613496565b611242565b3480156106b7575f5ffd5b506103615f81565b3480156106ca575f5ffd5b506106de6106d9366004612ca4565b61128c565b60405161034891906134f1565b3480156106f6575f5ffd5b5061038e610705366004612df6565b6112a5565b348015610715575f5ffd5b50610361610724366004612ca4565b6112e4565b348015610734575f5ffd5b506103617f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b348015610767575f5ffd5b5061038e610776366004613161565b6112fa565b348015610786575f5ffd5b506106de610795366004613106565b61139d565b3480156107a5575f5ffd5b5061052b6107b436600461353e565b6113cd565b3480156107c4575f5ffd5b5061038e6107d3366004613106565b611477565b60605f6108075f357fffffffff000000000000000000000000000000000000000000000000000000001661152e565b5090507fffffffff000000000000000000000000000000000000000000000000000000005f351673ffffffffffffffffffffffffffffffffffffffff82166108a0576040517fbb370b2b0000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000009091166004820152602401610287565b505f5f8273ffffffffffffffffffffffffffffffffffffffff1634878733346040516020016108d29493929190613570565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261090a916135b3565b5f6040518083038185875af1925050503d805f8114610944576040519150601f19603f3d011682016040523d82523d5f602084013e610949565b606091505b5091509150811561095e579250610967915050565b80518060208301fd5b92915050565b5f610977826115ec565b806109675750610967826116cf565b5f61099081611733565b61099a838361173d565b505050565b5f6109aa8433610dad565b905083816109fd576040517fcba6e97700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610287565b505f610a0984836135f6565b9050610a193386836001876117bb565b5f338285604051602001610a2f93929190613609565b6040516020818303038152906040529050610a4a86826119df565b505050505050565b8451845181148015610a645750835181145b8015610a705750825181145b8015610a7c5750815181145b610ab2576040517f263eee8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b81811015610b4e57610b46878281518110610ad157610ad1613646565b6020026020010151878381518110610aeb57610aeb613646565b6020026020010151878481518110610b0557610b05613646565b6020026020010151878581518110610b1f57610b1f613646565b6020026020010151878681518110610b3957610b39613646565b6020026020010151610fd8565b600101610ab4565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260086020526040902060609061096790611a0a565b5f82815260066020526040902054610b9e81611733565b61099a8383611a16565b3373ffffffffffffffffffffffffffffffffffffffff84161480610be157503373ffffffffffffffffffffffffffffffffffffffff8516145b338486909192610c46576040517f1a525b3200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff938416600482015291831660248301529091166044820152606401610287565b505050610c5683855f85856117bb565b8115610c8f575f835f83604051602001610c7293929190613673565b6040516020818303038152906040529050610c8d85826119df565b505b50505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000610cc15750601290565b505f90565b73ffffffffffffffffffffffffffffffffffffffff81163314610d15576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81158015610d3957505f5473ffffffffffffffffffffffffffffffffffffffff1633145b1533839091610d92576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401610287565b5050610d9e8233611aad565b5050565b606061096782611b44565b5f8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e0c575073ffffffffffffffffffffffffffffffffffffffff81165f90815260036020526040902054610967565b5073ffffffffffffffffffffffffffffffffffffffff8082165f90815260056020908152604080832093861683529290522054610967565b60608167ffffffffffffffff811115610e5f57610e5f612ce3565b604051908082528060200260200182016040528015610e9257816020015b6060815260200190600190039081610e7d5790505b5090505f5b82811015610f88575f8030868685818110610eb457610eb4613646565b9050602002810190610ec691906136aa565b604051610ed4929190613712565b5f60405180830381855af49150503d805f8114610f0c576040519150601f19603f3d011682016040523d82523d5f602084013e610f11565b606091505b509150915081610f6057805115610f2b5780518082602001fd5b6040517fb774c28400000000000000000000000000000000000000000000000000000000815260048101849052602401610287565b80848481518110610f7357610f73613646565b60209081029190910101525050600101610e97565b5092915050565b610f97611be3565b610fa05f611c63565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610fcc81611733565b610c8d85858585611c96565b3373ffffffffffffffffffffffffffffffffffffffff86161461100057611000338685611cde565b610c8d8585858585611da5565b3373ffffffffffffffffffffffffffffffffffffffff8416148061104657503373ffffffffffffffffffffffffffffffffffffffff8516145b3384869091926110ab576040517f98ce294500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff938416600482015291831660248301529091166044820152606401610287565b5050505f6110b98585610dad565b9050828110156110f5576040517f0ef76c3500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8281036111068587836001876117bb565b5f85828560405160200161111c93929190613609565b6040516020818303038152906040529050610b4e87826119df565b61113f611be3565b60095460ff1661117b576040517fe633442100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040515f907f41f386d449eec03c1c3b75bbba9c18df70aa19779ff47f68eab4b6a66fb399d4908290a2565b6111d7611be3565b341561120f576040517ff36ba73700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d9e8282611e7c565b5f8281526007602052604081206112309083611fdb565b9392505050565b5f6112308383611fe6565b61124a611be3565b3415611282576040517ff36ba73700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d9e8282611ffd565b5f81815260076020526040902060609061096790611a0a565b6112b33384846001856117bb565b5f3383836040516020016112c993929190613609565b6040516020818303038152906040529050610c8f84826119df565b5f818152600760205260408120610967906120c1565b5f8281526006602052604090205461131181611733565b8215801561133857505f5473ffffffffffffffffffffffffffffffffffffffff8381169116145b1582849091611391576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401610287565b505061099a8383611aad565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260046020526040902060609061096790611a0a565b6060815167ffffffffffffffff8111156113e9576113e9612ce3565b60405190808252806020026020018201604052801561141c57816020015b60608152602001906001900390816114075790505b5090505f5b82518110156114715761144c83828151811061143f5761143f613646565b6020026020010151611b44565b82828151811061145e5761145e613646565b6020908102919091010152600101611421565b50919050565b61147f611be3565b73ffffffffffffffffffffffffffffffffffffffff8116611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610287565b61152b81611c63565b50565b5f808061157d7fcee78b4094da86011096000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000086166120ca565b90505f61158982611b44565b905080516014148061159a57508051155b81906115d3576040517f42bfe79f0000000000000000000000000000000000000000000000000000000081526004016102879190613242565b506115dd81613721565b60601c95600195509350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061167e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5a05180f00000000000000000000000000000000000000000000000000000000145b8061096757507fffffffff0000000000000000000000000000000000000000000000000000000082167f90832245000000000000000000000000000000000000000000000000000000001492915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fc52d600800000000000000000000000000000000000000000000000000000000148061172457506117248261214d565b806109675750610967826121a2565b61152b81336121fd565b81611774576040517fd0dc904b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815260066020526040808220805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b73ffffffffffffffffffffffffffffffffffffffff8416611808576040517f6355e76600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361186d576040517fdab7504700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8086165f90815260056020908152604080832093881683529290522083905582156119415773ffffffffffffffffffffffffffffffffffffffff85165f9081526004602052604090206118d5908561225f565b50828573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167ff772a43bfdf4729b196e3fb54a818b91a2ca6c49d10b2e16278752f9f515c25d846040516119349190613242565b60405180910390a4610c8d565b73ffffffffffffffffffffffffffffffffffffffff85165f90815260046020526040902061196f9085612280565b508115158573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f0ebf5762d8855cbe012d2ca42fb33a81175e17c8a8751f8859931ba453bd4167846040516119d09190613242565b60405180910390a45050505050565b610d9e827f386072cc5a58e61263b434c722725f21031cd06e7c552cfaa06db5de8a320dbc836122a1565b60605f6112308361239a565b5f828152600760205260408120611a2d908361225f565b9050801561099a5773ffffffffffffffffffffffffffffffffffffffff82165f908152600860205260409020611a6390846123f2565b50604051339073ffffffffffffffffffffffffffffffffffffffff84169085907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a4505050565b5f828152600760205260408120611ac49083612280565b9050801561099a5773ffffffffffffffffffffffffffffffffffffffff82165f908152600860205260409020611afa90846123fd565b50604051339073ffffffffffffffffffffffffffffffffffffffff84169085907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a4505050565b5f818152600160205260409020805460609190611b609061378d565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8c9061378d565b8015611bd75780601f10611bae57610100808354040283529160200191611bd7565b820191905f5260205f20905b815481529060010190602001808311611bba57829003601f168201915b50505050509050919050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610fa0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610287565b611c8d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a65f61173d565b61152b81612408565b60095460ff16611cd2576040517fe633442100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8f848484846124b9565b73ffffffffffffffffffffffffffffffffffffffff8083165f90815260056020908152604080832093871683529290522054801580611d1c57508082115b15611d81576040517ff3a6b69100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8085166004830152602482018390528516604482015260648101839052608401610287565b610c8f8385611d9085856137d8565b5f60405180602001604052805f8152506117bb565b73ffffffffffffffffffffffffffffffffffffffff851615801590611ddf575073ffffffffffffffffffffffffffffffffffffffff841615155b611e15576040517fd2d5ec3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e228585858585610c8d565b611e2f8585858585612563565b611e3c8585858585610c8d565b5f3386868685604051602001611e569594939291906137eb565b6040516020818303038152906040529050611e71868261271c565b610a4a858483612747565b7f2145e1d6d074577dc71ef54c3807742b41b053a9352ae6b491331509acb9750f8201611ed5576040517f85c169bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fd0f59754f88971fe6bc5a6618cc9d5f1e859c58d16b22d1c7b2d3e2b246cd8aa8201611f2e576040517f76755b3800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f1fd9e056a24d14c4abc642fcc325992a946906d0dbc57dd70278aaf12842024d8201611f87576040517f4ef6d7fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f828152600160205260409020611f9e828261389b565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b282604051611fcf9190613242565b60405180910390a25050565b5f61123083836128a0565b5f82815260076020526040812061123090836128c6565b8051825114612038576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81515f03612072576040517f97da5f9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b825181101561099a576120b983828151811061209257612092613646565b60200260200101518383815181106120ac576120ac613646565b6020026020010151611e7c565b600101612074565b5f610967825490565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201525f602a82018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008416602c83015291829101604051602081830303815290604052905080612145906139b2565b949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fa918fa6b0000000000000000000000000000000000000000000000000000000014806109675750610967826128f4565b5f806121cd7f01ffc9a70000000000000000000000000000000000000000000000000000000061152e565b50905073ffffffffffffffffffffffffffffffffffffffff81166121f357505f92915050565b611230818461298a565b6122078282611fe6565b81839091610c8f576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401610287565b5f6112308373ffffffffffffffffffffffffffffffffffffffff8416612a56565b5f6112308373ffffffffffffffffffffffffffffffffffffffff8416612aa2565b6122e173ffffffffffffffffffffffffffffffffffffffff84167f6bb56a140000000000000000000000000000000000000000000000000000000061298a565b1561099a576040517f6bb56a1400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636bb56a149061233a90859085906004016139f4565b5f604051808303815f875af1158015612355573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610c8f9190810190613a0c565b6060815f01805480602002602001604051908101604052809291908181526020018280548015611bd757602002820191905f5260205f20905b8154815260200190600101908083116123d35750505050509050919050565b5f6112308383612a56565b5f6112308383612aa2565b5f5473ffffffffffffffffffffffffffffffffffffffff1661242982612b85565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260086020526040812061245690611a0a565b90505f5b8151811015610c8f575f82828151811061247657612476613646565b6020026020010151905061248a8185611aad565b73ffffffffffffffffffffffffffffffffffffffff8516156124b0576124b08186611a16565b5060010161245a565b73ffffffffffffffffffffffffffffffffffffffff8416612506576040517fd2d5ec3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125135f85858585610c8d565b6125205f85858585612563565b61252d5f85858585610c8d565b5f335f8686856040516020016125479594939291906137eb565b6040516020818303038152906040529050610c8d858483612747565b73ffffffffffffffffffffffffffffffffffffffff851661259a578260025f82825461258f91906135f6565b909155506126509050565b73ffffffffffffffffffffffffffffffffffffffff85165f9081526003602052604090205480868580831015612622576040517f08d47949000000000000000000000000000000000000000000000000000000008152600481019390935273ffffffffffffffffffffffffffffffffffffffff909116602483015260448201526