{
  "_format": "hh-sol-artifact-1",
  "contractName": "PermissionedERC4626",
  "sourceName": "contracts/PermissionedERC4626.sol",
  "abi": [
    {
      "inputs": [],
      "name": "AccessControlBadConfirmation",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "neededRole",
          "type": "bytes32"
        }
      ],
      "name": "AccessControlUnauthorizedAccount",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AddressEmptyCode",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "ERC1967InvalidImplementation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ERC1967NonPayable",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "allowance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "needed",
          "type": "uint256"
        }
      ],
      "name": "ERC20InsufficientAllowance",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "balance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "needed",
          "type": "uint256"
        }
      ],
      "name": "ERC20InsufficientBalance",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "approver",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidApprover",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidReceiver",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidSender",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidSpender",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "ERC4626ExceededMaxDeposit",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "ERC4626ExceededMaxMint",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "ERC4626ExceededMaxRedeem",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "ERC4626ExceededMaxWithdraw",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "FailedCall",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "asset",
          "type": "address"
        }
      ],
      "name": "InvalidAsset",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidInitialization",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotInitializing",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SafeERC20FailedOperation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UUPSUnauthorizedCallContext",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "slot",
          "type": "bytes32"
        }
      ],
      "name": "UUPSUnsupportedProxiableUUID",
      "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": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "Deposit",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "version",
          "type": "uint64"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "previousAdminRole",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "newAdminRole",
          "type": "bytes32"
        }
      ],
      "name": "RoleAdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleGranted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleRevoked",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "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": "implementation",
          "type": "address"
        }
      ],
      "name": "Upgraded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "Withdraw",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DEFAULT_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "GUARDIAN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "LP_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "UPGRADE_INTERFACE_VERSION",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "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": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "asset",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "convertToAssets",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        }
      ],
      "name": "convertToShares",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "deposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "maxDeposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "maxMint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "maxRedeem",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "maxWithdraw",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "mint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        }
      ],
      "name": "previewDeposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "previewMint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "previewRedeem",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        }
      ],
      "name": "previewWithdraw",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proxiableUUID",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "redeem",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "callerConfirmation",
          "type": "address"
        }
      ],
      "name": "renounceRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "adminRole",
          "type": "bytes32"
        }
      ],
      "name": "setRoleAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalAssets",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "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": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "upgradeToAndCall",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "withdraw",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x60a0604052306080523480156012575f5ffd5b50608051611e1a6100395f395f8181610f2201528181610f4b01526110ae0152611e1a5ff3fe60806040526004361061021d575f3560e01c80636e553f651161011e578063b460af94116100a8578063d547741f1161006d578063d547741f14610624578063d905777e14610643578063dd62ed3e14610662578063e1d3945014610681578063ef8b30f7146105e6575f5ffd5b8063b460af94146105a8578063ba087652146105c7578063c63d75b614610451578063c6e6f592146105e6578063ce96cb7714610605575f5ffd5b806395d89b41116100ee57806395d89b4114610513578063a217fddf14610527578063a9059cbb1461053a578063ad3cb1cc14610559578063b3d7f6b914610589575f5ffd5b80636e553f651461049757806370a08231146104b657806391d14854146104d557806394bf804d146104f4575f5ffd5b8063248a9ca3116101aa57806338d52e0f1161016f57806338d52e0f1461041e578063402d267d146104515780634cdad506146102985780634f1ef2861461047057806352d1902d14610483575f5ffd5b8063248a9ca31461036857806324ea54f4146103875780632f2ff15d146103ba578063313ce567146103d957806336568abe146103ff575f5ffd5b8063095ea7b3116101f0578063095ea7b3146102b75780630a28a477146102d657806318160ddd146102f55780631e4e00911461032857806323b872dd14610349575f5ffd5b806301e1d1141461022157806301ffc9a71461024857806306fdde031461027757806307a2d13a14610298575b5f5ffd5b34801561022c575f5ffd5b506102356106b4565b6040519081526020015b60405180910390f35b348015610253575f5ffd5b506102676102623660046118cc565b610734565b604051901515815260200161023f565b348015610282575f5ffd5b5061028b61076a565b60405161023f91906118f3565b3480156102a3575f5ffd5b506102356102b2366004611928565b61082a565b3480156102c2575f5ffd5b506102676102d136600461195a565b610835565b3480156102e1575f5ffd5b506102356102f0366004611928565b61084c565b348015610300575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610235565b348015610333575f5ffd5b50610347610342366004611982565b610858565b005b348015610354575f5ffd5b506102676103633660046119a2565b610871565b348015610373575f5ffd5b50610235610382366004611928565b610896565b348015610392575f5ffd5b506102357f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b3480156103c5575f5ffd5b506103476103d43660046119dc565b6108b6565b3480156103e4575f5ffd5b506103ed6108d8565b60405160ff909116815260200161023f565b34801561040a575f5ffd5b506103476104193660046119dc565b610901565b348015610429575f5ffd5b505f516020611dc55f395f51905f52546040516001600160a01b03909116815260200161023f565b34801561045c575f5ffd5b5061023561046b366004611a06565b610934565b61034761047e366004611a33565b610971565b34801561048e575f5ffd5b50610235610990565b3480156104a2575f5ffd5b506102356104b13660046119dc565b6109ab565b3480156104c1575f5ffd5b506102356104d0366004611a06565b610a08565b3480156104e0575f5ffd5b506102676104ef3660046119dc565b610a2e565b3480156104ff575f5ffd5b5061023561050e3660046119dc565b610a64565b34801561051e575f5ffd5b5061028b610ab0565b348015610532575f5ffd5b506102355f81565b348015610545575f5ffd5b5061026761055436600461195a565b610aee565b348015610564575f5ffd5b5061028b604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610594575f5ffd5b506102356105a3366004611928565b610afb565b3480156105b3575f5ffd5b506102356105c2366004611af7565b610b07565b3480156105d2575f5ffd5b506102356105e1366004611af7565b610b5d565b3480156105f1575f5ffd5b50610235610600366004611928565b610baa565b348015610610575f5ffd5b5061023561061f366004611a06565b610bb5565b34801561062f575f5ffd5b5061034761063e3660046119dc565b610bc8565b34801561064e575f5ffd5b5061023561065d366004611a06565b610be4565b34801561066d575f5ffd5b5061023561067c366004611b30565b610bee565b34801561068c575f5ffd5b506102357fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a681565b5f805f516020611dc55f395f51905f5280546040516370a0823160e01b81523060048201529192506001600160a01b0316906370a0823190602401602060405180830381865afa15801561070a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072e9190611b58565b91505090565b5f6001600160e01b03198216637965db0b60e01b148061076457506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f516020611d655f395f51905f52916107a890611b6f565b80601f01602080910402602001604051908101604052809291908181526020018280546107d490611b6f565b801561081f5780601f106107f65761010080835404028352916020019161081f565b820191905f5260205f20905b81548152906001019060200180831161080257829003601f168201915b505050505091505090565b5f610764825f610c37565b5f33610842818585610c8e565b5060019392505050565b5f610764826001610c9b565b5f61086281610ce9565b61086c8383610cf6565b505050565b5f3361087e858285610d56565b610889858585610da0565b60019150505b9392505050565b5f9081525f516020611da55f395f51905f52602052604090206001015490565b6108bf82610896565b6108c881610ce9565b6108d28383610dfd565b50505050565b5f805f516020611dc55f395f51905f5290505f815461072e9190600160a01b900460ff16611bbb565b6001600160a01b038116331461092a5760405163334bd91960e11b815260040160405180910390fd5b61086c8282610e9e565b5f61095f7fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a683610a2e565b61096a57505f919050565b5f19610764565b610979610f17565b61098282610fbd565b61098c8282610fe7565b5050565b5f6109996110a3565b505f516020611d855f395f51905f5290565b5f5f6109b683610934565b9050808411156109e857828482604051633c8097d960e11b81526004016109df93929190611bd4565b60405180910390fd5b5f6109f285610baa565b9050610a00338587846110ec565b949350505050565b6001600160a01b03165f9081525f516020611d655f395f51905f52602052604090205490565b5f9182525f516020611da55f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f5f610a6f83610934565b905080841115610a985782848260405163284ff66760e01b81526004016109df93929190611bd4565b5f610aa285610afb565b9050610a00338583886110ec565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f516020611d655f395f51905f52916107a890611b6f565b5f33610842818585610da0565b5f610764826001610c37565b5f5f610b1283610bb5565b905080851115610b3b57828582604051633fa733bb60e21b81526004016109df93929190611bd4565b5f610b458661084c565b9050610b543386868985611178565b95945050505050565b5f5f610b6883610be4565b905080851115610b9157828582604051632e52afbb60e21b81526004016109df93929190611bd4565b5f610b9b8661082a565b9050610b54338686848a611178565b5f610764825f610c9b565b5f610764610bc283610a08565b5f610c37565b610bd182610896565b610bda81610ce9565b6108d28383610e9e565b5f61076482610a08565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f61088f610c436106b4565b610c4e906001611bf5565b610c595f600a611ceb565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610c859190611bf5565b8591908561122c565b61086c838383600161126e565b5f61088f610caa82600a611ceb565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610cd69190611bf5565b610cde6106b4565b610c85906001611bf5565b610cf38133611349565b50565b5f516020611da55f395f51905f525f610d0e84610896565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f610d618484610bee565b90505f1981146108d25781811015610d9257828183604051637dc7a0d960e11b81526004016109df93929190611bd4565b6108d284848484035f61126e565b6001600160a01b038316610dc957604051634b637e8f60e11b81525f60048201526024016109df565b6001600160a01b038216610df25760405163ec442f0560e01b81525f60048201526024016109df565b61086c838383611382565b5f5f516020611da55f395f51905f52610e168484610a2e565b610e95575f848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055610e4b3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610764565b5f915050610764565b5f5f516020611da55f395f51905f52610eb78484610a2e565b15610e95575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610764565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f9d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610f915f516020611d855f395f51905f52546001600160a01b031690565b6001600160a01b031614155b15610fbb5760405163703e46dd60e11b815260040160405180910390fd5b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504161098c81610ce9565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611041575060408051601f3d908101601f1916820190925261103e91810190611b58565b60015b61106957604051634c9c8ce360e01b81526001600160a01b03831660048201526024016109df565b5f516020611d855f395f51905f52811461109957604051632a87526960e21b8152600481018290526024016109df565b61086c83836114a8565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fbb5760405163703e46dd60e11b815260040160405180910390fd5b5f516020611dc55f395f51905f528054611111906001600160a01b03168630866114fd565b61111b8483611564565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78585604051611169929190918252602082015260400190565b60405180910390a35050505050565b5f516020611dc55f395f51905f526001600160a01b03868116908516146111a4576111a4848784610d56565b6111ae8483611598565b80546111c4906001600160a01b031686856115cc565b836001600160a01b0316856001600160a01b0316876001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db868660405161121c929190918252602082015260400190565b60405180910390a4505050505050565b5f611259611239836115fd565b801561125457505f848061124f5761124f611cf9565b868809115b151590565b611264868686611629565b610b549190611bf5565b5f516020611d655f395f51905f526001600160a01b0385166112a55760405163e602df0560e01b81525f60048201526024016109df565b6001600160a01b0384166112ce57604051634a1406b160e11b81525f60048201526024016109df565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561134257836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161116991815260200190565b5050505050565b6113538282610a2e565b61098c5760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016109df565b5f516020611d655f395f51905f526001600160a01b0384166113bc5781816002015f8282546113b19190611bf5565b909155506114199050565b6001600160a01b0384165f90815260208290526040902054828110156113fb5784818460405163391434e360e21b81526004016109df93929190611bd4565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611437576002810180548390039055611455565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161149a91815260200190565b60405180910390a350505050565b6114b1826116df565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156114f55761086c8282611742565b61098c6117ab565b6040516001600160a01b0384811660248301528381166044830152606482018390526108d29186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506117ca565b6001600160a01b03821661158d5760405163ec442f0560e01b81525f60048201526024016109df565b61098c5f8383611382565b6001600160a01b0382166115c157604051634b637e8f60e11b81525f60048201526024016109df565b61098c825f83611382565b6040516001600160a01b0383811660248301526044820183905261086c91859182169063a9059cbb90606401611532565b5f600282600381111561161257611612611d0d565b61161c9190611d21565b60ff166001149050919050565b5f838302815f1985870982811083820303915050805f0361165d5783828161165357611653611cf9565b049250505061088f565b808411611674576116746003851502601118611836565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b806001600160a01b03163b5f0361171457604051634c9c8ce360e01b81526001600160a01b03821660048201526024016109df565b5f516020611d855f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161175e9190611d4e565b5f60405180830381855af49150503d805f8114611796576040519150601f19603f3d011682016040523d82523d5f602084013e61179b565b606091505b5091509150610b54858383611847565b3415610fbb5760405163b398979f60e01b815260040160405180910390fd5b5f5f60205f8451602086015f885af1806117e9576040513d5f823e3d81fd5b50505f513d9150811561180057806001141561180d565b6001600160a01b0384163b155b156108d257604051635274afe760e01b81526001600160a01b03851660048201526024016109df565b634e487b715f52806020526024601cfd5b60608261185c57611857826118a3565b61088f565b815115801561187357506001600160a01b0384163b155b1561189c57604051639996b31560e01b81526001600160a01b03851660048201526024016109df565b508061088f565b8051156118b35780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f602082840312156118dc575f5ffd5b81356001600160e01b03198116811461088f575f5ffd5b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215611938575f5ffd5b5035919050565b80356001600160a01b0381168114611955575f5ffd5b919050565b5f5f6040838503121561196b575f5ffd5b6119748361193f565b946020939093013593505050565b5f5f60408385031215611993575f5ffd5b50508035926020909101359150565b5f5f5f606084860312156119b4575f5ffd5b6119bd8461193f565b92506119cb6020850161193f565b929592945050506040919091013590565b5f5f604083850312156119ed575f5ffd5b823591506119fd6020840161193f565b90509250929050565b5f60208284031215611a16575f5ffd5b61088f8261193f565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215611a44575f5ffd5b611a4d8361193f565b9150602083013567ffffffffffffffff811115611a68575f5ffd5b8301601f81018513611a78575f5ffd5b803567ffffffffffffffff811115611a9257611a92611a1f565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715611ac157611ac1611a1f565b604052818152828201602001871015611ad8575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f5f60608486031215611b09575f5ffd5b83359250611b196020850161193f565b9150611b276040850161193f565b90509250925092565b5f5f60408385031215611b41575f5ffd5b611b4a8361193f565b91506119fd6020840161193f565b5f60208284031215611b68575f5ffd5b5051919050565b600181811c90821680611b8357607f821691505b602082108103611ba157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b60ff818116838216019081111561076457610764611ba7565b6001600160a01b039390931683526020830191909152604082015260600190565b8082018082111561076457610764611ba7565b6001815b6001841115611c4357808504811115611c2757611c27611ba7565b6001841615611c3557908102905b60019390931c928002611c0c565b935093915050565b5f82611c5957506001610764565b81611c6557505f610764565b8160018114611c7b5760028114611c8557611ca1565b6001915050610764565b60ff841115611c9657611c96611ba7565b50506001821b610764565b5060208310610133831016604e8410600b8410161715611cc4575081810a610764565b611cd05f198484611c08565b805f1904821115611ce357611ce3611ba7565b029392505050565b5f61088f60ff841683611c4b565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60ff831680611d3f57634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b5f82518060208501845e5f92019182525091905056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268000773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00a2646970667358221220d5f28cf5a8f3980c642578ba7711c64ee145289e49779e99879b30ad248cc28064736f6c634300081c0033",
  "deployedBytecode": "0x60806040526004361061021d575f3560e01c80636e553f651161011e578063b460af94116100a8578063d547741f1161006d578063d547741f14610624578063d905777e14610643578063dd62ed3e14610662578063e1d3945014610681578063ef8b30f7146105e6575f5ffd5b8063b460af94146105a8578063ba087652146105c7578063c63d75b614610451578063c6e6f592146105e6578063ce96cb7714610605575f5ffd5b806395d89b41116100ee57806395d89b4114610513578063a217fddf14610527578063a9059cbb1461053a578063ad3cb1cc14610559578063b3d7f6b914610589575f5ffd5b80636e553f651461049757806370a08231146104b657806391d14854146104d557806394bf804d146104f4575f5ffd5b8063248a9ca3116101aa57806338d52e0f1161016f57806338d52e0f1461041e578063402d267d146104515780634cdad506146102985780634f1ef2861461047057806352d1902d14610483575f5ffd5b8063248a9ca31461036857806324ea54f4146103875780632f2ff15d146103ba578063313ce567146103d957806336568abe146103ff575f5ffd5b8063095ea7b3116101f0578063095ea7b3146102b75780630a28a477146102d657806318160ddd146102f55780631e4e00911461032857806323b872dd14610349575f5ffd5b806301e1d1141461022157806301ffc9a71461024857806306fdde031461027757806307a2d13a14610298575b5f5ffd5b34801561022c575f5ffd5b506102356106b4565b6040519081526020015b60405180910390f35b348015610253575f5ffd5b506102676102623660046118cc565b610734565b604051901515815260200161023f565b348015610282575f5ffd5b5061028b61076a565b60405161023f91906118f3565b3480156102a3575f5ffd5b506102356102b2366004611928565b61082a565b3480156102c2575f5ffd5b506102676102d136600461195a565b610835565b3480156102e1575f5ffd5b506102356102f0366004611928565b61084c565b348015610300575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610235565b348015610333575f5ffd5b50610347610342366004611982565b610858565b005b348015610354575f5ffd5b506102676103633660046119a2565b610871565b348015610373575f5ffd5b50610235610382366004611928565b610896565b348015610392575f5ffd5b506102357f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b3480156103c5575f5ffd5b506103476103d43660046119dc565b6108b6565b3480156103e4575f5ffd5b506103ed6108d8565b60405160ff909116815260200161023f565b34801561040a575f5ffd5b506103476104193660046119dc565b610901565b348015610429575f5ffd5b505f516020611dc55f395f51905f52546040516001600160a01b03909116815260200161023f565b34801561045c575f5ffd5b5061023561046b366004611a06565b610934565b61034761047e366004611a33565b610971565b34801561048e575f5ffd5b50610235610990565b3480156104a2575f5ffd5b506102356104b13660046119dc565b6109ab565b3480156104c1575f5ffd5b506102356104d0366004611a06565b610a08565b3480156104e0575f5ffd5b506102676104ef3660046119dc565b610a2e565b3480156104ff575f5ffd5b5061023561050e3660046119dc565b610a64565b34801561051e575f5ffd5b5061028b610ab0565b348015610532575f5ffd5b506102355f81565b348015610545575f5ffd5b5061026761055436600461195a565b610aee565b348015610564575f5ffd5b5061028b604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610594575f5ffd5b506102356105a3366004611928565b610afb565b3480156105b3575f5ffd5b506102356105c2366004611af7565b610b07565b3480156105d2575f5ffd5b506102356105e1366004611af7565b610b5d565b3480156105f1575f5ffd5b50610235610600366004611928565b610baa565b348015610610575f5ffd5b5061023561061f366004611a06565b610bb5565b34801561062f575f5ffd5b5061034761063e3660046119dc565b610bc8565b34801561064e575f5ffd5b5061023561065d366004611a06565b610be4565b34801561066d575f5ffd5b5061023561067c366004611b30565b610bee565b34801561068c575f5ffd5b506102357fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a681565b5f805f516020611dc55f395f51905f5280546040516370a0823160e01b81523060048201529192506001600160a01b0316906370a0823190602401602060405180830381865afa15801561070a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072e9190611b58565b91505090565b5f6001600160e01b03198216637965db0b60e01b148061076457506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f516020611d655f395f51905f52916107a890611b6f565b80601f01602080910402602001604051908101604052809291908181526020018280546107d490611b6f565b801561081f5780601f106107f65761010080835404028352916020019161081f565b820191905f5260205f20905b81548152906001019060200180831161080257829003601f168201915b505050505091505090565b5f610764825f610c37565b5f33610842818585610c8e565b5060019392505050565b5f610764826001610c9b565b5f61086281610ce9565b61086c8383610cf6565b505050565b5f3361087e858285610d56565b610889858585610da0565b60019150505b9392505050565b5f9081525f516020611da55f395f51905f52602052604090206001015490565b6108bf82610896565b6108c881610ce9565b6108d28383610dfd565b50505050565b5f805f516020611dc55f395f51905f5290505f815461072e9190600160a01b900460ff16611bbb565b6001600160a01b038116331461092a5760405163334bd91960e11b815260040160405180910390fd5b61086c8282610e9e565b5f61095f7fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a683610a2e565b61096a57505f919050565b5f19610764565b610979610f17565b61098282610fbd565b61098c8282610fe7565b5050565b5f6109996110a3565b505f516020611d855f395f51905f5290565b5f5f6109b683610934565b9050808411156109e857828482604051633c8097d960e11b81526004016109df93929190611bd4565b60405180910390fd5b5f6109f285610baa565b9050610a00338587846110ec565b949350505050565b6001600160a01b03165f9081525f516020611d655f395f51905f52602052604090205490565b5f9182525f516020611da55f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f5f610a6f83610934565b905080841115610a985782848260405163284ff66760e01b81526004016109df93929190611bd4565b5f610aa285610afb565b9050610a00338583886110ec565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f516020611d655f395f51905f52916107a890611b6f565b5f33610842818585610da0565b5f610764826001610c37565b5f5f610b1283610bb5565b905080851115610b3b57828582604051633fa733bb60e21b81526004016109df93929190611bd4565b5f610b458661084c565b9050610b543386868985611178565b95945050505050565b5f5f610b6883610be4565b905080851115610b9157828582604051632e52afbb60e21b81526004016109df93929190611bd4565b5f610b9b8661082a565b9050610b54338686848a611178565b5f610764825f610c9b565b5f610764610bc283610a08565b5f610c37565b610bd182610896565b610bda81610ce9565b6108d28383610e9e565b5f61076482610a08565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f61088f610c436106b4565b610c4e906001611bf5565b610c595f600a611ceb565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610c859190611bf5565b8591908561122c565b61086c838383600161126e565b5f61088f610caa82600a611ceb565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610cd69190611bf5565b610cde6106b4565b610c85906001611bf5565b610cf38133611349565b50565b5f516020611da55f395f51905f525f610d0e84610896565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f610d618484610bee565b90505f1981146108d25781811015610d9257828183604051637dc7a0d960e11b81526004016109df93929190611bd4565b6108d284848484035f61126e565b6001600160a01b038316610dc957604051634b637e8f60e11b81525f60048201526024016109df565b6001600160a01b038216610df25760405163ec442f0560e01b81525f60048201526024016109df565b61086c838383611382565b5f5f516020611da55f395f51905f52610e168484610a2e565b610e95575f848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055610e4b3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610764565b5f915050610764565b5f5f516020611da55f395f51905f52610eb78484610a2e565b15610e95575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610764565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f9d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610f915f516020611d855f395f51905f52546001600160a01b031690565b6001600160a01b031614155b15610fbb5760405163703e46dd60e11b815260040160405180910390fd5b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504161098c81610ce9565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611041575060408051601f3d908101601f1916820190925261103e91810190611b58565b60015b61106957604051634c9c8ce360e01b81526001600160a01b03831660048201526024016109df565b5f516020611d855f395f51905f52811461109957604051632a87526960e21b8152600481018290526024016109df565b61086c83836114a8565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fbb5760405163703e46dd60e11b815260040160405180910390fd5b5f516020611dc55f395f51905f528054611111906001600160a01b03168630866114fd565b61111b8483611564565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78585604051611169929190918252602082015260400190565b60405180910390a35050505050565b5f516020611dc55f395f51905f526001600160a01b03868116908516146111a4576111a4848784610d56565b6111ae8483611598565b80546111c4906001600160a01b031686856115cc565b836001600160a01b0316856001600160a01b0316876001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db868660405161121c929190918252602082015260400190565b60405180910390a4505050505050565b5f611259611239836115fd565b801561125457505f848061124f5761124f611cf9565b868809115b151590565b611264868686611629565b610b549190611bf5565b5f516020611d655f395f51905f526001600160a01b0385166112a55760405163e602df0560e01b81525f60048201526024016109df565b6001600160a01b0384166112ce57604051634a1406b160e11b81525f60048201526024016109df565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561134257836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161116991815260200190565b5050505050565b6113538282610a2e565b61098c5760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016109df565b5f516020611d655f395f51905f526001600160a01b0384166113bc5781816002015f8282546113b19190611bf5565b909155506114199050565b6001600160a01b0384165f90815260208290526040902054828110156113fb5784818460405163391434e360e21b81526004016109df93929190611bd4565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611437576002810180548390039055611455565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161149a91815260200190565b60405180910390a350505050565b6114b1826116df565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156114f55761086c8282611742565b61098c6117ab565b6040516001600160a01b0384811660248301528381166044830152606482018390526108d29186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506117ca565b6001600160a01b03821661158d5760405163ec442f0560e01b81525f60048201526024016109df565b61098c5f8383611382565b6001600160a01b0382166115c157604051634b637e8f60e11b81525f60048201526024016109df565b61098c825f83611382565b6040516001600160a01b0383811660248301526044820183905261086c91859182169063a9059cbb90606401611532565b5f600282600381111561161257611612611d0d565b61161c9190611d21565b60ff166001149050919050565b5f838302815f1985870982811083820303915050805f0361165d5783828161165357611653611cf9565b049250505061088f565b808411611674576116746003851502601118611836565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b806001600160a01b03163b5f0361171457604051634c9c8ce360e01b81526001600160a01b03821660048201526024016109df565b5f516020611d855f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161175e9190611d4e565b5f60405180830381855af49150503d805f8114611796576040519150601f19603f3d011682016040523d82523d5f602084013e61179b565b606091505b5091509150610b54858383611847565b3415610fbb5760405163b398979f60e01b815260040160405180910390fd5b5f5f60205f8451602086015f885af1806117e9576040513d5f823e3d81fd5b50505f513d9150811561180057806001141561180d565b6001600160a01b0384163b155b156108d257604051635274afe760e01b81526001600160a01b03851660048201526024016109df565b634e487b715f52806020526024601cfd5b60608261185c57611857826118a3565b61088f565b815115801561187357506001600160a01b0384163b155b1561189c57604051639996b31560e01b81526001600160a01b03851660048201526024016109df565b508061088f565b8051156118b35780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f602082840312156118dc575f5ffd5b81356001600160e01b03198116811461088f575f5ffd5b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215611938575f5ffd5b5035919050565b80356001600160a01b0381168114611955575f5ffd5b919050565b5f5f6040838503121561196b575f5ffd5b6119748361193f565b946020939093013593505050565b5f5f60408385031215611993575f5ffd5b50508035926020909101359150565b5f5f5f606084860312156119b4575f5ffd5b6119bd8461193f565b92506119cb6020850161193f565b929592945050506040919091013590565b5f5f604083850312156119ed575f5ffd5b823591506119fd6020840161193f565b90509250929050565b5f60208284031215611a16575f5ffd5b61088f8261193f565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215611a44575f5ffd5b611a4d8361193f565b9150602083013567ffffffffffffffff811115611a68575f5ffd5b8301601f81018513611a78575f5ffd5b803567ffffffffffffffff811115611a9257611a92611a1f565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715611ac157611ac1611a1f565b604052818152828201602001871015611ad8575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f5f60608486031215611b09575f5ffd5b83359250611b196020850161193f565b9150611b276040850161193f565b90509250925092565b5f5f60408385031215611b41575f5ffd5b611b4a8361193f565b91506119fd6020840161193f565b5f60208284031215611b68575f5ffd5b5051919050565b600181811c90821680611b8357607f821691505b602082108103611ba157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b60ff818116838216019081111561076457610764611ba7565b6001600160a01b039390931683526020830191909152604082015260600190565b8082018082111561076457610764611ba7565b6001815b6001841115611c4357808504811115611c2757611c27611ba7565b6001841615611c3557908102905b60019390931c928002611c0c565b935093915050565b5f82611c5957506001610764565b81611c6557505f610764565b8160018114611c7b5760028114611c8557611ca1565b6001915050610764565b60ff841115611c9657611c96611ba7565b50506001821b610764565b5060208310610133831016604e8410600b8410161715611cc4575081810a610764565b611cd05f198484611c08565b805f1904821115611ce357611ce3611ba7565b029392505050565b5f61088f60ff841683611c4b565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60ff831680611d3f57634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b5f82518060208501845e5f92019182525091905056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268000773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00a2646970667358221220d5f28cf5a8f3980c642578ba7711c64ee145289e49779e99879b30ad248cc28064736f6c634300081c0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
