{
  "_format": "hh-sol-artifact-1",
  "contractName": "PropBalancesEchidnaTest",
  "sourceName": "contracts/test/echidna/PoolMockEchidna/PropBalancesEchidnaTest.sol",
  "abi": [
    {
      "inputs": [],
      "name": "alreadyInitialized",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "arithmeticError",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "bottomTickLowerThanMIN",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "dynamicFeeActive",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "dynamicFeeDisabled",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "flashInsufficientPaid0",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "flashInsufficientPaid1",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "incorrectPluginFee",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "insufficientInputAmount",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "invalidAmountRequired",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "expectedSelector",
          "type": "bytes4"
        }
      ],
      "name": "invalidHookResponse",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "invalidLimitSqrtPrice",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "invalidNewCommunityFee",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "invalidNewTickSpacing",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "liquidityAdd",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "liquidityOverflow",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "liquiditySub",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "locked",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "notAllowed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "notInitialized",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "pluginIsNotConnected",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "priceOutOfRange",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "tickInvalidLinks",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "tickIsNotInitialized",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "tickIsNotSpaced",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "tickOutOfRange",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "topTickAboveMAX",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "topTickLowerOrEqBottomTick",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "transferFailed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "zeroAmountRequired",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "zeroLiquidityActual",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "zeroLiquidityDesired",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "int24",
          "name": "bottomTick",
          "type": "int24"
        },
        {
          "indexed": true,
          "internalType": "int24",
          "name": "topTick",
          "type": "int24"
        },
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "liquidityAmount",
          "type": "uint128"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount0",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount1",
          "type": "uint256"
        }
      ],
      "name": "Burn",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint24",
          "name": "pluginFee",
          "type": "uint24"
        }
      ],
      "name": "BurnFee",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "int24",
          "name": "bottomTick",
          "type": "int24"
        },
        {
          "indexed": true,
          "internalType": "int24",
          "name": "topTick",
          "type": "int24"
        },
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "amount0",
          "type": "uint128"
        },
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "amount1",
          "type": "uint128"
        }
      ],
      "name": "Collect",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "communityFeeNew",
          "type": "uint16"
        }
      ],
      "name": "CommunityFee",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "newCommunityVault",
          "type": "address"
        }
      ],
      "name": "CommunityVault",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount0",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount1",
          "type": "uint256"
        }
      ],
      "name": "ExcessTokens",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "fee",
          "type": "uint16"
        }
      ],
      "name": "Fee",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount0",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount1",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "paid0",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "paid1",
          "type": "uint256"
        }
      ],
      "name": "Flash",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint160",
          "name": "price",
          "type": "uint160"
        },
        {
          "indexed": false,
          "internalType": "int24",
          "name": "tick",
          "type": "int24"
        }
      ],
      "name": "Initialize",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "int24",
          "name": "bottomTick",
          "type": "int24"
        },
        {
          "indexed": true,
          "internalType": "int24",
          "name": "topTick",
          "type": "int24"
        },
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "liquidityAmount",
          "type": "uint128"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount0",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount1",
          "type": "uint256"
        }
      ],
      "name": "Mint",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "newPluginAddress",
          "type": "address"
        }
      ],
      "name": "Plugin",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "newPluginConfig",
          "type": "uint8"
        }
      ],
      "name": "PluginConfig",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount0",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount1",
          "type": "uint256"
        }
      ],
      "name": "Skim",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "amount0",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "amount1",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "uint160",
          "name": "price",
          "type": "uint160"
        },
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "liquidity",
          "type": "uint128"
        },
        {
          "indexed": false,
          "internalType": "int24",
          "name": "tick",
          "type": "int24"
        }
      ],
      "name": "Swap",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint24",
          "name": "overrideFee",
          "type": "uint24"
        },
        {
          "indexed": false,
          "internalType": "uint24",
          "name": "pluginFee",
          "type": "uint24"
        }
      ],
      "name": "SwapFee",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "int24",
          "name": "newTickSpacing",
          "type": "int24"
        }
      ],
      "name": "TickSpacing",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "int24",
          "name": "bottomTick",
          "type": "int24"
        },
        {
          "internalType": "int24",
          "name": "topTick",
          "type": "int24"
        },
        {
          "internalType": "uint128",
          "name": "amount",
          "type": "uint128"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "burn",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "amount0",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount1",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint128",
          "name": "liquidityDelta",
          "type": "uint128"
        }
      ],
      "name": "burnLastMintedPosition",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "int24",
          "name": "bottomTick",
          "type": "int24"
        },
        {
          "internalType": "int24",
          "name": "topTick",
          "type": "int24"
        },
        {
          "internalType": "uint128",
          "name": "amount0Requested",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "amount1Requested",
          "type": "uint128"
        }
      ],
      "name": "collect",
      "outputs": [
        {
          "internalType": "uint128",
          "name": "amount0",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "amount1",
          "type": "uint128"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint128",
          "name": "amount0Requested",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "amount1Requested",
          "type": "uint128"
        }
      ],
      "name": "collectLastMintedPosition",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "communityVault",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount0",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount1",
          "type": "uint256"
        }
      ],
      "name": "donate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "echidna_check_balances_not_zero",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "factory",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "fee",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "currentFee",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount0",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount1",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "flash",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount0",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount1",
          "type": "uint256"
        }
      ],
      "name": "flashWrapped",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getCommunityFeePending",
      "outputs": [
        {
          "internalType": "uint128",
          "name": "",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "",
          "type": "uint128"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getPluginFeePending",
      "outputs": [
        {
          "internalType": "uint128",
          "name": "",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "",
          "type": "uint128"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getReserves",
      "outputs": [
        {
          "internalType": "uint128",
          "name": "",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "",
          "type": "uint128"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "globalState",
      "outputs": [
        {
          "internalType": "uint160",
          "name": "price",
          "type": "uint160"
        },
        {
          "internalType": "int24",
          "name": "tick",
          "type": "int24"
        },
        {
          "internalType": "uint16",
          "name": "lastFee",
          "type": "uint16"
        },
        {
          "internalType": "uint8",
          "name": "pluginConfig",
          "type": "uint8"
        },
        {
          "internalType": "uint16",
          "name": "communityFee",
          "type": "uint16"
        },
        {
          "internalType": "bool",
          "name": "unlocked",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "hasRoleOrOwner",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint160",
          "name": "initialPrice",
          "type": "uint160"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isUnlocked",
      "outputs": [
        {
          "internalType": "bool",
          "name": "unlocked",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lastFeeTransferTimestamp",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "liquidity",
      "outputs": [
        {
          "internalType": "uint128",
          "name": "",
          "type": "uint128"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "maxLiquidityPerTick",
      "outputs": [
        {
          "internalType": "uint128",
          "name": "",
          "type": "uint128"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "leftoversRecipient",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "int24",
          "name": "bottomTick",
          "type": "int24"
        },
        {
          "internalType": "int24",
          "name": "topTick",
          "type": "int24"
        },
        {
          "internalType": "uint128",
          "name": "liquidityDesired",
          "type": "uint128"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "mint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "amount0",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount1",
          "type": "uint256"
        },
        {
          "internalType": "uint128",
          "name": "liquidityActual",
          "type": "uint128"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int24",
          "name": "tickDelta",
          "type": "int24"
        },
        {
          "internalType": "uint128",
          "name": "liquidityDesired",
          "type": "uint128"
        },
        {
          "internalType": "uint256",
          "name": "pay0",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "pay1",
          "type": "uint256"
        }
      ],
      "name": "mintAroundCurrentTickWrapped",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int24",
          "name": "bottomTick",
          "type": "int24"
        },
        {
          "internalType": "int24",
          "name": "topTick",
          "type": "int24"
        },
        {
          "internalType": "uint128",
          "name": "liquidityDesired",
          "type": "uint128"
        },
        {
          "internalType": "uint256",
          "name": "pay0",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "pay1",
          "type": "uint256"
        }
      ],
      "name": "mintWrapped",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "nextTickGlobal",
      "outputs": [
        {
          "internalType": "int24",
          "name": "",
          "type": "int24"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "plugin",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "positions",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "liquidity",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "innerFeeGrowth0Token",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "innerFeeGrowth1Token",
          "type": "uint256"
        },
        {
          "internalType": "uint128",
          "name": "fees0",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "fees1",
          "type": "uint128"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "prevTickGlobal",
      "outputs": [
        {
          "internalType": "int24",
          "name": "",
          "type": "int24"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "safelyGetStateOfAMM",
      "outputs": [
        {
          "internalType": "uint160",
          "name": "sqrtPrice",
          "type": "uint160"
        },
        {
          "internalType": "int24",
          "name": "tick",
          "type": "int24"
        },
        {
          "internalType": "uint16",
          "name": "lastFee",
          "type": "uint16"
        },
        {
          "internalType": "uint8",
          "name": "pluginConfig",
          "type": "uint8"
        },
        {
          "internalType": "uint128",
          "name": "activeLiquidity",
          "type": "uint128"
        },
        {
          "internalType": "int24",
          "name": "nextTick",
          "type": "int24"
        },
        {
          "internalType": "int24",
          "name": "previousTick",
          "type": "int24"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "newCommunityFee",
          "type": "uint16"
        }
      ],
      "name": "setCommunityFee",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newCommunityVault",
          "type": "address"
        }
      ],
      "name": "setCommunityVault",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "newFee",
          "type": "uint16"
        }
      ],
      "name": "setFee",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newPluginAddress",
          "type": "address"
        }
      ],
      "name": "setPlugin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "newConfig",
          "type": "uint8"
        }
      ],
      "name": "setPluginConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int24",
          "name": "newTickSpacing",
          "type": "int24"
        }
      ],
      "name": "setTickSpacing",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "skim",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "zeroToOne",
          "type": "bool"
        },
        {
          "internalType": "int256",
          "name": "amountRequired",
          "type": "int256"
        },
        {
          "internalType": "uint160",
          "name": "limitSqrtPrice",
          "type": "uint160"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "swap",
      "outputs": [
        {
          "internalType": "int256",
          "name": "amount0",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "amount1",
          "type": "int256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "leftoversRecipient",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "zeroToOne",
          "type": "bool"
        },
        {
          "internalType": "int256",
          "name": "amountToSell",
          "type": "int256"
        },
        {
          "internalType": "uint160",
          "name": "limitSqrtPrice",
          "type": "uint160"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "swapWithPaymentInAdvance",
      "outputs": [
        {
          "internalType": "int256",
          "name": "amount0",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "amount1",
          "type": "int256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bool",
          "name": "zeroToOne",
          "type": "bool"
        },
        {
          "internalType": "int256",
          "name": "amountRequired",
          "type": "int256"
        },
        {
          "internalType": "uint160",
          "name": "limitSqrtPrice",
          "type": "uint160"
        },
        {
          "internalType": "uint256",
          "name": "pay0",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "pay1",
          "type": "uint256"
        }
      ],
      "name": "swapWithPaymentInAdvanceWrapped",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "sync",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "tickSpacing",
      "outputs": [
        {
          "internalType": "int24",
          "name": "",
          "type": "int24"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int16",
          "name": "",
          "type": "int16"
        }
      ],
      "name": "tickTable",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "tickTreeRoot",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int16",
          "name": "",
          "type": "int16"
        }
      ],
      "name": "tickTreeSecondLayer",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int24",
          "name": "",
          "type": "int24"
        }
      ],
      "name": "ticks",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "liquidityTotal",
          "type": "uint256"
        },
        {
          "internalType": "int128",
          "name": "liquidityDelta",
          "type": "int128"
        },
        {
          "internalType": "int24",
          "name": "prevTick",
          "type": "int24"
        },
        {
          "internalType": "int24",
          "name": "nextTick",
          "type": "int24"
        },
        {
          "internalType": "uint256",
          "name": "outerFeeGrowth0Token",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "outerFeeGrowth1Token",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "token0",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "token1",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalFeeGrowth0Token",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalFeeGrowth1Token",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60e06040523480156200001157600080fd5b50600260c052600160a052306080526000620d89e7196200003281620001e4565b6009805462ffffff93841663010000000265ffffffffffff1990911693909216929092171790556002805460ff60e01b1916600160e01b1790556001600160a01b03811615620000875762000087816200009a565b50620000946003620000ee565b62000215565b600680546001600160a01b0319166001600160a01b0383169081179091556040519081527f27a3944eff2135a57675f17e72501038982b73620d01f794c72e93d61a3932a29060200160405180910390a150565b620d89e719620000fe81620001e4565b620d89e7196000818152602085905260409020600101805465ffffffffffff60801b1916600160981b62ffffff9485160262ffffff60801b191617600160801b9490931693909302919091179091556200015881620001e4565b8260006200016a620d89e719620001e4565b60020b60020b81526020019081526020016000206001016010846000620d89e7196200019690620001e4565b60020b81526020810191909152604001600020600101805462ffffff948516600160981b0262ffffff60981b1990911617905581549383166101009190910a90810292021990921617905550565b60008160020b627fffff1981036200020c57634e487b7160e01b600052601160045260246000fd5b60000392915050565b60805160a05160c0516164ef620002d86000396000818161078e01528181610b750152818161113101528181611475015281816118a70152818161197401528181611d7101528181612f7e015281816137d801526151190152600081816103c101528181610c01015281816110ed01528181611432015281816118df0152818161193c01528181611d2201528181612f26015281816130ee0152818161378a01526150e401526000818161070d0152818161215301526138eb01526164ef6000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80639e922180116101b2578063d5c35a7e116100f9578063ecdecf42116100a2578063f30dba931161007c578063f30dba93146108e8578063f3a016ab14610971578063f637731d14610984578063fff6cae91461099757600080fd5b8063ecdecf42146108b9578063ef01df4f146108c2578063f085a610146108d557600080fd5b8063ddca3f43116100d3578063ddca3f43146107f8578063e76c01e414610813578063e8ae2b69146108a657600080fd5b8063d5c35a7e146107b8578063d8544cf3146107c5578063d8619037146107d857600080fd5b8063c5390e2d1161015b578063d0c93a7c11610135578063d0c93a7c14610775578063d21220a714610789578063d21c2577146107b057600080fd5b8063c5390e2d1461072f578063c677e3e014610742578063cc1f97cf1461076257600080fd5b8063b563f7421161018c578063b563f742146106e2578063bca57f81146106f5578063c45a01551461070857600080fd5b80639e9221801461067c578063a1eded871461068f578063aafe29c0146106ab57600080fd5b8063514ea4bf116102765780637bd780251161021f5780639734b577116101f95780639734b577146105f857806397ce1c511461060b5780639e4e02271461066957600080fd5b80637bd78025146105ab5780638380edb7146105c75780638e005553146105e557600080fd5b80636378ae44116102505780636378ae441461056857806370cf754a1461057f57806377f8c3a91461059457600080fd5b8063514ea4bf146104ac57806353e9786814610529578063578b9a361461053c57600080fd5b80631a686502116102d85780633b3bc70e116102b25780633b3bc70e14610473578063490e6cbc146104865780634f1eb3d81461049957600080fd5b80631a686502146104235780631dd19cb414610458578063240a875a1461046057600080fd5b80630cdd53f6116103095780630cdd53f6146103a95780630dfe1681146103bc578063128acb08146103fb57600080fd5b8063050a4d21146103305780630606e8551461035c5780630902f1ac14610371575b600080fd5b600954610344906301000000900460020b81565b60405160029190910b81526020015b60405180910390f35b61036f61036a366004615b38565b61099f565b005b600c546001600160801b0380821691600160801b9004165b604080516001600160801b03938416815292909116602083015201610353565b61036f6103b7366004615b8f565b610a94565b6103e37f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610353565b61040e610409366004615c18565b610ac8565b60408051928352602083019190915201610353565b60095461044090660100000000000090046001600160801b031681565b6040516001600160801b039091168152602001610353565b61036f610ccf565b61036f61046e366004615cab565b610d02565b61040e610481366004615cc8565b610d81565b61036f610494366004615d40565b610fce565b6103896104a7366004615d8d565b611386565b6104f56104ba366004615dfa565b600b602052600090815260409020805460018201546002830154600390930154919290916001600160801b0380821691600160801b90041685565b604080519586526020860194909452928401919091526001600160801b03908116606084015216608082015260a001610353565b6007546103e3906001600160a01b031681565b60095461055390600160c81b900463ffffffff1681565b60405163ffffffff9091168152602001610353565b61057160005481565b604051908152602001610353565b6104406d09745258e83de0d0f4e400fce79981565b60045461055390600160d01b900463ffffffff1681565b6004546001600160681b0380821691600160681b900416610389565b600254600160e01b900460ff165b6040519015158152602001610353565b61036f6105f3366004615cab565b611552565b61036f610606366004615e13565b6115bd565b610613611655565b604080516001600160a01b039098168852600296870b602089015261ffff9095169487019490945260ff90921660608601526001600160801b03166080850152820b60a0840152900b60c082015260e001610353565b61040e610677366004615e48565b6116eb565b61036f61068a366004615ede565b611a13565b6005546001600160681b0380821691600160681b900416610389565b6106be6106b9366004615efb565b611ac8565b6040805193845260208401929092526001600160801b031690820152606001610353565b61036f6106f0366004615f5d565b611e7a565b61036f610703366004615fa1565b611fee565b6103e37f000000000000000000000000000000000000000000000000000000000000000081565b61036f61073d366004615fc4565b612041565b610571610750366004615ffc565b60086020526000908152604090205481565b61036f61077036600461601f565b6120e7565b60095461034490600160b01b900460020b81565b6103e37f000000000000000000000000000000000000000000000000000000000000000081565b6105d561210a565b6009546103449060020b81565b61036f6107d336600461601f565b612140565b6105716107e6366004615ffc565b600a6020526000908152604090205481565b6108006121bb565b60405161ffff9091168152602001610353565b6002805461085e916001600160a01b03821691600160a01b810490910b9061ffff600160b81b820481169160ff600160c81b8204811692600160d01b83041691600160e01b90041686565b604080516001600160a01b03909716875260029590950b602087015261ffff9384169486019490945260ff9091166060850152166080830152151560a082015260c001610353565b6105d56108b436600461603c565b61225f565b61057160015481565b6006546103e3906001600160a01b031681565b61036f6108e336600461606c565b612268565b61093a6108f636600461606c565b60036020819052600091825260409091208054600182015460028084015493909401549193600f82900b93600160801b8304820b93600160981b90930490910b9186565b60408051968752600f9590950b6020870152600293840b94860194909452910b6060840152608083015260a082015260c001610353565b61036f61097f366004616087565b6122d1565b61036f61099236600461601f565b612387565b61036f612586565b60006040518060400160405280848152602001838152506040516020016109c691906160b5565b60408051601f19818403018152908290526302abf8a760e61b82529150309063aafe29c090610a0390339084908b908b908b908990600401616112565b6060604051808303816000875af1158015610a22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a46919061616b565b505060408051808201909152600288810b825287900b6020909101525050600f805462ffffff95861663010000000265ffffffffffff19909116959096169490941794909417909255505050565b81600d6000828254610aa691906161ba565b9250508190555080600e6000828254610abf91906161ba565b90915550505050565b600080600080610ade8a8a8a8a60008b8b6125b8565b91509150610aea612771565b6040805160608101825260008082526020808301829052828401829052835180850190945281845283015290610b2384848d8d8d6127aa565b6001600160801b03909116604088015260029190910b60208701526001600160a01b03909116855291975095509050600080610b5d612ed2565b915091508c15610bf3576000871215610b9e57610b9e7f00000000000000000000000000000000000000000000000000000000000000008f896000036130ec565b610baa88888c8c61315e565b600d54610bb789846161ba565b1115610bd657604051633ed6d50560e21b815260040160405180910390fd5b610bee888885600001516000876020015160006131fe565b610c7a565b6000881215610c2a57610c2a7f00000000000000000000000000000000000000000000000000000000000000008f8a6000036130ec565b610c3688888c8c61315e565b600e54610c4388836161ba565b1115610c6257604051633ed6d50560e21b815260040160405180910390fd5b610c7a888860008660000151600088602001516131fe565b610c968e89898760000151886040015189602001518c8c613541565b50505050610cb26002805460ff60e01b1916600160e01b179055565b610cc28a8a8a8a88888c8c6135f4565b5050965096945050505050565b610cd7613703565b610cdf612771565b610ce83361372e565b610d006002805460ff60e01b1916600160e01b179055565b565b610d0a61387b565b610d126138a5565b6103e861ffff82161180610d35575060025461ffff828116600160d01b90920416145b80610d57575061ffff811615801590610d5757506007546001600160a01b0316155b15610d755760405163a709b9af60e01b815260040160405180910390fd5b610d7e8161396b565b50565b6000808686610d9082826139dc565b6f7fffffffffffffffffffffffffffffff6001600160801b0388161115610dca57604051638995290f60e01b815260040160405180910390fd5b6000610dd5886161cd565b90506000610de7338c8c858c8c613a5e565b9050610df1612771565b610df9612ed2565b50506000610e08338d8d613bb8565b9050610e16818d8d86613be4565b909750955062ffffff821615610e8c576000808815610e5157610e428962ffffff8616620f4240613d09565b9150610e4e828a6161fc565b98505b8715610e7957610e6a8862ffffff8616620f4240613d09565b9050610e7681896161fc565b97505b610e8960008060008086866131fe565b50505b86861715610ef1576003810154610ead9088906001600160801b031661620f565b6003820154610ecd908890600160801b90046001600160801b031661620f565b6001600160801b039182169116600160801b026001600160801b0319161760038201555b506001600160801b0389168617851715610f98576040805162ffffff83168152905133917f1a25098b7a731ae33ed362388b593b876963dfde0efb4db9c0befeed637ff26b919081900360200190a2604080516001600160801b038b16815260208101889052808201879052905160028c810b92908e900b9133917f0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c919081900360600190a45b610fb06002805460ff60e01b1916600160e01b179055565b610fc0338c8c858a8a8e8e613da2565b505050509550959350505050565b600254600160c81b9004601016156110b4576006546040516346f0547760e11b80825233600483018181526001600160a01b038a81166024860152604485018a90526064850189905260a06084860190815260a486018890526110b49694959190941693638de0a8ee93928c928c928c928c928c929060c401848480828437600081840152601f19601f8201169050808301925050509750505050505050506020604051808303816000875af115801561108c573d6000803e3d6000fd5b505050506040513d60208110156110a257600080fd5b50516001600160e01b03191690613eb0565b6110bc612771565b6000806000806110ca612ed2565b909250905060008815611113576110e6896064620f4240613eed565b90506111137f00000000000000000000000000000000000000000000000000000000000000008b8b6130ec565b600088156111575761112a896064620f4240613eed565b90506111577f00000000000000000000000000000000000000000000000000000000000000008c8b6130ec565b61116382828a8a613f6d565b600d5495508561117383866161ba565b1115611192576040516336de50ff60e11b815260040160405180910390fd5b600e549450846111a282856161ba565b11156111c15760405163c998149f60e01b815260040160405180910390fd5b60025495849003959483900394600160d01b900461ffff16801561122157600087156111f7576111f488836103e8613d09565b90505b6000871561120f5761120c88846103e8613d09565b90505b61121e828284846000806131fe565b50505b604080518c8152602081018c90528082018990526060810188905290516001600160a01b038e169133917fbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca6339181900360800190a350505050506112926002805460ff60e01b1916600160e01b179055565b600254600160c81b90046020161561137d5761137d63343d37ff60e01b600660009054906101000a90046001600160a01b03166001600160a01b031663343d37ff338b8b8b89898d8d6040518963ffffffff1660e01b815260040180896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505099505050505050505050506020604051808303816000875af115801561108c573d6000803e3d6000fd5b50505050505050565b600080611391612771565b600061139e338888613bb8565b60038101549091506001600160801b0380821691600160801b900481169087168210156113c9578196505b806001600160801b0316866001600160801b031611156113e7578095505b6001600160801b03878717161561152d576001600160801b0387830381168783038216600160801b026001600160801b031916176003850155879550869450851615611461576114617f00000000000000000000000000000000000000000000000000000000000000008b876001600160801b03166130ec565b6001600160801b038416156114a4576114a47f00000000000000000000000000000000000000000000000000000000000000008b866001600160801b03166130ec565b6114cc856001600160801b0316600003856001600160801b03166000036000806000806131fe565b604080516001600160a01b038c1681526001600160801b038088166020830152861681830152905160028a810b92908c900b9133917f70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0919081900360600190a45b6115456002805460ff60e01b1916600160e01b179055565b5050509550959350505050565b61155a6138a5565b600254600160c81b8104608016151590600160e01b900460ff1661159157604051636798480960e11b815260040160405180910390fd5b80156115b0576040516369cdc70760e11b815260040160405180910390fd5b6115b982613fce565b5050565b60006040518060400160405280848152602001838152506040516020016115e491906160b5565b60408051601f19818403018152908290526312439b2f60e21b82529150309063490e6cbc9061161d908790879087908790600401616236565b600060405180830381600087803b15801561163757600080fd5b505af115801561164b573d6000803e3d6000fd5b5050505050505050565b600280546001600160a01b03811691600160a01b8204900b9061ffff600160b81b8204169060ff600160c81b820481169160009182918291600160e01b90910416806116b457604051636798480960e11b815260040160405180910390fd5b505060095495969495939492936001600160801b03660100000000000082041693600282810b9450630100000090920490910b9150565b6000806000861215611710576040516334cb3a0160e11b815260040160405180910390fd5b611718612771565b6000871561177357600061172b600d5490565b905061173a886000888861315e565b6000611745600d5490565b905061175961175483836161fc565b614038565b925061176c8360008060008060006131fe565b50506117bd565b600061177e600e5490565b905061178d600089888861315e565b6000611798600e5490565b90506117a761175483836161fc565b92506117ba6000846000806000806131fe565b50505b8681146117c8578096505b50856000036117ea57604051633ed6d50560e21b815260040160405180910390fd5b6118026002805460ff60e01b1916600160e01b179055565b6000806118158a8a8a8a60018b8b6125b8565b91509150611821612771565b611829612ed2565b5050604080516060810182526000808252602080830182905282840182905283518085019094528184528301529061186484848d8d8d6127aa565b6001600160801b03909116604088015260029190910b60208701526001600160a01b039091168552919750955090508a1561192e5760008512156118d0576118d07f00000000000000000000000000000000000000000000000000000000000000008d876000036130ec565b858a038a8714611905576119057f00000000000000000000000000000000000000000000000000000000000000008f836130ec565b61192861191182614038565b6000038784600001516000866020015160006131fe565b506119bf565b6000861215611965576119657f00000000000000000000000000000000000000000000000000000000000000008d886000036130ec565b848a038a861461199a5761199a7f00000000000000000000000000000000000000000000000000000000000000008f836130ec565b6119bd876119a783614038565b60000360008560000151600087602001516131fe565b505b6119db8c87878560000151866040015187602001518a8a613541565b6119f36002805460ff60e01b1916600160e01b179055565b611a038c8c8c8c8a8a8e8e6135f4565b5050505097509795505050505050565b600f5463010000008104600290810b91900b03611a2f57600080fd5b600f54604051631d9de38760e11b8152600282810b6004830152630100000090920490910b60248201526001600160801b038216604482015260806064820152600060848201523090633b3bc70e9060a40160408051808303816000875af1158015611a9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac39190616264565b505050565b60008060008787611ad982826139dc565b876001600160801b0316600003611b035760405163e6ace6df60e01b815260040160405180910390fd5b611b228b8b8b611b1b8c6001600160801b031661404c565b8b8b613a5e565b50611b2b612771565b60028054600160a01b810490910b906001600160a01b03166000819003611b655760405163812eb65560e01b815260040160405180910390fd5b600954600160b01b9004600290810b9081908d900b81611b8757611b87616288565b078160020b8e60020b81611b9d57611b9d616288565b071760020b15611bc057604051635f6e14f360e01b815260040160405180910390fd5b50611bdf8c8c611bd88d6001600160801b031661404c565b858561405f565b50909750955060009150819050611bf4612ed2565b91509150611c0487878b8b61410e565b8615611c235781611c14600d5490565b611c1e91906161fc565b611c26565b60005b91508515611c475780611c38600e5490565b611c4291906161fc565b611c4a565b60005b905086821015611c6f57611c688a6001600160801b03168389613d09565b9450611c73565b8994505b85811015611cb3576000611c918b6001600160801b03168389613d09565b9050856001600160801b0316816001600160801b03161015611cb1578095505b505b846001600160801b0316600003611cdd57604051632fae8a9b60e21b815260040160405180910390fd5b6000611cea8e8e8e613bb8565b9050611d09818e8e611d048a6001600160801b031661404c565b613be4565b9098509650508615611d5e5786821115611d4f57611d4a7f00000000000000000000000000000000000000000000000000000000000000008f8985036130ec565b611d5e565b868214611d5e57611d5e61629e565b8515611dad5785811115611d9e57611d997f00000000000000000000000000000000000000000000000000000000000000008f8884036130ec565b611dad565b858114611dad57611dad61629e565b611dbd87876000806000806131fe565b8a60020b8c60020b8e6001600160a01b03167f7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde33898c8c60405180856001600160a01b03168152602001846001600160801b0316815260200183815260200182815260200194505050505060405180910390a4611e486002805460ff60e01b1916600160e01b179055565b611e698d8d8d611e60896001600160801b031661404c565b8b8b8f8f613da2565b505050509750975097945050505050565b60008460020b1215611e9257611e8f846162b4565b93505b611e9f620d89e7196162b4565b611eaa9060026162cd565b60020b8460020b1315611ed257611ec4620d89e7196162b4565b611ecf9060026162cd565b93505b60028054600160a01b9004900b6000611eeb86836162ed565b90506000611ef98784616312565b90506000604051806040016040528087815260200186815250604051602001611f2291906160b5565b60408051601f19818403018152908290526302abf8a760e61b82529150309063aafe29c090611f5f9033908490889088908e908990600401616112565b6060604051808303816000875af1158015611f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa2919061616b565b505060408051808201909152600285810b825284900b6020909101525050600f805462ffffff93841665ffffffffffff1990911617630100000093909216929092021790555050505050565b611ff661387b565b6006546001600160a01b03168061202057604051639e727ce360e01b815260040160405180910390fd5b336001600160a01b03821614612038576120386138a5565b6115b98261414d565b600060405180604001604052808481526020018381525060405160200161206891906160b5565b60408051601f1981840301815290829052639e4e022760e01b825291503090639e4e0227906120a590839081908b908b908b908990600401616337565b60408051808303816000875af11580156120c3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164b9190616264565b6120ef61387b565b6120f76138a5565b612101600061414d565b610d7e816141b6565b600954600090600160c81b900463ffffffff161561213a576000600d54118061213557506000600e54115b905090565b50600190565b61214861387b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612180576121806138a5565b6001600160a01b0381161580156121a35750600254600160d01b900461ffff1615155b156121b2576121b2600061396b565b610d7e81614211565b600254600160b81b810461ffff1690600160c81b900460ff8116906080161561225b57600660009054906101000a90046001600160a01b03166001600160a01b031663f70d93626040518163ffffffff1660e01b8152600401602060405180830381865afa158015612231573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122559190616379565b91505090565b5090565b60015b92915050565b61227061387b565b6122786138a5565b60008160020b13158061229057506101f4600282900b135b806122aa5750600954600282810b600160b01b909204900b145b156122c857604051632bf827d160e21b815260040160405180910390fd5b610d7e8161426c565b600f5463010000008104600290810b91900b036122ed57600080fd5b600f546040516309e3d67b60e31b81523060048201819052600283810b6024840152630100000090930490920b60448201526001600160801b03808516606483015283166084820152634f1eb3d89060a40160408051808303816000875af115801561235d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123819190616396565b50505050565b6000612392826142d5565b6002549091506001600160a01b0316156123bf57604051631499a6b760e21b815260040160405180910390fd5b600280546001600160a01b03841676ffffffffffffffffffffffffffffffffffffffffffffff199091168117600160a01b62ffffff851602178255604080519182529183900b602082015281517f98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c95929181900390910190a16006546001600160a01b0316156124a857600654604080516318dbf60160e21b8082523360048301526001600160a01b03868116602484015292516124a89491939091169163636fd80491604480830192602092919082900301816000875af115801561108c573d6000803e3d6000fd5b6000600160646124b781613fce565b6124c08261426c565b61ffff8316158015906124dc57506007546001600160a01b0316155b156124fa5760405163a709b9af60e01b815260040160405180910390fd5b6125038361396b565b600254600160c81b90046040161561257f576006546040805163416eb29160e11b8082523360048301526001600160a01b038981166024840152600289900b6044840152925161257f949193909116916382dd652291606480830192602092919082900301816000875af115801561108c573d6000803e3d6000fd5b5050505050565b61258e613703565b612596612771565b61259e612ed2565b5050610d006002805460ff60e01b1916600160e01b179055565b6002546000908190600160c81b900460ff166125d681600116151590565b15612763576006546001600160a01b031633036125fa576000809250925050612765565b6000600660009054906101000a90046001600160a01b03166001600160a01b031663029c1cb7338d8d8d8d8d8d8d6040518963ffffffff1660e01b815260040180896001600160a01b03168152602001886001600160a01b031681526020018715158152602001868152602001856001600160a01b031681526020018415158152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505099505050505050505050506060604051808303816000875af11580156126d7573d6000803e3d6000fd5b505050506040513d60608110156126ed57600080fd5b5080516020820151604090920151919550909350905060808216158015612728575060008462ffffff161180612728575060008362ffffff16115b1561274657604051633a4528ef60e01b815260040160405180910390fd5b6127616001600160e01b0319821663029c1cb760e01b613eb0565b505b505b97509795505050505050565b600254600160e01b900460ff1661279b57604051636798480960e11b815260040160405180910390fd5b6002805460ff60e01b19169055565b60008060008060006127cf604051806040016040528060008152602001600081525090565b876000036127f0576040516301e76e6160e61b815260040160405180910390fd5b600160ff1b8803612814576040516334cb3a0160e11b815260040160405180910390fd5b6040805161016081018252600060208201819052606082018190526080820181905260a0820181905262ffffff8d16610140830152808b1360c08301529181018a9052600954600281810b61012084015263010000008204810b610100840152805461ffff600160d01b820481168552600160b81b82041660e08501526001600160a01b0381169850600160a01b9004900b9550660100000000000090046001600160801b03169350908590036128de5760405163812eb65560e01b815260040160405180910390fd5b62ffffff8c1615612926576128f38b8d6163c5565b62ffffff1660e08201819052620f424011612921576040516315b2afa960e01b815260040160405180910390fd5b612978565b62ffffff8b1615612978578a8160e00181815161294391906163c5565b62ffffff90811690915260e0830151620f42409116109050612978576040516315b2afa960e01b815260040160405180910390fd5b89156129d857846001600160a01b0316886001600160a01b03161015806129ad57506401000276a36001600160a01b03891611155b156129cb57604051631662672360e01b815260040160405180910390fd5b6000546080820152612a3d565b846001600160a01b0316886001600160a01b0316111580612a16575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b03891610155b15612a3457604051631662672360e01b815260040160405180910390fd5b60015460808201525b612a6f6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60008b612a8157826101200151612a88565b8261010001515b6001600160a01b03881683529050612a9f816145e8565b6001600160a01b0390811660208401819052612adc918e918a918e161182151514612ace578460200151612ad0565b8c5b888f8860e001516148c3565b60808601526060850152604084015260c084015190975015612b3457612b0b8260800151836040015101614038565b8b039a50612b2a612b1f8360600151614038565b606085015190614a91565b6060840152612b6c565b612b418260600151614038565b8b019a50612b66612b5b8360800151846040015101614038565b606085015190614aa7565b60608401525b825115612bae57825160808301516000916103e891612b8a91614abd565b81612b9757612b97616288565b608085018051929091049182900390528551018552505b600083610140015162ffffff16118015612bd1575060008360e0015162ffffff16115b15612c12576000612bfa836080015185610140015162ffffff168660e0015162ffffff16613d09565b60808401805182900390526020860180519091019052505b6001600160801b03851615612c4957612c3d8260800151600160801b876001600160801b0316613d09565b60808401805190910190525b8160200151876001600160a01b031603612d65578260200151612c8457600160208401528b612c7a57600054612c7e565b6001545b60a08401525b60008c15612cf35750608083015160a0840151600283810b600081815260036020819052604082209081018054828601805490980390975595909403909455600190920154600160801b810490910b61010087015261012086019190915260001983019750600f0b9003612d53565b5060a08301516080840151600283810b60008181526003602081905260409091209081018054828501805490970390965594909303909355600190910154600160981b810490910b6101208601526101008501919091529095508590600f0b5b612d5d8682614ae7565b955050612d87565b81516001600160a01b03881614612d8757612d7f876142d5565b955050612dae565b508915801590612da95750886001600160a01b0316866001600160a01b031614155b612a6f575b60008a83604001510390508260c0015115158c151514612dd357826060015181612dda565b8083606001515b6002805476ffffffffffffffffffffffffffffffffffffffffffffff1916600160a01b62ffffff8b160273ffffffffffffffffffffffffffffffffffffffff1916176001600160a01b038b161790556020850151919a509850159050612ea7576101008201516101208301516009805462ffffff92831665ffffffffffff199091161763010000009290931691909102919091177fffffffffffffffffffff00000000000000000000000000000000ffffffffffff1666010000000000006001600160801b038716021790555b8a15612eba576080820151600055612ec3565b60808201516001555b50509550955095509550955095565b600080612ede600d5490565b600e5490925090506001600160801b03821180612f0157506001600160801b0381115b15612fc4576007546001600160a01b03166001600160801b03831115612f6a57612f5f7f0000000000000000000000000000000000000000000000000000000000000000826ffffffffffffffffffffffffffffffffe1986016130ec565b6001600160801b0392505b6001600160801b03821115612fc257612fb77f0000000000000000000000000000000000000000000000000000000000000000826ffffffffffffffffffffffffffffffffe1985016130ec565b6001600160801b0391505b505b600954660100000000000090046001600160801b03166000819003612fe857509091565b600c546001600160801b0380821691600160801b900416818511818511818061300e5750805b156130e35781156130465761303c846001600160801b03168803600160801b876001600160801b0316613d09565b6000805490910190555b80156130795761306f836001600160801b03168703600160801b876001600160801b0316613d09565b6001805490910190555b604080516001600160801b038087168a0382528516880360208201527fef10ebb00f0dbc72ad4602e94abbbda6f3d40632714f70e9c8fa30d5d44289c9910160405180910390a16001600160801b03808816908716600160801b026001600160801b03191617600c555b50505050509091565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036131425780600d600082825461313791906161fc565b90915550611ac39050565b80600e600082825461315491906161fc565b9091555050505050565b80156131b25760006131728284018461643e565b90508060000151600d600082825461318a91906161ba565b90915550506020810151600e80546000906131a69084906161ba565b90915550612381915050565b60008413156131d85783600d60008282546131cd91906161ba565b909155506123819050565b60008313156123815782600e60008282546131f391906161ba565b909155505050505050565b600084118061320d5750600083115b806132185750600082115b806132235750600081115b156134b55760048054600790600160d01b900463ffffffff1660008080808061324f8c8c888a8c614b61565b93509350935093508082176000146132955761326a82614038565b613274908f61645a565b61327d82614038565b613287908f61645a565b909e509c50600194506132fb565b6001600160681b0384841716156132fb57600480547fffffffffffff000000000000000000000000000000000000000000000000000016600160681b6001600160681b03868116919091026cffffffffffffffffffffffffff1916919091179086161790555b60059750600696506133168a8a8863ffffffff168a8c614b61565b92965090945092509050818117156134095761333182614038565b61333b908f61645a565b61334482614038565b61334e908f61645a565b809e50819f5050506001945061340463aa6b14bb60e01b600660009054906101000a90046001600160a01b03166001600160a01b031663aa6b14bb85856040518363ffffffff1660e01b81526004016133b1929190918252602082015260400190565b6020604051808303816000875af11580156133d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f4919061647a565b6001600160e01b03191690613eb0565b61346f565b6001600160681b03848417161561346f57600580547fffffffffffff000000000000000000000000000000000000000000000000000016600160681b6001600160681b03868116919091026cffffffffffffffffffffffffff1916919091179086161790555b84156134ac57600480547fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff16600160d01b4263ffffffff16021790555b50505050505050505b8585171561353957600c546001600160801b0380821691600160801b90041687156134f8576134ec6134e789846164a4565b614c6d565b6001600160801b031691505b86156135175761350b6134e788836164a4565b6001600160801b031690505b6001600160801b039182169116600160801b026001600160801b03191617600c555b505050505050565b6040805162ffffff808516825283166020820152815133927f9443903d84c9719611bd4bba871daaf18a3950d00d5d78b1a2fa701f76df54ff928290030190a260408051888152602081018890526001600160a01b03878116828401526001600160801b0387166060830152600286900b60808301529151918a169133917fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67919081900360a00190a35050505050505050565b60028054600160c81b9004161561164b576006546001600160a01b0316331461164b5761164b639cb5a96360e01b600660009054906101000a90046001600160a01b03166001600160a01b0316639cb5a963338c8c8c8c8c8c8c8c6040518a63ffffffff1660e01b8152600401808a6001600160a01b03168152602001896001600160a01b031681526020018815158152602001878152602001866001600160a01b03168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509a50505050505050505050506020604051808303816000875af115801561108c573d6000803e3d6000fd5b6006546001600160a01b03163314610d0057604051634994c26960e11b815260040160405180910390fd5b60008061373a600d5490565b600e54600c5491935091506001600160801b0380821691600160801b9004168184118061376f5750806001600160801b031683115b1561257f57816001600160801b03168411156137c2576137c27f0000000000000000000000000000000000000000000000000000000000000000866137bd6001600160801b038616886161fc565b6130ec565b806001600160801b031683111561380b5761380b7f0000000000000000000000000000000000000000000000000000000000000000866137bd6001600160801b038516876161fc565b6001600160a01b0385167fb94331e4420f16b156f53c397a8adcd09481283ee7830f7b688b22858e9db80b6138496001600160801b038516876161fc565b61385c6001600160801b038516876161fc565b6040805192835260208301919091520160405180910390a25050505050565b600254600160e01b900460ff16610d0057604051636798480960e11b815260040160405180910390fd5b6040805163e8ae2b6960e01b81527fb73ce166ead2f8e9add217713a7989e4edfba9625f71dfd2516204bb67ad3442600482015233602482015290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163e8ae2b699160448083019260209291908290030181865afa158015613936573d6000803e3d6000fd5b505050506040513d602081101561394c57600080fd5b5051610d0057604051634994c26960e11b815260040160405180910390fd5b600280547fffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff16600160d01b61ffff8416908102919091179091556040519081527f3647dccc990d4941b0b05b32527ef493a98d6187b20639ca2f9743f3b55ca5e1906020015b60405180910390a150565b6139e9620d89e7196162b4565b60020b8160020b1315613a0f57604051631445443d60e01b815260040160405180910390fd5b8160020b8160020b13613a355760405163d9a841a760e01b815260040160405180910390fd5b620d89e719600283900b12156115b957604051631d1ac7f160e21b815260040160405180910390fd5b600254600090600160c81b900460041615613bae576006546001600160a01b03163303613a8d57506000613bae565b600654604051632f1208d960e11b815233600482018181526001600160a01b038b8116602485015260028b810b60448601528a900b6064850152600f89900b608485015260c060a4850190815260c485018890526000959190911693635e2411b293928d928d928d928d928d928d92919060e401848480828437600081840152601f19601f8201169050808301925050509850505050505050505060408051808303816000875af1158015613b46573d6000803e3d6000fd5b505050506040513d6040811015613b5c57600080fd5b50805160209091015192509050620f424062ffffff831610613b91576040516315b2afa960e01b815260040160405180910390fd5b613bac6001600160e01b03198216632f1208d960e11b613eb0565b505b9695505050505050565b62ffffff818116908316601885811b91909117901b176000908152600b602052604090205b9392505050565b6002805460008054600154919384936001600160a01b03811693600160a01b90910490910b918491829190600f89900b15613c4057613c2a60038c878c86866000614c83565b9350613c3d60038b878c86866001614c83565b92505b600080613c5260038e8e8a8888614d74565b91509150613c628e8c8484614e11565b5050505086600f0b600014613cfc578180613c7a5750805b15613c9357613c93898984848760008d600f0b12614f06565b6000613ca28a8a8a878961405f565b91985096509050600f81900b15613cfa57600954613cd390660100000000000090046001600160801b031689614ae7565b600960066101000a8154816001600160801b0302191690836001600160801b031602179055505b505b5050505094509492505050565b60008383028160001985870982811083820303915050808411613d2b57600080fd5b80600003613d3e57508290049050613bdd565b8385870960008581038616958690049560026003880281188089028203028089028203028089028203028089028203028089028203028089029091030291819003819004600101858411909403939093029190930391909104170290509392505050565b6006546001600160a01b0316331461164b57600254600160c81b90046008161561164b5761164b63d685201060e01b600660009054906101000a90046001600160a01b03166001600160a01b031663d6852010338c8c8c8c8c8c8c8c6040518a63ffffffff1660e01b8152600401808a6001600160a01b03168152602001896001600160a01b031681526020018860020b81526020018760020b815260200186600f0b8152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509a50505050505050505050506020604051808303816000875af115801561108c573d6000803e3d6000fd5b6001600160e01b0319828116908216146115b95760405163d3f5153b60e01b81526001600160e01b03198216600482015260240160405180910390fd5b6000831580613f0e57505082820282848281613f0b57613f0b616288565b04145b15613f2f5760008211613f2057600080fd5b81810490829006151501613bdd565b613f3a848484613d09565b905060008280613f4c57613f4c616288565b8486091115613bdd576000198110613f6357600080fd5b6001019392505050565b6000613f7b8284018461643e565b8051909150613f8b9086906161ba565b600d6000828254613f9c91906161ba565b90915550506020810151613fb19085906161ba565b600e6000828254613fc291906161ba565b90915550505050505050565b600280547fffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff16600160b81b61ffff8416908102919091179091556040519081527f598b9f043c813aa6be3426ca60d1c65d17256312890be5118dab55b0775ebe2a906020016139d1565b80600081121561404757600080fd5b919050565b806000600f82900b121561404757600080fd5b60008060008061406e896145e8565b9050600061407b896145e8565b90506000808b60020b8960020b12156140a05761409984848c614fff565b91506140de565b8a60020b8960020b12156140d0576140b988848c614fff565b91506140c684898c61503f565b90508994506140de565b6140db84848c61503f565b90505b60008a600f0b126140f05781816140f9565b81600003816000035b909d909c50949a509398505050505050505050565b80156141225760006131728284018461643e565b83600d600082825461413491906161ba565b9250508190555082600e60008282546131f391906161ba565b600280547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff16600160c81b60ff8416908102919091179091556040519081527f3a6271b36c1b44bd6a0a0d56230602dc6919b7c17af57254306fadf5fee69dc3906020016139d1565b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f27a3944eff2135a57675f17e72501038982b73620d01f794c72e93d61a3932a2906020016139d1565b6007805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fb0b573c1f636e1f8bd9b415ba6c04d6dd49100bc25493fc6305b65ec0e581df3906020016139d1565b600980547fffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff16600160b01b62ffffff841602179055604051600282900b81527f01413b1d5d4c359e9a0daa7909ecda165f6e8c51fe2ff529d74b22a5a7c02645906020016139d1565b60006401000276a36001600160a01b0383161080614310575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b03831610155b1561432e576040516355cf1e2360e01b815260040160405180910390fd5b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c979088119617909417909217179091171717608081106143cf57607f810383901c91506143d9565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b146145d957886001600160a01b03166145be826145e8565b6001600160a01b031611156145d357816145db565b806145db565b815b9998505050505050505050565b6000600282900b60171d62ffffff818401821816620d89e881111561462057604051633c10250f60e01b815260040160405180910390fd5b600160801b600182161561464157506ffffcb933bd6fad37aa2d162d1a5940015b6002821615614660576ffff97272373d413259a46990580e213a0260801c5b600482161561467f576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b600882161561469e576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156146bd576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156146dc576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156146fb576fff2ea16466c96a3843ec78b326b528610260801c5b608082161561471a576ffe5dee046a99a2a811c461f1969c30530260801c5b61010082161561473a576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b61020082161561475a576ff987a7253ac413176f2b074cf7815e540260801c5b61040082161561477a576ff3392b0822b70005940c7a398e4b70f30260801c5b61080082161561479a576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156147ba576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156147da576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156147fa576f70d869a156d2a1b890bb3df62baf32f70260801c5b61800082161561481a576f31be135f97d08fd981231505542fcfa60260801c5b6201000082161561483b576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b6202000082161561485b576e5d6af8dedb81196699c329225ee6040260801c5b6204000082106148a15762040000821615614884576d2216e584f5fa1ea926041bedfe980260801c5b620800008216156148a1576b048a170391f7dc42444e8fa20260801c5b60008560020b13156148b257600019045b63ffffffff0160201c949350505050565b600080600080615b098a6148d95761506f6148dd565b61507e5b9050600087126149b15760006149068888620f42400362ffffff16620f424062ffffff16613d09565b90506149178a8c8b8563ffffffff16565b94508481106149445789955061493d858862ffffff1689620f42400362ffffff16613eed565b925061498a565b6149508b8a838f61508d565b9550856001600160a01b03168a6001600160a01b0316036149735761497361629e565b614982868c8b8563ffffffff16565b945084880392505b6149a9868c8b8f61499d576150a66149a1565b6150b55b63ffffffff16565b935050614a83565b615b098b6149c1576150a66149c5565b6150b55b90506149d68a8c8b8463ffffffff16565b93508760000397506000881215614a00576040516334cb3a0160e11b815260040160405180910390fd5b838810614a0f57899550614a54565b614a1b8b8a8a8f6150c4565b9550856001600160a01b03168a6001600160a01b031614614a4857614a45868c8b8463ffffffff16565b93505b87841115614a54578793505b614a63868c8b8563ffffffff16565b9450614a7f858862ffffff1689620f42400362ffffff16613eed565b9250505b509650965096509692505050565b8082038281131560008312151461226257600080fd5b8181018281121560008312151461226257600080fd5b6000821580614ade57505081810281838281614adb57614adb616288565b04145b61226257600080fd5b60008082600f0b1215614b2957508082016001600160801b0380841690821610614b24576040516302603ee960e31b815260040160405180910390fd5b612262565b826001600160801b03168284019150816001600160801b0316101561226257604051634cba017960e11b815260040160405180910390fd5b600080808088881715614c0f5784546001600160681b038082169160681c16614b8a8b836161ba565b9150614b968a826161ba565b9050617080614bab8a63ffffffff42166161fc565b101580614bbe57506001600160681b0382115b80614bcf57506001600160681b0381115b15614bfe578754600080614be48585856150d4565b6000808d559a508a99509097509550614c61945050505050565b909450925060009150819050614c61565b617080614c228863ffffffff42166161fc565b10614c545784546001600160681b038082169160681c1680821715614c51578754600080614be48585856150d4565b50505b5060009250829150819050805b95509550955095915050565b806001600160801b038116811461404757600080fd5b600286900b6000908152602088905260408120805482614ca38289614ae7565b6001600160801b031690506d09745258e83de0d0f4e400fce799811115614cdd576040516312dc1b2560e11b815260040160405180910390fd5b6001830154600f0b85614d015788600f0b81600f0b614cfc91906164a4565b614d13565b88600f0b81600f0b614d13919061645a565b6001850180546001600160801b0319166001600160801b0392909216919091179055818455811594506000839003614d6557841594508960020b8b60020b13614d655760038401879055600284018890555b50505050979650505050505050565b600285810b60009081526020889052604080822087840b8084529183209293849391929088900b1215614dea578860020b8760020b12614dc557816002015486039350816003015485039250614dd4565b81600201549350816003015492505b6002810154600382015494039390920391610cc2565b81600201548160020154039350816003015481600301540392505050965096945050505050565b8354600f84900b600003614e3b57806001600160801b0316600003614e365750612381565b614e51565b614e458185614ae7565b6001600160801b031685555b600185015460028601546000858314614e885760018801869055614e858387036001600160801b038616600160801b613d09565b90505b6000858314614eb55760028901869055614eb28387036001600160801b038716600160801b613d09565b90505b6001600160801b038282171615614efb57600389018054600160801b6001600160801b03808316860181166001600160801b031990931683178290048116850116021790555b505050505050505050565b60095463010000008104600290810b919081900b90600160c81b900463ffffffff168282828915614f4757614f3f8c898386868c61514e565b919450925090505b8815614f6357614f5b8b898386868c61514e565b919450925090505b8260020b8660020b141580614f7e57508160020b8560020b14155b80614f9557508363ffffffff168163ffffffff1614155b15614ff1576009805462ffffff80861663010000000265ffffffffffff1963ffffffff8616600160c81b02167fffffff00000000ffffffffffffffffffffffffffffffffffffff00000000000090931692909217908516171790555b505050505050505050505050565b60008082600f0b12156150275761501f6117548585856000036000615243565b600003615037565b6150376117548585856001615243565b949350505050565b60008082600f0b121561505f5761501f61175485858560000360006152f0565b61503761175485858560016152f0565b600061503783858460016152f0565b60006150378484846001615243565b600061509d858585856001615357565b95945050505050565b60006150378385846000615243565b600061503784848460006152f0565b600061509d858585856000615357565b6000808080861561510e5761510a7f000000000000000000000000000000000000000000000000000000000000000086896130ec565b8691505b85156151425761513f7f000000000000000000000000000000000000000000000000000000000000000086886130ec565b50845b90969095509350505050565b600080600083156151985760008061516760038c615587565b915091508a60020b8860020b0361518057819750615191565b8a60020b8760020b03615191578096505b5050615221565b6000808a60020b8860020b1280156151b557508a60020b8760020b135b156151de57508690508560028a810b908c900b13156151d6578a9650615211565b8a9750615211565b6151ec6008600a8b8e6156f5565b600281810b600090815260036020526040902060010154600160801b9004900b925090505b61521e60038c84846157aa565b50505b60006152316008600a8a8d6158a0565b969a9599509597509395505050505050565b60006001600160a01b038585038116908516811061526057600080fd5b7bffffffffffffffffffffffffffffffff000000000000000000000000606085901b16836152b957866001600160a01b03166152a68383896001600160a01b0316613d09565b816152b3576152b3616288565b046152e5565b6152e56152d08383896001600160a01b0316613eed565b886001600160a01b0316808204910615150190565b979650505050505050565b6000846001600160a01b0316846001600160a01b0316101561531157600080fd5b6001600160a01b03858503168261533f5761533a81856001600160801b0316600160601b613d09565b613bae565b613bae81856001600160801b0316600160601b613eed565b6000856001600160a01b031660000361536f57600080fd5b846001600160801b031660000361538557600080fd5b8360000361539457508461509d565b811515831515036154a2577bffffffffffffffffffffffffffffffff000000000000000000000000606086901b168215615450576001600160a01b038716858102908682816153e5576153e5616288565b04036154155781810182811061541357615409838a6001600160a01b031683613eed565b935050505061509d565b505b6154478261543c888b6001600160a01b0316868161543557615435616288565b0490615938565b808204910615150190565b9250505061509d565b6001600160a01b0387168581029086828161546d5761546d616288565b041461547857600080fd5b80821161548457600080fd5b61544761549d838a6001600160a01b0316848603613eed565b615948565b811561550f5761550861549d6001600160a01b038611156154da576154d586600160601b896001600160801b0316613d09565b6154f8565b6001600160801b038716606087901b816154f6576154f6616288565b045b6001600160a01b03891690615938565b905061509d565b60006001600160a01b0385111561553d5761553885600160601b886001600160801b0316613eed565b61555a565b61555a606086901b6001600160801b038816808204910615150190565b905080876001600160a01b03161161557157600080fd5b6001600160a01b03871603905095945050505050565b600281810b60008181526020859052604081206001810180548383557fffffffffffffffffffff000000000000000000000000000000000000000000008116909155818501839055600390910191909155600160801b8104830b92600160981b909104900b90620d89e719148061560f5750615606620d89e7196162b4565b60020b8360020b145b1561566857600283900b6000908152602085905260409020600101805462ffffff808516600160801b0262ffffff60801b19918516600160981b029190911665ffffffffffff60801b19909216919091171790556156ee565b8060020b8260020b0361568e57604051630d6e094960e01b815260040160405180910390fd5b600282810b6000908152602086905260408082206001908101805462ffffff808816600160981b0262ffffff60981b19909216919091179091559385900b83529120018054918416600160801b0262ffffff60801b199092169190911790555b9250929050565b600190810190600090600883811d610d8a01901c90829061ffff83161b851663ffffffff161561575857615729878561595e565b9094509092509050801561573e575050615037565b61574f86610d8b840160010b61595e565b90945090925090505b8061579b576157768563ffffffff168360010193508360010b61598f565b90935090508061578e5750620d89e891506150379050565b6157988684615add565b92505b6152e587610d89198501615add565b600283900b620d89e71914806157d157506157c8620d89e7196162b4565b60020b8360020b145b612381578260020b8260020b1280156157ef57508260020b8160020b135b61580c5760405163e45ac17d60e01b815260040160405180910390fd5b600283810b600090815260209590955260408086206001908101805465ffffffffffff60801b1916600160981b62ffffff878116820262ffffff60801b1990811693909317600160801b8a831681029190911790945597860b8a52848a208401805462ffffff60981b191698909916908102979097179097559390920b865290942090930180549092169202919091179055565b816000806158dd8785600881901d600181810b60009081526020949094526040909320805460ff9093169390931b80831890935591811490151891565b91509150811561592e57610d8a01600181810b60081d80820b6000908152602089905260409020805460ff9094169290921b80841890925582159190921481811893501461592e576001811b831892505b5050949350505050565b8082018281101561226257600080fd5b806001600160a01b038116811461404757600080fd5b600881901d600181900b6000908152602084905260408120548190615983908561598f565b93969095509293505050565b60008060ff831684811c8083036159ab578460ff179350615ad4565b7f555555555555555555555555555555555555555555555555555555555555555560008290038216908116156001600160801b0382161560071b1777ffffffffffffffff0000000000000000ffffffffffffffff82161560061b177bffffffff00000000ffffffff00000000ffffffff00000000ffffffff82161560051b177dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff82161560041b177eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff82161560031b177f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f82161560021b177f33333333333333333333333333333333333333333333333333333333333333339091161560011b1760ff1685019350600192505b50509250929050565b600181900b600090815260208390526040902054600882901b90615b01908261598f565b509392505050565b610d006164cc565b8035600281900b811461404757600080fd5b6001600160801b0381168114610d7e57600080fd5b600080600080600060a08688031215615b5057600080fd5b615b5986615b11565b9450615b6760208701615b11565b93506040860135615b7781615b23565b94979396509394606081013594506080013592915050565b60008060408385031215615ba257600080fd5b50508035926020909101359150565b6001600160a01b0381168114610d7e57600080fd5b8035801515811461404757600080fd5b60008083601f840112615be857600080fd5b50813567ffffffffffffffff811115615c0057600080fd5b6020830191508360208285010111156156ee57600080fd5b60008060008060008060a08789031215615c3157600080fd5b8635615c3c81615bb1565b9550615c4a60208801615bc6565b9450604087013593506060870135615c6181615bb1565b9250608087013567ffffffffffffffff811115615c7d57600080fd5b615c8989828a01615bd6565b979a9699509497509295939492505050565b61ffff81168114610d7e57600080fd5b600060208284031215615cbd57600080fd5b8135613bdd81615c9b565b600080600080600060808688031215615ce057600080fd5b615ce986615b11565b9450615cf760208701615b11565b93506040860135615d0781615b23565b9250606086013567ffffffffffffffff811115615d2357600080fd5b615d2f88828901615bd6565b969995985093965092949392505050565b600080600080600060808688031215615d5857600080fd5b8535615d6381615bb1565b94506020860135935060408601359250606086013567ffffffffffffffff811115615d2357600080fd5b600080600080600060a08688031215615da557600080fd5b8535615db081615bb1565b9450615dbe60208701615b11565b9350615dcc60408701615b11565b92506060860135615ddc81615b23565b91506080860135615dec81615b23565b809150509295509295909350565b600060208284031215615e0c57600080fd5b5035919050565b600080600060608486031215615e2857600080fd5b8335615e3381615bb1565b95602085013595506040909401359392505050565b600080600080600080600060c0888a031215615e6357600080fd5b8735615e6e81615bb1565b96506020880135615e7e81615bb1565b9550615e8c60408901615bc6565b9450606088013593506080880135615ea381615bb1565b925060a088013567ffffffffffffffff811115615ebf57600080fd5b615ecb8a828b01615bd6565b989b979a50959850939692959293505050565b600060208284031215615ef057600080fd5b8135613bdd81615b23565b600080600080600080600060c0888a031215615f1657600080fd5b8735615f2181615bb1565b96506020880135615f3181615bb1565b9550615f3f60408901615b11565b9450615f4d60608901615b11565b93506080880135615ea381615b23565b60008060008060808587031215615f7357600080fd5b615f7c85615b11565b93506020850135615f8c81615b23565b93969395505050506040820135916060013590565b600060208284031215615fb357600080fd5b813560ff81168114613bdd57600080fd5b600080600080600060a08688031215615fdc57600080fd5b615fe586615bc6565b9450602086013593506040860135615b7781615bb1565b60006020828403121561600e57600080fd5b81358060010b8114613bdd57600080fd5b60006020828403121561603157600080fd5b8135613bdd81615bb1565b6000806040838503121561604f57600080fd5b82359150602083013561606181615bb1565b809150509250929050565b60006020828403121561607e57600080fd5b613bdd82615b11565b6000806040838503121561609a57600080fd5b82356160a581615b23565b9150602083013561606181615b23565b815181526020808301519082015260408101612262565b6000815180845260005b818110156160f2576020818501810151868301820152016160d6565b506000602082860101526020601f19601f83011685010191505092915050565b60006001600160a01b0380891683528088166020840152508560020b60408301528460020b60608301526001600160801b038416608083015260c060a083015261615f60c08301846160cc565b98975050505050505050565b60008060006060848603121561618057600080fd5b8351925060208401519150604084015161619981615b23565b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b80820180821115612262576122626161a4565b600081600f0b6f7fffffffffffffffffffffffffffffff1981036161f3576161f36161a4565b60000392915050565b81810381811115612262576122626161a4565b6001600160801b0381811683821601908082111561622f5761622f6161a4565b5092915050565b6001600160a01b0385168152836020820152826040820152608060608201526000613bae60808301846160cc565b6000806040838503121561627757600080fd5b505080516020909101519092909150565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052600160045260246000fd5b60008160020b627fffff1981036161f3576161f36161a4565b60008260020b8260020b028060020b915080821461622f5761622f6161a4565b600282810b9082900b03627fffff198112627fffff82131715612262576122626161a4565b600281810b9083900b01627fffff8113627fffff1982121715612262576122626161a4565b60006001600160a01b0380891683528088166020840152861515604084015285606084015280851660808401525060c060a083015261615f60c08301846160cc565b60006020828403121561638b57600080fd5b8151613bdd81615c9b565b600080604083850312156163a957600080fd5b82516163b481615b23565b602084015190925061606181615b23565b62ffffff81811683821601908082111561622f5761622f6161a4565b6000604082840312156163f357600080fd5b6040516040810181811067ffffffffffffffff8211171561642457634e487b7160e01b600052604160045260246000fd5b604052823581526020928301359281019290925250919050565b60006040828403121561645057600080fd5b613bdd83836163e1565b818103600083128015838313168383128216171561622f5761622f6161a4565b60006020828403121561648c57600080fd5b81516001600160e01b031981168114613bdd57600080fd5b80820182811260008312801582168215821617156164c4576164c46161a4565b505092915050565b634e487b7160e01b600052605160045260246000fdfea164736f6c6343000814000a",
  "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061032b5760003560e01c80639e922180116101b2578063d5c35a7e116100f9578063ecdecf42116100a2578063f30dba931161007c578063f30dba93146108e8578063f3a016ab14610971578063f637731d14610984578063fff6cae91461099757600080fd5b8063ecdecf42146108b9578063ef01df4f146108c2578063f085a610146108d557600080fd5b8063ddca3f43116100d3578063ddca3f43146107f8578063e76c01e414610813578063e8ae2b69146108a657600080fd5b8063d5c35a7e146107b8578063d8544cf3146107c5578063d8619037146107d857600080fd5b8063c5390e2d1161015b578063d0c93a7c11610135578063d0c93a7c14610775578063d21220a714610789578063d21c2577146107b057600080fd5b8063c5390e2d1461072f578063c677e3e014610742578063cc1f97cf1461076257600080fd5b8063b563f7421161018c578063b563f742146106e2578063bca57f81146106f5578063c45a01551461070857600080fd5b80639e9221801461067c578063a1eded871461068f578063aafe29c0146106ab57600080fd5b8063514ea4bf116102765780637bd780251161021f5780639734b577116101f95780639734b577146105f857806397ce1c511461060b5780639e4e02271461066957600080fd5b80637bd78025146105ab5780638380edb7146105c75780638e005553146105e557600080fd5b80636378ae44116102505780636378ae441461056857806370cf754a1461057f57806377f8c3a91461059457600080fd5b8063514ea4bf146104ac57806353e9786814610529578063578b9a361461053c57600080fd5b80631a686502116102d85780633b3bc70e116102b25780633b3bc70e14610473578063490e6cbc146104865780634f1eb3d81461049957600080fd5b80631a686502146104235780631dd19cb414610458578063240a875a1461046057600080fd5b80630cdd53f6116103095780630cdd53f6146103a95780630dfe1681146103bc578063128acb08146103fb57600080fd5b8063050a4d21146103305780630606e8551461035c5780630902f1ac14610371575b600080fd5b600954610344906301000000900460020b81565b60405160029190910b81526020015b60405180910390f35b61036f61036a366004615b38565b61099f565b005b600c546001600160801b0380821691600160801b9004165b604080516001600160801b03938416815292909116602083015201610353565b61036f6103b7366004615b8f565b610a94565b6103e37f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610353565b61040e610409366004615c18565b610ac8565b60408051928352602083019190915201610353565b60095461044090660100000000000090046001600160801b031681565b6040516001600160801b039091168152602001610353565b61036f610ccf565b61036f61046e366004615cab565b610d02565b61040e610481366004615cc8565b610d81565b61036f610494366004615d40565b610fce565b6103896104a7366004615d8d565b611386565b6104f56104ba366004615dfa565b600b602052600090815260409020805460018201546002830154600390930154919290916001600160801b0380821691600160801b90041685565b604080519586526020860194909452928401919091526001600160801b03908116606084015216608082015260a001610353565b6007546103e3906001600160a01b031681565b60095461055390600160c81b900463ffffffff1681565b60405163ffffffff9091168152602001610353565b61057160005481565b604051908152602001610353565b6104406d09745258e83de0d0f4e400fce79981565b60045461055390600160d01b900463ffffffff1681565b6004546001600160681b0380821691600160681b900416610389565b600254600160e01b900460ff165b6040519015158152602001610353565b61036f6105f3366004615cab565b611552565b61036f610606366004615e13565b6115bd565b610613611655565b604080516001600160a01b039098168852600296870b602089015261ffff9095169487019490945260ff90921660608601526001600160801b03166080850152820b60a0840152900b60c082015260e001610353565b61040e610677366004615e48565b6116eb565b61036f61068a366004615ede565b611a13565b6005546001600160681b0380821691600160681b900416610389565b6106be6106b9366004615efb565b611ac8565b6040805193845260208401929092526001600160801b031690820152606001610353565b61036f6106f0366004615f5d565b611e7a565b61036f610703366004615fa1565b611fee565b6103e37f000000000000000000000000000000000000000000000000000000000000000081565b61036f61073d366004615fc4565b612041565b610571610750366004615ffc565b60086020526000908152604090205481565b61036f61077036600461601f565b6120e7565b60095461034490600160b01b900460020b81565b6103e37f000000000000000000000000000000000000000000000000000000000000000081565b6105d561210a565b6009546103449060020b81565b61036f6107d336600461601f565b612140565b6105716107e6366004615ffc565b600a6020526000908152604090205481565b6108006121bb565b60405161ffff9091168152602001610353565b6002805461085e916001600160a01b03821691600160a01b810490910b9061ffff600160b81b820481169160ff600160c81b8204811692600160d01b83041691600160e01b90041686565b604080516001600160a01b03909716875260029590950b602087015261ffff9384169486019490945260ff9091166060850152166080830152151560a082015260c001610353565b6105d56108b436600461603c565b61225f565b61057160015481565b6006546103e3906001600160a01b031681565b61036f6108e336600461606c565b612268565b61093a6108f636600461606c565b60036020819052600091825260409091208054600182015460028084015493909401549193600f82900b93600160801b8304820b93600160981b90930490910b9186565b60408051968752600f9590950b6020870152600293840b94860194909452910b6060840152608083015260a082015260c001610353565b61036f61097f366004616087565b6122d1565b61036f61099236600461601f565b612387565b61036f612586565b60006040518060400160405280848152602001838152506040516020016109c691906160b5565b60408051601f19818403018152908290526302abf8a760e61b82529150309063aafe29c090610a0390339084908b908b908b908990600401616112565b6060604051808303816000875af1158015610a22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a46919061616b565b505060408051808201909152600288810b825287900b6020909101525050600f805462ffffff95861663010000000265ffffffffffff19909116959096169490941794909417909255505050565b81600d6000828254610aa691906161ba565b9250508190555080600e6000828254610abf91906161ba565b90915550505050565b600080600080610ade8a8a8a8a60008b8b6125b8565b91509150610aea612771565b6040805160608101825260008082526020808301829052828401829052835180850190945281845283015290610b2384848d8d8d6127aa565b6001600160801b03909116604088015260029190910b60208701526001600160a01b03909116855291975095509050600080610b5d612ed2565b915091508c15610bf3576000871215610b9e57610b9e7f00000000000000000000000000000000000000000000000000000000000000008f896000036130ec565b610baa88888c8c61315e565b600d54610bb789846161ba565b1115610bd657604051633ed6d50560e21b815260040160405180910390fd5b610bee888885600001516000876020015160006131fe565b610c7a565b6000881215610c2a57610c2a7f00000000000000000000000000000000000000000000000000000000000000008f8a6000036130ec565b610c3688888c8c61315e565b600e54610c4388836161ba565b1115610c6257604051633ed6d50560e21b815260040160405180910390fd5b610c7a888860008660000151600088602001516131fe565b610c968e89898760000151886040015189602001518c8c613541565b50505050610cb26002805460ff60e01b1916600160e01b179055565b610cc28a8a8a8a88888c8c6135f4565b5050965096945050505050565b610cd7613703565b610cdf612771565b610ce83361372e565b610d006002805460ff60e01b1916600160e01b179055565b565b610d0a61387b565b610d126138a5565b6103e861ffff82161180610d35575060025461ffff828116600160d01b90920416145b80610d57575061ffff811615801590610d5757506007546001600160a01b0316155b15610d755760405163a709b9af60e01b815260040160405180910390fd5b610d7e8161396b565b50565b6000808686610d9082826139dc565b6f7fffffffffffffffffffffffffffffff6001600160801b0388161115610dca57604051638995290f60e01b815260040160405180910390fd5b6000610dd5886161cd565b90506000610de7338c8c858c8c613a5e565b9050610df1612771565b610df9612ed2565b50506000610e08338d8d613bb8565b9050610e16818d8d86613be4565b909750955062ffffff821615610e8c576000808815610e5157610e428962ffffff8616620f4240613d09565b9150610e4e828a6161fc565b98505b8715610e7957610e6a8862ffffff8616620f4240613d09565b9050610e7681896161fc565b97505b610e8960008060008086866131fe565b50505b86861715610ef1576003810154610ead9088906001600160801b031661620f565b6003820154610ecd908890600160801b90046001600160801b031661620f565b6001600160801b039182169116600160801b026001600160801b0319161760038201555b506001600160801b0389168617851715610f98576040805162ffffff83168152905133917f1a25098b7a731ae33ed362388b593b876963dfde0efb4db9c0befeed637ff26b919081900360200190a2604080516001600160801b038b16815260208101889052808201879052905160028c810b92908e900b9133917f0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c919081900360600190a45b610fb06002805460ff60e01b1916600160e01b179055565b610fc0338c8c858a8a8e8e613da2565b505050509550959350505050565b600254600160c81b9004601016156110b4576006546040516346f0547760e11b80825233600483018181526001600160a01b038a81166024860152604485018a90526064850189905260a06084860190815260a486018890526110b49694959190941693638de0a8ee93928c928c928c928c928c929060c401848480828437600081840152601f19601f8201169050808301925050509750505050505050506020604051808303816000875af115801561108c573d6000803e3d6000fd5b505050506040513d60208110156110a257600080fd5b50516001600160e01b03191690613eb0565b6110bc612771565b6000806000806110ca612ed2565b909250905060008815611113576110e6896064620f4240613eed565b90506111137f00000000000000000000000000000000000000000000000000000000000000008b8b6130ec565b600088156111575761112a896064620f4240613eed565b90506111577f00000000000000000000000000000000000000000000000000000000000000008c8b6130ec565b61116382828a8a613f6d565b600d5495508561117383866161ba565b1115611192576040516336de50ff60e11b815260040160405180910390fd5b600e549450846111a282856161ba565b11156111c15760405163c998149f60e01b815260040160405180910390fd5b60025495849003959483900394600160d01b900461ffff16801561122157600087156111f7576111f488836103e8613d09565b90505b6000871561120f5761120c88846103e8613d09565b90505b61121e828284846000806131fe565b50505b604080518c8152602081018c90528082018990526060810188905290516001600160a01b038e169133917fbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca6339181900360800190a350505050506112926002805460ff60e01b1916600160e01b179055565b600254600160c81b90046020161561137d5761137d63343d37ff60e01b600660009054906101000a90046001600160a01b03166001600160a01b031663343d37ff338b8b8b89898d8d6040518963ffffffff1660e01b815260040180896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505099505050505050505050506020604051808303816000875af115801561108c573d6000803e3d6000fd5b50505050505050565b600080611391612771565b600061139e338888613bb8565b60038101549091506001600160801b0380821691600160801b900481169087168210156113c9578196505b806001600160801b0316866001600160801b031611156113e7578095505b6001600160801b03878717161561152d576001600160801b0387830381168783038216600160801b026001600160801b031916176003850155879550869450851615611461576114617f00000000000000000000000000000000000000000000000000000000000000008b876001600160801b03166130ec565b6001600160801b038416156114a4576114a47f00000000000000000000000000000000000000000000000000000000000000008b866001600160801b03166130ec565b6114cc856001600160801b0316600003856001600160801b03166000036000806000806131fe565b604080516001600160a01b038c1681526001600160801b038088166020830152861681830152905160028a810b92908c900b9133917f70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0919081900360600190a45b6115456002805460ff60e01b1916600160e01b179055565b5050509550959350505050565b61155a6138a5565b600254600160c81b8104608016151590600160e01b900460ff1661159157604051636798480960e11b815260040160405180910390fd5b80156115b0576040516369cdc70760e11b815260040160405180910390fd5b6115b982613fce565b5050565b60006040518060400160405280848152602001838152506040516020016115e491906160b5565b60408051601f19818403018152908290526312439b2f60e21b82529150309063490e6cbc9061161d908790879087908790600401616236565b600060405180830381600087803b15801561163757600080fd5b505af115801561164b573d6000803e3d6000fd5b5050505050505050565b600280546001600160a01b03811691600160a01b8204900b9061ffff600160b81b8204169060ff600160c81b820481169160009182918291600160e01b90910416806116b457604051636798480960e11b815260040160405180910390fd5b505060095495969495939492936001600160801b03660100000000000082041693600282810b9450630100000090920490910b9150565b6000806000861215611710576040516334cb3a0160e11b815260040160405180910390fd5b611718612771565b6000871561177357600061172b600d5490565b905061173a886000888861315e565b6000611745600d5490565b905061175961175483836161fc565b614038565b925061176c8360008060008060006131fe565b50506117bd565b600061177e600e5490565b905061178d600089888861315e565b6000611798600e5490565b90506117a761175483836161fc565b92506117ba6000846000806000806131fe565b50505b8681146117c8578096505b50856000036117ea57604051633ed6d50560e21b815260040160405180910390fd5b6118026002805460ff60e01b1916600160e01b179055565b6000806118158a8a8a8a60018b8b6125b8565b91509150611821612771565b611829612ed2565b5050604080516060810182526000808252602080830182905282840182905283518085019094528184528301529061186484848d8d8d6127aa565b6001600160801b03909116604088015260029190910b60208701526001600160a01b039091168552919750955090508a1561192e5760008512156118d0576118d07f00000000000000000000000000000000000000000000000000000000000000008d876000036130ec565b858a038a8714611905576119057f00000000000000000000000000000000000000000000000000000000000000008f836130ec565b61192861191182614038565b6000038784600001516000866020015160006131fe565b506119bf565b6000861215611965576119657f00000000000000000000000000000000000000000000000000000000000000008d886000036130ec565b848a038a861461199a5761199a7f00000000000000000000000000000000000000000000000000000000000000008f836130ec565b6119bd876119a783614038565b60000360008560000151600087602001516131fe565b505b6119db8c87878560000151866040015187602001518a8a613541565b6119f36002805460ff60e01b1916600160e01b179055565b611a038c8c8c8c8a8a8e8e6135f4565b5050505097509795505050505050565b600f5463010000008104600290810b91900b03611a2f57600080fd5b600f54604051631d9de38760e11b8152600282810b6004830152630100000090920490910b60248201526001600160801b038216604482015260806064820152600060848201523090633b3bc70e9060a40160408051808303816000875af1158015611a9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac39190616264565b505050565b60008060008787611ad982826139dc565b876001600160801b0316600003611b035760405163e6ace6df60e01b815260040160405180910390fd5b611b228b8b8b611b1b8c6001600160801b031661404c565b8b8b613a5e565b50611b2b612771565b60028054600160a01b810490910b906001600160a01b03166000819003611b655760405163812eb65560e01b815260040160405180910390fd5b600954600160b01b9004600290810b9081908d900b81611b8757611b87616288565b078160020b8e60020b81611b9d57611b9d616288565b071760020b15611bc057604051635f6e14f360e01b815260040160405180910390fd5b50611bdf8c8c611bd88d6001600160801b031661404c565b858561405f565b50909750955060009150819050611bf4612ed2565b91509150611c0487878b8b61410e565b8615611c235781611c14600d5490565b611c1e91906161fc565b611c26565b60005b91508515611c475780611c38600e5490565b611c4291906161fc565b611c4a565b60005b905086821015611c6f57611c688a6001600160801b03168389613d09565b9450611c73565b8994505b85811015611cb3576000611c918b6001600160801b03168389613d09565b9050856001600160801b0316816001600160801b03161015611cb1578095505b505b846001600160801b0316600003611cdd57604051632fae8a9b60e21b815260040160405180910390fd5b6000611cea8e8e8e613bb8565b9050611d09818e8e611d048a6001600160801b031661404c565b613be4565b9098509650508615611d5e5786821115611d4f57611d4a7f00000000000000000000000000000000000000000000000000000000000000008f8985036130ec565b611d5e565b868214611d5e57611d5e61629e565b8515611dad5785811115611d9e57611d997f00000000000000000000000000000000000000000000000000000000000000008f8884036130ec565b611dad565b858114611dad57611dad61629e565b611dbd87876000806000806131fe565b8a60020b8c60020b8e6001600160a01b03167f7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde33898c8c60405180856001600160a01b03168152602001846001600160801b0316815260200183815260200182815260200194505050505060405180910390a4611e486002805460ff60e01b1916600160e01b179055565b611e698d8d8d611e60896001600160801b031661404c565b8b8b8f8f613da2565b505050509750975097945050505050565b60008460020b1215611e9257611e8f846162b4565b93505b611e9f620d89e7196162b4565b611eaa9060026162cd565b60020b8460020b1315611ed257611ec4620d89e7196162b4565b611ecf9060026162cd565b93505b60028054600160a01b9004900b6000611eeb86836162ed565b90506000611ef98784616312565b90506000604051806040016040528087815260200186815250604051602001611f2291906160b5565b60408051601f19818403018152908290526302abf8a760e61b82529150309063aafe29c090611f5f9033908490889088908e908990600401616112565b6060604051808303816000875af1158015611f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa2919061616b565b505060408051808201909152600285810b825284900b6020909101525050600f805462ffffff93841665ffffffffffff1990911617630100000093909216929092021790555050505050565b611ff661387b565b6006546001600160a01b03168061202057604051639e727ce360e01b815260040160405180910390fd5b336001600160a01b03821614612038576120386138a5565b6115b98261414d565b600060405180604001604052808481526020018381525060405160200161206891906160b5565b60408051601f1981840301815290829052639e4e022760e01b825291503090639e4e0227906120a590839081908b908b908b908990600401616337565b60408051808303816000875af11580156120c3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164b9190616264565b6120ef61387b565b6120f76138a5565b612101600061414d565b610d7e816141b6565b600954600090600160c81b900463ffffffff161561213a576000600d54118061213557506000600e54115b905090565b50600190565b61214861387b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612180576121806138a5565b6001600160a01b0381161580156121a35750600254600160d01b900461ffff1615155b156121b2576121b2600061396b565b610d7e81614211565b600254600160b81b810461ffff1690600160c81b900460ff8116906080161561225b57600660009054906101000a90046001600160a01b03166001600160a01b031663f70d93626040518163ffffffff1660e01b8152600401602060405180830381865afa158015612231573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122559190616379565b91505090565b5090565b60015b92915050565b61227061387b565b6122786138a5565b60008160020b13158061229057506101f4600282900b135b806122aa5750600954600282810b600160b01b909204900b145b156122c857604051632bf827d160e21b815260040160405180910390fd5b610d7e8161426c565b600f5463010000008104600290810b91900b036122ed57600080fd5b600f546040516309e3d67b60e31b81523060048201819052600283810b6024840152630100000090930490920b60448201526001600160801b03808516606483015283166084820152634f1eb3d89060a40160408051808303816000875af115801561235d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123819190616396565b50505050565b6000612392826142d5565b6002549091506001600160a01b0316156123bf57604051631499a6b760e21b815260040160405180910390fd5b600280546001600160a01b03841676ffffffffffffffffffffffffffffffffffffffffffffff199091168117600160a01b62ffffff851602178255604080519182529183900b602082015281517f98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c95929181900390910190a16006546001600160a01b0316156124a857600654604080516318dbf60160e21b8082523360048301526001600160a01b03868116602484015292516124a89491939091169163636fd80491604480830192602092919082900301816000875af115801561108c573d6000803e3d6000fd5b6000600160646124b781613fce565b6124c08261426c565b61ffff8316158015906124dc57506007546001600160a01b0316155b156124fa5760405163a709b9af60e01b815260040160405180910390fd5b6125038361396b565b600254600160c81b90046040161561257f576006546040805163416eb29160e11b8082523360048301526001600160a01b038981166024840152600289900b6044840152925161257f949193909116916382dd652291606480830192602092919082900301816000875af115801561108c573d6000803e3d6000fd5b5050505050565b61258e613703565b612596612771565b61259e612ed2565b5050610d006002805460ff60e01b1916600160e01b179055565b6002546000908190600160c81b900460ff166125d681600116151590565b15612763576006546001600160a01b031633036125fa576000809250925050612765565b6000600660009054906101000a90046001600160a01b03166001600160a01b031663029c1cb7338d8d8d8d8d8d8d6040518963ffffffff1660e01b815260040180896001600160a01b03168152602001886001600160a01b031681526020018715158152602001868152602001856001600160a01b031681526020018415158152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505099505050505050505050506060604051808303816000875af11580156126d7573d6000803e3d6000fd5b505050506040513d60608110156126ed57600080fd5b5080516020820151604090920151919550909350905060808216158015612728575060008462ffffff161180612728575060008362ffffff16115b1561274657604051633a4528ef60e01b815260040160405180910390fd5b6127616001600160e01b0319821663029c1cb760e01b613eb0565b505b505b97509795505050505050565b600254600160e01b900460ff1661279b57604051636798480960e11b815260040160405180910390fd5b6002805460ff60e01b19169055565b60008060008060006127cf604051806040016040528060008152602001600081525090565b876000036127f0576040516301e76e6160e61b815260040160405180910390fd5b600160ff1b8803612814576040516334cb3a0160e11b815260040160405180910390fd5b6040805161016081018252600060208201819052606082018190526080820181905260a0820181905262ffffff8d16610140830152808b1360c08301529181018a9052600954600281810b61012084015263010000008204810b610100840152805461ffff600160d01b820481168552600160b81b82041660e08501526001600160a01b0381169850600160a01b9004900b9550660100000000000090046001600160801b03169350908590036128de5760405163812eb65560e01b815260040160405180910390fd5b62ffffff8c1615612926576128f38b8d6163c5565b62ffffff1660e08201819052620f424011612921576040516315b2afa960e01b815260040160405180910390fd5b612978565b62ffffff8b1615612978578a8160e00181815161294391906163c5565b62ffffff90811690915260e0830151620f42409116109050612978576040516315b2afa960e01b815260040160405180910390fd5b89156129d857846001600160a01b0316886001600160a01b03161015806129ad57506401000276a36001600160a01b03891611155b156129cb57604051631662672360e01b815260040160405180910390fd5b6000546080820152612a3d565b846001600160a01b0316886001600160a01b0316111580612a16575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b03891610155b15612a3457604051631662672360e01b815260040160405180910390fd5b60015460808201525b612a6f6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60008b612a8157826101200151612a88565b8261010001515b6001600160a01b03881683529050612a9f816145e8565b6001600160a01b0390811660208401819052612adc918e918a918e161182151514612ace578460200151612ad0565b8c5b888f8860e001516148c3565b60808601526060850152604084015260c084015190975015612b3457612b0b8260800151836040015101614038565b8b039a50612b2a612b1f8360600151614038565b606085015190614a91565b6060840152612b6c565b612b418260600151614038565b8b019a50612b66612b5b8360800151846040015101614038565b606085015190614aa7565b60608401525b825115612bae57825160808301516000916103e891612b8a91614abd565b81612b9757612b97616288565b608085018051929091049182900390528551018552505b600083610140015162ffffff16118015612bd1575060008360e0015162ffffff16115b15612c12576000612bfa836080015185610140015162ffffff168660e0015162ffffff16613d09565b60808401805182900390526020860180519091019052505b6001600160801b03851615612c4957612c3d8260800151600160801b876001600160801b0316613d09565b60808401805190910190525b8160200151876001600160a01b031603612d65578260200151612c8457600160208401528b612c7a57600054612c7e565b6001545b60a08401525b60008c15612cf35750608083015160a0840151600283810b600081815260036020819052604082209081018054828601805490980390975595909403909455600190920154600160801b810490910b61010087015261012086019190915260001983019750600f0b9003612d53565b5060a08301516080840151600283810b60008181526003602081905260409091209081018054828501805490970390965594909303909355600190910154600160981b810490910b6101208601526101008501919091529095508590600f0b5b612d5d8682614ae7565b955050612d87565b81516001600160a01b03881614612d8757612d7f876142d5565b955050612dae565b508915801590612da95750886001600160a01b0316866001600160a01b031614155b612a6f575b60008a83604001510390508260c0015115158c151514612dd357826060015181612dda565b8083606001515b6002805476ffffffffffffffffffffffffffffffffffffffffffffff1916600160a01b62ffffff8b160273ffffffffffffffffffffffffffffffffffffffff1916176001600160a01b038b161790556020850151919a509850159050612ea7576101008201516101208301516009805462ffffff92831665ffffffffffff199091161763010000009290931691909102919091177fffffffffffffffffffff00000000000000000000000000000000ffffffffffff1666010000000000006001600160801b038716021790555b8a15612eba576080820151600055612ec3565b60808201516001555b50509550955095509550955095565b600080612ede600d5490565b600e5490925090506001600160801b03821180612f0157506001600160801b0381115b15612fc4576007546001600160a01b03166001600160801b03831115612f6a57612f5f7f0000000000000000000000000000000000000000000000000000000000000000826ffffffffffffffffffffffffffffffffe1986016130ec565b6001600160801b0392505b6001600160801b03821115612fc257612fb77f0000000000000000000000000000000000000000000000000000000000000000826ffffffffffffffffffffffffffffffffe1985016130ec565b6001600160801b0391505b505b600954660100000000000090046001600160801b03166000819003612fe857509091565b600c546001600160801b0380821691600160801b900416818511818511818061300e5750805b156130e35781156130465761303c846001600160801b03168803600160801b876001600160801b0316613d09565b6000805490910190555b80156130795761306f836001600160801b03168703600160801b876001600160801b0316613d09565b6001805490910190555b604080516001600160801b038087168a0382528516880360208201527fef10ebb00f0dbc72ad4602e94abbbda6f3d40632714f70e9c8fa30d5d44289c9910160405180910390a16001600160801b03808816908716600160801b026001600160801b03191617600c555b50505050509091565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036131425780600d600082825461313791906161fc565b90915550611ac39050565b80600e600082825461315491906161fc565b9091555050505050565b80156131b25760006131728284018461643e565b90508060000151600d600082825461318a91906161ba565b90915550506020810151600e80546000906131a69084906161ba565b90915550612381915050565b60008413156131d85783600d60008282546131cd91906161ba565b909155506123819050565b60008313156123815782600e60008282546131f391906161ba565b909155505050505050565b600084118061320d5750600083115b806132185750600082115b806132235750600081115b156134b55760048054600790600160d01b900463ffffffff1660008080808061324f8c8c888a8c614b61565b93509350935093508082176000146132955761326a82614038565b613274908f61645a565b61327d82614038565b613287908f61645a565b909e509c50600194506132fb565b6001600160681b0384841716156132fb57600480547fffffffffffff000000000000000000000000000000000000000000000000000016600160681b6001600160681b03868116919091026cffffffffffffffffffffffffff1916919091179086161790555b60059750600696506133168a8a8863ffffffff168a8c614b61565b92965090945092509050818117156134095761333182614038565b61333b908f61645a565b61334482614038565b61334e908f61645a565b809e50819f5050506001945061340463aa6b14bb60e01b600660009054906101000a90046001600160a01b03166001600160a01b031663aa6b14bb85856040518363ffffffff1660e01b81526004016133b1929190918252602082015260400190565b6020604051808303816000875af11580156133d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f4919061647a565b6001600160e01b03191690613eb0565b61346f565b6001600160681b03848417161561346f57600580547fffffffffffff000000000000000000000000000000000000000000000000000016600160681b6001600160681b03868116919091026cffffffffffffffffffffffffff1916919091179086161790555b84156134ac57600480547fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff16600160d01b4263ffffffff16021790555b50505050505050505b8585171561353957600c546001600160801b0380821691600160801b90041687156134f8576134ec6134e789846164a4565b614c6d565b6001600160801b031691505b86156135175761350b6134e788836164a4565b6001600160801b031690505b6001600160801b039182169116600160801b026001600160801b03191617600c555b505050505050565b6040805162ffffff808516825283166020820152815133927f9443903d84c9719611bd4bba871daaf18a3950d00d5d78b1a2fa701f76df54ff928290030190a260408051888152602081018890526001600160a01b03878116828401526001600160801b0387166060830152600286900b60808301529151918a169133917fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67919081900360a00190a35050505050505050565b60028054600160c81b9004161561164b576006546001600160a01b0316331461164b5761164b639cb5a96360e01b600660009054906101000a90046001600160a01b03166001600160a01b0316639cb5a963338c8c8c8c8c8c8c8c6040518a63ffffffff1660e01b8152600401808a6001600160a01b03168152602001896001600160a01b031681526020018815158152602001878152602001866001600160a01b03168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509a50505050505050505050506020604051808303816000875af115801561108c573d6000803e3d6000fd5b6006546001600160a01b03163314610d0057604051634994c26960e11b815260040160405180910390fd5b60008061373a600d5490565b600e54600c5491935091506001600160801b0380821691600160801b9004168184118061376f5750806001600160801b031683115b1561257f57816001600160801b03168411156137c2576137c27f0000000000000000000000000000000000000000000000000000000000000000866137bd6001600160801b038616886161fc565b6130ec565b806001600160801b031683111561380b5761380b7f0000000000000000000000000000000000000000000000000000000000000000866137bd6001600160801b038516876161fc565b6001600160a01b0385167fb94331e4420f16b156f53c397a8adcd09481283ee7830f7b688b22858e9db80b6138496001600160801b038516876161fc565b61385c6001600160801b038516876161fc565b6040805192835260208301919091520160405180910390a25050505050565b600254600160e01b900460ff16610d0057604051636798480960e11b815260040160405180910390fd5b6040805163e8ae2b6960e01b81527fb73ce166ead2f8e9add217713a7989e4edfba9625f71dfd2516204bb67ad3442600482015233602482015290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163e8ae2b699160448083019260209291908290030181865afa158015613936573d6000803e3d6000fd5b505050506040513d602081101561394c57600080fd5b5051610d0057604051634994c26960e11b815260040160405180910390fd5b600280547fffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff16600160d01b61ffff8416908102919091179091556040519081527f3647dccc990d4941b0b05b32527ef493a98d6187b20639ca2f9743f3b55ca5e1906020015b60405180910390a150565b6139e9620d89e7196162b4565b60020b8160020b1315613a0f57604051631445443d60e01b815260040160405180910390fd5b8160020b8160020b13613a355760405163d9a841a760e01b815260040160405180910390fd5b620d89e719600283900b12156115b957604051631d1ac7f160e21b815260040160405180910390fd5b600254600090600160c81b900460041615613bae576006546001600160a01b03163303613a8d57506000613bae565b600654604051632f1208d960e11b815233600482018181526001600160a01b038b8116602485015260028b810b60448601528a900b6064850152600f89900b608485015260c060a4850190815260c485018890526000959190911693635e2411b293928d928d928d928d928d928d92919060e401848480828437600081840152601f19601f8201169050808301925050509850505050505050505060408051808303816000875af1158015613b46573d6000803e3d6000fd5b505050506040513d6040811015613b5c57600080fd5b50805160209091015192509050620f424062ffffff831610613b91576040516315b2afa960e01b815260040160405180910390fd5b613bac6001600160e01b03198216632f1208d960e11b613eb0565b505b9695505050505050565b62ffffff818116908316601885811b91909117901b176000908152600b602052604090205b9392505050565b6002805460008054600154919384936001600160a01b03811693600160a01b90910490910b918491829190600f89900b15613c4057613c2a60038c878c86866000614c83565b9350613c3d60038b878c86866001614c83565b92505b600080613c5260038e8e8a8888614d74565b91509150613c628e8c8484614e11565b5050505086600f0b600014613cfc578180613c7a5750805b15613c9357613c93898984848760008d600f0b12614f06565b6000613ca28a8a8a878961405f565b91985096509050600f81900b15613cfa57600954613cd390660100000000000090046001600160801b031689614ae7565b600960066101000a8154816001600160801b0302191690836001600160801b031602179055505b505b5050505094509492505050565b60008383028160001985870982811083820303915050808411613d2b57600080fd5b80600003613d3e57508290049050613bdd565b8385870960008581038616958690049560026003880281188089028203028089028203028089028203028089028203028089028203028089029091030291819003819004600101858411909403939093029190930391909104170290509392505050565b6006546001600160a01b0316331461164b57600254600160c81b90046008161561164b5761164b63d685201060e01b600660009054906101000a90046001600160a01b03166001600160a01b031663d6852010338c8c8c8c8c8c8c8c6040518a63ffffffff1660e01b8152600401808a6001600160a01b03168152602001896001600160a01b031681526020018860020b81526020018760020b815260200186600f0b8152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509a50505050505050505050506020604051808303816000875af115801561108c573d6000803e3d6000fd5b6001600160e01b0319828116908216146115b95760405163d3f5153b60e01b81526001600160e01b03198216600482015260240160405180910390fd5b6000831580613f0e57505082820282848281613f0b57613f0b616288565b04145b15613f2f5760008211613f2057600080fd5b81810490829006151501613bdd565b613f3a848484613d09565b905060008280613f4c57613f4c616288565b8486091115613bdd576000198110613f6357600080fd5b6001019392505050565b6000613f7b8284018461643e565b8051909150613f8b9086906161ba565b600d6000828254613f9c91906161ba565b90915550506020810151613fb19085906161ba565b600e6000828254613fc291906161ba565b90915550505050505050565b600280547fffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff16600160b81b61ffff8416908102919091179091556040519081527f598b9f043c813aa6be3426ca60d1c65d17256312890be5118dab55b0775ebe2a906020016139d1565b80600081121561404757600080fd5b919050565b806000600f82900b121561404757600080fd5b60008060008061406e896145e8565b9050600061407b896145e8565b90506000808b60020b8960020b12156140a05761409984848c614fff565b91506140de565b8a60020b8960020b12156140d0576140b988848c614fff565b91506140c684898c61503f565b90508994506140de565b6140db84848c61503f565b90505b60008a600f0b126140f05781816140f9565b81600003816000035b909d909c50949a509398505050505050505050565b80156141225760006131728284018461643e565b83600d600082825461413491906161ba565b9250508190555082600e60008282546131f391906161ba565b600280547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff16600160c81b60ff8416908102919091179091556040519081527f3a6271b36c1b44bd6a0a0d56230602dc6919b7c17af57254306fadf5fee69dc3906020016139d1565b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f27a3944eff2135a57675f17e72501038982b73620d01f794c72e93d61a3932a2906020016139d1565b6007805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fb0b573c1f636e1f8bd9b415ba6c04d6dd49100bc25493fc6305b65ec0e581df3906020016139d1565b600980547fffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff16600160b01b62ffffff841602179055604051600282900b81527f01413b1d5d4c359e9a0daa7909ecda165f6e8c51fe2ff529d74b22a5a7c02645906020016139d1565b60006401000276a36001600160a01b0383161080614310575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b03831610155b1561432e576040516355cf1e2360e01b815260040160405180910390fd5b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c979088119617909417909217179091171717608081106143cf57607f810383901c91506143d9565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b146145d957886001600160a01b03166145be826145e8565b6001600160a01b031611156145d357816145db565b806145db565b815b9998505050505050505050565b6000600282900b60171d62ffffff818401821816620d89e881111561462057604051633c10250f60e01b815260040160405180910390fd5b600160801b600182161561464157506ffffcb933bd6fad37aa2d162d1a5940015b6002821615614660576ffff97272373d413259a46990580e213a0260801c5b600482161561467f576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b600882161561469e576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156146bd576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156146dc576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156146fb576fff2ea16466c96a3843ec78b326b528610260801c5b608082161561471a576ffe5dee046a99a2a811c461f1969c30530260801c5b61010082161561473a576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b61020082161561475a576ff987a7253ac413176f2b074cf7815e540260801c5b61040082161561477a576ff3392b0822b70005940c7a398e4b70f30260801c5b61080082161561479a576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156147ba576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156147da576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156147fa576f70d869a156d2a1b890bb3df62baf32f70260801c5b61800082161561481a576f31be135f97d08fd981231505542fcfa60260801c5b6201000082161561483b576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b6202000082161561485b576e5d6af8dedb81196699c329225ee6040260801c5b6204000082106148a15762040000821615614884576d2216e584f5fa1ea926041bedfe980260801c5b620800008216156148a1576b048a170391f7dc42444e8fa20260801c5b60008560020b13156148b257600019045b63ffffffff0160201c949350505050565b600080600080615b098a6148d95761506f6148dd565b61507e5b9050600087126149b15760006149068888620f42400362ffffff16620f424062ffffff16613d09565b90506149178a8c8b8563ffffffff16565b94508481106149445789955061493d858862ffffff1689620f42400362ffffff16613eed565b925061498a565b6149508b8a838f61508d565b9550856001600160a01b03168a6001600160a01b0316036149735761497361629e565b614982868c8b8563ffffffff16565b945084880392505b6149a9868c8b8f61499d576150a66149a1565b6150b55b63ffffffff16565b935050614a83565b615b098b6149c1576150a66149c5565b6150b55b90506149d68a8c8b8463ffffffff16565b93508760000397506000881215614a00576040516334cb3a0160e11b815260040160405180910390fd5b838810614a0f57899550614a54565b614a1b8b8a8a8f6150c4565b9550856001600160a01b03168a6001600160a01b031614614a4857614a45868c8b8463ffffffff16565b93505b87841115614a54578793505b614a63868c8b8563ffffffff16565b9450614a7f858862ffffff1689620f42400362ffffff16613eed565b9250505b509650965096509692505050565b8082038281131560008312151461226257600080fd5b8181018281121560008312151461226257600080fd5b6000821580614ade57505081810281838281614adb57614adb616288565b04145b61226257600080fd5b60008082600f0b1215614b2957508082016001600160801b0380841690821610614b24576040516302603ee960e31b815260040160405180910390fd5b612262565b826001600160801b03168284019150816001600160801b0316101561226257604051634cba017960e11b815260040160405180910390fd5b600080808088881715614c0f5784546001600160681b038082169160681c16614b8a8b836161ba565b9150614b968a826161ba565b9050617080614bab8a63ffffffff42166161fc565b101580614bbe57506001600160681b0382115b80614bcf57506001600160681b0381115b15614bfe578754600080614be48585856150d4565b6000808d559a508a99509097509550614c61945050505050565b909450925060009150819050614c61565b617080614c228863ffffffff42166161fc565b10614c545784546001600160681b038082169160681c1680821715614c51578754600080614be48585856150d4565b50505b5060009250829150819050805b95509550955095915050565b806001600160801b038116811461404757600080fd5b600286900b6000908152602088905260408120805482614ca38289614ae7565b6001600160801b031690506d09745258e83de0d0f4e400fce799811115614cdd576040516312dc1b2560e11b815260040160405180910390fd5b6001830154600f0b85614d015788600f0b81600f0b614cfc91906164a4565b614d13565b88600f0b81600f0b614d13919061645a565b6001850180546001600160801b0319166001600160801b0392909216919091179055818455811594506000839003614d6557841594508960020b8b60020b13614d655760038401879055600284018890555b50505050979650505050505050565b600285810b60009081526020889052604080822087840b8084529183209293849391929088900b1215614dea578860020b8760020b12614dc557816002015486039350816003015485039250614dd4565b81600201549350816003015492505b6002810154600382015494039390920391610cc2565b81600201548160020154039350816003015481600301540392505050965096945050505050565b8354600f84900b600003614e3b57806001600160801b0316600003614e365750612381565b614e51565b614e458185614ae7565b6001600160801b031685555b600185015460028601546000858314614e885760018801869055614e858387036001600160801b038616600160801b613d09565b90505b6000858314614eb55760028901869055614eb28387036001600160801b038716600160801b613d09565b90505b6001600160801b038282171615614efb57600389018054600160801b6001600160801b03808316860181166001600160801b031990931683178290048116850116021790555b505050505050505050565b60095463010000008104600290810b919081900b90600160c81b900463ffffffff168282828915614f4757614f3f8c898386868c61514e565b919450925090505b8815614f6357614f5b8b898386868c61514e565b919450925090505b8260020b8660020b141580614f7e57508160020b8560020b14155b80614f9557508363ffffffff168163ffffffff1614155b15614ff1576009805462ffffff80861663010000000265ffffffffffff1963ffffffff8616600160c81b02167fffffff00000000ffffffffffffffffffffffffffffffffffffff00000000000090931692909217908516171790555b505050505050505050505050565b60008082600f0b12156150275761501f6117548585856000036000615243565b600003615037565b6150376117548585856001615243565b949350505050565b60008082600f0b121561505f5761501f61175485858560000360006152f0565b61503761175485858560016152f0565b600061503783858460016152f0565b60006150378484846001615243565b600061509d858585856001615357565b95945050505050565b60006150378385846000615243565b600061503784848460006152f0565b600061509d858585856000615357565b6000808080861561510e5761510a7f000000000000000000000000000000000000000000000000000000000000000086896130ec565b8691505b85156151425761513f7f000000000000000000000000000000000000000000000000000000000000000086886130ec565b50845b90969095509350505050565b600080600083156151985760008061516760038c615587565b915091508a60020b8860020b0361518057819750615191565b8a60020b8760020b03615191578096505b5050615221565b6000808a60020b8860020b1280156151b557508a60020b8760020b135b156151de57508690508560028a810b908c900b13156151d6578a9650615211565b8a9750615211565b6151ec6008600a8b8e6156f5565b600281810b600090815260036020526040902060010154600160801b9004900b925090505b61521e60038c84846157aa565b50505b60006152316008600a8a8d6158a0565b969a9599509597509395505050505050565b60006001600160a01b038585038116908516811061526057600080fd5b7bffffffffffffffffffffffffffffffff000000000000000000000000606085901b16836152b957866001600160a01b03166152a68383896001600160a01b0316613d09565b816152b3576152b3616288565b046152e5565b6152e56152d08383896001600160a01b0316613eed565b886001600160a01b0316808204910615150190565b979650505050505050565b6000846001600160a01b0316846001600160a01b0316101561531157600080fd5b6001600160a01b03858503168261533f5761533a81856001600160801b0316600160601b613d09565b613bae565b613bae81856001600160801b0316600160601b613eed565b6000856001600160a01b031660000361536f57600080fd5b846001600160801b031660000361538557600080fd5b8360000361539457508461509d565b811515831515036154a2577bffffffffffffffffffffffffffffffff000000000000000000000000606086901b168215615450576001600160a01b038716858102908682816153e5576153e5616288565b04036154155781810182811061541357615409838a6001600160a01b031683613eed565b935050505061509d565b505b6154478261543c888b6001600160a01b0316868161543557615435616288565b0490615938565b808204910615150190565b9250505061509d565b6001600160a01b0387168581029086828161546d5761546d616288565b041461547857600080fd5b80821161548457600080fd5b61544761549d838a6001600160a01b0316848603613eed565b615948565b811561550f5761550861549d6001600160a01b038611156154da576154d586600160601b896001600160801b0316613d09565b6154f8565b6001600160801b038716606087901b816154f6576154f6616288565b045b6001600160a01b03891690615938565b905061509d565b60006001600160a01b0385111561553d5761553885600160601b886001600160801b0316613eed565b61555a565b61555a606086901b6001600160801b038816808204910615150190565b905080876001600160a01b03161161557157600080fd5b6001600160a01b03871603905095945050505050565b600281810b60008181526020859052604081206001810180548383557fffffffffffffffffffff000000000000000000000000000000000000000000008116909155818501839055600390910191909155600160801b8104830b92600160981b909104900b90620d89e719148061560f5750615606620d89e7196162b4565b60020b8360020b145b1561566857600283900b6000908152602085905260409020600101805462ffffff808516600160801b0262ffffff60801b19918516600160981b029190911665ffffffffffff60801b19909216919091171790556156ee565b8060020b8260020b0361568e57604051630d6e094960e01b815260040160405180910390fd5b600282810b6000908152602086905260408082206001908101805462ffffff808816600160981b0262ffffff60981b19909216919091179091559385900b83529120018054918416600160801b0262ffffff60801b199092169190911790555b9250929050565b600190810190600090600883811d610d8a01901c90829061ffff83161b851663ffffffff161561575857615729878561595e565b9094509092509050801561573e575050615037565b61574f86610d8b840160010b61595e565b90945090925090505b8061579b576157768563ffffffff168360010193508360010b61598f565b90935090508061578e5750620d89e891506150379050565b6157988684615add565b92505b6152e587610d89198501615add565b600283900b620d89e71914806157d157506157c8620d89e7196162b4565b60020b8360020b145b612381578260020b8260020b1280156157ef57508260020b8160020b135b61580c5760405163e45ac17d60e01b815260040160405180910390fd5b600283810b600090815260209590955260408086206001908101805465ffffffffffff60801b1916600160981b62ffffff878116820262ffffff60801b1990811693909317600160801b8a831681029190911790945597860b8a52848a208401805462ffffff60981b191698909916908102979097179097559390920b865290942090930180549092169202919091179055565b816000806158dd8785600881901d600181810b60009081526020949094526040909320805460ff9093169390931b80831890935591811490151891565b91509150811561592e57610d8a01600181810b60081d80820b6000908152602089905260409020805460ff9094169290921b80841890925582159190921481811893501461592e576001811b831892505b5050949350505050565b8082018281101561226257600080fd5b806001600160a01b038116811461404757600080fd5b600881901d600181900b6000908152602084905260408120548190615983908561598f565b93969095509293505050565b60008060ff831684811c8083036159ab578460ff179350615ad4565b7f555555555555555555555555555555555555555555555555555555555555555560008290038216908116156001600160801b0382161560071b1777ffffffffffffffff0000000000000000ffffffffffffffff82161560061b177bffffffff00000000ffffffff00000000ffffffff00000000ffffffff82161560051b177dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff82161560041b177eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff82161560031b177f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f82161560021b177f33333333333333333333333333333333333333333333333333333333333333339091161560011b1760ff1685019350600192505b50509250929050565b600181900b600090815260208390526040902054600882901b90615b01908261598f565b509392505050565b610d006164cc565b8035600281900b811461404757600080fd5b6001600160801b0381168114610d7e57600080fd5b600080600080600060a08688031215615b5057600080fd5b615b5986615b11565b9450615b6760208701615b11565b93506040860135615b7781615b23565b94979396509394606081013594506080013592915050565b60008060408385031215615ba257600080fd5b50508035926020909101359150565b6001600160a01b0381168114610d7e57600080fd5b8035801515811461404757600080fd5b60008083601f840112615be857600080fd5b50813567ffffffffffffffff811115615c0057600080fd5b6020830191508360208285010111156156ee57600080fd5b60008060008060008060a08789031215615c3157600080fd5b8635615c3c81615bb1565b9550615c4a60208801615bc6565b9450604087013593506060870135615c6181615bb1565b9250608087013567ffffffffffffffff811115615c7d57600080fd5b615c8989828a01615bd6565b979a9699509497509295939492505050565b61ffff81168114610d7e57600080fd5b600060208284031215615cbd57600080fd5b8135613bdd81615c9b565b600080600080600060808688031215615ce057600080fd5b615ce986615b11565b9450615cf760208701615b11565b93506040860135615d0781615b23565b9250606086013567ffffffffffffffff811115615d2357600080fd5b615d2f88828901615bd6565b969995985093965092949392505050565b600080600080600060808688031215615d5857600080fd5b8535615d6381615bb1565b94506020860135935060408601359250606086013567ffffffffffffffff811115615d2357600080fd5b600080600080600060a08688031215615da557600080fd5b8535615db081615bb1565b9450615dbe60208701615b11565b9350615dcc60408701615b11565b92506060860135615ddc81615b23565b91506080860135615dec81615b23565b809150509295509295909350565b600060208284031215615e0c57600080fd5b5035919050565b600080600060608486031215615e2857600080fd5b8335615e3381615bb1565b95602085013595506040909401359392505050565b600080600080600080600060c0888a031215615e6357600080fd5b8735615e6e81615bb1565b96506020880135615e7e81615bb1565b9550615e8c60408901615bc6565b9450606088013593506080880135615ea381615bb1565b925060a088013567ffffffffffffffff811115615ebf57600080fd5b615ecb8a828b01615bd6565b989b979a50959850939692959293505050565b600060208284031215615ef057600080fd5b8135613bdd81615b23565b600080600080600080600060c0888a031215615f1657600080fd5b8735615f2181615bb1565b96506020880135615f3181615bb1565b9550615f3f60408901615b11565b9450615f4d60608901615b11565b93506080880135615ea381615b23565b60008060008060808587031215615f7357600080fd5b615f7c85615b11565b93506020850135615f8c81615b23565b93969395505050506040820135916060013590565b600060208284031215615fb357600080fd5b813560ff81168114613bdd57600080fd5b600080600080600060a08688031215615fdc57600080fd5b615fe586615bc6565b9450602086013593506040860135615b7781615bb1565b60006020828403121561600e57600080fd5b81358060010b8114613bdd57600080fd5b60006020828403121561603157600080fd5b8135613bdd81615bb1565b6000806040838503121561604f57600080fd5b82359150602083013561606181615bb1565b809150509250929050565b60006020828403121561607e57600080fd5b613bdd82615b11565b6000806040838503121561609a57600080fd5b82356160a581615b23565b9150602083013561606181615b23565b815181526020808301519082015260408101612262565b6000815180845260005b818110156160f2576020818501810151868301820152016160d6565b506000602082860101526020601f19601f83011685010191505092915050565b60006001600160a01b0380891683528088166020840152508560020b60408301528460020b60608301526001600160801b038416608083015260c060a083015261615f60c08301846160cc565b98975050505050505050565b60008060006060848603121561618057600080fd5b8351925060208401519150604084015161619981615b23565b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b80820180821115612262576122626161a4565b600081600f0b6f7fffffffffffffffffffffffffffffff1981036161f3576161f36161a4565b60000392915050565b81810381811115612262576122626161a4565b6001600160801b0381811683821601908082111561622f5761622f6161a4565b5092915050565b6001600160a01b0385168152836020820152826040820152608060608201526000613bae60808301846160cc565b6000806040838503121561627757600080fd5b505080516020909101519092909150565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052600160045260246000fd5b60008160020b627fffff1981036161f3576161f36161a4565b60008260020b8260020b028060020b915080821461622f5761622f6161a4565b600282810b9082900b03627fffff198112627fffff82131715612262576122626161a4565b600281810b9083900b01627fffff8113627fffff1982121715612262576122626161a4565b60006001600160a01b0380891683528088166020840152861515604084015285606084015280851660808401525060c060a083015261615f60c08301846160cc565b60006020828403121561638b57600080fd5b8151613bdd81615c9b565b600080604083850312156163a957600080fd5b82516163b481615b23565b602084015190925061606181615b23565b62ffffff81811683821601908082111561622f5761622f6161a4565b6000604082840312156163f357600080fd5b6040516040810181811067ffffffffffffffff8211171561642457634e487b7160e01b600052604160045260246000fd5b604052823581526020928301359281019290925250919050565b60006040828403121561645057600080fd5b613bdd83836163e1565b818103600083128015838313168383128216171561622f5761622f6161a4565b60006020828403121561648c57600080fd5b81516001600160e01b031981168114613bdd57600080fd5b80820182811260008312801582168215821617156164c4576164c46161a4565b505092915050565b634e487b7160e01b600052605160045260246000fdfea164736f6c6343000814000a",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
