{
  "_format": "hh-sol-artifact-1",
  "contractName": "AdvancedERC20",
  "sourceName": "contracts/token/AdvancedERC20.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "contractOwner",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "_name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "_symbol",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "initialHolder",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "initialSupply",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "initialFeatures",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "AccessDenied",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "oldValue",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "authorizer",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "nonce",
          "type": "bytes32"
        }
      ],
      "name": "AuthorizationCanceled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "authorizer",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "nonce",
          "type": "bytes32"
        }
      ],
      "name": "AuthorizationUsed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "by",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Burnt",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "source",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "DelegateChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "version",
          "type": "uint8"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "by",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Minted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "by",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "requested",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "assigned",
          "type": "uint256"
        }
      ],
      "name": "RoleUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "by",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "by",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "fromVal",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "toVal",
          "type": "uint256"
        }
      ],
      "name": "VotingPowerChanged",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "CANCEL_AUTHORIZATION_TYPEHASH",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "DELEGATION_TYPEHASH",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "DOMAIN_SEPARATOR",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "DOMAIN_TYPEHASH",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FEATURE_BURNS_ON_BEHALF",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FEATURE_DELEGATIONS",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FEATURE_DELEGATIONS_ON_BEHALF",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FEATURE_EIP2612_PERMITS",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FEATURE_EIP3009_RECEPTIONS",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FEATURE_EIP3009_TRANSFERS",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FEATURE_ERC1363_APPROVALS",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FEATURE_ERC1363_TRANSFERS",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FEATURE_OWN_BURNS",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FEATURE_TRANSFERS",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FEATURE_TRANSFERS_ON_BEHALF",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FEATURE_UNSAFE_TRANSFERS",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "PERMIT_TYPEHASH",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "RECEIVE_WITH_AUTHORIZATION_TYPEHASH",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ROLE_ACCESS_MANAGER",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ROLE_ERC20_RECEIVER",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ROLE_ERC20_SENDER",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ROLE_TOKEN_CREATOR",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ROLE_TOKEN_DESTROYER",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ROLE_UPGRADE_MANAGER",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "TRANSFER_WITH_AUTHORIZATION_TYPEHASH",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "remaining",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "approveAndCall",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "approveAndCall",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "authorizer",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "nonce",
          "type": "bytes32"
        }
      ],
      "name": "authorizationState",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "balance",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "burn",
      "outputs": [
        {
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "authorizer",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "nonce",
          "type": "bytes32"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "cancelAuthorization",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "decreaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "delegate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "nonce",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "exp",
          "type": "uint256"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "delegateWithAuthorization",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "entireSupplyHistory",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint64",
              "name": "k",
              "type": "uint64"
            },
            {
              "internalType": "uint192",
              "name": "v",
              "type": "uint192"
            }
          ],
          "internalType": "struct AdvancedERC20.KV[]",
          "name": "",
          "type": "tuple[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "features",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getInitializedVersion",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "getRole",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "increaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "mint",
      "outputs": [
        {
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "mintAndCall",
      "outputs": [
        {
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "mintAndCall",
      "outputs": [
        {
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "nonces",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "exp",
          "type": "uint256"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "permit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "contractOwner",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "_name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "_symbol",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "initialHolder",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "initialSupply",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "initialFeatures",
          "type": "uint256"
        }
      ],
      "name": "postConstruct",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "validAfter",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "validBefore",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "nonce",
          "type": "bytes32"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "receiveWithAuthorization",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "safeMint",
      "outputs": [
        {
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "blockNum",
          "type": "uint256"
        }
      ],
      "name": "totalSupplyAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "totalSupplyHistory",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "k",
          "type": "uint64"
        },
        {
          "internalType": "uint192",
          "name": "v",
          "type": "uint192"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupplyHistoryLength",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transferAndCall",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "transferAndCall",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "transferFromAndCall",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transferFromAndCall",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "validAfter",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "validBefore",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "nonce",
          "type": "bytes32"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "transferWithAuthorization",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "unsafeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_mask",
          "type": "uint256"
        }
      ],
      "name": "updateFeatures",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "role",
          "type": "uint256"
        }
      ],
      "name": "updateRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "votingDelegates",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "holder",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "blockNum",
          "type": "uint256"
        }
      ],
      "name": "votingPowerAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "votingPowerHistory",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "k",
          "type": "uint64"
        },
        {
          "internalType": "uint192",
          "name": "v",
          "type": "uint192"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "holder",
          "type": "address"
        }
      ],
      "name": "votingPowerHistoryLength",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "holder",
          "type": "address"
        }
      ],
      "name": "votingPowerHistoryOf",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint64",
              "name": "k",
              "type": "uint64"
            },
            {
              "internalType": "uint192",
              "name": "v",
              "type": "uint192"
            }
          ],
          "internalType": "struct AdvancedERC20.KV[]",
          "name": "",
          "type": "tuple[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "holder",
          "type": "address"
        }
      ],
      "name": "votingPowerOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b50604051614af3380380614af383398101604081905261002f91610a37565b600054610100900460ff161580801561004f5750600054600160ff909116105b806100695750303b158015610069575060005460ff166001145b6100bf5760405162461bcd60e51b815260206004820152602e6024820152600080516020614a9383398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156100e2576000805461ff0019166101001790555b8015610116576000805461ff001916905560405160018152600080516020614ab38339815191529060200160405180910390a15b50610125868686868686610130565b505050505050610c75565b600054610100900460ff16158080156101505750600054600160ff909116105b8061016a5750303b15801561016a575060005460ff166001145b6101bb5760405162461bcd60e51b815260206004820152602e6024820152600080516020614a9383398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016100b6565b6000805460ff1916600117905580156101de576000805461ff0019166101001790555b600086511161022f5760405162461bcd60e51b815260206004820152601560248201527f746f6b656e206e616d65206973206e6f7420736574000000000000000000000060448201526064016100b6565b60008551116102805760405162461bcd60e51b815260206004820152601760248201527f746f6b656e2073796d626f6c206973206e6f742073657400000000000000000060448201526064016100b6565b603361028c8782610b5f565b5060346102998682610b5f565b508215806102af57506001600160a01b03841615155b6103095760405162461bcd60e51b815260206004820152602560248201527f5f696e697469616c486f6c646572206e6f742073657420287a65726f20616464604482015264726573732960d81b60648201526084016100b6565b821561031957610319848461037b565b6001600160a01b03871615158061032f57508115155b1561033e5761033e87836105c6565b8015610372576000805461ff001916905560405160018152600080516020614ab38339815191529060200160405180910390a15b50505050505050565b6001600160a01b0382166103c05760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b60448201526064016100b6565b6035548181011161041d5760405162461bcd60e51b815260206004820152602160248201527f7a65726f2076616c7565206f722061726974686d65746963206f766572666c6f6044820152607760f81b60648201526084016100b6565b6035546001600160c01b0390610434908390610c33565b11156104825760405162461bcd60e51b815260206004820152601f60248201527f746f74616c20737570706c79206f766572666c6f77202875696e74313932290060448201526064016100b6565b80603560008282546104949190610c33565b90915550506001600160a01b038216600090815260366020526040812080548392906104c1908490610c33565b909155506104d49050603960018361065c565b50506001600160a01b038083166000908152603760205260408120546104fe9233929116846107dd565b6040518181526001600160a01b0383169033907f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f09060200160405180910390a36040518181526001600160a01b0383169060009033907fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f9060200160405180910390a46040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600054610100900460ff166106315760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016100b6565b6001600160a01b0382161561064d5761064d8260001980610906565b610658308280610906565b5050565b82546000908190156106ae578454859061067890600190610c4c565b8154811061068857610688610c5f565b6000918252602090912001546801000000000000000090046001600160c01b03166106b1565b60005b6001600160c01b03169150836106d0576106cb8383610c4c565b6106da565b6106da8383610c33565b85549091501580159061072157508454439086906106fa90600190610c4c565b8154811061070a5761070a610c5f565b6000918252602090912001546001600160401b0316145b1561077e5784548190869061073890600190610c4c565b8154811061074857610748610c5f565b9060005260206000200160000160086101000a8154816001600160c01b0302191690836001600160c01b031602179055506107d5565b604080518082019091526001600160401b0343811682526001600160c01b0380841660208085019182528954600181018b5560008b8152919091209451915190921668010000000000000000029216919091179101555b935093915050565b816001600160a01b0316836001600160a01b031614806107fb575080155b610900576001600160a01b0383161561087f576001600160a01b0383166000908152603860205260408120908061083383828661065c565b91509150856001600160a01b0316876001600160a01b0316600080516020614ad38339815191528484604051610873929190918252602082015260400190565b60405180910390a35050505b6001600160a01b03821615610900576001600160a01b038216600090815260386020526040812090806108b48360018661065c565b91509150846001600160a01b0316876001600160a01b0316600080516020614ad383398151915284846040516108f4929190918252602082015260400190565b60405180910390a35050505b50505050565b6001600160a01b038316600081815260016020908152604091829020849055815185815290810184905233917f5a10526456f5116c0b7b80582c217d666243fd51b6a2d92c8011e601c2462e5f910160405180910390a3505050565b80516001600160a01b038116811461097957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126109a557600080fd5b81516001600160401b038111156109be576109be61097e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156109ec576109ec61097e565b604052818152838201602001851015610a0457600080fd5b60005b82811015610a2357602081860181015183830182015201610a07565b506000918101602001919091529392505050565b60008060008060008060c08789031215610a5057600080fd5b610a5987610962565b60208801519096506001600160401b03811115610a7557600080fd5b610a8189828a01610994565b604089015190965090506001600160401b03811115610a9f57600080fd5b610aab89828a01610994565b945050610aba60608801610962565b608088015160a090980151969995985093969395939492505050565b600181811c90821680610aea57607f821691505b602082108103610b0a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610b5a57806000526020600020601f840160051c81016020851015610b375750805b601f840160051c820191505b81811015610b575760008155600101610b43565b50505b505050565b81516001600160401b03811115610b7857610b7861097e565b610b8c81610b868454610ad6565b84610b10565b6020601f821160018114610bc05760008315610ba85750848201515b600019600385901b1c1916600184901b178455610b57565b600084815260208120601f198516915b82811015610bf05787850151825560209485019460019092019101610bd0565b5084821015610c0e5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c4657610c46610c1d565b92915050565b81810381811115610c4657610c46610c1d565b634e487b7160e01b600052603260045260246000fd5b613e0f80610c846000396000f3fe608060405234801561001057600080fd5b506004361061043e5760003560e01c806387793f3e11610236578063b88d4fde1161013b578063d9169487116100c3578063e94a010211610087578063e94a010214610a22578063e98f5ba714610a5b578063ef55bec614610a65578063f63c2f8214610a78578063f9cf927114610a8057600080fd5b8063d91694871461097e578063dd62ed3e146109a5578063e3ee160e146109de578063e62cac76146109f1578063e7a324dc146109fb57600080fd5b8063c5ff500c1161010a578063c5ff500c14610928578063cae9ca5114610932578063d505accf14610945578063d5bb7f6714610958578063d8fbe9941461096b57600080fd5b8063b88d4fde146108e7578063bcc3f3bd146108fa578063c0d6568d1461090d578063c1d34b891461091557600080fd5b80639dc29fac116101be578063ae5b102e1161018d578063ae5b102e146108a1578063ae60bda4146108b4578063ae682e2e146108bf578063b3c65015146108ca578063b66dbdc5146108df57600080fd5b80639dc29fac14610841578063a0cc6a6814610854578063a457c2d71461087b578063a9059cbb1461088e57600080fd5b806394f4f9301161020557806394f4f930146107ed57806395d89b411461080057806397ba461114610808578063981b24d01461081b57806398de4ba31461082e57600080fd5b806387793f3e1461079f5780638832e6e3146107c85780638d4e57e6146107db5780638f6fba8c146107e557600080fd5b806339509351116103475780635c19a95c116102cf57806370a082311161029357806370a08231146107095780637815ef0c146107325780637ecebe00146107455780637f2eecc3146107655780637fd491b01461078c57600080fd5b80635c19a95c146106955780635e2dc2b7146106a857806364cb8b96146106b1578063653de620146106c65780636641d9a0146106cf57600080fd5b8063442767331161031657806344276733146106285780634721272d1461065157806350c29e371461065a57806359b961ef1461066f5780635a049a701461068257600080fd5b806339509351146105e75780633e9c5f7e146105fa5780634000aea01461060257806340c10f191461061557600080fd5b80631e0fa234116103ca5780632d4c39ea116103995780632d4c39ea1461058357806330adf81f1461058b578063313ce567146105b25780633177029f146105cc5780633644e515146105df57600080fd5b80631e0fa234146104f357806320606b701461053457806323b872dd1461055b5780632b5214161461056e57600080fd5b8063136d035f11610411578063136d035f146104a657806313873a24146104c457806318160ddd146104cc5780631993f554146104e35780631a0b04ea146104eb57600080fd5b806301ffc9a71461044357806306fdde031461046b578063095ea7b3146104805780631296ee6214610493575b600080fd5b61045661045136600461356f565b610a93565b60405190151581526020015b60405180910390f35b610473610b1b565b60405161046291906135d2565b61045661048e366004613601565b610ba9565b6104566104a1366004613601565b610bbf565b6104af61080081565b60405163ffffffff9091168152602001610462565b6104af608081565b6104d560355481565b604051908152602001610462565b6104af600481565b6104af600881565b61051c61050136600461362b565b6037602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610462565b6104d57f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b610456610569366004613646565b610bd3565b306000908152600160205260409020546104d5565b6104af604081565b6104d57f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6105ba601281565b60405160ff9091168152602001610462565b6104566105da366004613601565b610c40565b6104d5610c5c565b6104566105f5366004613601565b610cf8565b6104af602081565b61045661061036600461372d565b610da4565b610456610623366004613601565b610db2565b6104d561063636600461362b565b6001600160a01b031660009081526001602052604090205490565b6104af61020081565b61066d610668366004613783565b610e06565b005b61066d61067d366004613646565b61106d565b61066d61069036600461382e565b61107e565b61066d6106a336600461362b565b611129565b6104af61040081565b6106b961118c565b604051610462919061387c565b6104af61010081565b6106e26106dd3660046138dd565b611208565b604080516001600160401b0390931683526001600160c01b03909116602083015201610462565b6104d561071736600461362b565b6001600160a01b031660009081526036602052604090205490565b6106b961074036600461362b565b611243565b6104d561075336600461362b565b603a6020526000908152604090205481565b6104d57fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b6106e261079a366004613601565b6112d5565b6104d56107ad36600461362b565b6001600160a01b031660009081526038602052604090205490565b6104566107d636600461372d565b61131e565b6104af6201000081565b6104af600281565b6104d56107fb366004613601565b61133a565b6104736113a3565b61045661081636600461372d565b6113b0565b6104d56108293660046138dd565b6113cc565b61045661083c366004613601565b61141e565b61045661084f366004613601565b61143a565b6104d57f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b610456610889366004613601565b611892565b61045661089c366004613601565b61196f565b61066d6108af366004613601565b61197c565b6104d5600160fe1b81565b6104d5600160ff1b81565b60005460405160ff9091168152602001610462565b6039546104d5565b6104566108f53660046138f6565b61198a565b6104d561090836600461362b565b6119b0565b6104af600181565b6104566109233660046138f6565b611a23565b6104af6204000081565b61045661094036600461372d565b611a94565b61066d61095336600461395d565b611b03565b61066d6109663660046138dd565b611c52565b610456610979366004613646565b611c5c565b6104d57f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b6104d56109b33660046139c8565b6001600160a01b039182166000908152603c6020908152604080832093909416825291909152205490565b61066d6109ec3660046139fb565b611c79565b6104af6202000081565b6104d57fff41620983935eb4d4a3c7384a066ca8c1d10cef9a5eca9eb97ca735cd14a75581565b610456610a30366004613601565b6001600160a01b03919091166000908152603b60209081526040808320938352929052205460ff1690565b6104af6208000081565b61066d610a733660046139fb565b611dd4565b6104af601081565b61066d610a8e366004613a7c565b611f53565b60006001600160e01b031982166301ffc9a760e01b1480610ac457506001600160e01b031982166336372b0760e01b145b80610adf57506001600160e01b0319821663b0202a1160e01b145b80610afa57506001600160e01b03198216634ec7fbed60e11b145b80610b1557506001600160e01b03198216635ffa99dd60e11b145b92915050565b60338054610b2890613aba565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5490613aba565b8015610ba15780601f10610b7657610100808354040283529160200191610ba1565b820191906000526020600020905b815481529060010190602001808311610b8457829003601f168201915b505050505081565b6000610bb6338484612043565b50600192915050565b6000610bcc338484611c5c565b9392505050565b6000610bdf6004612154565b80610bf25750610bf28362040000612170565b80610c045750610c0462080000612192565b15610c1957610c1484848461106d565b610c36565b610c348484846040518060200160405280600081525061198a565b505b5060019392505050565b6000610bcc838360405180602001604052806000815250611a94565b604080518082018252600f81526e416476616e6365644552433230763160881b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f65218aa0cdc6725da873801e9daf9d54f230d8a515289f76c8bd31dd8648c50d81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b336000908152603c602090815260408083206001600160a01b03861684529091528120548281018110610d8e5760405162461bcd60e51b815260206004820152603360248201527f7a65726f2076616c756520617070726f76616c20696e637265617365206f722060448201527261726974686d65746963206f766572666c6f7760681b60648201526084015b60405180910390fd5b610d9c8461048e8584613b0a565b949350505050565b6000610d9c33858585611a23565b6000610dc062010000612192565b610dfc5760405162461bcd60e51b815260206004820152600d60248201526c1858d8d95cdcc819195b9a5959609a1b6044820152606401610d85565b610bb6838361219e565b600054610100900460ff1615808015610e265750600054600160ff909116105b80610e405750303b158015610e40575060005460ff166001145b610ea35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610d85565b6000805460ff191660011790558015610ec6576000805461ff0019166101001790555b6000865111610f0f5760405162461bcd60e51b81526020600482015260156024820152741d1bdad95b881b985b59481a5cc81b9bdd081cd95d605a1b6044820152606401610d85565b6000855111610f605760405162461bcd60e51b815260206004820152601760248201527f746f6b656e2073796d626f6c206973206e6f74207365740000000000000000006044820152606401610d85565b6033610f6c8782613b64565b506034610f798682613b64565b50821580610f8f57506001600160a01b03841615155b610fe95760405162461bcd60e51b815260206004820152602560248201527f5f696e697469616c486f6c646572206e6f742073657420287a65726f20616464604482015264726573732960d81b6064820152608401610d85565b8215610ff957610ff9848461219e565b6001600160a01b03871615158061100f57508115155b1561101e5761101e87836123c5565b8015611064576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b61107933848484612457565b505050565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742960208201526001600160a01b03871691810191909152606081018590526000906110e2906080015b6040516020818303038152906040528585856129e5565b9050856001600160a01b0316816001600160a01b0316146111155760405162461bcd60e51b8152600401610d8590613c22565b61112186866001612a4a565b505050505050565b6111336020612154565b61117f5760405162461bcd60e51b815260206004820152601860248201527f64656c65676174696f6e73206172652064697361626c656400000000000000006044820152606401610d85565b6111893382612b58565b50565b60606039805480602002602001604051908101604052809291908181526020016000905b828210156111ff57600084815260209081902060408051808201909152908401546001600160401b0381168252600160401b90046001600160c01b0316818301528252600190920191016111b0565b50505050905090565b6039818154811061121857600080fd5b6000918252602090912001546001600160401b0381169150600160401b90046001600160c01b031682565b6001600160a01b0381166000908152603860209081526040808320805482518185028101850190935280835260609492939192909184015b828210156112ca57600084815260209081902060408051808201909152908401546001600160401b0381168252600160401b90046001600160c01b03168183015282526001909201910161127b565b505050509050919050565b603860205281600052604060002081815481106112f157600080fd5b6000918252602090912001546001600160401b0381169250600160401b90046001600160c01b0316905082565b600061132a8484610db2565b50610c3660008585856001612bf4565b60004382106113815760405162461bcd60e51b8152602060048201526013602482015272189b1bd8dac81b9bdd081e595d081b5a5b9959606a1b6044820152606401610d85565b6001600160a01b0383166000908152603860205260409020610bcc9083612d35565b60348054610b2890613aba565b60006113bc8484610db2565b50610c3660008585856000612bf4565b60004382106114135760405162461bcd60e51b8152602060048201526013602482015272189b1bd8dac81b9bdd081e595d081b5a5b9959606a1b6044820152606401610d85565b610b15603983612d35565b6000610bcc8383604051806020016040528060008152506113b0565b600061144862020000612192565b61166a576001600160a01b0383163314801561146957506114696008612154565b8061148d57506001600160a01b038316331480159061148d575061148d6010612154565b6001600160a01b03841633146114d8576040518060400160405280601c81526020017f6275726e73206f6e20626568616c66206172652064697361626c656400000000815250611504565b60405180604001604052806012815260200171189d5c9b9cc8185c9948191a5cd8589b195960721b8152505b906115225760405162461bcd60e51b8152600401610d8591906135d2565b506001600160a01b038316331461166a576001600160a01b0383166000908152603c60209081526040808320338452909152902054828110156115a75760405162461bcd60e51b815260206004820152601d60248201527f6275726e20616d6f756e74206578636565647320616c6c6f77616e63650000006044820152606401610d85565b600019811015611668576115bb8382613c4d565b6001600160a01b0385166000818152603c602090815260408083203380855292529091208390559192507fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a76116108685613b0a565b60408051918252602082018690520160405180910390a360405181815233906001600160a01b038616907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259060200160405180910390a35b505b816000036116ac5760405162461bcd60e51b815260206004820152600f60248201526e3d32b937903b30b63ab290313ab93760891b6044820152606401610d85565b6001600160a01b0383166117025760405162461bcd60e51b815260206004820152601a60248201527f6275726e2066726f6d20746865207a65726f20616464726573730000000000006044820152606401610d85565b6001600160a01b03831660009081526036602052604090205482111561176a5760405162461bcd60e51b815260206004820152601b60248201527f6275726e20616d6f756e7420657863656564732062616c616e636500000000006044820152606401610d85565b6001600160a01b03831660009081526036602052604081208054849290611792908490613c4d565b9250508190555081603560008282546117ab9190613c4d565b909155506117be90506039600084612f18565b50506001600160a01b038084166000908152603760205260408120546117e99233929116908561308f565b6040518281526001600160a01b0384169033907fe8a89cc6e5096f9d9f43de82c077c1f4cfe707c0e0c2032176c68813b9ae6a5c9060200160405180910390a36040518281526000906001600160a01b038516903390600080516020613d9a8339815191529060200160405180910390a46040518281526000906001600160a01b03851690600080516020613dba8339815191529060200160405180910390a350600192915050565b336000908152603c602090815260408083206001600160a01b0386168452909152812054826119035760405162461bcd60e51b815260206004820152601c60248201527f7a65726f2076616c756520617070726f76616c206465637265617365000000006044820152606401610d85565b828110156119615760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d85565b610d9c8461048e8584613c4d565b6000610bcc338484610bd3565b61198682826131db565b5050565b600061199785858561106d565b6119a5858585856001612bf4565b506001949350505050565b6001600160a01b0381166000908152603860205260408120805415611a1057805481906119df90600190613c4d565b815481106119ef576119ef613c60565b600091825260209091200154600160401b90046001600160c01b0316611a13565b60005b6001600160c01b03169392505050565b6000611a2f6080612154565b611a7b5760405162461bcd60e51b815260206004820152601e60248201527f45524331333633207472616e7366657273206172652064697361626c656400006044820152606401610d85565b611a8685858561106d565b6119a5858585856000612bf4565b6000611aa1610100612154565b611aed5760405162461bcd60e51b815260206004820152601e60248201527f4552433133363320617070726f76616c73206172652064697361626c656400006044820152606401610d85565b611af78484610ba9565b50610c36848484613244565b611b0e610200612154565b611b5a5760405162461bcd60e51b815260206004820152601c60248201527f45495032363132207065726d697473206172652064697361626c6564000000006044820152606401610d85565b6001600160a01b0387166000908152603a602052604081208054611beb917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9187611baa83613c76565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016110cb565b9050876001600160a01b0316816001600160a01b031614611c1e5760405162461bcd60e51b8152600401610d8590613c22565b844210611c3d5760405162461bcd60e51b8152600401610d8590613c8f565b611c48888888612043565b5050505050505050565b61118930826131db565b6000610d9c84848460405180602001604052806000815250611a23565b611c84610400612154565b611cd05760405162461bcd60e51b815260206004820152601e60248201527f45495033303039207472616e7366657273206172652064697361626c656400006044820152606401610d85565b6000611d157f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226760001b8b8b8b8b8b8b6040516020016110cb9796959493929190613cba565b9050896001600160a01b0316816001600160a01b031614611d485760405162461bcd60e51b8152600401610d8590613c22565b864211611d915760405162461bcd60e51b81526020600482015260176024820152761cda59db985d1d5c99481b9bdd081e595d081d985b1a59604a1b6044820152606401610d85565b854210611db05760405162461bcd60e51b8152600401610d8590613c8f565b611dbc8a866000612a4a565b611dc8818b8b8b612457565b50505050505050505050565b611ddf610800612154565b611e2b5760405162461bcd60e51b815260206004820152601f60248201527f4549503330303920726563657074696f6e73206172652064697361626c6564006044820152606401610d85565b6000611e707fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de860001b8b8b8b8b8b8b6040516020016110cb9796959493929190613cba565b9050896001600160a01b0316816001600160a01b031614611ea35760405162461bcd60e51b8152600401610d8590613c22565b864211611eec5760405162461bcd60e51b81526020600482015260176024820152761cda59db985d1d5c99481b9bdd081e595d081d985b1a59604a1b6044820152606401610d85565b854210611f0b5760405162461bcd60e51b8152600401610d8590613c8f565b6001600160a01b0389163314611db05760405162461bcd60e51b815260206004820152600d60248201526c1858d8d95cdcc819195b9a5959609a1b6044820152606401610d85565b611f5d6040612154565b611fb45760405162461bcd60e51b815260206004820152602260248201527f64656c65676174696f6e73206f6e20626568616c66206172652064697361626c604482015261195960f21b6064820152608401610d85565b604080517fff41620983935eb4d4a3c7384a066ca8c1d10cef9a5eca9eb97ca735cd14a75560208201526001600160a01b03881691810191909152606081018690526080810185905260009061200c9060a0016110cb565b905084421061202d5760405162461bcd60e51b8152600401610d8590613c8f565b61203981876000612a4a565b6110648188612b58565b6001600160a01b0382166120995760405162461bcd60e51b815260206004820152601b60248201527f617070726f766520746f20746865207a65726f206164647265737300000000006044820152606401610d85565b6001600160a01b038381166000818152603c602090815260408083209487168084529482529182902080549086905582518181529182018690529392917fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7910160405180910390a3826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161214691815260200190565b60405180910390a350505050565b30600090815260016020526040812054610b15905b8316831490565b6001600160a01b038216600090815260016020526040812054610bcc90612169565b6000610b153383612170565b6001600160a01b0382166121e35760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610d85565b603554818101116122405760405162461bcd60e51b815260206004820152602160248201527f7a65726f2076616c7565206f722061726974686d65746963206f766572666c6f6044820152607760f81b6064820152608401610d85565b6035546001600160c01b0390612257908390613b0a565b11156122a55760405162461bcd60e51b815260206004820152601f60248201527f746f74616c20737570706c79206f766572666c6f77202875696e7431393229006044820152606401610d85565b80603560008282546122b79190613b0a565b90915550506001600160a01b038216600090815260366020526040812080548392906122e4908490613b0a565b909155506122f790506039600183612f18565b50506001600160a01b0380831660009081526037602052604081205461232192339291168461308f565b6040518181526001600160a01b0383169033907f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f09060200160405180910390a36040518181526001600160a01b038316906000903390600080516020613d9a8339815191529060200160405180910390a46040518181526001600160a01b03831690600090600080516020613dba8339815191529060200160405180910390a35050565b600054610100900460ff166124305760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610d85565b6001600160a01b0382161561244c5761244c8260001980613370565b611986308283613370565b836001600160a01b0316836001600160a01b031614801561247d575061247d6001612154565b806124aa5750836001600160a01b0316836001600160a01b0316141580156124aa57506124aa6002612154565b846001600160a01b0316846001600160a01b0316146124fe576040518060400160405280602081526020017f7472616e7366657273206f6e20626568616c66206172652064697361626c656481525061252e565b604051806040016040528060168152602001751d1c985b9cd9995c9cc8185c9948191a5cd8589b195960521b8152505b9061254c5760405162461bcd60e51b8152600401610d8591906135d2565b506001600160a01b0383166125a35760405162461bcd60e51b815260206004820152601e60248201527f7472616e736665722066726f6d20746865207a65726f206164647265737300006044820152606401610d85565b6001600160a01b0382166125f95760405162461bcd60e51b815260206004820152601c60248201527f7472616e7366657220746f20746865207a65726f2061646472657373000000006044820152606401610d85565b306001600160a01b038316036126775760405162461bcd60e51b815260206004820152603f60248201527f696e76616c696420726563697069656e7420287472616e7366657220746f207460448201527f686520746f6b656e20736d61727420636f6e747261637420697473656c6629006064820152608401610d85565b8060000361270457816001600160a01b0316836001600160a01b0316856001600160a01b0316600080516020613d9a833981519152846040516126bc91815260200190565b60405180910390a4816001600160a01b0316836001600160a01b0316600080516020613dba833981519152836040516126f791815260200190565b60405180910390a36129df565b836001600160a01b0316836001600160a01b031614612872576001600160a01b038084166000908152603c60209081526040808320938816835292905220548181101561279d5760405162461bcd60e51b815260206004820152602160248201527f7472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636044820152606560f81b6064820152608401610d85565b600019811015612870576127b18282613c4d565b6001600160a01b038086166000818152603c60209081526040808320948b16808452949091529020839055919250907fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a761280b8585613b0a565b60408051918252602082018690520160405180910390a3846001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161286791815260200190565b60405180910390a35b505b6001600160a01b0383166000908152603660205260409020548111156128da5760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610d85565b6001600160a01b03831660009081526036602052604081208054839290612902908490613c4d565b90915550506001600160a01b0382166000908152603660205260408120805483929061292f908490613b0a565b90915550506001600160a01b03808416600090815260376020526040808220548584168352912054612967928792811691168461308f565b816001600160a01b0316836001600160a01b0316856001600160a01b0316600080516020613d9a833981519152846040516129a491815260200190565b60405180910390a4816001600160a01b0316836001600160a01b0316600080516020613dba8339815191528360405161214691815260200190565b50505050565b83516020850120600090816129f8610c5c565b60405161190160f01b60208201526022810191909152604281018390526062016040516020818303038152906040528051906020012090506000612a3e828888886133cc565b98975050505050505050565b6001600160a01b0383166000908152603b6020908152604080832085845290915290205460ff1615612aae5760405162461bcd60e51b815260206004820152600d60248201526c696e76616c6964206e6f6e636560981b6044820152606401610d85565b6001600160a01b0383166000908152603b602090815260408083208584529091529020805460ff191660011790558015612b1d5760405182906001600160a01b038516907f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8190600090a3505050565b60405182906001600160a01b038516907f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a590600090a3505050565b6001600160a01b0380831660009081526037602081815260408084208054603684529190942054929091528484166001600160a01b0319821617909255911690612ba48483858461308f565b826001600160a01b0316826001600160a01b0316856001600160a01b03167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a450505050565b836001600160a01b03163b600003612c485780612c435760405162461bcd60e51b815260206004820152600d60248201526c1153d0481c9958da5c1a595b9d609a1b6044820152606401610d85565b612d2e565b604051632229f29760e21b81526000906001600160a01b038616906388a7ca5c90612c7d9033908a9089908990600401613cf6565b6020604051808303816000875af1158015612c9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc09190613d33565b90506001600160e01b03198116632229f29760e21b146111215760405162461bcd60e51b815260206004820152602360248201527f696e76616c6964206f6e5472616e73666572526563656976656420726573706f6044820152626e736560e81b6064820152608401610d85565b5050505050565b81546000908103612d4857506000610b15565b825482908490612d5a90600190613c4d565b81548110612d6a57612d6a613c60565b6000918252602090912001546001600160401b031611612dc75782548390612d9490600190613c4d565b81548110612da457612da4613c60565b600091825260209091200154600160401b90046001600160c01b03169050610b15565b8183600081548110612ddb57612ddb613c60565b6000918252602090912001546001600160401b03161115612dfe57506000610b15565b82546000908190612e1190600190613c4d565b90505b81811115612ee15760006002612e2a8484613c4d565b612e349190613d50565b612e3e9083613c4d565b90506000868281548110612e5457612e54613c60565b6000918252602091829020604080518082019091529101546001600160401b038116808352600160401b9091046001600160c01b0316928201929092529150869003612eb257602001516001600160c01b03169350610b1592505050565b80516001600160401b0316861115612ecc57819350612eda565b612ed7600183613c4d565b92505b5050612e14565b848281548110612ef357612ef3613c60565b600091825260209091200154600160401b90046001600160c01b031695945050505050565b8254600090819015612f655784548590612f3490600190613c4d565b81548110612f4457612f44613c60565b600091825260209091200154600160401b90046001600160c01b0316612f68565b60005b6001600160c01b0316915083612f8757612f828383613c4d565b612f91565b612f918383613b0a565b855490915015801590612fd85750845443908690612fb190600190613c4d565b81548110612fc157612fc1613c60565b6000918252602090912001546001600160401b0316145b1561303557845481908690612fef90600190613c4d565b81548110612fff57612fff613c60565b9060005260206000200160000160086101000a8154816001600160c01b0302191690836001600160c01b03160217905550613087565b604080518082019091526001600160401b0343811682526001600160c01b0380841660208085019182528954600181018b5560008b81529190912094519151909216600160401b029216919091179101555b935093915050565b816001600160a01b0316836001600160a01b031614806130ad575080155b6129df576001600160a01b03831615613143576001600160a01b038316600090815260386020526040812090806130e5838286612f18565b91509150856001600160a01b0316876001600160a01b03167fd1404f22081753a56b50e0d5ff5c9ed0e4a3a840e1171a443721a342e71bb5c18484604051613137929190918252602082015260400190565b60405180910390a35050505b6001600160a01b038216156129df576001600160a01b0382166000908152603860205260408120908061317883600186612f18565b91509150846001600160a01b0316876001600160a01b03167fd1404f22081753a56b50e0d5ff5c9ed0e4a3a840e1171a443721a342e71bb5c184846040516131ca929190918252602082015260400190565b60405180910390a350505050505050565b6131e8600160ff1b61352f565b611986828261323f33613210876001600160a01b031660009081526001602052604090205490565b6001600160a01b0391909116600090815260016020526040902054600019808818821618908716919091171690565b613370565b6000836001600160a01b03163b1161328c5760405162461bcd60e51b815260206004820152600b60248201526a22a7a09039b832b73232b960a91b6044820152606401610d85565b6040516307b04a2d60e41b81526000906001600160a01b03851690637b04a2d0906132bf90339087908790600401613d72565b6020604051808303816000875af11580156132de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133029190613d33565b90506001600160e01b031981166307b04a2d60e41b146129df5760405162461bcd60e51b815260206004820152602360248201527f696e76616c6964206f6e417070726f76616c526563656976656420726573706f6044820152626e736560e81b6064820152608401610d85565b6001600160a01b038316600081815260016020908152604091829020849055815185815290810184905233917f5a10526456f5116c0b7b80582c217d666243fd51b6a2d92c8011e601c2462e5f910160405180910390a3505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561343e5760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207369676e6174757265202773272076616c756500000000006044820152606401610d85565b8360ff16601b148061345357508360ff16601c145b61349f5760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207369676e6174757265202776272076616c756500000000006044820152606401610d85565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156134f3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166135265760405162461bcd60e51b8152600401610d8590613c22565b95945050505050565b61118961353b82612192565b8061118957604051634ca8886760e01b815260040160405180910390fd5b6001600160e01b03198116811461118957600080fd5b60006020828403121561358157600080fd5b8135610bcc81613559565b6000815180845260005b818110156135b257602081850181015186830182015201613596565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000610bcc602083018461358c565b80356001600160a01b03811681146135fc57600080fd5b919050565b6000806040838503121561361457600080fd5b61361d836135e5565b946020939093013593505050565b60006020828403121561363d57600080fd5b610bcc826135e5565b60008060006060848603121561365b57600080fd5b613664846135e5565b9250613672602085016135e5565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126136aa57600080fd5b8135602083016000806001600160401b038411156136ca576136ca613683565b50604051601f19601f85018116603f011681018181106001600160401b03821117156136f8576136f8613683565b60405283815290508082840187101561371057600080fd5b838360208301376000602085830101528094505050505092915050565b60008060006060848603121561374257600080fd5b61374b846135e5565b92506020840135915060408401356001600160401b0381111561376d57600080fd5b61377986828701613699565b9150509250925092565b60008060008060008060c0878903121561379c57600080fd5b6137a5876135e5565b955060208701356001600160401b038111156137c057600080fd5b6137cc89828a01613699565b95505060408701356001600160401b038111156137e857600080fd5b6137f489828a01613699565b945050613803606088016135e5565b9598949750929560808101359460a0909101359350915050565b803560ff811681146135fc57600080fd5b600080600080600060a0868803121561384657600080fd5b61384f866135e5565b9450602086013593506138646040870161381d565b94979396509394606081013594506080013592915050565b602080825282518282018190526000918401906040840190835b818110156138d257835180516001600160401b031684526020908101516001600160c01b03168185015290930192604090920191600101613896565b509095945050505050565b6000602082840312156138ef57600080fd5b5035919050565b6000806000806080858703121561390c57600080fd5b613915856135e5565b9350613923602086016135e5565b92506040850135915060608501356001600160401b0381111561394557600080fd5b61395187828801613699565b91505092959194509250565b600080600080600080600060e0888a03121561397857600080fd5b613981886135e5565b965061398f602089016135e5565b955060408801359450606088013593506139ab6080890161381d565b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156139db57600080fd5b6139e4836135e5565b91506139f2602084016135e5565b90509250929050565b60008060008060008060008060006101208a8c031215613a1a57600080fd5b613a238a6135e5565b9850613a3160208b016135e5565b975060408a0135965060608a0135955060808a0135945060a08a01359350613a5b60c08b0161381d565b989b979a50959894979396929550929360e081013593506101000135919050565b60008060008060008060c08789031215613a9557600080fd5b613a9e876135e5565b955060208701359450604087013593506138036060880161381d565b600181811c90821680613ace57607f821691505b602082108103613aee57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b1557610b15613af4565b601f82111561107957806000526020600020601f840160051c81016020851015613b445750805b601f840160051c820191505b81811015612d2e5760008155600101613b50565b81516001600160401b03811115613b7d57613b7d613683565b613b9181613b8b8454613aba565b84613b1d565b6020601f821160018114613bc55760008315613bad5750848201515b600019600385901b1c1916600184901b178455612d2e565b600084815260208120601f198516915b82811015613bf55787850151825560209485019460019092019101613bd5565b5084821015613c135786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b602080825260119082015270696e76616c6964207369676e617475726560781b604082015260600190565b81810381811115610b1557610b15613af4565b634e487b7160e01b600052603260045260246000fd5b600060018201613c8857613c88613af4565b5060010190565b6020808252601190820152701cda59db985d1d5c9948195e1c1a5c9959607a1b604082015260600190565b9687526001600160a01b0395861660208801529390941660408601526060850191909152608084015260a083019190915260c082015260e00190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d299083018461358c565b9695505050505050565b600060208284031215613d4557600080fd5b8151610bcc81613559565b600082613d6d57634e487b7160e01b600052601260045260246000fd5b500490565b60018060a01b0384168152826020820152606060408201526000613526606083018461358c56fed1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212209247dcb365dd0219f745732c45d304a963229226e3b98c7a9ebffee87380a60264736f6c634300081d0033496e697469616c697a61626c653a20636f6e747261637420697320616c7265617f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498d1404f22081753a56b50e0d5ff5c9ed0e4a3a840e1171a443721a342e71bb5c1",
  "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061043e5760003560e01c806387793f3e11610236578063b88d4fde1161013b578063d9169487116100c3578063e94a010211610087578063e94a010214610a22578063e98f5ba714610a5b578063ef55bec614610a65578063f63c2f8214610a78578063f9cf927114610a8057600080fd5b8063d91694871461097e578063dd62ed3e146109a5578063e3ee160e146109de578063e62cac76146109f1578063e7a324dc146109fb57600080fd5b8063c5ff500c1161010a578063c5ff500c14610928578063cae9ca5114610932578063d505accf14610945578063d5bb7f6714610958578063d8fbe9941461096b57600080fd5b8063b88d4fde146108e7578063bcc3f3bd146108fa578063c0d6568d1461090d578063c1d34b891461091557600080fd5b80639dc29fac116101be578063ae5b102e1161018d578063ae5b102e146108a1578063ae60bda4146108b4578063ae682e2e146108bf578063b3c65015146108ca578063b66dbdc5146108df57600080fd5b80639dc29fac14610841578063a0cc6a6814610854578063a457c2d71461087b578063a9059cbb1461088e57600080fd5b806394f4f9301161020557806394f4f930146107ed57806395d89b411461080057806397ba461114610808578063981b24d01461081b57806398de4ba31461082e57600080fd5b806387793f3e1461079f5780638832e6e3146107c85780638d4e57e6146107db5780638f6fba8c146107e557600080fd5b806339509351116103475780635c19a95c116102cf57806370a082311161029357806370a08231146107095780637815ef0c146107325780637ecebe00146107455780637f2eecc3146107655780637fd491b01461078c57600080fd5b80635c19a95c146106955780635e2dc2b7146106a857806364cb8b96146106b1578063653de620146106c65780636641d9a0146106cf57600080fd5b8063442767331161031657806344276733146106285780634721272d1461065157806350c29e371461065a57806359b961ef1461066f5780635a049a701461068257600080fd5b806339509351146105e75780633e9c5f7e146105fa5780634000aea01461060257806340c10f191461061557600080fd5b80631e0fa234116103ca5780632d4c39ea116103995780632d4c39ea1461058357806330adf81f1461058b578063313ce567146105b25780633177029f146105cc5780633644e515146105df57600080fd5b80631e0fa234146104f357806320606b701461053457806323b872dd1461055b5780632b5214161461056e57600080fd5b8063136d035f11610411578063136d035f146104a657806313873a24146104c457806318160ddd146104cc5780631993f554146104e35780631a0b04ea146104eb57600080fd5b806301ffc9a71461044357806306fdde031461046b578063095ea7b3146104805780631296ee6214610493575b600080fd5b61045661045136600461356f565b610a93565b60405190151581526020015b60405180910390f35b610473610b1b565b60405161046291906135d2565b61045661048e366004613601565b610ba9565b6104566104a1366004613601565b610bbf565b6104af61080081565b60405163ffffffff9091168152602001610462565b6104af608081565b6104d560355481565b604051908152602001610462565b6104af600481565b6104af600881565b61051c61050136600461362b565b6037602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610462565b6104d57f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b610456610569366004613646565b610bd3565b306000908152600160205260409020546104d5565b6104af604081565b6104d57f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6105ba601281565b60405160ff9091168152602001610462565b6104566105da366004613601565b610c40565b6104d5610c5c565b6104566105f5366004613601565b610cf8565b6104af602081565b61045661061036600461372d565b610da4565b610456610623366004613601565b610db2565b6104d561063636600461362b565b6001600160a01b031660009081526001602052604090205490565b6104af61020081565b61066d610668366004613783565b610e06565b005b61066d61067d366004613646565b61106d565b61066d61069036600461382e565b61107e565b61066d6106a336600461362b565b611129565b6104af61040081565b6106b961118c565b604051610462919061387c565b6104af61010081565b6106e26106dd3660046138dd565b611208565b604080516001600160401b0390931683526001600160c01b03909116602083015201610462565b6104d561071736600461362b565b6001600160a01b031660009081526036602052604090205490565b6106b961074036600461362b565b611243565b6104d561075336600461362b565b603a6020526000908152604090205481565b6104d57fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b6106e261079a366004613601565b6112d5565b6104d56107ad36600461362b565b6001600160a01b031660009081526038602052604090205490565b6104566107d636600461372d565b61131e565b6104af6201000081565b6104af600281565b6104d56107fb366004613601565b61133a565b6104736113a3565b61045661081636600461372d565b6113b0565b6104d56108293660046138dd565b6113cc565b61045661083c366004613601565b61141e565b61045661084f366004613601565b61143a565b6104d57f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b610456610889366004613601565b611892565b61045661089c366004613601565b61196f565b61066d6108af366004613601565b61197c565b6104d5600160fe1b81565b6104d5600160ff1b81565b60005460405160ff9091168152602001610462565b6039546104d5565b6104566108f53660046138f6565b61198a565b6104d561090836600461362b565b6119b0565b6104af600181565b6104566109233660046138f6565b611a23565b6104af6204000081565b61045661094036600461372d565b611a94565b61066d61095336600461395d565b611b03565b61066d6109663660046138dd565b611c52565b610456610979366004613646565b611c5c565b6104d57f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b6104d56109b33660046139c8565b6001600160a01b039182166000908152603c6020908152604080832093909416825291909152205490565b61066d6109ec3660046139fb565b611c79565b6104af6202000081565b6104d57fff41620983935eb4d4a3c7384a066ca8c1d10cef9a5eca9eb97ca735cd14a75581565b610456610a30366004613601565b6001600160a01b03919091166000908152603b60209081526040808320938352929052205460ff1690565b6104af6208000081565b61066d610a733660046139fb565b611dd4565b6104af601081565b61066d610a8e366004613a7c565b611f53565b60006001600160e01b031982166301ffc9a760e01b1480610ac457506001600160e01b031982166336372b0760e01b145b80610adf57506001600160e01b0319821663b0202a1160e01b145b80610afa57506001600160e01b03198216634ec7fbed60e11b145b80610b1557506001600160e01b03198216635ffa99dd60e11b145b92915050565b60338054610b2890613aba565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5490613aba565b8015610ba15780601f10610b7657610100808354040283529160200191610ba1565b820191906000526020600020905b815481529060010190602001808311610b8457829003601f168201915b505050505081565b6000610bb6338484612043565b50600192915050565b6000610bcc338484611c5c565b9392505050565b6000610bdf6004612154565b80610bf25750610bf28362040000612170565b80610c045750610c0462080000612192565b15610c1957610c1484848461106d565b610c36565b610c348484846040518060200160405280600081525061198a565b505b5060019392505050565b6000610bcc838360405180602001604052806000815250611a94565b604080518082018252600f81526e416476616e6365644552433230763160881b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f65218aa0cdc6725da873801e9daf9d54f230d8a515289f76c8bd31dd8648c50d81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b336000908152603c602090815260408083206001600160a01b03861684529091528120548281018110610d8e5760405162461bcd60e51b815260206004820152603360248201527f7a65726f2076616c756520617070726f76616c20696e637265617365206f722060448201527261726974686d65746963206f766572666c6f7760681b60648201526084015b60405180910390fd5b610d9c8461048e8584613b0a565b949350505050565b6000610d9c33858585611a23565b6000610dc062010000612192565b610dfc5760405162461bcd60e51b815260206004820152600d60248201526c1858d8d95cdcc819195b9a5959609a1b6044820152606401610d85565b610bb6838361219e565b600054610100900460ff1615808015610e265750600054600160ff909116105b80610e405750303b158015610e40575060005460ff166001145b610ea35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610d85565b6000805460ff191660011790558015610ec6576000805461ff0019166101001790555b6000865111610f0f5760405162461bcd60e51b81526020600482015260156024820152741d1bdad95b881b985b59481a5cc81b9bdd081cd95d605a1b6044820152606401610d85565b6000855111610f605760405162461bcd60e51b815260206004820152601760248201527f746f6b656e2073796d626f6c206973206e6f74207365740000000000000000006044820152606401610d85565b6033610f6c8782613b64565b506034610f798682613b64565b50821580610f8f57506001600160a01b03841615155b610fe95760405162461bcd60e51b815260206004820152602560248201527f5f696e697469616c486f6c646572206e6f742073657420287a65726f20616464604482015264726573732960d81b6064820152608401610d85565b8215610ff957610ff9848461219e565b6001600160a01b03871615158061100f57508115155b1561101e5761101e87836123c5565b8015611064576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b61107933848484612457565b505050565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742960208201526001600160a01b03871691810191909152606081018590526000906110e2906080015b6040516020818303038152906040528585856129e5565b9050856001600160a01b0316816001600160a01b0316146111155760405162461bcd60e51b8152600401610d8590613c22565b61112186866001612a4a565b505050505050565b6111336020612154565b61117f5760405162461bcd60e51b815260206004820152601860248201527f64656c65676174696f6e73206172652064697361626c656400000000000000006044820152606401610d85565b6111893382612b58565b50565b60606039805480602002602001604051908101604052809291908181526020016000905b828210156111ff57600084815260209081902060408051808201909152908401546001600160401b0381168252600160401b90046001600160c01b0316818301528252600190920191016111b0565b50505050905090565b6039818154811061121857600080fd5b6000918252602090912001546001600160401b0381169150600160401b90046001600160c01b031682565b6001600160a01b0381166000908152603860209081526040808320805482518185028101850190935280835260609492939192909184015b828210156112ca57600084815260209081902060408051808201909152908401546001600160401b0381168252600160401b90046001600160c01b03168183015282526001909201910161127b565b505050509050919050565b603860205281600052604060002081815481106112f157600080fd5b6000918252602090912001546001600160401b0381169250600160401b90046001600160c01b0316905082565b600061132a8484610db2565b50610c3660008585856001612bf4565b60004382106113815760405162461bcd60e51b8152602060048201526013602482015272189b1bd8dac81b9bdd081e595d081b5a5b9959606a1b6044820152606401610d85565b6001600160a01b0383166000908152603860205260409020610bcc9083612d35565b60348054610b2890613aba565b60006113bc8484610db2565b50610c3660008585856000612bf4565b60004382106114135760405162461bcd60e51b8152602060048201526013602482015272189b1bd8dac81b9bdd081e595d081b5a5b9959606a1b6044820152606401610d85565b610b15603983612d35565b6000610bcc8383604051806020016040528060008152506113b0565b600061144862020000612192565b61166a576001600160a01b0383163314801561146957506114696008612154565b8061148d57506001600160a01b038316331480159061148d575061148d6010612154565b6001600160a01b03841633146114d8576040518060400160405280601c81526020017f6275726e73206f6e20626568616c66206172652064697361626c656400000000815250611504565b60405180604001604052806012815260200171189d5c9b9cc8185c9948191a5cd8589b195960721b8152505b906115225760405162461bcd60e51b8152600401610d8591906135d2565b506001600160a01b038316331461166a576001600160a01b0383166000908152603c60209081526040808320338452909152902054828110156115a75760405162461bcd60e51b815260206004820152601d60248201527f6275726e20616d6f756e74206578636565647320616c6c6f77616e63650000006044820152606401610d85565b600019811015611668576115bb8382613c4d565b6001600160a01b0385166000818152603c602090815260408083203380855292529091208390559192507fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a76116108685613b0a565b60408051918252602082018690520160405180910390a360405181815233906001600160a01b038616907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259060200160405180910390a35b505b816000036116ac5760405162461bcd60e51b815260206004820152600f60248201526e3d32b937903b30b63ab290313ab93760891b6044820152606401610d85565b6001600160a01b0383166117025760405162461bcd60e51b815260206004820152601a60248201527f6275726e2066726f6d20746865207a65726f20616464726573730000000000006044820152606401610d85565b6001600160a01b03831660009081526036602052604090205482111561176a5760405162461bcd60e51b815260206004820152601b60248201527f6275726e20616d6f756e7420657863656564732062616c616e636500000000006044820152606401610d85565b6001600160a01b03831660009081526036602052604081208054849290611792908490613c4d565b9250508190555081603560008282546117ab9190613c4d565b909155506117be90506039600084612f18565b50506001600160a01b038084166000908152603760205260408120546117e99233929116908561308f565b6040518281526001600160a01b0384169033907fe8a89cc6e5096f9d9f43de82c077c1f4cfe707c0e0c2032176c68813b9ae6a5c9060200160405180910390a36040518281526000906001600160a01b038516903390600080516020613d9a8339815191529060200160405180910390a46040518281526000906001600160a01b03851690600080516020613dba8339815191529060200160405180910390a350600192915050565b336000908152603c602090815260408083206001600160a01b0386168452909152812054826119035760405162461bcd60e51b815260206004820152601c60248201527f7a65726f2076616c756520617070726f76616c206465637265617365000000006044820152606401610d85565b828110156119615760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d85565b610d9c8461048e8584613c4d565b6000610bcc338484610bd3565b61198682826131db565b5050565b600061199785858561106d565b6119a5858585856001612bf4565b506001949350505050565b6001600160a01b0381166000908152603860205260408120805415611a1057805481906119df90600190613c4d565b815481106119ef576119ef613c60565b600091825260209091200154600160401b90046001600160c01b0316611a13565b60005b6001600160c01b03169392505050565b6000611a2f6080612154565b611a7b5760405162461bcd60e51b815260206004820152601e60248201527f45524331333633207472616e7366657273206172652064697361626c656400006044820152606401610d85565b611a8685858561106d565b6119a5858585856000612bf4565b6000611aa1610100612154565b611aed5760405162461bcd60e51b815260206004820152601e60248201527f4552433133363320617070726f76616c73206172652064697361626c656400006044820152606401610d85565b611af78484610ba9565b50610c36848484613244565b611b0e610200612154565b611b5a5760405162461bcd60e51b815260206004820152601c60248201527f45495032363132207065726d697473206172652064697361626c6564000000006044820152606401610d85565b6001600160a01b0387166000908152603a602052604081208054611beb917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9187611baa83613c76565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016110cb565b9050876001600160a01b0316816001600160a01b031614611c1e5760405162461bcd60e51b8152600401610d8590613c22565b844210611c3d5760405162461bcd60e51b8152600401610d8590613c8f565b611c48888888612043565b5050505050505050565b61118930826131db565b6000610d9c84848460405180602001604052806000815250611a23565b611c84610400612154565b611cd05760405162461bcd60e51b815260206004820152601e60248201527f45495033303039207472616e7366657273206172652064697361626c656400006044820152606401610d85565b6000611d157f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226760001b8b8b8b8b8b8b6040516020016110cb9796959493929190613cba565b9050896001600160a01b0316816001600160a01b031614611d485760405162461bcd60e51b8152600401610d8590613c22565b864211611d915760405162461bcd60e51b81526020600482015260176024820152761cda59db985d1d5c99481b9bdd081e595d081d985b1a59604a1b6044820152606401610d85565b854210611db05760405162461bcd60e51b8152600401610d8590613c8f565b611dbc8a866000612a4a565b611dc8818b8b8b612457565b50505050505050505050565b611ddf610800612154565b611e2b5760405162461bcd60e51b815260206004820152601f60248201527f4549503330303920726563657074696f6e73206172652064697361626c6564006044820152606401610d85565b6000611e707fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de860001b8b8b8b8b8b8b6040516020016110cb9796959493929190613cba565b9050896001600160a01b0316816001600160a01b031614611ea35760405162461bcd60e51b8152600401610d8590613c22565b864211611eec5760405162461bcd60e51b81526020600482015260176024820152761cda59db985d1d5c99481b9bdd081e595d081d985b1a59604a1b6044820152606401610d85565b854210611f0b5760405162461bcd60e51b8152600401610d8590613c8f565b6001600160a01b0389163314611db05760405162461bcd60e51b815260206004820152600d60248201526c1858d8d95cdcc819195b9a5959609a1b6044820152606401610d85565b611f5d6040612154565b611fb45760405162461bcd60e51b815260206004820152602260248201527f64656c65676174696f6e73206f6e20626568616c66206172652064697361626c604482015261195960f21b6064820152608401610d85565b604080517fff41620983935eb4d4a3c7384a066ca8c1d10cef9a5eca9eb97ca735cd14a75560208201526001600160a01b03881691810191909152606081018690526080810185905260009061200c9060a0016110cb565b905084421061202d5760405162461bcd60e51b8152600401610d8590613c8f565b61203981876000612a4a565b6110648188612b58565b6001600160a01b0382166120995760405162461bcd60e51b815260206004820152601b60248201527f617070726f766520746f20746865207a65726f206164647265737300000000006044820152606401610d85565b6001600160a01b038381166000818152603c602090815260408083209487168084529482529182902080549086905582518181529182018690529392917fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7910160405180910390a3826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161214691815260200190565b60405180910390a350505050565b30600090815260016020526040812054610b15905b8316831490565b6001600160a01b038216600090815260016020526040812054610bcc90612169565b6000610b153383612170565b6001600160a01b0382166121e35760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610d85565b603554818101116122405760405162461bcd60e51b815260206004820152602160248201527f7a65726f2076616c7565206f722061726974686d65746963206f766572666c6f6044820152607760f81b6064820152608401610d85565b6035546001600160c01b0390612257908390613b0a565b11156122a55760405162461bcd60e51b815260206004820152601f60248201527f746f74616c20737570706c79206f766572666c6f77202875696e7431393229006044820152606401610d85565b80603560008282546122b79190613b0a565b90915550506001600160a01b038216600090815260366020526040812080548392906122e4908490613b0a565b909155506122f790506039600183612f18565b50506001600160a01b0380831660009081526037602052604081205461232192339291168461308f565b6040518181526001600160a01b0383169033907f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f09060200160405180910390a36040518181526001600160a01b038316906000903390600080516020613d9a8339815191529060200160405180910390a46040518181526001600160a01b03831690600090600080516020613dba8339815191529060200160405180910390a35050565b600054610100900460ff166124305760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610d85565b6001600160a01b0382161561244c5761244c8260001980613370565b611986308283613370565b836001600160a01b0316836001600160a01b031614801561247d575061247d6001612154565b806124aa5750836001600160a01b0316836001600160a01b0316141580156124aa57506124aa6002612154565b846001600160a01b0316846001600160a01b0316146124fe576040518060400160405280602081526020017f7472616e7366657273206f6e20626568616c66206172652064697361626c656481525061252e565b604051806040016040528060168152602001751d1c985b9cd9995c9cc8185c9948191a5cd8589b195960521b8152505b9061254c5760405162461bcd60e51b8152600401610d8591906135d2565b506001600160a01b0383166125a35760405162461bcd60e51b815260206004820152601e60248201527f7472616e736665722066726f6d20746865207a65726f206164647265737300006044820152606401610d85565b6001600160a01b0382166125f95760405162461bcd60e51b815260206004820152601c60248201527f7472616e7366657220746f20746865207a65726f2061646472657373000000006044820152606401610d85565b306001600160a01b038316036126775760405162461bcd60e51b815260206004820152603f60248201527f696e76616c696420726563697069656e7420287472616e7366657220746f207460448201527f686520746f6b656e20736d61727420636f6e747261637420697473656c6629006064820152608401610d85565b8060000361270457816001600160a01b0316836001600160a01b0316856001600160a01b0316600080516020613d9a833981519152846040516126bc91815260200190565b60405180910390a4816001600160a01b0316836001600160a01b0316600080516020613dba833981519152836040516126f791815260200190565b60405180910390a36129df565b836001600160a01b0316836001600160a01b031614612872576001600160a01b038084166000908152603c60209081526040808320938816835292905220548181101561279d5760405162461bcd60e51b815260206004820152602160248201527f7472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636044820152606560f81b6064820152608401610d85565b600019811015612870576127b18282613c4d565b6001600160a01b038086166000818152603c60209081526040808320948b16808452949091529020839055919250907fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a761280b8585613b0a565b60408051918252602082018690520160405180910390a3846001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161286791815260200190565b60405180910390a35b505b6001600160a01b0383166000908152603660205260409020548111156128da5760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610d85565b6001600160a01b03831660009081526036602052604081208054839290612902908490613c4d565b90915550506001600160a01b0382166000908152603660205260408120805483929061292f908490613b0a565b90915550506001600160a01b03808416600090815260376020526040808220548584168352912054612967928792811691168461308f565b816001600160a01b0316836001600160a01b0316856001600160a01b0316600080516020613d9a833981519152846040516129a491815260200190565b60405180910390a4816001600160a01b0316836001600160a01b0316600080516020613dba8339815191528360405161214691815260200190565b50505050565b83516020850120600090816129f8610c5c565b60405161190160f01b60208201526022810191909152604281018390526062016040516020818303038152906040528051906020012090506000612a3e828888886133cc565b98975050505050505050565b6001600160a01b0383166000908152603b6020908152604080832085845290915290205460ff1615612aae5760405162461bcd60e51b815260206004820152600d60248201526c696e76616c6964206e6f6e636560981b6044820152606401610d85565b6001600160a01b0383166000908152603b602090815260408083208584529091529020805460ff191660011790558015612b1d5760405182906001600160a01b038516907f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8190600090a3505050565b60405182906001600160a01b038516907f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a590600090a3505050565b6001600160a01b0380831660009081526037602081815260408084208054603684529190942054929091528484166001600160a01b0319821617909255911690612ba48483858461308f565b826001600160a01b0316826001600160a01b0316856001600160a01b03167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a450505050565b836001600160a01b03163b600003612c485780612c435760405162461bcd60e51b815260206004820152600d60248201526c1153d0481c9958da5c1a595b9d609a1b6044820152606401610d85565b612d2e565b604051632229f29760e21b81526000906001600160a01b038616906388a7ca5c90612c7d9033908a9089908990600401613cf6565b6020604051808303816000875af1158015612c9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc09190613d33565b90506001600160e01b03198116632229f29760e21b146111215760405162461bcd60e51b815260206004820152602360248201527f696e76616c6964206f6e5472616e73666572526563656976656420726573706f6044820152626e736560e81b6064820152608401610d85565b5050505050565b81546000908103612d4857506000610b15565b825482908490612d5a90600190613c4d565b81548110612d6a57612d6a613c60565b6000918252602090912001546001600160401b031611612dc75782548390612d9490600190613c4d565b81548110612da457612da4613c60565b600091825260209091200154600160401b90046001600160c01b03169050610b15565b8183600081548110612ddb57612ddb613c60565b6000918252602090912001546001600160401b03161115612dfe57506000610b15565b82546000908190612e1190600190613c4d565b90505b81811115612ee15760006002612e2a8484613c4d565b612e349190613d50565b612e3e9083613c4d565b90506000868281548110612e5457612e54613c60565b6000918252602091829020604080518082019091529101546001600160401b038116808352600160401b9091046001600160c01b0316928201929092529150869003612eb257602001516001600160c01b03169350610b1592505050565b80516001600160401b0316861115612ecc57819350612eda565b612ed7600183613c4d565b92505b5050612e14565b848281548110612ef357612ef3613c60565b600091825260209091200154600160401b90046001600160c01b031695945050505050565b8254600090819015612f655784548590612f3490600190613c4d565b81548110612f4457612f44613c60565b600091825260209091200154600160401b90046001600160c01b0316612f68565b60005b6001600160c01b0316915083612f8757612f828383613c4d565b612f91565b612f918383613b0a565b855490915015801590612fd85750845443908690612fb190600190613c4d565b81548110612fc157612fc1613c60565b6000918252602090912001546001600160401b0316145b1561303557845481908690612fef90600190613c4d565b81548110612fff57612fff613c60565b9060005260206000200160000160086101000a8154816001600160c01b0302191690836001600160c01b03160217905550613087565b604080518082019091526001600160401b0343811682526001600160c01b0380841660208085019182528954600181018b5560008b81529190912094519151909216600160401b029216919091179101555b935093915050565b816001600160a01b0316836001600160a01b031614806130ad575080155b6129df576001600160a01b03831615613143576001600160a01b038316600090815260386020526040812090806130e5838286612f18565b91509150856001600160a01b0316876001600160a01b03167fd1404f22081753a56b50e0d5ff5c9ed0e4a3a840e1171a443721a342e71bb5c18484604051613137929190918252602082015260400190565b60405180910390a35050505b6001600160a01b038216156129df576001600160a01b0382166000908152603860205260408120908061317883600186612f18565b91509150846001600160a01b0316876001600160a01b03167fd1404f22081753a56b50e0d5ff5c9ed0e4a3a840e1171a443721a342e71bb5c184846040516131ca929190918252602082015260400190565b60405180910390a350505050505050565b6131e8600160ff1b61352f565b611986828261323f33613210876001600160a01b031660009081526001602052604090205490565b6001600160a01b0391909116600090815260016020526040902054600019808818821618908716919091171690565b613370565b6000836001600160a01b03163b1161328c5760405162461bcd60e51b815260206004820152600b60248201526a22a7a09039b832b73232b960a91b6044820152606401610d85565b6040516307b04a2d60e41b81526000906001600160a01b03851690637b04a2d0906132bf90339087908790600401613d72565b6020604051808303816000875af11580156132de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133029190613d33565b90506001600160e01b031981166307b04a2d60e41b146129df5760405162461bcd60e51b815260206004820152602360248201527f696e76616c6964206f6e417070726f76616c526563656976656420726573706f6044820152626e736560e81b6064820152608401610d85565b6001600160a01b038316600081815260016020908152604091829020849055815185815290810184905233917f5a10526456f5116c0b7b80582c217d666243fd51b6a2d92c8011e601c2462e5f910160405180910390a3505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561343e5760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207369676e6174757265202773272076616c756500000000006044820152606401610d85565b8360ff16601b148061345357508360ff16601c145b61349f5760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207369676e6174757265202776272076616c756500000000006044820152606401610d85565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156134f3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166135265760405162461bcd60e51b8152600401610d8590613c22565b95945050505050565b61118961353b82612192565b8061118957604051634ca8886760e01b815260040160405180910390fd5b6001600160e01b03198116811461118957600080fd5b60006020828403121561358157600080fd5b8135610bcc81613559565b6000815180845260005b818110156135b257602081850181015186830182015201613596565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000610bcc602083018461358c565b80356001600160a01b03811681146135fc57600080fd5b919050565b6000806040838503121561361457600080fd5b61361d836135e5565b946020939093013593505050565b60006020828403121561363d57600080fd5b610bcc826135e5565b60008060006060848603121561365b57600080fd5b613664846135e5565b9250613672602085016135e5565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126136aa57600080fd5b8135602083016000806001600160401b038411156136ca576136ca613683565b50604051601f19601f85018116603f011681018181106001600160401b03821117156136f8576136f8613683565b60405283815290508082840187101561371057600080fd5b838360208301376000602085830101528094505050505092915050565b60008060006060848603121561374257600080fd5b61374b846135e5565b92506020840135915060408401356001600160401b0381111561376d57600080fd5b61377986828701613699565b9150509250925092565b60008060008060008060c0878903121561379c57600080fd5b6137a5876135e5565b955060208701356001600160401b038111156137c057600080fd5b6137cc89828a01613699565b95505060408701356001600160401b038111156137e857600080fd5b6137f489828a01613699565b945050613803606088016135e5565b9598949750929560808101359460a0909101359350915050565b803560ff811681146135fc57600080fd5b600080600080600060a0868803121561384657600080fd5b61384f866135e5565b9450602086013593506138646040870161381d565b94979396509394606081013594506080013592915050565b602080825282518282018190526000918401906040840190835b818110156138d257835180516001600160401b031684526020908101516001600160c01b03168185015290930192604090920191600101613896565b509095945050505050565b6000602082840312156138ef57600080fd5b5035919050565b6000806000806080858703121561390c57600080fd5b613915856135e5565b9350613923602086016135e5565b92506040850135915060608501356001600160401b0381111561394557600080fd5b61395187828801613699565b91505092959194509250565b600080600080600080600060e0888a03121561397857600080fd5b613981886135e5565b965061398f602089016135e5565b955060408801359450606088013593506139ab6080890161381d565b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156139db57600080fd5b6139e4836135e5565b91506139f2602084016135e5565b90509250929050565b60008060008060008060008060006101208a8c031215613a1a57600080fd5b613a238a6135e5565b9850613a3160208b016135e5565b975060408a0135965060608a0135955060808a0135945060a08a01359350613a5b60c08b0161381d565b989b979a50959894979396929550929360e081013593506101000135919050565b60008060008060008060c08789031215613a9557600080fd5b613a9e876135e5565b955060208701359450604087013593506138036060880161381d565b600181811c90821680613ace57607f821691505b602082108103613aee57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b1557610b15613af4565b601f82111561107957806000526020600020601f840160051c81016020851015613b445750805b601f840160051c820191505b81811015612d2e5760008155600101613b50565b81516001600160401b03811115613b7d57613b7d613683565b613b9181613b8b8454613aba565b84613b1d565b6020601f821160018114613bc55760008315613bad5750848201515b600019600385901b1c1916600184901b178455612d2e565b600084815260208120601f198516915b82811015613bf55787850151825560209485019460019092019101613bd5565b5084821015613c135786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b602080825260119082015270696e76616c6964207369676e617475726560781b604082015260600190565b81810381811115610b1557610b15613af4565b634e487b7160e01b600052603260045260246000fd5b600060018201613c8857613c88613af4565b5060010190565b6020808252601190820152701cda59db985d1d5c9948195e1c1a5c9959607a1b604082015260600190565b9687526001600160a01b0395861660208801529390941660408601526060850191909152608084015260a083019190915260c082015260e00190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d299083018461358c565b9695505050505050565b600060208284031215613d4557600080fd5b8151610bcc81613559565b600082613d6d57634e487b7160e01b600052601260045260246000fd5b500490565b60018060a01b0384168152826020820152606060408201526000613526606083018461358c56fed1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212209247dcb365dd0219f745732c45d304a963229226e3b98c7a9ebffee87380a60264736f6c634300081d0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
