{
  "_format": "hh3-artifact-1",
  "contractName": "LSP7CustomizableTokenInit",
  "sourceName": "contracts/presets/LSP7CustomizableTokenInit.sol",
  "abi": [
    {
      "inputs": [],
      "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": "LSP7CannotUpdateTransferLockPeriod",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "LSP7CannotUseAddressZeroAsOperator",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tranferAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "balanceOf",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "tokenBalanceCap",
          "type": "uint256"
        }
      ],
      "name": "LSP7CappedBalanceExceeded",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "LSP7CappedSupplyCannotMintOverCap",
      "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": "LSP7InvalidTransferLockPeriod",
      "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": [],
      "name": "LSP7RevokableFeatureDisabled",
      "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": "LSP7TokenAlreadyTransferable",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "LSP7TokenContractCannotHoldValue",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "LSP7TokenOwnerCannotBeOperator",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "LSP7TransferDisabled",
      "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": false,
          "internalType": "uint8",
          "name": "version",
          "type": "uint8"
        }
      ],
      "name": "Initialized",
      "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": "bool",
          "name": "enabled",
          "type": "bool"
        }
      ],
      "name": "RevokableStatusChanged",
      "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"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "start",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "end",
          "type": "uint256"
        }
      ],
      "name": "TransferLockPeriodChanged",
      "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": [],
      "name": "NON_TRANSFERABLE_BYPASS_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "REVOKER_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "UNCAPPED_BALANCE_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": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "burn",
      "outputs": [],
      "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": [],
      "name": "disableRevokable",
      "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": [
        {
          "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"
        },
        {
          "components": [
            {
              "internalType": "bool",
              "name": "isMintable",
              "type": "bool"
            },
            {
              "internalType": "uint256",
              "name": "initialMintAmount",
              "type": "uint256"
            }
          ],
          "internalType": "struct LSP7MintableParams",
          "name": "mintableParams",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "tokenBalanceCap",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "tokenSupplyCap",
              "type": "uint256"
            }
          ],
          "internalType": "struct LSP7CappedParams",
          "name": "cappedParams",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "transferLockStart",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "transferLockEnd",
              "type": "uint256"
            }
          ],
          "internalType": "struct LSP7NonTransferableParams",
          "name": "nonTransferableParams",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "bool",
              "name": "isRevokable",
              "type": "bool"
            }
          ],
          "internalType": "struct LSP7RevokableParams",
          "name": "revokableParams",
          "type": "tuple"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isMintable",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isRevokable",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isTransferable",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "makeTransferable",
      "outputs": [],
      "stateMutability": "nonpayable",
      "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": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "revoke",
      "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": "tokenBalanceCap",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "tokenSupplyCap",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "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": [],
      "name": "transferLockEnabled",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "transferLockEnd",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "transferLockStart",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "newTransferLockStart",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "newTransferLockEnd",
          "type": "uint256"
        }
      ],
      "name": "updateTransferLockPeriod",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "stateMutability": "payable",
      "type": "receive"
    }
  ],
  "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60d3565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161460d1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6151ba806100e05f395ff3fe608060405260043610610337575f3560e01c8063760d9bba116101af578063a3246ad3116100eb578063d547741f11610094578063e6fc60981161006e578063e6fc609814610a20578063ecff3a0c14610a36578063f2fde38b14610a50578063f5fb0b0c14610a6f576103c2565b8063d547741f146109c3578063d72fc29a146109e2578063dedff9c614610a01576103c2565b8063ca15c873116100c5578063ca15c8731461095c578063d1ca01881461097b578063d539139314610990576103c2565b8063a3246ad3146108fd578063b49506fd14610929578063c282ca7814610948576103c2565b80638fb05730116101585780639418775311610132578063941877531461088c57806397902421146108bf5780639e045773146108d2578063a217fddf146108ea576103c2565b80638fb05730146108385780639010d07c1461084e57806391d148541461086d576103c2565b80637e5cd5c1116101895780637e5cd5c1146107e05780637f23690c146107f45780638da5cb5b14610807576103c2565b8063760d9bba1461076f578063783816701461078e5780637c4acabf146107ad576103c2565b8063313ce5671161027e57806354f6127f11610227578063696fd68c11610201578063696fd68c146106f457806370a0823114610708578063715018a61461073c5780637580d92014610750576103c2565b806354f6127f1461067d57806365aeaa95146106a95780636963d438146106c8576103c2565b806345e14c461161025857806345e14c461461063157806346b45af71461065057806352058d8a14610669576103c2565b8063313ce567146105cd57806336568abe146105f357806344d1718714610612576103c2565b8063248a9ca3116102e05780632de94807116102ba5780632de94807146105635780632f2ff15d1461058f57806330d0dc37146105ae576103c2565b8063248a9ca3146104fa5780632bc1da82146105255780632d7667c914610544576103c2565b806318160ddd1161031157806318160ddd146104b35780631e4e0091146104c75780632121dc75146104e6576103c2565b806301ffc9a71461041d57806312318ac41461045157806315f7163014610492576103c2565b366103c257345f03610390576040517fe5099ee30000000000000000000000000000000000000000000000000000000081526004016103879060208082526004908201525f604082015260600190565b60405180910390fd5b6040517f388f5adc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f36606082826004811015610405576040517fe5099ee300000000000000000000000000000000000000000000000000000000815260040161038792919061419c565b50506104118383610a8e565b80519350602001915050f35b348015610428575f5ffd5b5061043c6104373660046141e8565b610c09565b60405190151581526020015b60405180910390f35b34801561045c575f5ffd5b506104847fb4b3a36d7c2b72add3151898671aaed843238e580f7d6d4bc5077ce2023b065981565b604051908152602001610448565b34801561049d575f5ffd5b506104b16104ac3660046142a6565b610c13565b005b3480156104be575f5ffd5b50609954610484565b3480156104d2575f5ffd5b506104b16104e13660046143ad565b610db5565b3480156104f1575f5ffd5b5061043c610dce565b348015610505575f5ffd5b506104846105143660046143cd565b5f908152609d602052604090205490565b348015610530575f5ffd5b506104b161053f3660046144f7565b610e5c565b34801561054f575f5ffd5b506104b161055e366004614715565b610f02565b34801561056e575f5ffd5b5061058261057d3660046147f8565b611007565b6040516104489190614811565b34801561059a575f5ffd5b506104b16105a9366004614853565b61102a565b3480156105b9575f5ffd5b506104b16105c836600461487d565b61104b565b3480156105d8575f5ffd5b506105e1611111565b60405160ff9091168152602001610448565b3480156105fe575f5ffd5b506104b161060d366004614853565b611128565b34801561061d575f5ffd5b506104b161062c3660046144f7565b6111de565b34801561063c575f5ffd5b506104b161064b3660046143ad565b611204565b34801561065b575f5ffd5b5060cf5461043c9060ff1681565b348015610674575f5ffd5b506104846112c8565b348015610688575f5ffd5b5061069c6106973660046143cd565b6112e3565b6040516104489190614934565b3480156106b4575f5ffd5b506104846106c3366004614946565b6112ee565b3480156106d3575f5ffd5b506106e76106e236600461496e565b611351565b60405161044891906149df565b3480156106ff575f5ffd5b506104b161149c565b348015610713575f5ffd5b506104846107223660046147f8565b6001600160a01b03165f908152609a602052604090205490565b348015610747575f5ffd5b506104b1611543565b34801561075b575f5ffd5b506104b161076a366004614a60565b611556565b34801561077a575f5ffd5b506104b1610789366004614a91565b61158c565b348015610799575f5ffd5b506104b16107a8366004614af8565b6115b4565b3480156107b8575f5ffd5b506104847fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee3081565b3480156107eb575f5ffd5b506104b16116b7565b6104b1610802366004614b44565b61174f565b348015610812575f5ffd5b506033546001600160a01b03165b6040516001600160a01b039091168152602001610448565b348015610843575f5ffd5b506104846101665481565b348015610859575f5ffd5b506108206108683660046143ad565b611799565b348015610878575f5ffd5b5061043c610887366004614853565b6117b7565b348015610897575f5ffd5b506104847f975773d1e0a917a74b57f36a377f439ffff6271648aebdbff75a52ab58eb7bad81565b6104b16108cd366004614b88565b6117c2565b3480156108dd575f5ffd5b506101975460ff1661043c565b3480156108f5575f5ffd5b506104845f81565b348015610908575f5ffd5b5061091c6109173660046143cd565b61180c565b6040516104489190614be3565b348015610934575f5ffd5b506104b16109433660046144f7565b611825565b348015610953575f5ffd5b506104b1611864565b348015610967575f5ffd5b506104846109763660046143cd565b6118fe565b348015610986575f5ffd5b5061013354610484565b34801561099b575f5ffd5b506104847f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b3480156109ce575f5ffd5b506104b16109dd366004614853565b611914565b3480156109ed575f5ffd5b5061091c6109fc3660046147f8565b61199e565b348015610a0c575f5ffd5b506106e7610a1b366004614c23565b6119c1565b348015610a2b575f5ffd5b506104846101655481565b348015610a41575f5ffd5b506101675461043c9060ff1681565b348015610a5b575f5ffd5b506104b1610a6a3660046147f8565b611a6b565b348015610a7a575f5ffd5b506104b1610a89366004614af8565b611b15565b60605f610abd5f357fffffffff0000000000000000000000000000000000000000000000000000000016611c38565b5090507fffffffff000000000000000000000000000000000000000000000000000000005f35166001600160a01b038216610b49576040517fbb370b2b0000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000009091166004820152602401610387565b505f5f826001600160a01b03163487873334604051602001610b6e9493929190614c55565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052610ba691614c98565b5f6040518083038185875af1925050503d805f8114610be0576040519150601f19603f3d011682016040523d82523d5f602084013e610be5565b606091505b50915091508115610bfa579250610c03915050565b80518060208301fd5b92915050565b5f610c0382611cf6565b5f54610100900460ff1615808015610c3157505f54600160ff909116105b80610c4a5750303b158015610c4a57505f5460ff166001145b610cd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610387565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610d32575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610d458c8c8c8c8c8c8c8c8c8c8c611d0f565b8015610da7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b5f610dbf81611e98565b610dc98383611ea2565b505050565b610167545f9060ff16610de15750600190565b6101655461016654901580159115159082610dfa575080155b15610e085760019250505090565b81158015610e135750805b15610e25574261016654109250505090565b818015610e30575080155b15610e42574261016554119250505090565b42610165541180610e5557504261016654105b9250505090565b5f610e6784336112ee565b90508381610ead576040517fcba6e9770000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610387565b505f610eb98483614cdb565b9050610ec9338683600187611f20565b5f338285604051602001610edf93929190614cee565b6040516020818303038152906040529050610efa86826120c2565b505050505050565b8451845181148015610f145750835181145b8015610f205750825181145b8015610f2c5750815181145b610f62576040517f263eee8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b81811015610ffe57610ff6878281518110610f8157610f81614d1e565b6020026020010151878381518110610f9b57610f9b614d1e565b6020026020010151878481518110610fb557610fb5614d1e565b6020026020010151878581518110610fcf57610fcf614d1e565b6020026020010151878681518110610fe957610fe9614d1e565b602002602001015161158c565b600101610f64565b50505050505050565b6001600160a01b0381165f908152609f60205260409020606090610c03906120ed565b5f828152609d602052604090205461104181611e98565b610dc983836120f9565b336001600160a01b038416148061106a5750336001600160a01b038516145b3384869091926110c2576040517f1a525b320000000000000000000000000000000000000000000000000000000081526001600160a01b03938416600482015291831660248301529091166044820152606401610387565b5050506110d283855f8585611f20565b811561110b575f835f836040516020016110ee93929190614d4b565b604051602081830303815290604052905061110985826120c2565b505b50505050565b6098545f9060ff166111235750601290565b505f90565b6001600160a01b038116331461116a576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8115801561118257506033546001600160a01b031633145b15338390916111ce576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301526024820152604401610387565b50506111da8233612176565b5050565b336001600160a01b038416146111f9576111f93384846121f3565b610dc98383836122a0565b61120c61233c565b6101675460ff16611249576040517f2561c3fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015806112565750818110155b61128c576040517fd41cc2a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610165829055610166819055604051819083907f938e6c55d25d181f86d200da26970f962ec97adb02dfa0452811fb9073573ebe905f90a35050565b60cf545f9060ff166112db575060995490565b506101015490565b6060610c03826123b0565b5f826001600160a01b0316826001600160a01b03160361132657506001600160a01b0381165f908152609a6020526040902054610c03565b506001600160a01b038082165f908152609c6020908152604080832093861683529290522054610c03565b60608167ffffffffffffffff81111561136c5761136c6143e4565b60405190808252806020026020018201604052801561139f57816020015b606081526020019060019003908161138a5790505b5090505f5b82811015611495575f80308686858181106113c1576113c1614d1e565b90506020028101906113d39190614d75565b6040516113e1929190614dd6565b5f60405180830381855af49150503d805f8114611419576040519150601f19603f3d011682016040523d82523d5f602084013e61141e565b606091505b50915091508161146d578051156114385780518082602001fd5b6040517fb774c28400000000000000000000000000000000000000000000000000000000815260048101849052602401610387565b8084848151811061148057611480614d1e565b602090810291909101015250506001016113a4565b5092915050565b6114a461233c565b6101675460ff166114e1576040517fc99ae81400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61016780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555f61016581905561016681905560405181907f938e6c55d25d181f86d200da26970f962ec97adb02dfa0452811fb9073573ebe908290a3565b61154b61233c565b6115545f61244f565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661158081611e98565b61110985858585612458565b336001600160a01b038616146115a7576115a73386856121f3565b61110985858585856124a0565b336001600160a01b03841614806115d35750336001600160a01b038516145b33848690919261162b576040517f98ce29450000000000000000000000000000000000000000000000000000000081526001600160a01b03938416600482015291831660248301529091166044820152606401610387565b5050505f61163985856112ee565b905082811015611675576040517f0ef76c3500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828103611686858783600187611f20565b5f85828560405160200161169c93929190614cee565b6040516020818303038152906040529050610ffe87826120c2565b6116bf61233c565b60cf5460ff166116fb576040517fe633442100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60cf80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040515f907f41f386d449eec03c1c3b75bbba9c18df70aa19779ff47f68eab4b6a66fb399d4908290a2565b61175761233c565b341561178f576040517ff36ba73700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111da828261255d565b5f828152609e602052604081206117b090836126bc565b9392505050565b5f6117b083836126c7565b6117ca61233c565b3415611802576040517ff36ba73700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111da82826126de565b5f818152609e60205260409020606090610c03906120ed565b611833338484600185611f20565b5f33838360405160200161184993929190614cee565b604051602081830303815290604052905061110b84826120c2565b61186c61233c565b6101975460ff166118a9576040517f3aeb5e9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61019780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040515f907f67e25b3c9018f015458c04997debf5769d7c1727a0918c43acfe4daf80ac7017908290a2565b5f818152609e60205260408120610c03906127a2565b5f828152609d602052604090205461192b81611e98565b8215801561194657506033546001600160a01b038381169116145b1582849091611992576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301526024820152604401610387565b5050610dc98383612176565b6001600160a01b0381165f908152609b60205260409020606090610c03906120ed565b6060815167ffffffffffffffff8111156119dd576119dd6143e4565b604051908082528060200260200182016040528015611a1057816020015b60608152602001906001900390816119fb5790505b5090505f5b8251811015611a6557611a40838281518110611a3357611a33614d1e565b60200260200101516123b0565b828281518110611a5257611a52614d1e565b6020908102919091010152600101611a15565b50919050565b611a7361233c565b6001600160a01b038116611b09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610387565b611b128161244f565b50565b7fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee30611b3f81611e98565b6101975460ff16611b7c576040517f3aeb5e9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6033546001600160a01b0385811691161480611bbd5750611bbd7fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee30856117b7565b84907fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee3090611c28576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301526024820152604401610387565b50506111098585856001866124a0565b5f8080611c877fcee78b4094da86011096000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000086166127ab565b90505f611c93826123b0565b9050805160141480611ca457508051155b8190611cdd576040517f42bfe79f0000000000000000000000000000000000000000000000000000000081526004016103879190614934565b50611ce781614de5565b60601c95600195509350505050565b5f611d008261282e565b80610c035750610c0382612911565b5f54610100900460ff16611da5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b611e1b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c90819084018382808284375f920191909152508c92508b91508a9050612975565b611e23612a4c565b611e38611e336020860186614e51565b612afd565b611e458360200135612c26565b611e4f8335612cc2565b611e5e82356020840135612d9a565b611e73611e6e6020830183614e51565b612f0d565b602084013515611e8b57611e8b87856020013561300f565b5050505050505050505050565b611b12813361307b565b81611ed9576040517fd0dc904b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f828152609d6020526040808220805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6001600160a01b038416611f60576040517f6355e76600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b0316846001600160a01b031603611fab576040517fdab7504700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038086165f908152609c60209081526040808320938816835292905220839055821561204b576001600160a01b0385165f908152609b60205260409020611ff990856130d0565b5082856001600160a01b0316856001600160a01b03167ff772a43bfdf4729b196e3fb54a818b91a2ca6c49d10b2e16278752f9f515c25d8460405161203e9190614934565b60405180910390a4611109565b6001600160a01b0385165f908152609b6020526040902061206c90856130e4565b50811515856001600160a01b0316856001600160a01b03167f0ebf5762d8855cbe012d2ca42fb33a81175e17c8a8751f8859931ba453bd4167846040516120b39190614934565b60405180910390a45050505050565b6111da827f386072cc5a58e61263b434c722725f21031cd06e7c552cfaa06db5de8a320dbc836130f8565b60605f6117b0836131d7565b5f828152609e6020526040812061211090836130d0565b90508015610dc9576001600160a01b0382165f908152609f60205260409020612139908461322f565b5060405133906001600160a01b0384169085907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a4505050565b5f828152609e6020526040812061218d90836130e4565b90508015610dc9576001600160a01b0382165f908152609f602052604090206121b6908461323a565b5060405133906001600160a01b0384169085907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a4505050565b6001600160a01b038083165f908152609c602090815260408083209387168352929052205480158061222457508082115b1561227c576040517ff3a6b6910000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152602482018390528516604482015260648101839052608401610387565b61110b838561228b8585614e6a565b5f60405180602001604052805f815250611f20565b6001600160a01b0383166122e0576040517fd2d5ec3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122ed835f845f85613245565b6122fa835f845f85613252565b612307835f845f85611109565b5f33845f8585604051602001612321959493929190614e7d565b604051602081830303815290604052905061110b8482613396565b6033546001600160a01b03163314611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610387565b5f8181526097602052604090208054606091906123cc90614ec2565b80601f01602080910402602001604051908101604052809291908181526020018280546123f890614ec2565b80156124435780601f1061241a57610100808354040283529160200191612443565b820191905f5260205f20905b81548152906001019060200180831161242657829003601f168201915b50505050509050919050565b611b12816133c1565b60cf5460ff16612494576040517fe633442100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61110b8484848461349b565b6001600160a01b038516158015906124c057506001600160a01b03841615155b6124f6576040517fd2d5ec3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125038585858585613245565b6125108585858585613252565b61251d8585858585611109565b5f3386868685604051602001612537959493929190614e7d565b60405160208183030381529060405290506125528682613396565b610efa8584836134b3565b7f2145e1d6d074577dc71ef54c3807742b41b053a9352ae6b491331509acb9750f82016125b6576040517f85c169bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fd0f59754f88971fe6bc5a6618cc9d5f1e859c58d16b22d1c7b2d3e2b246cd8aa820161260f576040517f76755b3800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f1fd9e056a24d14c4abc642fcc325992a946906d0dbc57dd70278aaf12842024d8201612668576040517f4ef6d7fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815260976020526040902061267f8282614f51565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2826040516126b09190614934565b60405180910390a25050565b5f6117b083836135d8565b5f828152609e602052604081206117b090836135fe565b8051825114612719576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81515f03612753576040517f97da5f9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8251811015610dc95761279a83828151811061277357612773614d1e565b602002602001015183838151811061278d5761278d614d1e565b602002602001015161255d565b600101612755565b5f610c03825490565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201525f602a82018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008416602c8301529182910160405160208183030381529060405290508061282690615068565b949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806128c057507fffffffff0000000000000000000000000000000000000000000000000000000082167f5a05180f00000000000000000000000000000000000000000000000000000000145b80610c0357507fffffffff0000000000000000000000000000000000000000000000000000000082167f90832245000000000000000000000000000000000000000000000000000000001492915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fc52d600800000000000000000000000000000000000000000000000000000000148061296657506129668261361f565b80610c035750610c0382613674565b5f54610100900460ff16612a0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b612a17858585856136c2565b609880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905550505050565b5f54610100900460ff16612ae2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b6115545f612af86033546001600160a01b031690565b6120f9565b5f54610100900460ff16612b93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b60cf80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040517f41f386d449eec03c1c3b75bbba9c18df70aa19779ff47f68eab4b6a66fb399d4905f90a28015611b1257611b127f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6612af86033546001600160a01b031690565b5f54610100900460ff16612cbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b61010155565b5f54610100900460ff16612d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b6101338190558015611b1257611b127f975773d1e0a917a74b57f36a377f439ffff6271648aebdbff75a52ab58eb7bad612af86033546001600160a01b031690565b5f54610100900460ff16612e30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b801580612e3d5750818110155b612e73576040517fd41cc2a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61016582905561016681905561016780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055604051819083907f938e6c55d25d181f86d200da26970f962ec97adb02dfa0452811fb9073573ebe905f90a36111da7fb4b3a36d7c2b72add3151898671aaed843238e580f7d6d4bc5077ce2023b0659612af86033546001600160a01b031690565b5f54610100900460ff16612fa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b61019780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215801591909117909155611b1257611b127fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee30612af86033546001600160a01b031690565b5f61301a6101015490565b905080821181158061302a575080155b613060576040517feacbf0d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61110b8484600160405180602001604052805f81525061385c565b61308582826126c7565b8183909161110b576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301526024820152604401610387565b5f6117b0836001600160a01b0384166138f9565b5f6117b0836001600160a01b038416613945565b61312b6001600160a01b0384167f6bb56a1400000000000000000000000000000000000000000000000000000000613a28565b15610dc9576040517f6bb56a140000000000000000000000000000000000000000000000000000000081526001600160a01b03841690636bb56a149061317790859085906004016150aa565b5f604051808303815f875af1158015613192573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261110b91908101906150c2565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561244357602002820191905f5260205f20905b8154815260200190600101908083116132105750505050509050919050565b5f6117b083836138f9565b5f6117b08383613945565b6111098585858585613af4565b6001600160a01b03851661327c578260995f8282546132719190614cdb565b9091555061330b9050565b6001600160a01b0385165f908152609a6020526040902054808685808310156132ea576040517f08d4794900000000000000000000000000000000000000000000000000000000815260048101939093526001600160a01b0390911660248301526044820152606401610387565b5050506001600160a01b0386165f908152609a602052604090209084900390555b6001600160a01b03841661332757609980548490039055613345565b6001600160a01b0384165f908152609a602052604090208054840190555b836001600160a01b0316856001600160a01b0316336001600160a01b03167f3997e418d2cef0b3b0e907b1e39605c3f7d32dbd061e82ea5b4a770d46a160a68686866040516120b393929190615137565b6111da827f429ac7a06903dbc9c13dfcb3c9d11df8194581fa047c96d7a4171fc7402958ea836130f8565b6133eb7fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee305f611ea2565b6133f481613b0e565b5f61341e7fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee3061180c565b90505f5b8151811015610dc9575f82828151811061343e5761343e614d1e565b60200260200101519050836001600160a01b0316816001600160a01b0316036134675750613493565b6134917fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee3082612176565b505b600101613422565b6134a784848484613b41565b61110b84848484613ba5565b6134dd837f6bb56a1400000000000000000000000000000000000000000000000000000000613a28565b15613549576040517f6bb56a140000000000000000000000000000000000000000000000000000000081526001600160a01b03841690636bb56a1490613177907f20804611b3e2ea21c480dc465142210acf4a2485947541770ec1fb87dee4a55c9085906004016150aa565b81610dc9576001600160a01b0383163b1561359b576040517fa608fbb60000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610387565b6040517f26c247f40000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610387565b5f825f0182815481106135ed576135ed614d1e565b905f5260205f200154905092915050565b6001600160a01b0381165f90815260018301602052604081205415156117b0565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fa918fa6b000000000000000000000000000000000000000000000000000000001480610c035750610c0382613bed565b5f8061369f7f01ffc9a700000000000000000000000000000000000000000000000000000000611c38565b5090506001600160a01b0381166136b857505f92915050565b6117b08184613a28565b5f54610100900460ff16613758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b61376182613c83565b6137c27feafec4d89fa9619884b60000a4d96624a38f7ac2d8d9a604ecf07c12c77e480c5f1b6040518060400160405280600481526020017fa4d9662400000000000000000000000000000000000000000000000000000000815250612668565b6137ec7fdeba1e292f8ba88238e10ab3c7f88bd4be4fac56cad5194b6ecceaf653468af185612668565b6138167f2f0a68ab07768e01943a599e73362a0e17a63a72e94dd2e384d2c1d4db93275684612668565b604080516020810183905261110b917fe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb39101604051602081830303815290604052612668565b6001600160a01b03841661389c576040517fd2d5ec3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138a95f85858585613245565b6138b65f85858585613252565b6138c35f85858585611109565b5f335f8686856040516020016138dd959493929190614e7d565b60405160208183030381529060405290506111098584836134b3565b5f81815260018301602052604081205461393e57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610c03565b505f610c03565b5f8181526001830160205260408120548015613a1f575f613967600183614e6a565b85549091505f9061397a90600190614e6a565b90508181146139d9575f865f01828154811061399857613998614d1e565b905f5260205f200154905080875f0184815481106139b8576139b8614d1e565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806139ea576139ea615157565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610c03565b5f915050610c03565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a70000000000000000000000000000000000000000000000000000000017815282515f9392849283928392918391908a617530fa92503d91505f519050828015613ade575060208210155b8015613ae957505f81115b979650505050505050565b613b018585858585613d62565b6111098585858585613d7c565b613b387fb4b3a36d7c2b72add3151898671aaed843238e580f7d6d4bc5077ce2023b06595f611ea2565b611b1281613d96565b613b496112c8565b1580613b6f5750613b586112c8565b83613b6260995490565b613b6c9190614cdb565b11155b61110b576040517feacbf0d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60cf5460ff16613be1576040517fe633442100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61110b8484848461385c565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f629aa694000000000000000000000000000000000000000000000000000000001480610c0357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610c03565b5f54610100900460ff16613d19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b6001600160a01b038116613d59576040517f1ad8836c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b1281613dc9565b613d6b84613e32565b611109576111098585858585613f01565b613d898585858585613f8e565b6111098585858585611109565b613dc07f975773d1e0a917a74b57f36a377f439ffff6271648aebdbff75a52ab58eb7bad5f611ea2565b611b1281613fa8565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f80357fffffffff00000000000000000000000000000000000000000000000000000000167ff5fb0b0c00000000000000000000000000000000000000000000000000000000148015613e8857506101975460ff165b8015613eb95750613eb97fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee30336117b7565b8015610c0357506033546001600160a01b0383811691161480610c035750610c037fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee30836117b7565b6001600160a01b0385161580613f1e57506001600160a01b038416155b61110957613f4c7fb4b3a36d7c2b72add3151898671aaed843238e580f7d6d4bc5077ce2023b0659866117b7565b61110957613f58610dce565b611109576040517f2077e68600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613f9784613e32565b611109576111098585858585613fdb565b613fd27f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a65f611ea2565b611b1281614108565b836001600160a01b0316856001600160a01b03160315611109576001600160a01b038416158061401557506001600160a01b03841661dead145b611109576140437f975773d1e0a917a74b57f36a377f439ffff6271648aebdbff75a52ab58eb7bad856117b7565b611109575f6140526101335490565b905080151580614063575050611109565b8185614083886001600160a01b03165f908152609a602052604090205490565b61408d9190614cdb565b111586866140af896001600160a01b03165f908152609a602052604090205490565b8590919293611e8b576040517f8eb9dd520000000000000000000000000000000000000000000000000000000081526001600160a01b039094166004850152602484019290925260448301526064820152608401610387565b5f61411b6033546001600160a01b031690565b905061412682613dc9565b6001600160a01b0381165f908152609f60205260408120614146906120ed565b90505f5b815181101561110b575f82828151811061416657614166614d1e565b6020026020010151905061417a8185612176565b6001600160a01b038516156141935761419381866120f9565b5060010161414a565b60208152816020820152818360408301375f818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b5f602082840312156141f8575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146117b0575f5ffd5b5f5f83601f840112614237575f5ffd5b50813567ffffffffffffffff81111561424e575f5ffd5b602083019150836020828501011115614265575f5ffd5b9250929050565b80356001600160a01b0381168114614282575f5ffd5b919050565b80358015158114614282575f5ffd5b5f60408284031215611a65575f5ffd5b5f5f5f5f5f5f5f5f5f5f5f6101808c8e0312156142c1575f5ffd5b67ffffffffffffffff8c3511156142d6575f5ffd5b6142e38d8d358e01614227565b909b50995060208c013567ffffffffffffffff811115614301575f5ffd5b61430d8e828f01614227565b909a509850614320905060408d0161426c565b965060608c0135955061433560808d01614287565b94506143448d60a08e01614296565b93506143538d60e08e01614296565b92506143638d6101208e01614296565b915060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea08d8f03011215614396575f5ffd5b6101608c0190509295989b509295989b9093969950565b5f5f604083850312156143be575f5ffd5b50508035926020909101359150565b5f602082840312156143dd575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614458576144586143e4565b604052919050565b5f67ffffffffffffffff821115614479576144796143e4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f8301126144b4575f5ffd5b81356144c76144c282614460565b614411565b8181528460208386010111156144db575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f60608486031215614509575f5ffd5b6145128461426c565b925060208401359150604084013567ffffffffffffffff811115614534575f5ffd5b614540868287016144a5565b9150509250925092565b5f67ffffffffffffffff821115614563576145636143e4565b5060051b60200190565b5f82601f83011261457c575f5ffd5b813561458a6144c28261454a565b8082825260208201915060208360051b8601019250858311156145ab575f5ffd5b602085015b838110156145cf576145c18161426c565b8352602092830192016145b0565b5095945050505050565b5f82601f8301126145e8575f5ffd5b81356145f66144c28261454a565b8082825260208201915060208360051b860101925085831115614617575f5ffd5b602085015b838110156145cf57803583526020928301920161461c565b5f82601f830112614643575f5ffd5b81356146516144c28261454a565b8082825260208201915060208360051b860101925085831115614672575f5ffd5b602085015b838110156145cf5761468881614287565b835260209283019201614677565b5f82601f8301126146a5575f5ffd5b81356146b36144c28261454a565b8082825260208201915060208360051b8601019250858311156146d4575f5ffd5b602085015b838110156145cf57803567ffffffffffffffff8111156146f7575f5ffd5b614706886020838a01016144a5565b845250602092830192016146d9565b5f5f5f5f5f60a08688031215614729575f5ffd5b853567ffffffffffffffff81111561473f575f5ffd5b61474b8882890161456d565b955050602086013567ffffffffffffffff811115614767575f5ffd5b6147738882890161456d565b945050604086013567ffffffffffffffff81111561478f575f5ffd5b61479b888289016145d9565b935050606086013567ffffffffffffffff8111156147b7575f5ffd5b6147c388828901614634565b925050608086013567ffffffffffffffff8111156147df575f5ffd5b6147eb88828901614696565b9150509295509295909350565b5f60208284031215614808575f5ffd5b6117b08261426c565b602080825282518282018190525f918401906040840190835b8181101561484857835183526020938401939092019160010161482a565b509095945050505050565b5f5f60408385031215614864575f5ffd5b823591506148746020840161426c565b90509250929050565b5f5f5f5f60808587031215614890575f5ffd5b6148998561426c565b93506148a76020860161426c565b92506148b560408601614287565b9150606085013567ffffffffffffffff8111156148d0575f5ffd5b6148dc878288016144a5565b91505092959194509250565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6117b060208301846148e8565b5f5f60408385031215614957575f5ffd5b6149608361426c565b91506148746020840161426c565b5f5f6020838503121561497f575f5ffd5b823567ffffffffffffffff811115614995575f5ffd5b8301601f810185136149a5575f5ffd5b803567ffffffffffffffff8111156149bb575f5ffd5b8560208260051b84010111156149cf575f5ffd5b6020919091019590945092505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614a54577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452614a3f8583516148e8565b94506020938401939190910190600101614a05565b50929695505050505050565b5f5f5f5f60808587031215614a73575f5ffd5b614a7c8561426c565b9350602085013592506148b560408601614287565b5f5f5f5f5f60a08688031215614aa5575f5ffd5b614aae8661426c565b9450614abc6020870161426c565b935060408601359250614ad160608701614287565b9150608086013567ffffffffffffffff811115614aec575f5ffd5b6147eb888289016144a5565b5f5f5f5f60808587031215614b0b575f5ffd5b614b148561426c565b9350614b226020860161426c565b925060408501359150606085013567ffffffffffffffff8111156148d0575f5ffd5b5f5f60408385031215614b55575f5ffd5b82359150602083013567ffffffffffffffff811115614b72575f5ffd5b614b7e858286016144a5565b9150509250929050565b5f5f60408385031215614b99575f5ffd5b823567ffffffffffffffff811115614baf575f5ffd5b614bbb858286016145d9565b925050602083013567ffffffffffffffff811115614bd7575f5ffd5b614b7e85828601614696565b602080825282518282018190525f918401906040840190835b818110156148485783516001600160a01b0316835260209384019390920191600101614bfc565b5f60208284031215614c33575f5ffd5b813567ffffffffffffffff811115614c49575f5ffd5b612826848285016145d9565b8385823760609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016919092019081526014810191909152603401919050565b5f82518060208501845e5f920191825250919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610c0357610c03614cae565b6001600160a01b0384168152826020820152606060408201525f614d1560608301846148e8565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6001600160a01b038416815260ff83166020820152606060408201525f614d1560608301846148e8565b5f5f83357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614da8575f5ffd5b83018035915067ffffffffffffffff821115614dc2575f5ffd5b602001915036819003821315614265575f5ffd5b818382375f9101908152919050565b805160208201517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000811691906014821015614e4a577fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808360140360031b1b82161692505b5050919050565b5f60208284031215614e61575f5ffd5b6117b082614287565b81810381811115610c0357610c03614cae565b6001600160a01b03861681526001600160a01b03851660208201526001600160a01b038416604082015282606082015260a060808201525f613ae960a08301846148e8565b600181811c90821680614ed657607f821691505b602082108103611a65577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b601f821115610dc957805f5260205f20601f840160051c81016020851015614f325750805b601f840160051c820191505b81811015611109575f8155600101614f3e565b815167ffffffffffffffff811115614f6b57614f6b6143e4565b614f7f81614f798454614ec2565b84614f0d565b6020601f821160018114614fd0575f8315614f9a5750848201515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178455611109565b5f848152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b8281101561501d5787850151825560209485019460019092019101614ffd565b508482101561505957868401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b60f8161c191681555b50505050600190811b01905550565b80516020808301519190811015611a65577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b16919050565b828152604060208201525f61282660408301846148e8565b5f602082840312156150d2575f5ffd5b815167ffffffffffffffff8111156150e8575f5ffd5b8201601f810184136150f8575f5ffd5b80516151066144c282614460565b81815285602083850101111561511a575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b8381528215156020820152606060408201525f614d1560608301846148e8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220835d61276b2468fec1cbc22e18385155a6681ab9b6b5444fc2901cf0f0cea4d064736f6c634300081c0033",
  "deployedBytecode": "0x608060405260043610610337575f3560e01c8063760d9bba116101af578063a3246ad3116100eb578063d547741f11610094578063e6fc60981161006e578063e6fc609814610a20578063ecff3a0c14610a36578063f2fde38b14610a50578063f5fb0b0c14610a6f576103c2565b8063d547741f146109c3578063d72fc29a146109e2578063dedff9c614610a01576103c2565b8063ca15c873116100c5578063ca15c8731461095c578063d1ca01881461097b578063d539139314610990576103c2565b8063a3246ad3146108fd578063b49506fd14610929578063c282ca7814610948576103c2565b80638fb05730116101585780639418775311610132578063941877531461088c57806397902421146108bf5780639e045773146108d2578063a217fddf146108ea576103c2565b80638fb05730146108385780639010d07c1461084e57806391d148541461086d576103c2565b80637e5cd5c1116101895780637e5cd5c1146107e05780637f23690c146107f45780638da5cb5b14610807576103c2565b8063760d9bba1461076f578063783816701461078e5780637c4acabf146107ad576103c2565b8063313ce5671161027e57806354f6127f11610227578063696fd68c11610201578063696fd68c146106f457806370a0823114610708578063715018a61461073c5780637580d92014610750576103c2565b806354f6127f1461067d57806365aeaa95146106a95780636963d438146106c8576103c2565b806345e14c461161025857806345e14c461461063157806346b45af71461065057806352058d8a14610669576103c2565b8063313ce567146105cd57806336568abe146105f357806344d1718714610612576103c2565b8063248a9ca3116102e05780632de94807116102ba5780632de94807146105635780632f2ff15d1461058f57806330d0dc37146105ae576103c2565b8063248a9ca3146104fa5780632bc1da82146105255780632d7667c914610544576103c2565b806318160ddd1161031157806318160ddd146104b35780631e4e0091146104c75780632121dc75146104e6576103c2565b806301ffc9a71461041d57806312318ac41461045157806315f7163014610492576103c2565b366103c257345f03610390576040517fe5099ee30000000000000000000000000000000000000000000000000000000081526004016103879060208082526004908201525f604082015260600190565b60405180910390fd5b6040517f388f5adc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f36606082826004811015610405576040517fe5099ee300000000000000000000000000000000000000000000000000000000815260040161038792919061419c565b50506104118383610a8e565b80519350602001915050f35b348015610428575f5ffd5b5061043c6104373660046141e8565b610c09565b60405190151581526020015b60405180910390f35b34801561045c575f5ffd5b506104847fb4b3a36d7c2b72add3151898671aaed843238e580f7d6d4bc5077ce2023b065981565b604051908152602001610448565b34801561049d575f5ffd5b506104b16104ac3660046142a6565b610c13565b005b3480156104be575f5ffd5b50609954610484565b3480156104d2575f5ffd5b506104b16104e13660046143ad565b610db5565b3480156104f1575f5ffd5b5061043c610dce565b348015610505575f5ffd5b506104846105143660046143cd565b5f908152609d602052604090205490565b348015610530575f5ffd5b506104b161053f3660046144f7565b610e5c565b34801561054f575f5ffd5b506104b161055e366004614715565b610f02565b34801561056e575f5ffd5b5061058261057d3660046147f8565b611007565b6040516104489190614811565b34801561059a575f5ffd5b506104b16105a9366004614853565b61102a565b3480156105b9575f5ffd5b506104b16105c836600461487d565b61104b565b3480156105d8575f5ffd5b506105e1611111565b60405160ff9091168152602001610448565b3480156105fe575f5ffd5b506104b161060d366004614853565b611128565b34801561061d575f5ffd5b506104b161062c3660046144f7565b6111de565b34801561063c575f5ffd5b506104b161064b3660046143ad565b611204565b34801561065b575f5ffd5b5060cf5461043c9060ff1681565b348015610674575f5ffd5b506104846112c8565b348015610688575f5ffd5b5061069c6106973660046143cd565b6112e3565b6040516104489190614934565b3480156106b4575f5ffd5b506104846106c3366004614946565b6112ee565b3480156106d3575f5ffd5b506106e76106e236600461496e565b611351565b60405161044891906149df565b3480156106ff575f5ffd5b506104b161149c565b348015610713575f5ffd5b506104846107223660046147f8565b6001600160a01b03165f908152609a602052604090205490565b348015610747575f5ffd5b506104b1611543565b34801561075b575f5ffd5b506104b161076a366004614a60565b611556565b34801561077a575f5ffd5b506104b1610789366004614a91565b61158c565b348015610799575f5ffd5b506104b16107a8366004614af8565b6115b4565b3480156107b8575f5ffd5b506104847fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee3081565b3480156107eb575f5ffd5b506104b16116b7565b6104b1610802366004614b44565b61174f565b348015610812575f5ffd5b506033546001600160a01b03165b6040516001600160a01b039091168152602001610448565b348015610843575f5ffd5b506104846101665481565b348015610859575f5ffd5b506108206108683660046143ad565b611799565b348015610878575f5ffd5b5061043c610887366004614853565b6117b7565b348015610897575f5ffd5b506104847f975773d1e0a917a74b57f36a377f439ffff6271648aebdbff75a52ab58eb7bad81565b6104b16108cd366004614b88565b6117c2565b3480156108dd575f5ffd5b506101975460ff1661043c565b3480156108f5575f5ffd5b506104845f81565b348015610908575f5ffd5b5061091c6109173660046143cd565b61180c565b6040516104489190614be3565b348015610934575f5ffd5b506104b16109433660046144f7565b611825565b348015610953575f5ffd5b506104b1611864565b348015610967575f5ffd5b506104846109763660046143cd565b6118fe565b348015610986575f5ffd5b5061013354610484565b34801561099b575f5ffd5b506104847f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b3480156109ce575f5ffd5b506104b16109dd366004614853565b611914565b3480156109ed575f5ffd5b5061091c6109fc3660046147f8565b61199e565b348015610a0c575f5ffd5b506106e7610a1b366004614c23565b6119c1565b348015610a2b575f5ffd5b506104846101655481565b348015610a41575f5ffd5b506101675461043c9060ff1681565b348015610a5b575f5ffd5b506104b1610a6a3660046147f8565b611a6b565b348015610a7a575f5ffd5b506104b1610a89366004614af8565b611b15565b60605f610abd5f357fffffffff0000000000000000000000000000000000000000000000000000000016611c38565b5090507fffffffff000000000000000000000000000000000000000000000000000000005f35166001600160a01b038216610b49576040517fbb370b2b0000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000009091166004820152602401610387565b505f5f826001600160a01b03163487873334604051602001610b6e9493929190614c55565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052610ba691614c98565b5f6040518083038185875af1925050503d805f8114610be0576040519150601f19603f3d011682016040523d82523d5f602084013e610be5565b606091505b50915091508115610bfa579250610c03915050565b80518060208301fd5b92915050565b5f610c0382611cf6565b5f54610100900460ff1615808015610c3157505f54600160ff909116105b80610c4a5750303b158015610c4a57505f5460ff166001145b610cd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610387565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610d32575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610d458c8c8c8c8c8c8c8c8c8c8c611d0f565b8015610da7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b5f610dbf81611e98565b610dc98383611ea2565b505050565b610167545f9060ff16610de15750600190565b6101655461016654901580159115159082610dfa575080155b15610e085760019250505090565b81158015610e135750805b15610e25574261016654109250505090565b818015610e30575080155b15610e42574261016554119250505090565b42610165541180610e5557504261016654105b9250505090565b5f610e6784336112ee565b90508381610ead576040517fcba6e9770000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610387565b505f610eb98483614cdb565b9050610ec9338683600187611f20565b5f338285604051602001610edf93929190614cee565b6040516020818303038152906040529050610efa86826120c2565b505050505050565b8451845181148015610f145750835181145b8015610f205750825181145b8015610f2c5750815181145b610f62576040517f263eee8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b81811015610ffe57610ff6878281518110610f8157610f81614d1e565b6020026020010151878381518110610f9b57610f9b614d1e565b6020026020010151878481518110610fb557610fb5614d1e565b6020026020010151878581518110610fcf57610fcf614d1e565b6020026020010151878681518110610fe957610fe9614d1e565b602002602001015161158c565b600101610f64565b50505050505050565b6001600160a01b0381165f908152609f60205260409020606090610c03906120ed565b5f828152609d602052604090205461104181611e98565b610dc983836120f9565b336001600160a01b038416148061106a5750336001600160a01b038516145b3384869091926110c2576040517f1a525b320000000000000000000000000000000000000000000000000000000081526001600160a01b03938416600482015291831660248301529091166044820152606401610387565b5050506110d283855f8585611f20565b811561110b575f835f836040516020016110ee93929190614d4b565b604051602081830303815290604052905061110985826120c2565b505b50505050565b6098545f9060ff166111235750601290565b505f90565b6001600160a01b038116331461116a576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8115801561118257506033546001600160a01b031633145b15338390916111ce576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301526024820152604401610387565b50506111da8233612176565b5050565b336001600160a01b038416146111f9576111f93384846121f3565b610dc98383836122a0565b61120c61233c565b6101675460ff16611249576040517f2561c3fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015806112565750818110155b61128c576040517fd41cc2a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610165829055610166819055604051819083907f938e6c55d25d181f86d200da26970f962ec97adb02dfa0452811fb9073573ebe905f90a35050565b60cf545f9060ff166112db575060995490565b506101015490565b6060610c03826123b0565b5f826001600160a01b0316826001600160a01b03160361132657506001600160a01b0381165f908152609a6020526040902054610c03565b506001600160a01b038082165f908152609c6020908152604080832093861683529290522054610c03565b60608167ffffffffffffffff81111561136c5761136c6143e4565b60405190808252806020026020018201604052801561139f57816020015b606081526020019060019003908161138a5790505b5090505f5b82811015611495575f80308686858181106113c1576113c1614d1e565b90506020028101906113d39190614d75565b6040516113e1929190614dd6565b5f60405180830381855af49150503d805f8114611419576040519150601f19603f3d011682016040523d82523d5f602084013e61141e565b606091505b50915091508161146d578051156114385780518082602001fd5b6040517fb774c28400000000000000000000000000000000000000000000000000000000815260048101849052602401610387565b8084848151811061148057611480614d1e565b602090810291909101015250506001016113a4565b5092915050565b6114a461233c565b6101675460ff166114e1576040517fc99ae81400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61016780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555f61016581905561016681905560405181907f938e6c55d25d181f86d200da26970f962ec97adb02dfa0452811fb9073573ebe908290a3565b61154b61233c565b6115545f61244f565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661158081611e98565b61110985858585612458565b336001600160a01b038616146115a7576115a73386856121f3565b61110985858585856124a0565b336001600160a01b03841614806115d35750336001600160a01b038516145b33848690919261162b576040517f98ce29450000000000000000000000000000000000000000000000000000000081526001600160a01b03938416600482015291831660248301529091166044820152606401610387565b5050505f61163985856112ee565b905082811015611675576040517f0ef76c3500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828103611686858783600187611f20565b5f85828560405160200161169c93929190614cee565b6040516020818303038152906040529050610ffe87826120c2565b6116bf61233c565b60cf5460ff166116fb576040517fe633442100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60cf80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040515f907f41f386d449eec03c1c3b75bbba9c18df70aa19779ff47f68eab4b6a66fb399d4908290a2565b61175761233c565b341561178f576040517ff36ba73700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111da828261255d565b5f828152609e602052604081206117b090836126bc565b9392505050565b5f6117b083836126c7565b6117ca61233c565b3415611802576040517ff36ba73700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111da82826126de565b5f818152609e60205260409020606090610c03906120ed565b611833338484600185611f20565b5f33838360405160200161184993929190614cee565b604051602081830303815290604052905061110b84826120c2565b61186c61233c565b6101975460ff166118a9576040517f3aeb5e9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61019780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040515f907f67e25b3c9018f015458c04997debf5769d7c1727a0918c43acfe4daf80ac7017908290a2565b5f818152609e60205260408120610c03906127a2565b5f828152609d602052604090205461192b81611e98565b8215801561194657506033546001600160a01b038381169116145b1582849091611992576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301526024820152604401610387565b5050610dc98383612176565b6001600160a01b0381165f908152609b60205260409020606090610c03906120ed565b6060815167ffffffffffffffff8111156119dd576119dd6143e4565b604051908082528060200260200182016040528015611a1057816020015b60608152602001906001900390816119fb5790505b5090505f5b8251811015611a6557611a40838281518110611a3357611a33614d1e565b60200260200101516123b0565b828281518110611a5257611a52614d1e565b6020908102919091010152600101611a15565b50919050565b611a7361233c565b6001600160a01b038116611b09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610387565b611b128161244f565b50565b7fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee30611b3f81611e98565b6101975460ff16611b7c576040517f3aeb5e9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6033546001600160a01b0385811691161480611bbd5750611bbd7fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee30856117b7565b84907fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee3090611c28576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301526024820152604401610387565b50506111098585856001866124a0565b5f8080611c877fcee78b4094da86011096000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000086166127ab565b90505f611c93826123b0565b9050805160141480611ca457508051155b8190611cdd576040517f42bfe79f0000000000000000000000000000000000000000000000000000000081526004016103879190614934565b50611ce781614de5565b60601c95600195509350505050565b5f611d008261282e565b80610c035750610c0382612911565b5f54610100900460ff16611da5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b611e1b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c90819084018382808284375f920191909152508c92508b91508a9050612975565b611e23612a4c565b611e38611e336020860186614e51565b612afd565b611e458360200135612c26565b611e4f8335612cc2565b611e5e82356020840135612d9a565b611e73611e6e6020830183614e51565b612f0d565b602084013515611e8b57611e8b87856020013561300f565b5050505050505050505050565b611b12813361307b565b81611ed9576040517fd0dc904b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f828152609d6020526040808220805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6001600160a01b038416611f60576040517f6355e76600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b0316846001600160a01b031603611fab576040517fdab7504700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038086165f908152609c60209081526040808320938816835292905220839055821561204b576001600160a01b0385165f908152609b60205260409020611ff990856130d0565b5082856001600160a01b0316856001600160a01b03167ff772a43bfdf4729b196e3fb54a818b91a2ca6c49d10b2e16278752f9f515c25d8460405161203e9190614934565b60405180910390a4611109565b6001600160a01b0385165f908152609b6020526040902061206c90856130e4565b50811515856001600160a01b0316856001600160a01b03167f0ebf5762d8855cbe012d2ca42fb33a81175e17c8a8751f8859931ba453bd4167846040516120b39190614934565b60405180910390a45050505050565b6111da827f386072cc5a58e61263b434c722725f21031cd06e7c552cfaa06db5de8a320dbc836130f8565b60605f6117b0836131d7565b5f828152609e6020526040812061211090836130d0565b90508015610dc9576001600160a01b0382165f908152609f60205260409020612139908461322f565b5060405133906001600160a01b0384169085907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a4505050565b5f828152609e6020526040812061218d90836130e4565b90508015610dc9576001600160a01b0382165f908152609f602052604090206121b6908461323a565b5060405133906001600160a01b0384169085907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a4505050565b6001600160a01b038083165f908152609c602090815260408083209387168352929052205480158061222457508082115b1561227c576040517ff3a6b6910000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152602482018390528516604482015260648101839052608401610387565b61110b838561228b8585614e6a565b5f60405180602001604052805f815250611f20565b6001600160a01b0383166122e0576040517fd2d5ec3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122ed835f845f85613245565b6122fa835f845f85613252565b612307835f845f85611109565b5f33845f8585604051602001612321959493929190614e7d565b604051602081830303815290604052905061110b8482613396565b6033546001600160a01b03163314611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610387565b5f8181526097602052604090208054606091906123cc90614ec2565b80601f01602080910402602001604051908101604052809291908181526020018280546123f890614ec2565b80156124435780601f1061241a57610100808354040283529160200191612443565b820191905f5260205f20905b81548152906001019060200180831161242657829003601f168201915b50505050509050919050565b611b12816133c1565b60cf5460ff16612494576040517fe633442100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61110b8484848461349b565b6001600160a01b038516158015906124c057506001600160a01b03841615155b6124f6576040517fd2d5ec3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125038585858585613245565b6125108585858585613252565b61251d8585858585611109565b5f3386868685604051602001612537959493929190614e7d565b60405160208183030381529060405290506125528682613396565b610efa8584836134b3565b7f2145e1d6d074577dc71ef54c3807742b41b053a9352ae6b491331509acb9750f82016125b6576040517f85c169bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fd0f59754f88971fe6bc5a6618cc9d5f1e859c58d16b22d1c7b2d3e2b246cd8aa820161260f576040517f76755b3800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f1fd9e056a24d14c4abc642fcc325992a946906d0dbc57dd70278aaf12842024d8201612668576040517f4ef6d7fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815260976020526040902061267f8282614f51565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2826040516126b09190614934565b60405180910390a25050565b5f6117b083836135d8565b5f828152609e602052604081206117b090836135fe565b8051825114612719576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81515f03612753576040517f97da5f9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8251811015610dc95761279a83828151811061277357612773614d1e565b602002602001015183838151811061278d5761278d614d1e565b602002602001015161255d565b600101612755565b5f610c03825490565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201525f602a82018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008416602c8301529182910160405160208183030381529060405290508061282690615068565b949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806128c057507fffffffff0000000000000000000000000000000000000000000000000000000082167f5a05180f00000000000000000000000000000000000000000000000000000000145b80610c0357507fffffffff0000000000000000000000000000000000000000000000000000000082167f90832245000000000000000000000000000000000000000000000000000000001492915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fc52d600800000000000000000000000000000000000000000000000000000000148061296657506129668261361f565b80610c035750610c0382613674565b5f54610100900460ff16612a0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b612a17858585856136c2565b609880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905550505050565b5f54610100900460ff16612ae2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b6115545f612af86033546001600160a01b031690565b6120f9565b5f54610100900460ff16612b93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b60cf80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040517f41f386d449eec03c1c3b75bbba9c18df70aa19779ff47f68eab4b6a66fb399d4905f90a28015611b1257611b127f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6612af86033546001600160a01b031690565b5f54610100900460ff16612cbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b61010155565b5f54610100900460ff16612d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b6101338190558015611b1257611b127f975773d1e0a917a74b57f36a377f439ffff6271648aebdbff75a52ab58eb7bad612af86033546001600160a01b031690565b5f54610100900460ff16612e30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b801580612e3d5750818110155b612e73576040517fd41cc2a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61016582905561016681905561016780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055604051819083907f938e6c55d25d181f86d200da26970f962ec97adb02dfa0452811fb9073573ebe905f90a36111da7fb4b3a36d7c2b72add3151898671aaed843238e580f7d6d4bc5077ce2023b0659612af86033546001600160a01b031690565b5f54610100900460ff16612fa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b61019780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215801591909117909155611b1257611b127fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee30612af86033546001600160a01b031690565b5f61301a6101015490565b905080821181158061302a575080155b613060576040517feacbf0d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61110b8484600160405180602001604052805f81525061385c565b61308582826126c7565b8183909161110b576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301526024820152604401610387565b5f6117b0836001600160a01b0384166138f9565b5f6117b0836001600160a01b038416613945565b61312b6001600160a01b0384167f6bb56a1400000000000000000000000000000000000000000000000000000000613a28565b15610dc9576040517f6bb56a140000000000000000000000000000000000000000000000000000000081526001600160a01b03841690636bb56a149061317790859085906004016150aa565b5f604051808303815f875af1158015613192573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261110b91908101906150c2565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561244357602002820191905f5260205f20905b8154815260200190600101908083116132105750505050509050919050565b5f6117b083836138f9565b5f6117b08383613945565b6111098585858585613af4565b6001600160a01b03851661327c578260995f8282546132719190614cdb565b9091555061330b9050565b6001600160a01b0385165f908152609a6020526040902054808685808310156132ea576040517f08d4794900000000000000000000000000000000000000000000000000000000815260048101939093526001600160a01b0390911660248301526044820152606401610387565b5050506001600160a01b0386165f908152609a602052604090209084900390555b6001600160a01b03841661332757609980548490039055613345565b6001600160a01b0384165f908152609a602052604090208054840190555b836001600160a01b0316856001600160a01b0316336001600160a01b03167f3997e418d2cef0b3b0e907b1e39605c3f7d32dbd061e82ea5b4a770d46a160a68686866040516120b393929190615137565b6111da827f429ac7a06903dbc9c13dfcb3c9d11df8194581fa047c96d7a4171fc7402958ea836130f8565b6133eb7fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee305f611ea2565b6133f481613b0e565b5f61341e7fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee3061180c565b90505f5b8151811015610dc9575f82828151811061343e5761343e614d1e565b60200260200101519050836001600160a01b0316816001600160a01b0316036134675750613493565b6134917fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee3082612176565b505b600101613422565b6134a784848484613b41565b61110b84848484613ba5565b6134dd837f6bb56a1400000000000000000000000000000000000000000000000000000000613a28565b15613549576040517f6bb56a140000000000000000000000000000000000000000000000000000000081526001600160a01b03841690636bb56a1490613177907f20804611b3e2ea21c480dc465142210acf4a2485947541770ec1fb87dee4a55c9085906004016150aa565b81610dc9576001600160a01b0383163b1561359b576040517fa608fbb60000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610387565b6040517f26c247f40000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610387565b5f825f0182815481106135ed576135ed614d1e565b905f5260205f200154905092915050565b6001600160a01b0381165f90815260018301602052604081205415156117b0565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fa918fa6b000000000000000000000000000000000000000000000000000000001480610c035750610c0382613bed565b5f8061369f7f01ffc9a700000000000000000000000000000000000000000000000000000000611c38565b5090506001600160a01b0381166136b857505f92915050565b6117b08184613a28565b5f54610100900460ff16613758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b61376182613c83565b6137c27feafec4d89fa9619884b60000a4d96624a38f7ac2d8d9a604ecf07c12c77e480c5f1b6040518060400160405280600481526020017fa4d9662400000000000000000000000000000000000000000000000000000000815250612668565b6137ec7fdeba1e292f8ba88238e10ab3c7f88bd4be4fac56cad5194b6ecceaf653468af185612668565b6138167f2f0a68ab07768e01943a599e73362a0e17a63a72e94dd2e384d2c1d4db93275684612668565b604080516020810183905261110b917fe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb39101604051602081830303815290604052612668565b6001600160a01b03841661389c576040517fd2d5ec3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138a95f85858585613245565b6138b65f85858585613252565b6138c35f85858585611109565b5f335f8686856040516020016138dd959493929190614e7d565b60405160208183030381529060405290506111098584836134b3565b5f81815260018301602052604081205461393e57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610c03565b505f610c03565b5f8181526001830160205260408120548015613a1f575f613967600183614e6a565b85549091505f9061397a90600190614e6a565b90508181146139d9575f865f01828154811061399857613998614d1e565b905f5260205f200154905080875f0184815481106139b8576139b8614d1e565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806139ea576139ea615157565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610c03565b5f915050610c03565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a70000000000000000000000000000000000000000000000000000000017815282515f9392849283928392918391908a617530fa92503d91505f519050828015613ade575060208210155b8015613ae957505f81115b979650505050505050565b613b018585858585613d62565b6111098585858585613d7c565b613b387fb4b3a36d7c2b72add3151898671aaed843238e580f7d6d4bc5077ce2023b06595f611ea2565b611b1281613d96565b613b496112c8565b1580613b6f5750613b586112c8565b83613b6260995490565b613b6c9190614cdb565b11155b61110b576040517feacbf0d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60cf5460ff16613be1576040517fe633442100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61110b8484848461385c565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f629aa694000000000000000000000000000000000000000000000000000000001480610c0357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610c03565b5f54610100900460ff16613d19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610387565b6001600160a01b038116613d59576040517f1ad8836c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b1281613dc9565b613d6b84613e32565b611109576111098585858585613f01565b613d898585858585613f8e565b6111098585858585611109565b613dc07f975773d1e0a917a74b57f36a377f439ffff6271648aebdbff75a52ab58eb7bad5f611ea2565b611b1281613fa8565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f80357fffffffff00000000000000000000000000000000000000000000000000000000167ff5fb0b0c00000000000000000000000000000000000000000000000000000000148015613e8857506101975460ff165b8015613eb95750613eb97fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee30336117b7565b8015610c0357506033546001600160a01b0383811691161480610c035750610c037fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee30836117b7565b6001600160a01b0385161580613f1e57506001600160a01b038416155b61110957613f4c7fb4b3a36d7c2b72add3151898671aaed843238e580f7d6d4bc5077ce2023b0659866117b7565b61110957613f58610dce565b611109576040517f2077e68600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613f9784613e32565b611109576111098585858585613fdb565b613fd27f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a65f611ea2565b611b1281614108565b836001600160a01b0316856001600160a01b03160315611109576001600160a01b038416158061401557506001600160a01b03841661dead145b611109576140437f975773d1e0a917a74b57f36a377f439ffff6271648aebdbff75a52ab58eb7bad856117b7565b611109575f6140526101335490565b905080151580614063575050611109565b8185614083886001600160a01b03165f908152609a602052604090205490565b61408d9190614cdb565b111586866140af896001600160a01b03165f908152609a602052604090205490565b8590919293611e8b576040517f8eb9dd520000000000000000000000000000000000000000000000000000000081526001600160a01b039094166004850152602484019290925260448301526064820152608401610387565b5f61411b6033546001600160a01b031690565b905061412682613dc9565b6001600160a01b0381165f908152609f60205260408120614146906120ed565b90505f5b815181101561110b575f82828151811061416657614166614d1e565b6020026020010151905061417a8185612176565b6001600160a01b038516156141935761419381866120f9565b5060010161414a565b60208152816020820152818360408301375f818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b5f602082840312156141f8575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146117b0575f5ffd5b5f5f83601f840112614237575f5ffd5b50813567ffffffffffffffff81111561424e575f5ffd5b602083019150836020828501011115614265575f5ffd5b9250929050565b80356001600160a01b0381168114614282575f5ffd5b919050565b80358015158114614282575f5ffd5b5f60408284031215611a65575f5ffd5b5f5f5f5f5f5f5f5f5f5f5f6101808c8e0312156142c1575f5ffd5b67ffffffffffffffff8c3511156142d6575f5ffd5b6142e38d8d358e01614227565b909b50995060208c013567ffffffffffffffff811115614301575f5ffd5b61430d8e828f01614227565b909a509850614320905060408d0161426c565b965060608c0135955061433560808d01614287565b94506143448d60a08e01614296565b93506143538d60e08e01614296565b92506143638d6101208e01614296565b915060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea08d8f03011215614396575f5ffd5b6101608c0190509295989b509295989b9093969950565b5f5f604083850312156143be575f5ffd5b50508035926020909101359150565b5f602082840312156143dd575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614458576144586143e4565b604052919050565b5f67ffffffffffffffff821115614479576144796143e4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f8301126144b4575f5ffd5b81356144c76144c282614460565b614411565b8181528460208386010111156144db575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f60608486031215614509575f5ffd5b6145128461426c565b925060208401359150604084013567ffffffffffffffff811115614534575f5ffd5b614540868287016144a5565b9150509250925092565b5f67ffffffffffffffff821115614563576145636143e4565b5060051b60200190565b5f82601f83011261457c575f5ffd5b813561458a6144c28261454a565b8082825260208201915060208360051b8601019250858311156145ab575f5ffd5b602085015b838110156145cf576145c18161426c565b8352602092830192016145b0565b5095945050505050565b5f82601f8301126145e8575f5ffd5b81356145f66144c28261454a565b8082825260208201915060208360051b860101925085831115614617575f5ffd5b602085015b838110156145cf57803583526020928301920161461c565b5f82601f830112614643575f5ffd5b81356146516144c28261454a565b8082825260208201915060208360051b860101925085831115614672575f5ffd5b602085015b838110156145cf5761468881614287565b835260209283019201614677565b5f82601f8301126146a5575f5ffd5b81356146b36144c28261454a565b8082825260208201915060208360051b8601019250858311156146d4575f5ffd5b602085015b838110156145cf57803567ffffffffffffffff8111156146f7575f5ffd5b614706886020838a01016144a5565b845250602092830192016146d9565b5f5f5f5f5f60a08688031215614729575f5ffd5b853567ffffffffffffffff81111561473f575f5ffd5b61474b8882890161456d565b955050602086013567ffffffffffffffff811115614767575f5ffd5b6147738882890161456d565b945050604086013567ffffffffffffffff81111561478f575f5ffd5b61479b888289016145d9565b935050606086013567ffffffffffffffff8111156147b7575f5ffd5b6147c388828901614634565b925050608086013567ffffffffffffffff8111156147df575f5ffd5b6147eb88828901614696565b9150509295509295909350565b5f60208284031215614808575f5ffd5b6117b08261426c565b602080825282518282018190525f918401906040840190835b8181101561484857835183526020938401939092019160010161482a565b509095945050505050565b5f5f60408385031215614864575f5ffd5b823591506148746020840161426c565b90509250929050565b5f5f5f5f60808587031215614890575f5ffd5b6148998561426c565b93506148a76020860161426c565b92506148b560408601614287565b9150606085013567ffffffffffffffff8111156148d0575f5ffd5b6148dc878288016144a5565b91505092959194509250565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6117b060208301846148e8565b5f5f60408385031215614957575f5ffd5b6149608361426c565b91506148746020840161426c565b5f5f6020838503121561497f575f5ffd5b823567ffffffffffffffff811115614995575f5ffd5b8301601f810185136149a5575f5ffd5b803567ffffffffffffffff8111156149bb575f5ffd5b8560208260051b84010111156149cf575f5ffd5b6020919091019590945092505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614a54577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452614a3f8583516148e8565b94506020938401939190910190600101614a05565b50929695505050505050565b5f5f5f5f60808587031215614a73575f5ffd5b614a7c8561426c565b9350602085013592506148b560408601614287565b5f5f5f5f5f60a08688031215614aa5575f5ffd5b614aae8661426c565b9450614abc6020870161426c565b935060408601359250614ad160608701614287565b9150608086013567ffffffffffffffff811115614aec575f5ffd5b6147eb888289016144a5565b5f5f5f5f60808587031215614b0b575f5ffd5b614b148561426c565b9350614b226020860161426c565b925060408501359150606085013567ffffffffffffffff8111156148d0575f5ffd5b5f5f60408385031215614b55575f5ffd5b82359150602083013567ffffffffffffffff811115614b72575f5ffd5b614b7e858286016144a5565b9150509250929050565b5f5f60408385031215614b99575f5ffd5b823567ffffffffffffffff811115614baf575f5ffd5b614bbb858286016145d9565b925050602083013567ffffffffffffffff811115614bd7575f5ffd5b614b7e85828601614696565b602080825282518282018190525f918401906040840190835b818110156148485783516001600160a01b0316835260209384019390920191600101614bfc565b5f60208284031215614c33575f5ffd5b813567ffffffffffffffff811115614c49575f5ffd5b612826848285016145d9565b8385823760609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016919092019081526014810191909152603401919050565b5f82518060208501845e5f920191825250919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610c0357610c03614cae565b6001600160a01b0384168152826020820152606060408201525f614d1560608301846148e8565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6001600160a01b038416815260ff83166020820152606060408201525f614d1560608301846148e8565b5f5f83357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614da8575f5ffd5b83018035915067ffffffffffffffff821115614dc2575f5ffd5b602001915036819003821315614265575f5ffd5b818382375f9101908152919050565b805160208201517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000811691906014821015614e4a577fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808360140360031b1b82161692505b5050919050565b5f60208284031215614e61575f5ffd5b6117b082614287565b81810381811115610c0357610c03614cae565b6001600160a01b03861681526001600160a01b03851660208201526001600160a01b038416604082015282606082015260a060808201525f613ae960a08301846148e8565b600181811c90821680614ed657607f821691505b602082108103611a65577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b601f821115610dc957805f5260205f20601f840160051c81016020851015614f325750805b601f840160051c820191505b81811015611109575f8155600101614f3e565b815167ffffffffffffffff811115614f6b57614f6b6143e4565b614f7f81614f798454614ec2565b84614f0d565b6020601f821160018114614fd0575f8315614f9a5750848201515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178455611109565b5f848152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b8281101561501d5787850151825560209485019460019092019101614ffd565b508482101561505957868401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b60f8161c191681555b50505050600190811b01905550565b80516020808301519190811015611a65577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b16919050565b828152604060208201525f61282660408301846148e8565b5f602082840312156150d2575f5ffd5b815167ffffffffffffffff8111156150e8575f5ffd5b8201601f810184136150f8575f5ffd5b80516151066144c282614460565b81815285602083850101111561511a575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b8381528215156020820152606060408201525f614d1560608301846148e8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220835d61276b2468fec1cbc22e18385155a6681ab9b6b5444fc2901cf0f0cea4d064736f6c634300081c0033",
  "linkReferences": {},
  "deployedLinkReferences": {},
  "immutableReferences": {},
  "inputSourceName": "project/contracts/presets/LSP7CustomizableTokenInit.sol",
  "buildInfoId": "solc-0_8_28-02f211569dac97f8d48f774b05c17d2fd78020fb"
}