{
  "_format": "hh-sol-artifact-1",
  "contractName": "Liquidity",
  "sourceName": "contracts/liquidity/Liquidity.sol",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "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": [],
      "name": "AddressZero",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AlreadyRelayed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AmlValidationFailed",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "depositAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "limit",
          "type": "uint256"
        }
      ],
      "name": "DepositAmountExceedsLimit",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "depositHash",
          "type": "bytes32"
        }
      ],
      "name": "DepositHashAlreadyExists",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "ERC1967InvalidImplementation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ERC1967NonPayable",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "EligibilityValidationFailed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "EnforcedPause",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ExpectedPause",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "FailedCall",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "depositDataHash",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "calculatedHash",
          "type": "bytes32"
        }
      ],
      "name": "InvalidDepositHash",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidInitialization",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidWithdrawalAddress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotInitializing",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlySenderCanCancelDeposit",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "upToDepositId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "firstDepositId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "lastDepositId",
          "type": "uint256"
        }
      ],
      "name": "OutOfRange",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "RelayLimitExceeded",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SafeERC20FailedOperation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "SenderIsNotScrollMessenger",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TokenAddressIsZero",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TriedToDepositZero",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UUPSUnauthorizedCallContext",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "slot",
          "type": "bytes32"
        }
      ],
      "name": "UUPSUnsupportedProxiableUUID",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "WithdrawalAddressNotSet",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "WithdrawalFeeRatioExceedsLimit",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "withdrawalHash",
          "type": "bytes32"
        }
      ],
      "name": "WithdrawalNotFound",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "withdrawalHash",
          "type": "bytes32"
        }
      ],
      "name": "ClaimedWithdrawal",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "depositId",
          "type": "uint256"
        }
      ],
      "name": "DepositCanceled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "depositId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "recipientSaltHash",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "tokenIndex",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "isEligible",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "depositedAt",
          "type": "uint256"
        }
      ],
      "name": "Deposited",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "upToDepositId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "gasLimit",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "message",
          "type": "bytes"
        }
      ],
      "name": "DepositsRelayed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "withdrawalHash",
          "type": "bytes32"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "recipient",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "tokenIndex",
              "type": "uint32"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "nullifier",
              "type": "bytes32"
            }
          ],
          "indexed": false,
          "internalType": "struct WithdrawalLib.Withdrawal",
          "name": "withdrawal",
          "type": "tuple"
        }
      ],
      "name": "DirectWithdrawalFailed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "withdrawalHash",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        }
      ],
      "name": "DirectWithdrawalSuccessed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "version",
          "type": "uint64"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "Paused",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "amlPermitter",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "eligibilityPermitter",
          "type": "address"
        }
      ],
      "name": "PermitterSet",
      "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": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "Unpaused",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "Upgraded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "withdrawalHash",
          "type": "bytes32"
        }
      ],
      "name": "WithdrawalClaimable",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint32",
          "name": "token",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "WithdrawalFeeCollected",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint32",
          "name": "tokenIndex",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "feeRatio",
          "type": "uint256"
        }
      ],
      "name": "WithdrawalFeeRatioSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint32",
          "name": "token",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "WithdrawalFeeWithdrawn",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DEFAULT_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "RELAYER",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "RELAY_LIMIT",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "UPGRADE_INTERFACE_VERSION",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "WITHDRAWAL",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "WITHDRAWAL_FEE_RATIO_LIMIT",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "amlPermitter",
      "outputs": [
        {
          "internalType": "contract IPermitter",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "depositId",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "depositor",
              "type": "address"
            },
            {
              "internalType": "bytes32",
              "name": "recipientSaltHash",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "uint32",
              "name": "tokenIndex",
              "type": "uint32"
            },
            {
              "internalType": "bool",
              "name": "isEligible",
              "type": "bool"
            }
          ],
          "internalType": "struct DepositLib.Deposit",
          "name": "deposit",
          "type": "tuple"
        }
      ],
      "name": "cancelDeposit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "recipient",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "tokenIndex",
              "type": "uint32"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "nullifier",
              "type": "bytes32"
            }
          ],
          "internalType": "struct WithdrawalLib.Withdrawal[]",
          "name": "withdrawals",
          "type": "tuple[]"
        }
      ],
      "name": "claimWithdrawals",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "claimableWithdrawals",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "name": "collectedWithdrawalFees",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "contribution",
      "outputs": [
        {
          "internalType": "contract IContribution",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "deploymentTime",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "recipientSaltHash",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "amlPermission",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "eligibilityPermission",
          "type": "bytes"
        }
      ],
      "name": "depositERC1155",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "recipientSaltHash",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "amlPermission",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "eligibilityPermission",
          "type": "bytes"
        }
      ],
      "name": "depositERC20",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "recipientSaltHash",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "amlPermission",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "eligibilityPermission",
          "type": "bytes"
        }
      ],
      "name": "depositERC721",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "recipientSaltHash",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "amlPermission",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "eligibilityPermission",
          "type": "bytes"
        }
      ],
      "name": "depositNativeToken",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "doesDepositHashExist",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "eligibilityPermitter",
      "outputs": [
        {
          "internalType": "contract IPermitter",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "depositId",
          "type": "uint256"
        }
      ],
      "name": "getDepositData",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "depositHash",
              "type": "bytes32"
            },
            {
              "internalType": "address",
              "name": "sender",
              "type": "address"
            }
          ],
          "internalType": "struct DepositQueueLib.DepositData",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256[]",
          "name": "depositIds",
          "type": "uint256[]"
        }
      ],
      "name": "getDepositDataBatch",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "depositHash",
              "type": "bytes32"
            },
            {
              "internalType": "address",
              "name": "sender",
              "type": "address"
            }
          ],
          "internalType": "struct DepositQueueLib.DepositData[]",
          "name": "",
          "type": "tuple[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "depositId",
          "type": "uint256"
        }
      ],
      "name": "getDepositDataHash",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getLastDepositId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getLastRelayedDepositId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getNativeTokenIndex",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum ITokenData.TokenType",
          "name": "tokenType",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "getTokenIndex",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        },
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "tokenIndex",
          "type": "uint32"
        }
      ],
      "name": "getTokenInfo",
      "outputs": [
        {
          "components": [
            {
              "internalType": "enum ITokenData.TokenType",
              "name": "tokenType",
              "type": "uint8"
            },
            {
              "internalType": "address",
              "name": "tokenAddress",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "tokenId",
              "type": "uint256"
            }
          ],
          "internalType": "struct ITokenData.TokenInfo",
          "name": "",
          "type": "tuple"
        }
      ],
      "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": "_admin",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_l1ScrollMessenger",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_rollup",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_withdrawal",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_claim",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_relayer",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_contribution",
          "type": "address"
        },
        {
          "internalType": "address[]",
          "name": "initialERC20Tokens",
          "type": "address[]"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "depositId",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "recipientSaltHash",
          "type": "bytes32"
        },
        {
          "internalType": "uint32",
          "name": "tokenIndex",
          "type": "uint32"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "isEligible",
          "type": "bool"
        },
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "isDepositValid",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "l1ScrollMessenger",
      "outputs": [
        {
          "internalType": "contract IL1ScrollMessenger",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "name": "onERC1155Received",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pauseDeposits",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "paused",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "recipient",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "tokenIndex",
              "type": "uint32"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "nullifier",
              "type": "bytes32"
            }
          ],
          "internalType": "struct WithdrawalLib.Withdrawal[]",
          "name": "withdrawals",
          "type": "tuple[]"
        },
        {
          "internalType": "bytes32[]",
          "name": "withdrawalHashes",
          "type": "bytes32[]"
        }
      ],
      "name": "processWithdrawals",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proxiableUUID",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "upToDepositId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "gasLimit",
          "type": "uint256"
        }
      ],
      "name": "relayDeposits",
      "outputs": [],
      "stateMutability": "payable",
      "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": [],
      "name": "rollup",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_amlPermitter",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_eligibilityPermitter",
          "type": "address"
        }
      ],
      "name": "setPermitter",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "tokenIndex",
          "type": "uint32"
        },
        {
          "internalType": "uint256",
          "name": "feeRatio",
          "type": "uint256"
        }
      ],
      "name": "setWithdrawalFeeRatio",
      "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": "unpauseDeposits",
      "outputs": [],
      "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": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint32[]",
          "name": "tokenIndices",
          "type": "uint32[]"
        }
      ],
      "name": "withdrawCollectedFees",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "name": "withdrawalFeeRatio",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b60805161463d6100fd600039600081816121ff01528181612228015261236c015261463d6000f3fe6080604052600436106102ae5760003560e01c8063902eeef311610175578063c60af2b5116100dc578063d547741f11610095578063ea4644bb1161006f578063ea4644bb146108cc578063ecda10f5146108ec578063f23a6e6114610902578063f6a552d41461094857600080fd5b8063d547741f1461086a578063dd9ea2991461088a578063e579fa2b1461089f57600080fd5b8063c60af2b514610783578063cb23bcb5146107b0578063cbd90cd0146107d0578063cd6a976e146107fd578063d395c0171461081d578063d438c3491461084a57600080fd5b80639d07861c1161012e5780639d07861c146106a35780639d6a54cb146106c3578063a217fddf146106e3578063a98f7044146106f8578063ad3cb1cc14610718578063c13819b61461075657600080fd5b8063902eeef3146105e357806391d148541461060357806391f69b7d14610623578063978069b414610643578063986be0e2146106635780639c79a31c1461068357600080fd5b80634f1ef286116102195780635c975abb116101d25780635c975abb146105315780635edeb2a31461055657806363d8882a14610586578063675178371461059b57806376918c0d146105b057806385979730146105c357600080fd5b80634f1ef2861461047b57806350520b1f1461048e57806352d1902d146104c657806354adcb99146104db5780635521f77e146104f157806358dec40a1461051157600080fd5b80632f2ff15d1161026b5780632f2ff15d146103aa57806336568abe146103ca578063381175f6146103ea5780633cd07066146104265780633de40cfa14610446578063433f6c121461045957600080fd5b806301ffc9a7146102b357806302191980146102e8578063219cd263146102ff578063232c1c8a1461031b5780632483e71514610348578063248a9ca31461038a575b600080fd5b3480156102bf57600080fd5b506102d36102ce36600461380e565b61095e565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b506102fd610995565b005b34801561030b57600080fd5b50604051600081526020016102df565b34801561032757600080fd5b5061033b6103363660046138a1565b6109ab565b6040516102df9190613931565b34801561035457600080fd5b5061037c7fab4f864e5201b0fde9b5ee3e4cf96384802b0ffdfcf7f9de4699ce21a30afc4f81565b6040519081526020016102df565b34801561039657600080fd5b5061037c6103a5366004613992565b610aac565b3480156103b657600080fd5b506102fd6103c53660046139c0565b610ace565b3480156103d657600080fd5b506102fd6103e53660046139c0565b610af0565b3480156103f657600080fd5b5061040a6104053660046139f0565b610b28565b60408051921515835263ffffffff9091166020830152016102df565b34801561043257600080fd5b506102fd610441366004613a4e565b610c43565b6102fd610454366004613ac0565b610cc8565b34801561046557600080fd5b5061037c6000805160206145e883398151915281565b6102fd610489366004613b3d565b610dbd565b34801561049a57600080fd5b506005546104ae906001600160a01b031681565b6040516001600160a01b0390911681526020016102df565b3480156104d257600080fd5b5061037c610ddc565b3480156104e757600080fd5b5061037c6101c281565b3480156104fd57600080fd5b506102fd61050c366004613be8565b610df9565b34801561051d57600080fd5b506102fd61052c366004613cc5565b610f24565b34801561053d57600080fd5b506000805160206145c88339815191525460ff166102d3565b34801561056257600080fd5b506102d3610571366004613992565b600c6020526000908152604090205460ff1681565b34801561059257600080fd5b506102fd611023565b3480156105a757600080fd5b5061037c611036565b6102fd6105be366004613d19565b61104d565b3480156105cf57600080fd5b506008546104ae906001600160a01b031681565b3480156105ef57600080fd5b506102fd6105fe366004613d3b565b6111b5565b34801561060f57600080fd5b506102d361061e3660046139c0565b61121f565b34801561062f57600080fd5b506102fd61063e366004613dad565b611257565b34801561064f57600080fd5b506007546104ae906001600160a01b031681565b34801561066f57600080fd5b5061037c61067e366004613992565b611404565b34801561068f57600080fd5b506102fd61069e366004613dee565b611435565b3480156106af57600080fd5b506102d36106be366004613e34565b6115ad565b3480156106cf57600080fd5b506102fd6106de366004613e99565b61167f565b3480156106ef57600080fd5b5061037c600081565b34801561070457600080fd5b506004546104ae906001600160a01b031681565b34801561072457600080fd5b50610749604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102df9190613f58565b34801561076257600080fd5b50610776610771366004613992565b611750565b6040516102df9190613f6b565b34801561078f57600080fd5b5061037c61079e366004613f8b565b600b6020526000908152604090205481565b3480156107bc57600080fd5b506006546104ae906001600160a01b031681565b3480156107dc57600080fd5b506107f06107eb366004613f8b565b6117b1565b6040516102df9190613fbc565b34801561080957600080fd5b506102fd610818366004613be8565b611854565b34801561082957600080fd5b5061037c610838366004613f8b565b600a6020526000908152604090205481565b34801561085657600080fd5b506102fd610865366004614007565b6119b4565b34801561087657600080fd5b506102fd6108853660046139c0565b611b43565b34801561089657600080fd5b5061037c611b5f565b3480156108ab57600080fd5b5061037c6108ba366004613992565b60096020526000908152604090205481565b3480156108d857600080fd5b506102fd6108e73660046140a9565b611b71565b3480156108f857600080fd5b5061037c60035481565b34801561090e57600080fd5b5061092f61091d3660046141d1565b63f23a6e6160e01b9695505050505050565b6040516001600160e01b031990911681526020016102df565b34801561095457600080fd5b5061037c6105dc81565b60006001600160e01b03198216637965db0b60e01b148061098f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006109a081611e82565b6109a8611e8c565b50565b6060600082516001600160401b038111156109c8576109c8613838565b604051908082528060200260200182016040528015610a0d57816020015b60408051808201909152600080825260208201528152602001906001900390816109e65790505b50905060005b8351811015610aa557600d600001848281518110610a3357610a3361424c565b602002602001015181548110610a4b57610a4b61424c565b60009182526020918290206040805180820190915260029092020180548252600101546001600160a01b0316918101919091528251839083908110610a9257610a9261424c565b6020908102919091010152600101610a13565b5092915050565b60009081526000805160206145a8833981519152602052604090206001015490565b610ad782610aac565b610ae081611e82565b610aea8383611eef565b50505050565b6001600160a01b0381163314610b195760405163334bd91960e11b815260040160405180910390fd5b610b238282611f94565b505050565b60008080856003811115610b3e57610b3e613fa6565b03610b4f5750600190506000610c3b565b6001600160a01b038416610b765760405163dc2e5e8d60e01b815260040160405180910390fd5b6001856003811115610b8a57610b8a613fa6565b03610bc1576001600160a01b03841660009081526001602052604090205463ffffffff168015610bbf57600192509050610c3b565b505b6002856003811115610bd557610bd5613fa6565b1480610bf257506003856003811115610bf057610bf0613fa6565b145b15610c34576001600160a01b038416600090815260026020908152604080832086845290915290205463ffffffff168015610c3257600192509050610c3b565b505b5060009050805b935093915050565b6000610c4e81611e82565b6105dc821115610c715760405163886349bb60e01b815260040160405180910390fd5b63ffffffff83166000818152600a602052604090819020849055517ff5a91001916153e67eaaa2ae82827a002838792ca48af87df63408cc09cb96f490610cbb9085815260200190565b60405180910390a2505050565b610cd0612010565b34600003610cf1576040516394fe88d960e01b815260040160405180910390fd5b60008086604051602401610d0791815260200190565b60408051601f198184030181529190526020810180516001600160e01b031660016215566760e11b03191790529050610db4610d403390565b888434858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061204392505050565b50505050505050565b610dc56121f4565b610dce82612299565b610dd882826122a4565b5050565b6000610de6612361565b5060008051602061458883398151915290565b610e01612010565b84600003610e22576040516394fe88d960e01b815260040160405180910390fd5b610e376001600160a01b0388163330886123aa565b6000610e466001896000612411565b6040516001600160a01b038a166024820152604481018990526064810188905290915060009060840160408051601f198184030181529190526020810180516001600160e01b031663788c2ecf60e01b1790529050610f19610ea53390565b89848a858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061204392505050565b505050505050505050565b6000610f2f81611e82565b60005b8281101561101c576000848483818110610f4e57610f4e61424c565b9050602002016020810190610f639190613f8b565b63ffffffff81166000908152600b6020526040812054919250819003610f8a575050611014565b63ffffffff82166000908152600b60205260408120819055610fab836117b1565b9050610fc6816000015182602001518a85856040015161244b565b8263ffffffff16886001600160a01b03167f6c8628f02ab9884920c84f6f3507810561c8ed6c4b3bae0ce96eceab6def228b8460405161100891815260200190565b60405180910390a35050505b600101610f32565b5050505050565b600061102e81611e82565b6109a86125c6565b600e5460009061104890600190614278565b905090565b7fab4f864e5201b0fde9b5ee3e4cf96384802b0ffdfcf7f9de4699ce21a30afc4f61107781611e82565b6000611084600d8561260c565b90506101c2815111156110aa57604051635a8a34e560e01b815260040160405180910390fd5b600063f03efa3760e01b85836040516024016110c792919061428b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526004546006549192506001600160a01b0390811691635f7b157791349116600085896111223390565b6040518763ffffffff1660e01b81526004016111429594939291906142da565b6000604051808303818588803b15801561115b57600080fd5b505af115801561116f573d6000803e3d6000fd5b5050505050847f71df2a50f3ab1563277a27043770eb570eeaa3fc42ef76c607cdc667a82d03a485836040516111a6929190614323565b60405180910390a25050505050565b60006111c081611e82565b600780546001600160a01b03199081166001600160a01b03868116918217909355600880549092169285169283179091556040517ff670cdc1c52016a5cec857c88e8948913b39f86889230c0661b011fd2ed57df590600090a3505050565b60009182526000805160206145a8833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60005b81811015610b235760008383838181106112765761127661424c565b90506080020180360381019061128c919061433c565b90506000611299826127d4565b600081815260096020526040812054919250036112d157604051630181cdef60e61b8152600481018290526024015b60405180910390fd5b60006112e583602001518460400151612851565b905060008184604001516112f99190614278565b9050600061130a85602001516117b1565b9050600960008581526020019081526020016000206000905561134081600001518260200151876000015185856040015161244b565b845160405185916001600160a01b0316907f0575467d13f5ab9174f470cec96623374b05cf4b19a3c83a4bfca523e243ab0490600090a382156113f35760208086015163ffffffff166000908152600b9091526040812080548592906113a79084906143b0565b92505081905550846020015163ffffffff167f34658d4aa4a80fa713a0f3a04329f39177b5bea34e8dcba253600ee5ade6c654846040516113ea91815260200190565b60405180910390a25b50506001909301925061125a915050565b6000600d600001828154811061141c5761141c61424c565b9060005260206000209060020201600001549050919050565b81611445368390038301836143c3565b6000600d600001838154811061145d5761145d61424c565b60009182526020918290206040805180820190915260029092020180548252600101546001600160a01b03169181019190915290506114993390565b6001600160a01b031681602001516001600160a01b0316146114ce57604051631165d41f60e31b815260040160405180910390fd5b60006114d983612886565b8251909150811461150a578151604051633df112db60e11b81526004810191909152602481018290526044016112c8565b611512611036565b84116115315760405163d0ebeb4b60e01b815260040160405180910390fd5b600061153e600d88612904565b905060006115556107eb6080890160608a01613f8b565b90506115788160000151826020015184602001518a60400135856040015161244b565b60405188907f0c1c0787650562778c282502dfd6dcea2fb79d23783920aa18aee36b4aa3dc4890600090a25050505050505050565b600080600d60000188815481106115c6576115c661424c565b60009182526020808320604080518082018252600290940290910180548452600101546001600160a01b0390811684840152815160a08101835290881681529182018b9052810188905263ffffffff89166060820152861515608082015290925061163090612886565b8251909150811461164657600092505050611675565b836001600160a01b031682602001516001600160a01b03161461166e57600092505050611675565b6001925050505b9695505050505050565b6004546001600160a01b03163381146116ab5760405163d8844f1560e01b815260040160405180910390fd5b61171f6000805160206145e8833981519152826001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061e9190614448565b61173c57604051634261081360e11b815260040160405180910390fd5b61174685856129a0565b61101c8383612a79565b6040805180820190915260008082526020820152600d8054839081106117785761177861424c565b60009182526020918290206040805180820190915260029092020180548252600101546001600160a01b03169181019190915292915050565b604080516060810182526000808252602082018190529181019190915260008263ffffffff16815481106117e7576117e761424c565b6000918252602090912060408051606081019091526002909202018054829060ff16600381111561181a5761181a613fa6565b600381111561182b5761182b613fa6565b8152815461010090046001600160a01b0316602082015260019091015460409091015292915050565b61185c612010565b6001600160a01b0387166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101889052606401600060405180830381600087803b1580156118ba57600080fd5b505af11580156118ce573d6000803e3d6000fd5b5050505060006118e060028988612411565b6040516001600160a01b038a166024820152604481018990526064810188905290915060009060840160408051601f198184030181529190526020810180516001600160e01b03166313e803eb60e31b1790529050610f1961193f3390565b89846001858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061204392505050565b6119bc612010565b846000036119dd576040516394fe88d960e01b815260040160405180910390fd5b60408051602081018252600081529051637921219560e11b81526001600160a01b038a169163f242432a91611a1d91339130918c918c9190600401614465565b600060405180830381600087803b158015611a3757600080fd5b505af1158015611a4b573d6000803e3d6000fd5b505050506000611a5d60038a89612411565b6040516001600160a01b038b166024820152604481018a9052606481018990526084810188905290915060009060a40160408051601f198184030181529190526020810180516001600160e01b03166326fc02dd60e01b1790529050611b37611ac33390565b8a848a858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061204392505050565b50505050505050505050565b611b4c82610aac565b611b5581611e82565b610aea8383611f94565b600d5460009061104890600190614278565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015611bb65750825b90506000826001600160401b03166001148015611bd25750303b155b905081158015611be0575080155b15611bfe5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315611c2857845460ff60401b1916600160401b1785555b6001600160a01b038d161580611c4557506001600160a01b038c16155b80611c5757506001600160a01b038b16155b80611c6957506001600160a01b038a16155b80611c7b57506001600160a01b038916155b80611c8d57506001600160a01b038816155b80611c9f57506001600160a01b038716155b15611cbd57604051639fabe1c160e01b815260040160405180910390fd5b611cc860008e611eef565b50611cf37fab4f864e5201b0fde9b5ee3e4cf96384802b0ffdfcf7f9de4699ce21a30afc4f89611eef565b50611d0c6000805160206145e88339815191528b611eef565b50611d256000805160206145e88339815191528a611eef565b50611d2e612b65565b611d36612b65565b611d3f86612b6d565b611d47612bbe565b60408051808201909152600080825260208201818152600d8054600180820183559190935292517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5600290930292830155517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb690910180546001600160a01b039283166001600160a01b031991821617909155600e929092556004805483168f83161790556005805483168a831617905560068054909216908d16179055611e1262015180426144aa565b611e1d9060016143b0565b611e2a90620151806144cc565b6003558315611e7357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050505050565b6109a88133612bce565b611e94612010565b6000805160206145c8833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b60006000805160206145a8833981519152611f0a848461121f565b611f8a576000848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055611f403390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600191505061098f565b600091505061098f565b60006000805160206145a8833981519152611faf848461121f565b15611f8a576000848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4600191505061098f565b6000805160206145c88339815191525460ff16156120415760405163d93c066560e01b815260040160405180910390fd5b565b61204d8383612c07565b60006120598483612cb5565b9050600061206987600354612d89565b9050808611156120965760405163539163e160e01b815260048101879052602481018290526044016112c8565b60006120d86040518060a001604052808c6001600160a01b031681526020018b81526020018981526020018a63ffffffff168152602001851515815250612886565b6000818152600c602052604090205490915060ff161561210e5760405163bff0e9e760e01b8152600481018290526024016112c8565b6000818152600c60205260408120805460ff19166001179055612188600d838d8254604080518082019091529283526001600160a01b0391821660208085019182526001808401875560009687529520935160028302909401938455519290930180546001600160a01b0319169290911691909117905590565b6040805163ffffffff8c168152602081018b90528615158183015242606082015290519192508b916001600160a01b038e169184917f1061e9784cdd951f4cbc394956165b3a94cf872a3afda95fc76b55cefb35cc519181900360800190a45050505050505050505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061227b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661226f600080516020614588833981519152546001600160a01b031690565b6001600160a01b031614155b156120415760405163703e46dd60e11b815260040160405180910390fd5b6000610dd881611e82565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156122fe575060408051601f3d908101601f191682019092526122fb918101906144e3565b60015b61232657604051634c9c8ce360e01b81526001600160a01b03831660048201526024016112c8565b600080516020614588833981519152811461235757604051632a87526960e21b8152600481018290526024016112c8565b610b23838361300c565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146120415760405163703e46dd60e11b815260040160405180910390fd5b6040516001600160a01b038481166024830152838116604483015260648201839052610aea9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613062565b6000806000612421868686610b28565b9150915081156124345791506124449050565b61243f8686866130d3565b925050505b9392505050565b600085600381111561245f5761245f613fa6565b036124a0576040516001600160a01b0384169083156108fc029084906000818181858888f1935050505015801561249a573d6000803e3d6000fd5b5061101c565b60018560038111156124b4576124b4613fa6565b036124d2576124cd6001600160a01b0385168484613295565b61101c565b60028560038111156124e6576124e6613fa6565b03612558576040516323b872dd60e01b81523060048201526001600160a01b038481166024830152604482018390528516906323b872dd90606401600060405180830381600087803b15801561253b57600080fd5b505af115801561254f573d6000803e3d6000fd5b5050505061101c565b60408051602081018252600081529051637921219560e11b81526001600160a01b0386169163f242432a9161259891309188918791899190600401614465565b600060405180830381600087803b1580156125b257600080fd5b505af1158015610f19573d6000803e3d6000fd5b6125ce6132c6565b6000805160206145c8833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611ed1565b60018201548254606091908310158061262457508083105b156126655783548390829061263b90600190614278565b604051634a0dd9bd60e01b81526004810193909352602483019190915260448201526064016112c8565b6000815b8481116126c95785546000908790839081106126875761268761424c565b60009182526020909120600160029092020101546001600160a01b0316146126b757816126b3816144fc565b9250505b806126c1816144fc565b915050612669565b506000816001600160401b038111156126e4576126e4613838565b60405190808252806020026020018201604052801561270d578160200160208202803683370190505b5090506000835b8681116127b85787546000908990839081106127325761273261424c565b60009182526020909120600160029092020101546001600160a01b0316146127a6578760000181815481106127695761276961424c565b90600052602060002090600202016000015483838151811061278d5761278d61424c565b6020908102919091010152816127a2816144fc565b9250505b806127b0816144fc565b915050612714565b506127c48660016143b0565b6001880155509250505092915050565b60008160000151826020015183604001518460600151604051602001612834949392919060609490941b6bffffffffffffffffffffffff1916845260e09290921b6001600160e01b03191660148401526018830152603882015260580190565b604051602081830303815290604052805190602001209050919050565b63ffffffff82166000908152600a602052604081205461271061287482856144cc565b61287e91906144aa565b949350505050565b6000816000015182602001518360400151846060015185608001516128ac5760006128af565b60015b60405160609590951b6bffffffffffffffffffffffff191660208601526034850193909352605484019190915260e090811b6001600160e01b03191660748401521b60ff60e01b166078820152607c01612834565b604080518082019091526000808252602082015282600001828154811061292d5761292d61424c565b60009182526020918290206040805180820190915260029092020180548252600101546001600160a01b03169181019190915283549091508390839081106129775761297761424c565b60009182526020822060029091020190815560010180546001600160a01b031916905592915050565b60005b818110156129e3576129db8383838181106129c0576129c061424c565b9050608002018036038101906129d6919061433c565b6132f6565b6001016129a3565b508015610dd85760055460405163f099f9f560e01b81527ff00e60aabbc167f41684e8d81677229edbc0f1876ae2c1ded0a60367465292ab6004820152326024820152604481018390526001600160a01b039091169063f099f9f5906064015b600060405180830381600087803b158015612a5d57600080fd5b505af1158015612a71573d6000803e3d6000fd5b505050505050565b60005b81811015612b01574260096000858585818110612a9b57612a9b61424c565b90506020020135815260200190815260200160002081905550828282818110612ac657612ac661424c565b905060200201357fd63a18c6858559d79659151118b33c6ad7cf4f7735b64fe9dbd85c509e11a11760405160405180910390a2600101612a7c565b508015610dd85760055460405163f099f9f560e01b81527f25146e2fbfab3f988e64e94788d256b87c4fa8691f43ec409c49b57436cb7ee66004820152326024820152604481018390526001600160a01b039091169063f099f9f590606401612a43565b612041613582565b612b75613582565b612b8260008060006130d3565b5060005b8151811015610dd857612bb56001838381518110612ba657612ba661424c565b602002602001015160006130d3565b50600101612b86565b612bc6613582565b6120416135cb565b612bd8828261121f565b610dd85760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016112c8565b6007546001600160a01b031680612c1d57505050565b60405163901afa5f60e01b81526000906001600160a01b0383169063901afa5f90612c52903390349089908990600401614515565b6020604051808303816000875af1158015612c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c95919061454e565b905080610aea57604051631195542160e11b815260040160405180910390fd5b6008546000906001600160a01b031680612cd357600191505061098f565b8251600003612ce657600091505061098f565b60405163901afa5f60e01b81526000906001600160a01b0383169063901afa5f90612d1b90339034908a908a90600401614515565b6020604051808303816000875af1158015612d3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d5e919061454e565b905080612d7e57604051630a3a260560e01b815260040160405180910390fd5b506001949350505050565b600063ffffffff831615801590612da7575063ffffffff8316600214155b8015612dba575063ffffffff8316600314155b15612dc8575060001961098f565b81421015612e115763ffffffff8316612deb575068056bc75e2d6310000061098f565b60011963ffffffff841601612e055750631dcd650061098f565b5064746a52880061098f565b600062015180612e218442614278565b612e2b91906144aa565b905060006102d88210612e4057506004612e76565b6102228210612e5157506003612e76565b61016c8210612e6257506002612e76565b60b68210612e7257506001612e76565b5060005b63ffffffff8516612f0e578060ff16600003612e9f5768056bc75e2d631000009250505061098f565b8060ff16600103612ebd57681b1ae4d6e2ef5000009250505061098f565b8060ff16600203612edb57683635c9adc5dea000009250505061098f565b8060ff16600303612efa5769010f0cf064dd592000009250505061098f565b69021e19e0c9bab24000009250505061098f565b60011963ffffffff861601612f92578060ff16600003612f3657631dcd65009250505061098f565b8060ff16600103612f4f57633b9aca009250505061098f565b8060ff16600203612f695764012a05f2009250505061098f565b8060ff16600303612f83576402540be4009250505061098f565b640ba43b74009250505061098f565b8060ff16600003612fac5764746a5288009250505061098f565b8060ff16600103612fc65764e8d4a510009250505061098f565b8060ff16600203612fe15765048c273950009250505061098f565b8060ff16600303612ffc576509184e72a0009250505061098f565b652d79883d20009250505061098f565b613015826135ec565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561305a57610b238282613651565b610dd86136c7565b600080602060008451602086016000885af180613085576040513d6000823e3d81fd5b50506000513d9150811561309d5780600114156130aa565b6001600160a01b0384163b155b15610aea57604051635274afe760e01b81526001600160a01b03851660048201526024016112c8565b6000805460408051606081019091528290808760038111156130f7576130f7613fa6565b81526001600160a01b038716602080830191909152604090910186905282546001818101855560009485529190932082516002909402018054929390929091839160ff19169083600381111561314f5761314f613fa6565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b0319909116178155604090910151600190910155600085600381111561319a5761319a613fa6565b036131e3576000805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49805463ffffffff191663ffffffff83161790559050612444565b6001600160a01b03841661320a5760405163dc2e5e8d60e01b815260040160405180910390fd5b600185600381111561321e5761321e613fa6565b03613255576001600160a01b0384166000908152600160205260409020805463ffffffff191663ffffffff83161790559050612444565b6001600160a01b0393909316600090815260026020908152604080832094835293905291909120805463ffffffff191663ffffffff841617905550919050565b6040516001600160a01b03838116602483015260448201839052610b2391859182169063a9059cbb906064016123df565b6000805160206145c88339815191525460ff1661204157604051638dfc202b60e01b815260040160405180910390fd5b600061330582602001516117b1565b9050600061331b83602001518460400151612851565b9050600081846040015161332f9190614278565b9050600160008451600381111561334857613348613fa6565b0361337d5784516040516000916001600160a01b03169084156108fc0290859084818181858888f195506133fe945050505050565b60018451600381111561339257613392613fa6565b036133fa578451604080516001600160a01b0392831660248201526044808201869052825180830390910181526064909101909152602080820180516001600160e01b031663a9059cbb60e01b17905286015190916133f29116826136e6565b9150506133fe565b5060005b80156134c15784516001600160a01b0316613418866127d4565b6040517f6a65a945f1306f9bb3d4e3ce63aa367de6976a375de002492404554392c2460e90600090a382156124cd5760208086015163ffffffff166000908152600b9091526040812080548592906134719084906143b0565b92505081905550846020015163ffffffff167f34658d4aa4a80fa713a0f3a04329f39177b5bea34e8dcba253600ee5ade6c654846040516134b491815260200190565b60405180910390a261101c565b60006134cc866127d4565b600081815260096020526040908190204290555190915081907fedf8120f63daf877f6cb9aa7a3e21724c4532681d4afd77a45561904f1a045999061354790899081516001600160a01b0316815260208083015163ffffffff1690820152604080830151908201526060918201519181019190915260800190565b60405180910390a260405181907fd63a18c6858559d79659151118b33c6ad7cf4f7735b64fe9dbd85c509e11a11790600090a2505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661204157604051631afcd79f60e31b815260040160405180910390fd5b6135d3613582565b6000805160206145c8833981519152805460ff19169055565b806001600160a01b03163b60000361362257604051634c9c8ce360e01b81526001600160a01b03821660048201526024016112c8565b60008051602061458883398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161366e919061456b565b600060405180830381855af49150503d80600081146136a9576040519150601f19603f3d011682016040523d82523d6000602084013e6136ae565b606091505b50915091506136be858383613789565b95945050505050565b34156120415760405163b398979f60e01b815260040160405180910390fd5b6000806000846001600160a01b031684604051613703919061456b565b6000604051808303816000865af19150503d8060008114613740576040519150601f19603f3d011682016040523d82523d6000602084013e613745565b606091505b509150915081801561376f57508051158061376f57508080602001905181019061376f919061454e565b80156136be5750505050506001600160a01b03163b151590565b60608261379e57613799826137e5565b612444565b81511580156137b557506001600160a01b0384163b155b156137de57604051639996b31560e01b81526001600160a01b03851660048201526024016112c8565b5080612444565b8051156137f55780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b60006020828403121561382057600080fd5b81356001600160e01b03198116811461244457600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561387657613876613838565b604052919050565b60006001600160401b0382111561389757613897613838565b5060051b60200190565b6000602082840312156138b357600080fd5b81356001600160401b038111156138c957600080fd5b8201601f810184136138da57600080fd5b80356138ed6138e88261387e565b61384e565b8082825260208201915060208360051b85010192508683111561390f57600080fd5b6020840193505b82841015611675578335825260209384019390910190613916565b602080825282518282018190526000918401906040840190835b8181101561398757613971838551805182526020908101516001600160a01b0316910152565b602093909301926040929092019160010161394b565b509095945050505050565b6000602082840312156139a457600080fd5b5035919050565b6001600160a01b03811681146109a857600080fd5b600080604083850312156139d357600080fd5b8235915060208301356139e5816139ab565b809150509250929050565b600080600060608486031215613a0557600080fd5b833560048110613a1457600080fd5b92506020840135613a24816139ab565b929592945050506040919091013590565b803563ffffffff81168114613a4957600080fd5b919050565b60008060408385031215613a6157600080fd5b613a6a83613a35565b946020939093013593505050565b60008083601f840112613a8a57600080fd5b5081356001600160401b03811115613aa157600080fd5b602083019150836020828501011115613ab957600080fd5b9250929050565b600080600080600060608688031215613ad857600080fd5b8535945060208601356001600160401b03811115613af557600080fd5b613b0188828901613a78565b90955093505060408601356001600160401b03811115613b2057600080fd5b613b2c88828901613a78565b969995985093965092949392505050565b60008060408385031215613b5057600080fd5b8235613b5b816139ab565b915060208301356001600160401b03811115613b7657600080fd5b8301601f81018513613b8757600080fd5b80356001600160401b03811115613ba057613ba0613838565b613bb3601f8201601f191660200161384e565b818152866020838501011115613bc857600080fd5b816020840160208301376000602083830101528093505050509250929050565b600080600080600080600060a0888a031215613c0357600080fd5b8735613c0e816139ab565b9650602088013595506040880135945060608801356001600160401b03811115613c3757600080fd5b613c438a828b01613a78565b90955093505060808801356001600160401b03811115613c6257600080fd5b613c6e8a828b01613a78565b989b979a50959850939692959293505050565b60008083601f840112613c9357600080fd5b5081356001600160401b03811115613caa57600080fd5b6020830191508360208260051b8501011115613ab957600080fd5b600080600060408486031215613cda57600080fd5b8335613ce5816139ab565b925060208401356001600160401b03811115613d0057600080fd5b613d0c86828701613c81565b9497909650939450505050565b60008060408385031215613d2c57600080fd5b50508035926020909101359150565b60008060408385031215613d4e57600080fd5b8235613d59816139ab565b915060208301356139e5816139ab565b60008083601f840112613d7b57600080fd5b5081356001600160401b03811115613d9257600080fd5b6020830191508360208260071b8501011115613ab957600080fd5b60008060208385031215613dc057600080fd5b82356001600160401b03811115613dd657600080fd5b613de285828601613d69565b90969095509350505050565b60008082840360c0811215613e0257600080fd5b8335925060a0601f1982011215613e1857600080fd5b506020830190509250929050565b80151581146109a857600080fd5b60008060008060008060c08789031215613e4d57600080fd5b8635955060208701359450613e6460408801613a35565b9350606087013592506080870135613e7b81613e26565b915060a0870135613e8b816139ab565b809150509295509295509295565b60008060008060408587031215613eaf57600080fd5b84356001600160401b03811115613ec557600080fd5b613ed187828801613d69565b90955093505060208501356001600160401b03811115613ef057600080fd5b613efc87828801613c81565b95989497509550505050565b60005b83811015613f23578181015183820152602001613f0b565b50506000910152565b60008151808452613f44816020860160208601613f08565b601f01601f19169290920160200192915050565b6020815260006124446020830184613f2c565b815181526020808301516001600160a01b0316908201526040810161098f565b600060208284031215613f9d57600080fd5b61244482613a35565b634e487b7160e01b600052602160045260246000fd5b8151606082019060048110613fe157634e487b7160e01b600052602160045260246000fd5b82526020838101516001600160a01b031690830152604092830151929091019190915290565b60008060008060008060008060c0898b03121561402357600080fd5b883561402e816139ab565b975060208901359650604089013595506060890135945060808901356001600160401b0381111561405e57600080fd5b61406a8b828c01613a78565b90955093505060a08901356001600160401b0381111561408957600080fd5b6140958b828c01613a78565b999c989b5096995094979396929594505050565b600080600080600080600080610100898b0312156140c657600080fd5b88356140d1816139ab565b975060208901356140e1816139ab565b965060408901356140f1816139ab565b95506060890135614101816139ab565b94506080890135614111816139ab565b935060a0890135614121816139ab565b925060c0890135614131816139ab565b915060e08901356001600160401b0381111561414c57600080fd5b89016000601f82018c1361415f57600080fd5b813561416d6138e88261387e565b8082825260208201915060208360051b86010192508e83111561418f57600080fd5b6020850194505b828510156141ba5784356141a9816139ab565b825260209485019490910190614196565b9b9e9a9d50989b5096999598949750929550505050565b60008060008060008060a087890312156141ea57600080fd5b86356141f5816139ab565b95506020870135614205816139ab565b9450604087013593506060870135925060808701356001600160401b0381111561422e57600080fd5b61423a89828a01613a78565b979a9699509497509295939492505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561098f5761098f614262565b6000604082018483526040602084015280845180835260608501915060208601925060005b818110156142ce5783518352602093840193909201916001016142b0565b50909695505050505050565b60018060a01b038616815284602082015260a06040820152600061430160a0830186613f2c565b6060830194909452506001600160a01b03919091166080909101529392505050565b82815260406020820152600061287e6040830184613f2c565b6000608082840312801561434f57600080fd5b50604051608081016001600160401b038111828210171561437257614372613838565b6040528235614380816139ab565b815261438e60208401613a35565b6020820152604083810135908201526060928301359281019290925250919050565b8082018082111561098f5761098f614262565b600060a08284031280156143d657600080fd5b5060405160a081016001600160401b03811182821017156143f9576143f9613838565b6040528235614407816139ab565b8152602083810135908201526040808401359082015261442960608401613a35565b6060820152608083013561443c81613e26565b60808201529392505050565b60006020828403121561445a57600080fd5b8151612444816139ab565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061449f90830184613f2c565b979650505050505050565b6000826144c757634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761098f5761098f614262565b6000602082840312156144f557600080fd5b5051919050565b60006001820161450e5761450e614262565b5060010190565b60018060a01b038516815283602082015260806040820152600061453c6080830185613f2c565b828103606084015261449f8185613f2c565b60006020828403121561456057600080fd5b815161244481613e26565b6000825161457d818460208701613f08565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300738128fe393bef1bcd8a524796fff40618b938cd467c71fcf37850ab0ba4f7d7a264697066735822122065e006829fe939ae22d5b64464958c65ed5fd2fa088fdd8fd2ae79801c08713064736f6c634300081b0033",
  "deployedBytecode": "0x6080604052600436106102ae5760003560e01c8063902eeef311610175578063c60af2b5116100dc578063d547741f11610095578063ea4644bb1161006f578063ea4644bb146108cc578063ecda10f5146108ec578063f23a6e6114610902578063f6a552d41461094857600080fd5b8063d547741f1461086a578063dd9ea2991461088a578063e579fa2b1461089f57600080fd5b8063c60af2b514610783578063cb23bcb5146107b0578063cbd90cd0146107d0578063cd6a976e146107fd578063d395c0171461081d578063d438c3491461084a57600080fd5b80639d07861c1161012e5780639d07861c146106a35780639d6a54cb146106c3578063a217fddf146106e3578063a98f7044146106f8578063ad3cb1cc14610718578063c13819b61461075657600080fd5b8063902eeef3146105e357806391d148541461060357806391f69b7d14610623578063978069b414610643578063986be0e2146106635780639c79a31c1461068357600080fd5b80634f1ef286116102195780635c975abb116101d25780635c975abb146105315780635edeb2a31461055657806363d8882a14610586578063675178371461059b57806376918c0d146105b057806385979730146105c357600080fd5b80634f1ef2861461047b57806350520b1f1461048e57806352d1902d146104c657806354adcb99146104db5780635521f77e146104f157806358dec40a1461051157600080fd5b80632f2ff15d1161026b5780632f2ff15d146103aa57806336568abe146103ca578063381175f6146103ea5780633cd07066146104265780633de40cfa14610446578063433f6c121461045957600080fd5b806301ffc9a7146102b357806302191980146102e8578063219cd263146102ff578063232c1c8a1461031b5780632483e71514610348578063248a9ca31461038a575b600080fd5b3480156102bf57600080fd5b506102d36102ce36600461380e565b61095e565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b506102fd610995565b005b34801561030b57600080fd5b50604051600081526020016102df565b34801561032757600080fd5b5061033b6103363660046138a1565b6109ab565b6040516102df9190613931565b34801561035457600080fd5b5061037c7fab4f864e5201b0fde9b5ee3e4cf96384802b0ffdfcf7f9de4699ce21a30afc4f81565b6040519081526020016102df565b34801561039657600080fd5b5061037c6103a5366004613992565b610aac565b3480156103b657600080fd5b506102fd6103c53660046139c0565b610ace565b3480156103d657600080fd5b506102fd6103e53660046139c0565b610af0565b3480156103f657600080fd5b5061040a6104053660046139f0565b610b28565b60408051921515835263ffffffff9091166020830152016102df565b34801561043257600080fd5b506102fd610441366004613a4e565b610c43565b6102fd610454366004613ac0565b610cc8565b34801561046557600080fd5b5061037c6000805160206145e883398151915281565b6102fd610489366004613b3d565b610dbd565b34801561049a57600080fd5b506005546104ae906001600160a01b031681565b6040516001600160a01b0390911681526020016102df565b3480156104d257600080fd5b5061037c610ddc565b3480156104e757600080fd5b5061037c6101c281565b3480156104fd57600080fd5b506102fd61050c366004613be8565b610df9565b34801561051d57600080fd5b506102fd61052c366004613cc5565b610f24565b34801561053d57600080fd5b506000805160206145c88339815191525460ff166102d3565b34801561056257600080fd5b506102d3610571366004613992565b600c6020526000908152604090205460ff1681565b34801561059257600080fd5b506102fd611023565b3480156105a757600080fd5b5061037c611036565b6102fd6105be366004613d19565b61104d565b3480156105cf57600080fd5b506008546104ae906001600160a01b031681565b3480156105ef57600080fd5b506102fd6105fe366004613d3b565b6111b5565b34801561060f57600080fd5b506102d361061e3660046139c0565b61121f565b34801561062f57600080fd5b506102fd61063e366004613dad565b611257565b34801561064f57600080fd5b506007546104ae906001600160a01b031681565b34801561066f57600080fd5b5061037c61067e366004613992565b611404565b34801561068f57600080fd5b506102fd61069e366004613dee565b611435565b3480156106af57600080fd5b506102d36106be366004613e34565b6115ad565b3480156106cf57600080fd5b506102fd6106de366004613e99565b61167f565b3480156106ef57600080fd5b5061037c600081565b34801561070457600080fd5b506004546104ae906001600160a01b031681565b34801561072457600080fd5b50610749604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102df9190613f58565b34801561076257600080fd5b50610776610771366004613992565b611750565b6040516102df9190613f6b565b34801561078f57600080fd5b5061037c61079e366004613f8b565b600b6020526000908152604090205481565b3480156107bc57600080fd5b506006546104ae906001600160a01b031681565b3480156107dc57600080fd5b506107f06107eb366004613f8b565b6117b1565b6040516102df9190613fbc565b34801561080957600080fd5b506102fd610818366004613be8565b611854565b34801561082957600080fd5b5061037c610838366004613f8b565b600a6020526000908152604090205481565b34801561085657600080fd5b506102fd610865366004614007565b6119b4565b34801561087657600080fd5b506102fd6108853660046139c0565b611b43565b34801561089657600080fd5b5061037c611b5f565b3480156108ab57600080fd5b5061037c6108ba366004613992565b60096020526000908152604090205481565b3480156108d857600080fd5b506102fd6108e73660046140a9565b611b71565b3480156108f857600080fd5b5061037c60035481565b34801561090e57600080fd5b5061092f61091d3660046141d1565b63f23a6e6160e01b9695505050505050565b6040516001600160e01b031990911681526020016102df565b34801561095457600080fd5b5061037c6105dc81565b60006001600160e01b03198216637965db0b60e01b148061098f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006109a081611e82565b6109a8611e8c565b50565b6060600082516001600160401b038111156109c8576109c8613838565b604051908082528060200260200182016040528015610a0d57816020015b60408051808201909152600080825260208201528152602001906001900390816109e65790505b50905060005b8351811015610aa557600d600001848281518110610a3357610a3361424c565b602002602001015181548110610a4b57610a4b61424c565b60009182526020918290206040805180820190915260029092020180548252600101546001600160a01b0316918101919091528251839083908110610a9257610a9261424c565b6020908102919091010152600101610a13565b5092915050565b60009081526000805160206145a8833981519152602052604090206001015490565b610ad782610aac565b610ae081611e82565b610aea8383611eef565b50505050565b6001600160a01b0381163314610b195760405163334bd91960e11b815260040160405180910390fd5b610b238282611f94565b505050565b60008080856003811115610b3e57610b3e613fa6565b03610b4f5750600190506000610c3b565b6001600160a01b038416610b765760405163dc2e5e8d60e01b815260040160405180910390fd5b6001856003811115610b8a57610b8a613fa6565b03610bc1576001600160a01b03841660009081526001602052604090205463ffffffff168015610bbf57600192509050610c3b565b505b6002856003811115610bd557610bd5613fa6565b1480610bf257506003856003811115610bf057610bf0613fa6565b145b15610c34576001600160a01b038416600090815260026020908152604080832086845290915290205463ffffffff168015610c3257600192509050610c3b565b505b5060009050805b935093915050565b6000610c4e81611e82565b6105dc821115610c715760405163886349bb60e01b815260040160405180910390fd5b63ffffffff83166000818152600a602052604090819020849055517ff5a91001916153e67eaaa2ae82827a002838792ca48af87df63408cc09cb96f490610cbb9085815260200190565b60405180910390a2505050565b610cd0612010565b34600003610cf1576040516394fe88d960e01b815260040160405180910390fd5b60008086604051602401610d0791815260200190565b60408051601f198184030181529190526020810180516001600160e01b031660016215566760e11b03191790529050610db4610d403390565b888434858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061204392505050565b50505050505050565b610dc56121f4565b610dce82612299565b610dd882826122a4565b5050565b6000610de6612361565b5060008051602061458883398151915290565b610e01612010565b84600003610e22576040516394fe88d960e01b815260040160405180910390fd5b610e376001600160a01b0388163330886123aa565b6000610e466001896000612411565b6040516001600160a01b038a166024820152604481018990526064810188905290915060009060840160408051601f198184030181529190526020810180516001600160e01b031663788c2ecf60e01b1790529050610f19610ea53390565b89848a858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061204392505050565b505050505050505050565b6000610f2f81611e82565b60005b8281101561101c576000848483818110610f4e57610f4e61424c565b9050602002016020810190610f639190613f8b565b63ffffffff81166000908152600b6020526040812054919250819003610f8a575050611014565b63ffffffff82166000908152600b60205260408120819055610fab836117b1565b9050610fc6816000015182602001518a85856040015161244b565b8263ffffffff16886001600160a01b03167f6c8628f02ab9884920c84f6f3507810561c8ed6c4b3bae0ce96eceab6def228b8460405161100891815260200190565b60405180910390a35050505b600101610f32565b5050505050565b600061102e81611e82565b6109a86125c6565b600e5460009061104890600190614278565b905090565b7fab4f864e5201b0fde9b5ee3e4cf96384802b0ffdfcf7f9de4699ce21a30afc4f61107781611e82565b6000611084600d8561260c565b90506101c2815111156110aa57604051635a8a34e560e01b815260040160405180910390fd5b600063f03efa3760e01b85836040516024016110c792919061428b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526004546006549192506001600160a01b0390811691635f7b157791349116600085896111223390565b6040518763ffffffff1660e01b81526004016111429594939291906142da565b6000604051808303818588803b15801561115b57600080fd5b505af115801561116f573d6000803e3d6000fd5b5050505050847f71df2a50f3ab1563277a27043770eb570eeaa3fc42ef76c607cdc667a82d03a485836040516111a6929190614323565b60405180910390a25050505050565b60006111c081611e82565b600780546001600160a01b03199081166001600160a01b03868116918217909355600880549092169285169283179091556040517ff670cdc1c52016a5cec857c88e8948913b39f86889230c0661b011fd2ed57df590600090a3505050565b60009182526000805160206145a8833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60005b81811015610b235760008383838181106112765761127661424c565b90506080020180360381019061128c919061433c565b90506000611299826127d4565b600081815260096020526040812054919250036112d157604051630181cdef60e61b8152600481018290526024015b60405180910390fd5b60006112e583602001518460400151612851565b905060008184604001516112f99190614278565b9050600061130a85602001516117b1565b9050600960008581526020019081526020016000206000905561134081600001518260200151876000015185856040015161244b565b845160405185916001600160a01b0316907f0575467d13f5ab9174f470cec96623374b05cf4b19a3c83a4bfca523e243ab0490600090a382156113f35760208086015163ffffffff166000908152600b9091526040812080548592906113a79084906143b0565b92505081905550846020015163ffffffff167f34658d4aa4a80fa713a0f3a04329f39177b5bea34e8dcba253600ee5ade6c654846040516113ea91815260200190565b60405180910390a25b50506001909301925061125a915050565b6000600d600001828154811061141c5761141c61424c565b9060005260206000209060020201600001549050919050565b81611445368390038301836143c3565b6000600d600001838154811061145d5761145d61424c565b60009182526020918290206040805180820190915260029092020180548252600101546001600160a01b03169181019190915290506114993390565b6001600160a01b031681602001516001600160a01b0316146114ce57604051631165d41f60e31b815260040160405180910390fd5b60006114d983612886565b8251909150811461150a578151604051633df112db60e11b81526004810191909152602481018290526044016112c8565b611512611036565b84116115315760405163d0ebeb4b60e01b815260040160405180910390fd5b600061153e600d88612904565b905060006115556107eb6080890160608a01613f8b565b90506115788160000151826020015184602001518a60400135856040015161244b565b60405188907f0c1c0787650562778c282502dfd6dcea2fb79d23783920aa18aee36b4aa3dc4890600090a25050505050505050565b600080600d60000188815481106115c6576115c661424c565b60009182526020808320604080518082018252600290940290910180548452600101546001600160a01b0390811684840152815160a08101835290881681529182018b9052810188905263ffffffff89166060820152861515608082015290925061163090612886565b8251909150811461164657600092505050611675565b836001600160a01b031682602001516001600160a01b03161461166e57600092505050611675565b6001925050505b9695505050505050565b6004546001600160a01b03163381146116ab5760405163d8844f1560e01b815260040160405180910390fd5b61171f6000805160206145e8833981519152826001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061e9190614448565b61173c57604051634261081360e11b815260040160405180910390fd5b61174685856129a0565b61101c8383612a79565b6040805180820190915260008082526020820152600d8054839081106117785761177861424c565b60009182526020918290206040805180820190915260029092020180548252600101546001600160a01b03169181019190915292915050565b604080516060810182526000808252602082018190529181019190915260008263ffffffff16815481106117e7576117e761424c565b6000918252602090912060408051606081019091526002909202018054829060ff16600381111561181a5761181a613fa6565b600381111561182b5761182b613fa6565b8152815461010090046001600160a01b0316602082015260019091015460409091015292915050565b61185c612010565b6001600160a01b0387166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101889052606401600060405180830381600087803b1580156118ba57600080fd5b505af11580156118ce573d6000803e3d6000fd5b5050505060006118e060028988612411565b6040516001600160a01b038a166024820152604481018990526064810188905290915060009060840160408051601f198184030181529190526020810180516001600160e01b03166313e803eb60e31b1790529050610f1961193f3390565b89846001858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061204392505050565b6119bc612010565b846000036119dd576040516394fe88d960e01b815260040160405180910390fd5b60408051602081018252600081529051637921219560e11b81526001600160a01b038a169163f242432a91611a1d91339130918c918c9190600401614465565b600060405180830381600087803b158015611a3757600080fd5b505af1158015611a4b573d6000803e3d6000fd5b505050506000611a5d60038a89612411565b6040516001600160a01b038b166024820152604481018a9052606481018990526084810188905290915060009060a40160408051601f198184030181529190526020810180516001600160e01b03166326fc02dd60e01b1790529050611b37611ac33390565b8a848a858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061204392505050565b50505050505050505050565b611b4c82610aac565b611b5581611e82565b610aea8383611f94565b600d5460009061104890600190614278565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015611bb65750825b90506000826001600160401b03166001148015611bd25750303b155b905081158015611be0575080155b15611bfe5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315611c2857845460ff60401b1916600160401b1785555b6001600160a01b038d161580611c4557506001600160a01b038c16155b80611c5757506001600160a01b038b16155b80611c6957506001600160a01b038a16155b80611c7b57506001600160a01b038916155b80611c8d57506001600160a01b038816155b80611c9f57506001600160a01b038716155b15611cbd57604051639fabe1c160e01b815260040160405180910390fd5b611cc860008e611eef565b50611cf37fab4f864e5201b0fde9b5ee3e4cf96384802b0ffdfcf7f9de4699ce21a30afc4f89611eef565b50611d0c6000805160206145e88339815191528b611eef565b50611d256000805160206145e88339815191528a611eef565b50611d2e612b65565b611d36612b65565b611d3f86612b6d565b611d47612bbe565b60408051808201909152600080825260208201818152600d8054600180820183559190935292517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5600290930292830155517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb690910180546001600160a01b039283166001600160a01b031991821617909155600e929092556004805483168f83161790556005805483168a831617905560068054909216908d16179055611e1262015180426144aa565b611e1d9060016143b0565b611e2a90620151806144cc565b6003558315611e7357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050505050565b6109a88133612bce565b611e94612010565b6000805160206145c8833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b60006000805160206145a8833981519152611f0a848461121f565b611f8a576000848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055611f403390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600191505061098f565b600091505061098f565b60006000805160206145a8833981519152611faf848461121f565b15611f8a576000848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4600191505061098f565b6000805160206145c88339815191525460ff16156120415760405163d93c066560e01b815260040160405180910390fd5b565b61204d8383612c07565b60006120598483612cb5565b9050600061206987600354612d89565b9050808611156120965760405163539163e160e01b815260048101879052602481018290526044016112c8565b60006120d86040518060a001604052808c6001600160a01b031681526020018b81526020018981526020018a63ffffffff168152602001851515815250612886565b6000818152600c602052604090205490915060ff161561210e5760405163bff0e9e760e01b8152600481018290526024016112c8565b6000818152600c60205260408120805460ff19166001179055612188600d838d8254604080518082019091529283526001600160a01b0391821660208085019182526001808401875560009687529520935160028302909401938455519290930180546001600160a01b0319169290911691909117905590565b6040805163ffffffff8c168152602081018b90528615158183015242606082015290519192508b916001600160a01b038e169184917f1061e9784cdd951f4cbc394956165b3a94cf872a3afda95fc76b55cefb35cc519181900360800190a45050505050505050505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061227b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661226f600080516020614588833981519152546001600160a01b031690565b6001600160a01b031614155b156120415760405163703e46dd60e11b815260040160405180910390fd5b6000610dd881611e82565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156122fe575060408051601f3d908101601f191682019092526122fb918101906144e3565b60015b61232657604051634c9c8ce360e01b81526001600160a01b03831660048201526024016112c8565b600080516020614588833981519152811461235757604051632a87526960e21b8152600481018290526024016112c8565b610b23838361300c565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146120415760405163703e46dd60e11b815260040160405180910390fd5b6040516001600160a01b038481166024830152838116604483015260648201839052610aea9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613062565b6000806000612421868686610b28565b9150915081156124345791506124449050565b61243f8686866130d3565b925050505b9392505050565b600085600381111561245f5761245f613fa6565b036124a0576040516001600160a01b0384169083156108fc029084906000818181858888f1935050505015801561249a573d6000803e3d6000fd5b5061101c565b60018560038111156124b4576124b4613fa6565b036124d2576124cd6001600160a01b0385168484613295565b61101c565b60028560038111156124e6576124e6613fa6565b03612558576040516323b872dd60e01b81523060048201526001600160a01b038481166024830152604482018390528516906323b872dd90606401600060405180830381600087803b15801561253b57600080fd5b505af115801561254f573d6000803e3d6000fd5b5050505061101c565b60408051602081018252600081529051637921219560e11b81526001600160a01b0386169163f242432a9161259891309188918791899190600401614465565b600060405180830381600087803b1580156125b257600080fd5b505af1158015610f19573d6000803e3d6000fd5b6125ce6132c6565b6000805160206145c8833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611ed1565b60018201548254606091908310158061262457508083105b156126655783548390829061263b90600190614278565b604051634a0dd9bd60e01b81526004810193909352602483019190915260448201526064016112c8565b6000815b8481116126c95785546000908790839081106126875761268761424c565b60009182526020909120600160029092020101546001600160a01b0316146126b757816126b3816144fc565b9250505b806126c1816144fc565b915050612669565b506000816001600160401b038111156126e4576126e4613838565b60405190808252806020026020018201604052801561270d578160200160208202803683370190505b5090506000835b8681116127b85787546000908990839081106127325761273261424c565b60009182526020909120600160029092020101546001600160a01b0316146127a6578760000181815481106127695761276961424c565b90600052602060002090600202016000015483838151811061278d5761278d61424c565b6020908102919091010152816127a2816144fc565b9250505b806127b0816144fc565b915050612714565b506127c48660016143b0565b6001880155509250505092915050565b60008160000151826020015183604001518460600151604051602001612834949392919060609490941b6bffffffffffffffffffffffff1916845260e09290921b6001600160e01b03191660148401526018830152603882015260580190565b604051602081830303815290604052805190602001209050919050565b63ffffffff82166000908152600a602052604081205461271061287482856144cc565b61287e91906144aa565b949350505050565b6000816000015182602001518360400151846060015185608001516128ac5760006128af565b60015b60405160609590951b6bffffffffffffffffffffffff191660208601526034850193909352605484019190915260e090811b6001600160e01b03191660748401521b60ff60e01b166078820152607c01612834565b604080518082019091526000808252602082015282600001828154811061292d5761292d61424c565b60009182526020918290206040805180820190915260029092020180548252600101546001600160a01b03169181019190915283549091508390839081106129775761297761424c565b60009182526020822060029091020190815560010180546001600160a01b031916905592915050565b60005b818110156129e3576129db8383838181106129c0576129c061424c565b9050608002018036038101906129d6919061433c565b6132f6565b6001016129a3565b508015610dd85760055460405163f099f9f560e01b81527ff00e60aabbc167f41684e8d81677229edbc0f1876ae2c1ded0a60367465292ab6004820152326024820152604481018390526001600160a01b039091169063f099f9f5906064015b600060405180830381600087803b158015612a5d57600080fd5b505af1158015612a71573d6000803e3d6000fd5b505050505050565b60005b81811015612b01574260096000858585818110612a9b57612a9b61424c565b90506020020135815260200190815260200160002081905550828282818110612ac657612ac661424c565b905060200201357fd63a18c6858559d79659151118b33c6ad7cf4f7735b64fe9dbd85c509e11a11760405160405180910390a2600101612a7c565b508015610dd85760055460405163f099f9f560e01b81527f25146e2fbfab3f988e64e94788d256b87c4fa8691f43ec409c49b57436cb7ee66004820152326024820152604481018390526001600160a01b039091169063f099f9f590606401612a43565b612041613582565b612b75613582565b612b8260008060006130d3565b5060005b8151811015610dd857612bb56001838381518110612ba657612ba661424c565b602002602001015160006130d3565b50600101612b86565b612bc6613582565b6120416135cb565b612bd8828261121f565b610dd85760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016112c8565b6007546001600160a01b031680612c1d57505050565b60405163901afa5f60e01b81526000906001600160a01b0383169063901afa5f90612c52903390349089908990600401614515565b6020604051808303816000875af1158015612c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c95919061454e565b905080610aea57604051631195542160e11b815260040160405180910390fd5b6008546000906001600160a01b031680612cd357600191505061098f565b8251600003612ce657600091505061098f565b60405163901afa5f60e01b81526000906001600160a01b0383169063901afa5f90612d1b90339034908a908a90600401614515565b6020604051808303816000875af1158015612d3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d5e919061454e565b905080612d7e57604051630a3a260560e01b815260040160405180910390fd5b506001949350505050565b600063ffffffff831615801590612da7575063ffffffff8316600214155b8015612dba575063ffffffff8316600314155b15612dc8575060001961098f565b81421015612e115763ffffffff8316612deb575068056bc75e2d6310000061098f565b60011963ffffffff841601612e055750631dcd650061098f565b5064746a52880061098f565b600062015180612e218442614278565b612e2b91906144aa565b905060006102d88210612e4057506004612e76565b6102228210612e5157506003612e76565b61016c8210612e6257506002612e76565b60b68210612e7257506001612e76565b5060005b63ffffffff8516612f0e578060ff16600003612e9f5768056bc75e2d631000009250505061098f565b8060ff16600103612ebd57681b1ae4d6e2ef5000009250505061098f565b8060ff16600203612edb57683635c9adc5dea000009250505061098f565b8060ff16600303612efa5769010f0cf064dd592000009250505061098f565b69021e19e0c9bab24000009250505061098f565b60011963ffffffff861601612f92578060ff16600003612f3657631dcd65009250505061098f565b8060ff16600103612f4f57633b9aca009250505061098f565b8060ff16600203612f695764012a05f2009250505061098f565b8060ff16600303612f83576402540be4009250505061098f565b640ba43b74009250505061098f565b8060ff16600003612fac5764746a5288009250505061098f565b8060ff16600103612fc65764e8d4a510009250505061098f565b8060ff16600203612fe15765048c273950009250505061098f565b8060ff16600303612ffc576509184e72a0009250505061098f565b652d79883d20009250505061098f565b613015826135ec565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561305a57610b238282613651565b610dd86136c7565b600080602060008451602086016000885af180613085576040513d6000823e3d81fd5b50506000513d9150811561309d5780600114156130aa565b6001600160a01b0384163b155b15610aea57604051635274afe760e01b81526001600160a01b03851660048201526024016112c8565b6000805460408051606081019091528290808760038111156130f7576130f7613fa6565b81526001600160a01b038716602080830191909152604090910186905282546001818101855560009485529190932082516002909402018054929390929091839160ff19169083600381111561314f5761314f613fa6565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b0319909116178155604090910151600190910155600085600381111561319a5761319a613fa6565b036131e3576000805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49805463ffffffff191663ffffffff83161790559050612444565b6001600160a01b03841661320a5760405163dc2e5e8d60e01b815260040160405180910390fd5b600185600381111561321e5761321e613fa6565b03613255576001600160a01b0384166000908152600160205260409020805463ffffffff191663ffffffff83161790559050612444565b6001600160a01b0393909316600090815260026020908152604080832094835293905291909120805463ffffffff191663ffffffff841617905550919050565b6040516001600160a01b03838116602483015260448201839052610b2391859182169063a9059cbb906064016123df565b6000805160206145c88339815191525460ff1661204157604051638dfc202b60e01b815260040160405180910390fd5b600061330582602001516117b1565b9050600061331b83602001518460400151612851565b9050600081846040015161332f9190614278565b9050600160008451600381111561334857613348613fa6565b0361337d5784516040516000916001600160a01b03169084156108fc0290859084818181858888f195506133fe945050505050565b60018451600381111561339257613392613fa6565b036133fa578451604080516001600160a01b0392831660248201526044808201869052825180830390910181526064909101909152602080820180516001600160e01b031663a9059cbb60e01b17905286015190916133f29116826136e6565b9150506133fe565b5060005b80156134c15784516001600160a01b0316613418866127d4565b6040517f6a65a945f1306f9bb3d4e3ce63aa367de6976a375de002492404554392c2460e90600090a382156124cd5760208086015163ffffffff166000908152600b9091526040812080548592906134719084906143b0565b92505081905550846020015163ffffffff167f34658d4aa4a80fa713a0f3a04329f39177b5bea34e8dcba253600ee5ade6c654846040516134b491815260200190565b60405180910390a261101c565b60006134cc866127d4565b600081815260096020526040908190204290555190915081907fedf8120f63daf877f6cb9aa7a3e21724c4532681d4afd77a45561904f1a045999061354790899081516001600160a01b0316815260208083015163ffffffff1690820152604080830151908201526060918201519181019190915260800190565b60405180910390a260405181907fd63a18c6858559d79659151118b33c6ad7cf4f7735b64fe9dbd85c509e11a11790600090a2505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661204157604051631afcd79f60e31b815260040160405180910390fd5b6135d3613582565b6000805160206145c8833981519152805460ff19169055565b806001600160a01b03163b60000361362257604051634c9c8ce360e01b81526001600160a01b03821660048201526024016112c8565b60008051602061458883398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161366e919061456b565b600060405180830381855af49150503d80600081146136a9576040519150601f19603f3d011682016040523d82523d6000602084013e6136ae565b606091505b50915091506136be858383613789565b95945050505050565b34156120415760405163b398979f60e01b815260040160405180910390fd5b6000806000846001600160a01b031684604051613703919061456b565b6000604051808303816000865af19150503d8060008114613740576040519150601f19603f3d011682016040523d82523d6000602084013e613745565b606091505b509150915081801561376f57508051158061376f57508080602001905181019061376f919061454e565b80156136be5750505050506001600160a01b03163b151590565b60608261379e57613799826137e5565b612444565b81511580156137b557506001600160a01b0384163b155b156137de57604051639996b31560e01b81526001600160a01b03851660048201526024016112c8565b5080612444565b8051156137f55780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b60006020828403121561382057600080fd5b81356001600160e01b03198116811461244457600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561387657613876613838565b604052919050565b60006001600160401b0382111561389757613897613838565b5060051b60200190565b6000602082840312156138b357600080fd5b81356001600160401b038111156138c957600080fd5b8201601f810184136138da57600080fd5b80356138ed6138e88261387e565b61384e565b8082825260208201915060208360051b85010192508683111561390f57600080fd5b6020840193505b82841015611675578335825260209384019390910190613916565b602080825282518282018190526000918401906040840190835b8181101561398757613971838551805182526020908101516001600160a01b0316910152565b602093909301926040929092019160010161394b565b509095945050505050565b6000602082840312156139a457600080fd5b5035919050565b6001600160a01b03811681146109a857600080fd5b600080604083850312156139d357600080fd5b8235915060208301356139e5816139ab565b809150509250929050565b600080600060608486031215613a0557600080fd5b833560048110613a1457600080fd5b92506020840135613a24816139ab565b929592945050506040919091013590565b803563ffffffff81168114613a4957600080fd5b919050565b60008060408385031215613a6157600080fd5b613a6a83613a35565b946020939093013593505050565b60008083601f840112613a8a57600080fd5b5081356001600160401b03811115613aa157600080fd5b602083019150836020828501011115613ab957600080fd5b9250929050565b600080600080600060608688031215613ad857600080fd5b8535945060208601356001600160401b03811115613af557600080fd5b613b0188828901613a78565b90955093505060408601356001600160401b03811115613b2057600080fd5b613b2c88828901613a78565b969995985093965092949392505050565b60008060408385031215613b5057600080fd5b8235613b5b816139ab565b915060208301356001600160401b03811115613b7657600080fd5b8301601f81018513613b8757600080fd5b80356001600160401b03811115613ba057613ba0613838565b613bb3601f8201601f191660200161384e565b818152866020838501011115613bc857600080fd5b816020840160208301376000602083830101528093505050509250929050565b600080600080600080600060a0888a031215613c0357600080fd5b8735613c0e816139ab565b9650602088013595506040880135945060608801356001600160401b03811115613c3757600080fd5b613c438a828b01613a78565b90955093505060808801356001600160401b03811115613c6257600080fd5b613c6e8a828b01613a78565b989b979a50959850939692959293505050565b60008083601f840112613c9357600080fd5b5081356001600160401b03811115613caa57600080fd5b6020830191508360208260051b8501011115613ab957600080fd5b600080600060408486031215613cda57600080fd5b8335613ce5816139ab565b925060208401356001600160401b03811115613d0057600080fd5b613d0c86828701613c81565b9497909650939450505050565b60008060408385031215613d2c57600080fd5b50508035926020909101359150565b60008060408385031215613d4e57600080fd5b8235613d59816139ab565b915060208301356139e5816139ab565b60008083601f840112613d7b57600080fd5b5081356001600160401b03811115613d9257600080fd5b6020830191508360208260071b8501011115613ab957600080fd5b60008060208385031215613dc057600080fd5b82356001600160401b03811115613dd657600080fd5b613de285828601613d69565b90969095509350505050565b60008082840360c0811215613e0257600080fd5b8335925060a0601f1982011215613e1857600080fd5b506020830190509250929050565b80151581146109a857600080fd5b60008060008060008060c08789031215613e4d57600080fd5b8635955060208701359450613e6460408801613a35565b9350606087013592506080870135613e7b81613e26565b915060a0870135613e8b816139ab565b809150509295509295509295565b60008060008060408587031215613eaf57600080fd5b84356001600160401b03811115613ec557600080fd5b613ed187828801613d69565b90955093505060208501356001600160401b03811115613ef057600080fd5b613efc87828801613c81565b95989497509550505050565b60005b83811015613f23578181015183820152602001613f0b565b50506000910152565b60008151808452613f44816020860160208601613f08565b601f01601f19169290920160200192915050565b6020815260006124446020830184613f2c565b815181526020808301516001600160a01b0316908201526040810161098f565b600060208284031215613f9d57600080fd5b61244482613a35565b634e487b7160e01b600052602160045260246000fd5b8151606082019060048110613fe157634e487b7160e01b600052602160045260246000fd5b82526020838101516001600160a01b031690830152604092830151929091019190915290565b60008060008060008060008060c0898b03121561402357600080fd5b883561402e816139ab565b975060208901359650604089013595506060890135945060808901356001600160401b0381111561405e57600080fd5b61406a8b828c01613a78565b90955093505060a08901356001600160401b0381111561408957600080fd5b6140958b828c01613a78565b999c989b5096995094979396929594505050565b600080600080600080600080610100898b0312156140c657600080fd5b88356140d1816139ab565b975060208901356140e1816139ab565b965060408901356140f1816139ab565b95506060890135614101816139ab565b94506080890135614111816139ab565b935060a0890135614121816139ab565b925060c0890135614131816139ab565b915060e08901356001600160401b0381111561414c57600080fd5b89016000601f82018c1361415f57600080fd5b813561416d6138e88261387e565b8082825260208201915060208360051b86010192508e83111561418f57600080fd5b6020850194505b828510156141ba5784356141a9816139ab565b825260209485019490910190614196565b9b9e9a9d50989b5096999598949750929550505050565b60008060008060008060a087890312156141ea57600080fd5b86356141f5816139ab565b95506020870135614205816139ab565b9450604087013593506060870135925060808701356001600160401b0381111561422e57600080fd5b61423a89828a01613a78565b979a9699509497509295939492505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561098f5761098f614262565b6000604082018483526040602084015280845180835260608501915060208601925060005b818110156142ce5783518352602093840193909201916001016142b0565b50909695505050505050565b60018060a01b038616815284602082015260a06040820152600061430160a0830186613f2c565b6060830194909452506001600160a01b03919091166080909101529392505050565b82815260406020820152600061287e6040830184613f2c565b6000608082840312801561434f57600080fd5b50604051608081016001600160401b038111828210171561437257614372613838565b6040528235614380816139ab565b815261438e60208401613a35565b6020820152604083810135908201526060928301359281019290925250919050565b8082018082111561098f5761098f614262565b600060a08284031280156143d657600080fd5b5060405160a081016001600160401b03811182821017156143f9576143f9613838565b6040528235614407816139ab565b8152602083810135908201526040808401359082015261442960608401613a35565b6060820152608083013561443c81613e26565b60808201529392505050565b60006020828403121561445a57600080fd5b8151612444816139ab565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061449f90830184613f2c565b979650505050505050565b6000826144c757634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761098f5761098f614262565b6000602082840312156144f557600080fd5b5051919050565b60006001820161450e5761450e614262565b5060010190565b60018060a01b038516815283602082015260806040820152600061453c6080830185613f2c565b828103606084015261449f8185613f2c565b60006020828403121561456057600080fd5b815161244481613e26565b6000825161457d818460208701613f08565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300738128fe393bef1bcd8a524796fff40618b938cd467c71fcf37850ab0ba4f7d7a264697066735822122065e006829fe939ae22d5b64464958c65ed5fd2fa088fdd8fd2ae79801c08713064736f6c634300081b0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
