{
  "_format": "hh-sol-artifact-1",
  "contractName": "AssertSwapEchidnaTest",
  "sourceName": "contracts/test/echidna/PoolMockEchidna/AssertSwapEchidnaTest.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": "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": "0x60e06040523480156200001157600080fd5b50600260c052600160a052306080526000620d89e7196200003281620001e4565b6009805462ffffff93841663010000000265ffffffffffff1990911693909216929092171790556002805460ff60e01b1916600160e01b1790556001600160a01b03811615620000875762000087816200009a565b50620000946003620000ee565b62000215565b600680546001600160a01b0319166001600160a01b0383169081179091556040519081527f27a3944eff2135a57675f17e72501038982b73620d01f794c72e93d61a3932a29060200160405180910390a150565b620d89e719620000fe81620001e4565b620d89e7196000818152602085905260409020600101805465ffffffffffff60801b1916600160981b62ffffff9485160262ffffff60801b191617600160801b9490931693909302919091179091556200015881620001e4565b8260006200016a620d89e719620001e4565b60020b60020b81526020019081526020016000206001016010846000620d89e7196200019690620001e4565b60020b81526020810191909152604001600020600101805462ffffff948516600160981b0262ffffff60981b1990911617905581549383166101009190910a90810292021990921617905550565b60008160020b627fffff1981036200020c57634e487b7160e01b600052601160045260246000fd5b60000392915050565b60805160a05160c0516164d5620002d86000396000818161078301528181610b620152818161111e01528181611462015281816118940152818161196101528181611d5e01528181612f35015281816137be01526150ff0152600081816103b601528181610bee015281816110da0152818161141f015281816118cc0152818161192901528181611d0f01528181612edd015281816130a50152818161377001526150ca0152600081816107020152818161210a01526138d101526164d56000f3fe608060405234801561001057600080fd5b50600436106103205760003560e01c80639e922180116101a7578063d8544cf3116100ee578063ef01df4f11610097578063f3a016ab11610071578063f3a016ab1461095e578063f637731d14610971578063fff6cae91461098457600080fd5b8063ef01df4f146108af578063f085a610146108c2578063f30dba93146108d557600080fd5b8063e76c01e4116100c8578063e76c01e414610800578063e8ae2b6914610893578063ecdecf42146108a657600080fd5b8063d8544cf3146107b2578063d8619037146107c5578063ddca3f43146107e557600080fd5b8063c5390e2d11610150578063d0c93a7c1161012a578063d0c93a7c1461076a578063d21220a71461077e578063d5c35a7e146107a557600080fd5b8063c5390e2d14610724578063c677e3e014610737578063cc1f97cf1461075757600080fd5b8063b563f74211610181578063b563f742146106d7578063bca57f81146106ea578063c45a0155146106fd57600080fd5b80639e92218014610671578063a1eded8714610684578063aafe29c0146106a057600080fd5b8063514ea4bf1161026b5780637bd78025116102145780639734b577116101ee5780639734b577146105ed57806397ce1c51146106005780639e4e02271461065e57600080fd5b80637bd78025146105a05780638380edb7146105bc5780638e005553146105da57600080fd5b80636378ae44116102455780636378ae441461055d57806370cf754a1461057457806377f8c3a91461058957600080fd5b8063514ea4bf146104a157806353e978681461051e578063578b9a361461053157600080fd5b80631a686502116102cd5780633b3bc70e116102a75780633b3bc70e14610468578063490e6cbc1461047b5780634f1eb3d81461048e57600080fd5b80631a686502146104185780631dd19cb41461044d578063240a875a1461045557600080fd5b80630cdd53f6116102fe5780630cdd53f61461039e5780630dfe1681146103b1578063128acb08146103f057600080fd5b8063050a4d21146103255780630606e855146103515780630902f1ac14610366575b600080fd5b600954610339906301000000900460020b81565b60405160029190910b81526020015b60405180910390f35b61036461035f366004615b1e565b61098c565b005b600c546001600160801b0380821691600160801b9004165b604080516001600160801b03938416815292909116602083015201610348565b6103646103ac366004615b75565b610a81565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610348565b6104036103fe366004615bfe565b610ab5565b60408051928352602083019190915201610348565b60095461043590660100000000000090046001600160801b031681565b6040516001600160801b039091168152602001610348565b610364610cbc565b610364610463366004615c91565b610cef565b610403610476366004615cae565b610d6e565b610364610489366004615d26565b610fbb565b61037e61049c366004615d73565b611373565b6104ea6104af366004615de0565b600b602052600090815260409020805460018201546002830154600390930154919290916001600160801b0380821691600160801b90041685565b604080519586526020860194909452928401919091526001600160801b03908116606084015216608082015260a001610348565b6007546103d8906001600160a01b031681565b60095461054890600160c81b900463ffffffff1681565b60405163ffffffff9091168152602001610348565b61056660005481565b604051908152602001610348565b6104356d09745258e83de0d0f4e400fce79981565b60045461054890600160d01b900463ffffffff1681565b6004546001600160681b0380821691600160681b90041661037e565b600254600160e01b900460ff165b6040519015158152602001610348565b6103646105e8366004615c91565b61153f565b6103646105fb366004615df9565b6115aa565b610608611642565b604080516001600160a01b039098168852600296870b602089015261ffff9095169487019490945260ff90921660608601526001600160801b03166080850152820b60a0840152900b60c082015260e001610348565b61040361066c366004615e2e565b6116d8565b61036461067f366004615ec4565b611a00565b6005546001600160681b0380821691600160681b90041661037e565b6106b36106ae366004615ee1565b611ab5565b6040805193845260208401929092526001600160801b031690820152606001610348565b6103646106e5366004615f43565b611e67565b6103646106f8366004615f87565b611fdb565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b610364610732366004615faa565b61202e565b610566610745366004615fe2565b60086020526000908152604090205481565b610364610765366004616005565b6120d4565b60095461033990600160b01b900460020b81565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b6009546103399060020b81565b6103646107c0366004616005565b6120f7565b6105666107d3366004615fe2565b600a6020526000908152604090205481565b6107ed612172565b60405161ffff9091168152602001610348565b6002805461084b916001600160a01b03821691600160a01b810490910b9061ffff600160b81b820481169160ff600160c81b8204811692600160d01b83041691600160e01b90041686565b604080516001600160a01b03909716875260029590950b602087015261ffff9384169486019490945260ff9091166060850152166080830152151560a082015260c001610348565b6105ca6108a1366004616022565b612216565b61056660015481565b6006546103d8906001600160a01b031681565b6103646108d0366004616052565b61221f565b6109276108e3366004616052565b60036020819052600091825260409091208054600182015460028084015493909401549193600f82900b93600160801b8304820b93600160981b90930490910b9186565b60408051968752600f9590950b6020870152600293840b94860194909452910b6060840152608083015260a082015260c001610348565b61036461096c36600461606d565b612288565b61036461097f366004616005565b61233e565b61036461253d565b60006040518060400160405280848152602001838152506040516020016109b3919061609b565b60408051601f19818403018152908290526302abf8a760e61b82529150309063aafe29c0906109f090339084908b908b908b9089906004016160f8565b6060604051808303816000875af1158015610a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a339190616151565b505060408051808201909152600288810b825287900b6020909101525050600f805462ffffff95861663010000000265ffffffffffff19909116959096169490941794909417909255505050565b81600d6000828254610a9391906161a0565b9250508190555080600e6000828254610aac91906161a0565b90915550505050565b600080600080610acb8a8a8a8a60008b8b61256f565b91509150610ad7612728565b6040805160608101825260008082526020808301829052828401829052835180850190945281845283015290610b1084848d8d8d612761565b6001600160801b03909116604088015260029190910b60208701526001600160a01b03909116855291975095509050600080610b4a612e89565b915091508c15610be0576000871215610b8b57610b8b7f00000000000000000000000000000000000000000000000000000000000000008f896000036130a3565b610b9788888c8c613115565b600d54610ba489846161a0565b1115610bc357604051633ed6d50560e21b815260040160405180910390fd5b610bdb888885600001516000876020015160006131e4565b610c67565b6000881215610c1757610c177f00000000000000000000000000000000000000000000000000000000000000008f8a6000036130a3565b610c2388888c8c613115565b600e54610c3088836161a0565b1115610c4f57604051633ed6d50560e21b815260040160405180910390fd5b610c67888860008660000151600088602001516131e4565b610c838e89898760000151886040015189602001518c8c613527565b50505050610c9f6002805460ff60e01b1916600160e01b179055565b610caf8a8a8a8a88888c8c6135da565b5050965096945050505050565b610cc46136e9565b610ccc612728565b610cd533613714565b610ced6002805460ff60e01b1916600160e01b179055565b565b610cf7613861565b610cff61388b565b6103e861ffff82161180610d22575060025461ffff828116600160d01b90920416145b80610d44575061ffff811615801590610d4457506007546001600160a01b0316155b15610d625760405163a709b9af60e01b815260040160405180910390fd5b610d6b81613951565b50565b6000808686610d7d82826139c2565b6f7fffffffffffffffffffffffffffffff6001600160801b0388161115610db757604051638995290f60e01b815260040160405180910390fd5b6000610dc2886161b3565b90506000610dd4338c8c858c8c613a44565b9050610dde612728565b610de6612e89565b50506000610df5338d8d613b9e565b9050610e03818d8d86613bca565b909750955062ffffff821615610e79576000808815610e3e57610e2f8962ffffff8616620f4240613cef565b9150610e3b828a6161e2565b98505b8715610e6657610e578862ffffff8616620f4240613cef565b9050610e6381896161e2565b97505b610e7660008060008086866131e4565b50505b86861715610ede576003810154610e9a9088906001600160801b03166161f5565b6003820154610eba908890600160801b90046001600160801b03166161f5565b6001600160801b039182169116600160801b026001600160801b0319161760038201555b506001600160801b0389168617851715610f85576040805162ffffff83168152905133917f1a25098b7a731ae33ed362388b593b876963dfde0efb4db9c0befeed637ff26b919081900360200190a2604080516001600160801b038b16815260208101889052808201879052905160028c810b92908e900b9133917f0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c919081900360600190a45b610f9d6002805460ff60e01b1916600160e01b179055565b610fad338c8c858a8a8e8e613d88565b505050509550959350505050565b600254600160c81b9004601016156110a1576006546040516346f0547760e11b80825233600483018181526001600160a01b038a81166024860152604485018a90526064850189905260a06084860190815260a486018890526110a19694959190941693638de0a8ee93928c928c928c928c928c929060c401848480828437600081840152601f19601f8201169050808301925050509750505050505050506020604051808303816000875af1158015611079573d6000803e3d6000fd5b505050506040513d602081101561108f57600080fd5b50516001600160e01b03191690613e96565b6110a9612728565b6000806000806110b7612e89565b909250905060008815611100576110d3896064620f4240613ed3565b90506111007f00000000000000000000000000000000000000000000000000000000000000008b8b6130a3565b6000881561114457611117896064620f4240613ed3565b90506111447f00000000000000000000000000000000000000000000000000000000000000008c8b6130a3565b61115082828a8a613f53565b600d5495508561116083866161a0565b111561117f576040516336de50ff60e11b815260040160405180910390fd5b600e5494508461118f82856161a0565b11156111ae5760405163c998149f60e01b815260040160405180910390fd5b60025495849003959483900394600160d01b900461ffff16801561120e57600087156111e4576111e188836103e8613cef565b90505b600087156111fc576111f988846103e8613cef565b90505b61120b828284846000806131e4565b50505b604080518c8152602081018c90528082018990526060810188905290516001600160a01b038e169133917fbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca6339181900360800190a3505050505061127f6002805460ff60e01b1916600160e01b179055565b600254600160c81b90046020161561136a5761136a63343d37ff60e01b600660009054906101000a90046001600160a01b03166001600160a01b031663343d37ff338b8b8b89898d8d6040518963ffffffff1660e01b815260040180896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505099505050505050505050506020604051808303816000875af1158015611079573d6000803e3d6000fd5b50505050505050565b60008061137e612728565b600061138b338888613b9e565b60038101549091506001600160801b0380821691600160801b900481169087168210156113b6578196505b806001600160801b0316866001600160801b031611156113d4578095505b6001600160801b03878717161561151a576001600160801b0387830381168783038216600160801b026001600160801b03191617600385015587955086945085161561144e5761144e7f00000000000000000000000000000000000000000000000000000000000000008b876001600160801b03166130a3565b6001600160801b03841615611491576114917f00000000000000000000000000000000000000000000000000000000000000008b866001600160801b03166130a3565b6114b9856001600160801b0316600003856001600160801b03166000036000806000806131e4565b604080516001600160a01b038c1681526001600160801b038088166020830152861681830152905160028a810b92908c900b9133917f70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0919081900360600190a45b6115326002805460ff60e01b1916600160e01b179055565b5050509550959350505050565b61154761388b565b600254600160c81b8104608016151590600160e01b900460ff1661157e57604051636798480960e11b815260040160405180910390fd5b801561159d576040516369cdc70760e11b815260040160405180910390fd5b6115a682613fb4565b5050565b60006040518060400160405280848152602001838152506040516020016115d1919061609b565b60408051601f19818403018152908290526312439b2f60e21b82529150309063490e6cbc9061160a90879087908790879060040161621c565b600060405180830381600087803b15801561162457600080fd5b505af1158015611638573d6000803e3d6000fd5b5050505050505050565b600280546001600160a01b03811691600160a01b8204900b9061ffff600160b81b8204169060ff600160c81b820481169160009182918291600160e01b90910416806116a157604051636798480960e11b815260040160405180910390fd5b505060095495969495939492936001600160801b03660100000000000082041693600282810b9450630100000090920490910b9150565b60008060008612156116fd576040516334cb3a0160e11b815260040160405180910390fd5b611705612728565b60008715611760576000611718600d5490565b90506117278860008888613115565b6000611732600d5490565b905061174661174183836161e2565b61401e565b92506117598360008060008060006131e4565b50506117aa565b600061176b600e5490565b905061177a6000898888613115565b6000611785600e5490565b905061179461174183836161e2565b92506117a76000846000806000806131e4565b50505b8681146117b5578096505b50856000036117d757604051633ed6d50560e21b815260040160405180910390fd5b6117ef6002805460ff60e01b1916600160e01b179055565b6000806118028a8a8a8a60018b8b61256f565b9150915061180e612728565b611816612e89565b5050604080516060810182526000808252602080830182905282840182905283518085019094528184528301529061185184848d8d8d612761565b6001600160801b03909116604088015260029190910b60208701526001600160a01b039091168552919750955090508a1561191b5760008512156118bd576118bd7f00000000000000000000000000000000000000000000000000000000000000008d876000036130a3565b858a038a87146118f2576118f27f00000000000000000000000000000000000000000000000000000000000000008f836130a3565b6119156118fe8261401e565b6000038784600001516000866020015160006131e4565b506119ac565b6000861215611952576119527f00000000000000000000000000000000000000000000000000000000000000008d886000036130a3565b848a038a8614611987576119877f00000000000000000000000000000000000000000000000000000000000000008f836130a3565b6119aa876119948361401e565b60000360008560000151600087602001516131e4565b505b6119c88c87878560000151866040015187602001518a8a613527565b6119e06002805460ff60e01b1916600160e01b179055565b6119f08c8c8c8c8a8a8e8e6135da565b5050505097509795505050505050565b600f5463010000008104600290810b91900b03611a1c57600080fd5b600f54604051631d9de38760e11b8152600282810b6004830152630100000090920490910b60248201526001600160801b038216604482015260806064820152600060848201523090633b3bc70e9060a40160408051808303816000875af1158015611a8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab0919061624a565b505050565b60008060008787611ac682826139c2565b876001600160801b0316600003611af05760405163e6ace6df60e01b815260040160405180910390fd5b611b0f8b8b8b611b088c6001600160801b0316614032565b8b8b613a44565b50611b18612728565b60028054600160a01b810490910b906001600160a01b03166000819003611b525760405163812eb65560e01b815260040160405180910390fd5b600954600160b01b9004600290810b9081908d900b81611b7457611b7461626e565b078160020b8e60020b81611b8a57611b8a61626e565b071760020b15611bad57604051635f6e14f360e01b815260040160405180910390fd5b50611bcc8c8c611bc58d6001600160801b0316614032565b8585614045565b50909750955060009150819050611be1612e89565b91509150611bf187878b8b6140f4565b8615611c105781611c01600d5490565b611c0b91906161e2565b611c13565b60005b91508515611c345780611c25600e5490565b611c2f91906161e2565b611c37565b60005b905086821015611c5c57611c558a6001600160801b03168389613cef565b9450611c60565b8994505b85811015611ca0576000611c7e8b6001600160801b03168389613cef565b9050856001600160801b0316816001600160801b03161015611c9e578095505b505b846001600160801b0316600003611cca57604051632fae8a9b60e21b815260040160405180910390fd5b6000611cd78e8e8e613b9e565b9050611cf6818e8e611cf18a6001600160801b0316614032565b613bca565b9098509650508615611d4b5786821115611d3c57611d377f00000000000000000000000000000000000000000000000000000000000000008f8985036130a3565b611d4b565b868214611d4b57611d4b616284565b8515611d9a5785811115611d8b57611d867f00000000000000000000000000000000000000000000000000000000000000008f8884036130a3565b611d9a565b858114611d9a57611d9a616284565b611daa87876000806000806131e4565b8a60020b8c60020b8e6001600160a01b03167f7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde33898c8c60405180856001600160a01b03168152602001846001600160801b0316815260200183815260200182815260200194505050505060405180910390a4611e356002805460ff60e01b1916600160e01b179055565b611e568d8d8d611e4d896001600160801b0316614032565b8b8b8f8f613d88565b505050509750975097945050505050565b60008460020b1215611e7f57611e7c8461629a565b93505b611e8c620d89e71961629a565b611e979060026162b3565b60020b8460020b1315611ebf57611eb1620d89e71961629a565b611ebc9060026162b3565b93505b60028054600160a01b9004900b6000611ed886836162d3565b90506000611ee687846162f8565b90506000604051806040016040528087815260200186815250604051602001611f0f919061609b565b60408051601f19818403018152908290526302abf8a760e61b82529150309063aafe29c090611f4c9033908490889088908e9089906004016160f8565b6060604051808303816000875af1158015611f6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8f9190616151565b505060408051808201909152600285810b825284900b6020909101525050600f805462ffffff93841665ffffffffffff1990911617630100000093909216929092021790555050505050565b611fe3613861565b6006546001600160a01b03168061200d57604051639e727ce360e01b815260040160405180910390fd5b336001600160a01b038216146120255761202561388b565b6115a682614133565b6000604051806040016040528084815260200183815250604051602001612055919061609b565b60408051601f1981840301815290829052639e4e022760e01b825291503090639e4e02279061209290839081908b908b908b90899060040161631d565b60408051808303816000875af11580156120b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611638919061624a565b6120dc613861565b6120e461388b565b6120ee6000614133565b610d6b8161419c565b6120ff613861565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146121375761213761388b565b6001600160a01b03811615801561215a5750600254600160d01b900461ffff1615155b15612169576121696000613951565b610d6b816141f7565b600254600160b81b810461ffff1690600160c81b900460ff8116906080161561221257600660009054906101000a90046001600160a01b03166001600160a01b031663f70d93626040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220c919061635f565b91505090565b5090565b60015b92915050565b612227613861565b61222f61388b565b60008160020b13158061224757506101f4600282900b135b806122615750600954600282810b600160b01b909204900b145b1561227f57604051632bf827d160e21b815260040160405180910390fd5b610d6b81614252565b600f5463010000008104600290810b91900b036122a457600080fd5b600f546040516309e3d67b60e31b81523060048201819052600283810b6024840152630100000090930490920b60448201526001600160801b03808516606483015283166084820152634f1eb3d89060a40160408051808303816000875af1158015612314573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612338919061637c565b50505050565b6000612349826142bb565b6002549091506001600160a01b03161561237657604051631499a6b760e21b815260040160405180910390fd5b600280546001600160a01b03841676ffffffffffffffffffffffffffffffffffffffffffffff199091168117600160a01b62ffffff851602178255604080519182529183900b602082015281517f98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c95929181900390910190a16006546001600160a01b03161561245f57600654604080516318dbf60160e21b8082523360048301526001600160a01b038681166024840152925161245f9491939091169163636fd80491604480830192602092919082900301816000875af1158015611079573d6000803e3d6000fd5b60006001606461246e81613fb4565b61247782614252565b61ffff83161580159061249357506007546001600160a01b0316155b156124b15760405163a709b9af60e01b815260040160405180910390fd5b6124ba83613951565b600254600160c81b900460401615612536576006546040805163416eb29160e11b8082523360048301526001600160a01b038981166024840152600289900b60448401529251612536949193909116916382dd652291606480830192602092919082900301816000875af1158015611079573d6000803e3d6000fd5b5050505050565b6125456136e9565b61254d612728565b612555612e89565b5050610ced6002805460ff60e01b1916600160e01b179055565b6002546000908190600160c81b900460ff1661258d81600116151590565b1561271a576006546001600160a01b031633036125b157600080925092505061271c565b6000600660009054906101000a90046001600160a01b03166001600160a01b031663029c1cb7338d8d8d8d8d8d8d6040518963ffffffff1660e01b815260040180896001600160a01b03168152602001886001600160a01b031681526020018715158152602001868152602001856001600160a01b031681526020018415158152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505099505050505050505050506060604051808303816000875af115801561268e573d6000803e3d6000fd5b505050506040513d60608110156126a457600080fd5b50805160208201516040909201519195509093509050608082161580156126df575060008462ffffff1611806126df575060008362ffffff16115b156126fd57604051633a4528ef60e01b815260040160405180910390fd5b6127186001600160e01b0319821663029c1cb760e01b613e96565b505b505b97509795505050505050565b600254600160e01b900460ff1661275257604051636798480960e11b815260040160405180910390fd5b6002805460ff60e01b19169055565b6000806000806000612786604051806040016040528060008152602001600081525090565b876000036127a7576040516301e76e6160e61b815260040160405180910390fd5b600160ff1b88036127cb576040516334cb3a0160e11b815260040160405180910390fd5b6040805161016081018252600060208201819052606082018190526080820181905260a0820181905262ffffff8d16610140830152808b1360c08301529181018a9052600954600281810b61012084015263010000008204810b610100840152805461ffff600160d01b820481168552600160b81b82041660e08501526001600160a01b0381169850600160a01b9004900b9550660100000000000090046001600160801b03169350908590036128955760405163812eb65560e01b815260040160405180910390fd5b62ffffff8c16156128dd576128aa8b8d6163ab565b62ffffff1660e08201819052620f4240116128d8576040516315b2afa960e01b815260040160405180910390fd5b61292f565b62ffffff8b161561292f578a8160e0018181516128fa91906163ab565b62ffffff90811690915260e0830151620f4240911610905061292f576040516315b2afa960e01b815260040160405180910390fd5b891561298f57846001600160a01b0316886001600160a01b031610158061296457506401000276a36001600160a01b03891611155b1561298257604051631662672360e01b815260040160405180910390fd5b60005460808201526129f4565b846001600160a01b0316886001600160a01b03161115806129cd575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b03891610155b156129eb57604051631662672360e01b815260040160405180910390fd5b60015460808201525b612a266040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60008b612a3857826101200151612a3f565b8261010001515b6001600160a01b03881683529050612a56816145ce565b6001600160a01b0390811660208401819052612a93918e918a918e161182151514612a85578460200151612a87565b8c5b888f8860e001516148a9565b60808601526060850152604084015260c084015190975015612aeb57612ac2826080015183604001510161401e565b8b039a50612ae1612ad6836060015161401e565b606085015190614a77565b6060840152612b23565b612af8826060015161401e565b8b019a50612b1d612b12836080015184604001510161401e565b606085015190614a8d565b60608401525b825115612b6557825160808301516000916103e891612b4191614aa3565b81612b4e57612b4e61626e565b608085018051929091049182900390528551018552505b600083610140015162ffffff16118015612b88575060008360e0015162ffffff16115b15612bc9576000612bb1836080015185610140015162ffffff168660e0015162ffffff16613cef565b60808401805182900390526020860180519091019052505b6001600160801b03851615612c0057612bf48260800151600160801b876001600160801b0316613cef565b60808401805190910190525b8160200151876001600160a01b031603612d1c578260200151612c3b57600160208401528b612c3157600054612c35565b6001545b60a08401525b60008c15612caa5750608083015160a0840151600283810b600081815260036020819052604082209081018054828601805490980390975595909403909455600190920154600160801b810490910b61010087015261012086019190915260001983019750600f0b9003612d0a565b5060a08301516080840151600283810b60008181526003602081905260409091209081018054828501805490970390965594909303909355600190910154600160981b810490910b6101208601526101008501919091529095508590600f0b5b612d148682614acd565b955050612d3e565b81516001600160a01b03881614612d3e57612d36876142bb565b955050612d65565b508915801590612d605750886001600160a01b0316866001600160a01b031614155b612a26575b60008a83604001510390508260c0015115158c151514612d8a57826060015181612d91565b8083606001515b6002805476ffffffffffffffffffffffffffffffffffffffffffffff1916600160a01b62ffffff8b160273ffffffffffffffffffffffffffffffffffffffff1916176001600160a01b038b161790556020850151919a509850159050612e5e576101008201516101208301516009805462ffffff92831665ffffffffffff199091161763010000009290931691909102919091177fffffffffffffffffffff00000000000000000000000000000000ffffffffffff1666010000000000006001600160801b038716021790555b8a15612e71576080820151600055612e7a565b60808201516001555b50509550955095509550955095565b600080612e95600d5490565b600e5490925090506001600160801b03821180612eb857506001600160801b0381115b15612f7b576007546001600160a01b03166001600160801b03831115612f2157612f167f0000000000000000000000000000000000000000000000000000000000000000826ffffffffffffffffffffffffffffffffe1986016130a3565b6001600160801b0392505b6001600160801b03821115612f7957612f6e7f0000000000000000000000000000000000000000000000000000000000000000826ffffffffffffffffffffffffffffffffe1985016130a3565b6001600160801b0391505b505b600954660100000000000090046001600160801b03166000819003612f9f57509091565b600c546001600160801b0380821691600160801b9004168185118185118180612fc55750805b1561309a578115612ffd57612ff3846001600160801b03168803600160801b876001600160801b0316613cef565b6000805490910190555b801561303057613026836001600160801b03168703600160801b876001600160801b0316613cef565b6001805490910190555b604080516001600160801b038087168a0382528516880360208201527fef10ebb00f0dbc72ad4602e94abbbda6f3d40632714f70e9c8fa30d5d44289c9910160405180910390a16001600160801b03808816908716600160801b026001600160801b03191617600c555b50505050509091565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036130f95780600d60008282546130ee91906161e2565b90915550611ab09050565b80600e600082825461310b91906161e2565b9091555050505050565b60008412806131245750600083125b156131445760008413806131385750600083135b61314457613144616284565b801561319857600061315882840184616424565b90508060000151600d600082825461317091906161a0565b90915550506020810151600e805460009061318c9084906161a0565b90915550612338915050565b60008413156131be5783600d60008282546131b391906161a0565b909155506123389050565b60008313156123385782600e60008282546131d991906161a0565b909155505050505050565b60008411806131f35750600083115b806131fe5750600082115b806132095750600081115b1561349b5760048054600790600160d01b900463ffffffff166000808080806132358c8c888a8c614b47565b935093509350935080821760001461327b576132508261401e565b61325a908f616440565b6132638261401e565b61326d908f616440565b909e509c50600194506132e1565b6001600160681b0384841716156132e157600480547fffffffffffff000000000000000000000000000000000000000000000000000016600160681b6001600160681b03868116919091026cffffffffffffffffffffffffff1916919091179086161790555b60059750600696506132fc8a8a8863ffffffff168a8c614b47565b92965090945092509050818117156133ef576133178261401e565b613321908f616440565b61332a8261401e565b613334908f616440565b809e50819f505050600194506133ea63aa6b14bb60e01b600660009054906101000a90046001600160a01b03166001600160a01b031663aa6b14bb85856040518363ffffffff1660e01b8152600401613397929190918252602082015260400190565b6020604051808303816000875af11580156133b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133da9190616460565b6001600160e01b03191690613e96565b613455565b6001600160681b03848417161561345557600580547fffffffffffff000000000000000000000000000000000000000000000000000016600160681b6001600160681b03868116919091026cffffffffffffffffffffffffff1916919091179086161790555b841561349257600480547fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff16600160d01b4263ffffffff16021790555b50505050505050505b8585171561351f57600c546001600160801b0380821691600160801b90041687156134de576134d26134cd898461648a565b614c53565b6001600160801b031691505b86156134fd576134f16134cd888361648a565b6001600160801b031690505b6001600160801b039182169116600160801b026001600160801b03191617600c555b505050505050565b6040805162ffffff808516825283166020820152815133927f9443903d84c9719611bd4bba871daaf18a3950d00d5d78b1a2fa701f76df54ff928290030190a260408051888152602081018890526001600160a01b03878116828401526001600160801b0387166060830152600286900b60808301529151918a169133917fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67919081900360a00190a35050505050505050565b60028054600160c81b90041615611638576006546001600160a01b0316331461163857611638639cb5a96360e01b600660009054906101000a90046001600160a01b03166001600160a01b0316639cb5a963338c8c8c8c8c8c8c8c6040518a63ffffffff1660e01b8152600401808a6001600160a01b03168152602001896001600160a01b031681526020018815158152602001878152602001866001600160a01b03168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509a50505050505050505050506020604051808303816000875af1158015611079573d6000803e3d6000fd5b6006546001600160a01b03163314610ced57604051634994c26960e11b815260040160405180910390fd5b600080613720600d5490565b600e54600c5491935091506001600160801b0380821691600160801b900416818411806137555750806001600160801b031683115b1561253657816001600160801b03168411156137a8576137a87f0000000000000000000000000000000000000000000000000000000000000000866137a36001600160801b038616886161e2565b6130a3565b806001600160801b03168311156137f1576137f17f0000000000000000000000000000000000000000000000000000000000000000866137a36001600160801b038516876161e2565b6001600160a01b0385167fb94331e4420f16b156f53c397a8adcd09481283ee7830f7b688b22858e9db80b61382f6001600160801b038516876161e2565b6138426001600160801b038516876161e2565b6040805192835260208301919091520160405180910390a25050505050565b600254600160e01b900460ff16610ced57604051636798480960e11b815260040160405180910390fd5b6040805163e8ae2b6960e01b81527fb73ce166ead2f8e9add217713a7989e4edfba9625f71dfd2516204bb67ad3442600482015233602482015290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163e8ae2b699160448083019260209291908290030181865afa15801561391c573d6000803e3d6000fd5b505050506040513d602081101561393257600080fd5b5051610ced57604051634994c26960e11b815260040160405180910390fd5b600280547fffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff16600160d01b61ffff8416908102919091179091556040519081527f3647dccc990d4941b0b05b32527ef493a98d6187b20639ca2f9743f3b55ca5e1906020015b60405180910390a150565b6139cf620d89e71961629a565b60020b8160020b13156139f557604051631445443d60e01b815260040160405180910390fd5b8160020b8160020b13613a1b5760405163d9a841a760e01b815260040160405180910390fd5b620d89e719600283900b12156115a657604051631d1ac7f160e21b815260040160405180910390fd5b600254600090600160c81b900460041615613b94576006546001600160a01b03163303613a7357506000613b94565b600654604051632f1208d960e11b815233600482018181526001600160a01b038b8116602485015260028b810b60448601528a900b6064850152600f89900b608485015260c060a4850190815260c485018890526000959190911693635e2411b293928d928d928d928d928d928d92919060e401848480828437600081840152601f19601f8201169050808301925050509850505050505050505060408051808303816000875af1158015613b2c573d6000803e3d6000fd5b505050506040513d6040811015613b4257600080fd5b50805160209091015192509050620f424062ffffff831610613b77576040516315b2afa960e01b815260040160405180910390fd5b613b926001600160e01b03198216632f1208d960e11b613e96565b505b9695505050505050565b62ffffff818116908316601885811b91909117901b176000908152600b602052604090205b9392505050565b6002805460008054600154919384936001600160a01b03811693600160a01b90910490910b918491829190600f89900b15613c2657613c1060038c878c86866000614c69565b9350613c2360038b878c86866001614c69565b92505b600080613c3860038e8e8a8888614d5a565b91509150613c488e8c8484614df7565b5050505086600f0b600014613ce2578180613c605750805b15613c7957613c79898984848760008d600f0b12614eec565b6000613c888a8a8a8789614045565b91985096509050600f81900b15613ce057600954613cb990660100000000000090046001600160801b031689614acd565b600960066101000a8154816001600160801b0302191690836001600160801b031602179055505b505b5050505094509492505050565b60008383028160001985870982811083820303915050808411613d1157600080fd5b80600003613d2457508290049050613bc3565b8385870960008581038616958690049560026003880281188089028203028089028203028089028203028089028203028089028203028089029091030291819003819004600101858411909403939093029190930391909104170290509392505050565b6006546001600160a01b0316331461163857600254600160c81b9004600816156116385761163863d685201060e01b600660009054906101000a90046001600160a01b03166001600160a01b031663d6852010338c8c8c8c8c8c8c8c6040518a63ffffffff1660e01b8152600401808a6001600160a01b03168152602001896001600160a01b031681526020018860020b81526020018760020b815260200186600f0b8152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509a50505050505050505050506020604051808303816000875af1158015611079573d6000803e3d6000fd5b6001600160e01b0319828116908216146115a65760405163d3f5153b60e01b81526001600160e01b03198216600482015260240160405180910390fd5b6000831580613ef457505082820282848281613ef157613ef161626e565b04145b15613f155760008211613f0657600080fd5b81810490829006151501613bc3565b613f20848484613cef565b905060008280613f3257613f3261626e565b8486091115613bc3576000198110613f4957600080fd5b6001019392505050565b6000613f6182840184616424565b8051909150613f719086906161a0565b600d6000828254613f8291906161a0565b90915550506020810151613f979085906161a0565b600e6000828254613fa891906161a0565b90915550505050505050565b600280547fffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff16600160b81b61ffff8416908102919091179091556040519081527f598b9f043c813aa6be3426ca60d1c65d17256312890be5118dab55b0775ebe2a906020016139b7565b80600081121561402d57600080fd5b919050565b806000600f82900b121561402d57600080fd5b600080600080614054896145ce565b90506000614061896145ce565b90506000808b60020b8960020b12156140865761407f84848c614fe5565b91506140c4565b8a60020b8960020b12156140b65761409f88848c614fe5565b91506140ac84898c615025565b90508994506140c4565b6140c184848c615025565b90505b60008a600f0b126140d65781816140df565b81600003816000035b909d909c50949a509398505050505050505050565b801561410857600061315882840184616424565b83600d600082825461411a91906161a0565b9250508190555082600e60008282546131d991906161a0565b600280547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff16600160c81b60ff8416908102919091179091556040519081527f3a6271b36c1b44bd6a0a0d56230602dc6919b7c17af57254306fadf5fee69dc3906020016139b7565b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f27a3944eff2135a57675f17e72501038982b73620d01f794c72e93d61a3932a2906020016139b7565b6007805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fb0b573c1f636e1f8bd9b415ba6c04d6dd49100bc25493fc6305b65ec0e581df3906020016139b7565b600980547fffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff16600160b01b62ffffff841602179055604051600282900b81527f01413b1d5d4c359e9a0daa7909ecda165f6e8c51fe2ff529d74b22a5a7c02645906020016139b7565b60006401000276a36001600160a01b03831610806142f6575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b03831610155b15614314576040516355cf1e2360e01b815260040160405180910390fd5b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c979088119617909417909217179091171717608081106143b557607f810383901c91506143bf565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b146145bf57886001600160a01b03166145a4826145ce565b6001600160a01b031611156145b957816145c1565b806145c1565b815b9998505050505050505050565b6000600282900b60171d62ffffff818401821816620d89e881111561460657604051633c10250f60e01b815260040160405180910390fd5b600160801b600182161561462757506ffffcb933bd6fad37aa2d162d1a5940015b6002821615614646576ffff97272373d413259a46990580e213a0260801c5b6004821615614665576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615614684576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156146a3576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156146c2576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156146e1576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615614700576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615614720576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615614740576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615614760576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615614780576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156147a0576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156147c0576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156147e0576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615614800576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615614821576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615614841576e5d6af8dedb81196699c329225ee6040260801c5b620400008210614887576204000082161561486a576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615614887576b048a170391f7dc42444e8fa20260801c5b60008560020b131561489857600019045b63ffffffff0160201c949350505050565b600080600080615aef8a6148bf576150556148c3565b6150645b9050600087126149975760006148ec8888620f42400362ffffff16620f424062ffffff16613cef565b90506148fd8a8c8b8563ffffffff16565b945084811061492a57899550614923858862ffffff1689620f42400362ffffff16613ed3565b9250614970565b6149368b8a838f615073565b9550856001600160a01b03168a6001600160a01b03160361495957614959616284565b614968868c8b8563ffffffff16565b945084880392505b61498f868c8b8f6149835761508c614987565b61509b5b63ffffffff16565b935050614a69565b615aef8b6149a75761508c6149ab565b61509b5b90506149bc8a8c8b8463ffffffff16565b935087600003975060008812156149e6576040516334cb3a0160e11b815260040160405180910390fd5b8388106149f557899550614a3a565b614a018b8a8a8f6150aa565b9550856001600160a01b03168a6001600160a01b031614614a2e57614a2b868c8b8463ffffffff16565b93505b87841115614a3a578793505b614a49868c8b8563ffffffff16565b9450614a65858862ffffff1689620f42400362ffffff16613ed3565b9250505b509650965096509692505050565b8082038281131560008312151461221957600080fd5b8181018281121560008312151461221957600080fd5b6000821580614ac457505081810281838281614ac157614ac161626e565b04145b61221957600080fd5b60008082600f0b1215614b0f57508082016001600160801b0380841690821610614b0a576040516302603ee960e31b815260040160405180910390fd5b612219565b826001600160801b03168284019150816001600160801b0316101561221957604051634cba017960e11b815260040160405180910390fd5b600080808088881715614bf55784546001600160681b038082169160681c16614b708b836161a0565b9150614b7c8a826161a0565b9050617080614b918a63ffffffff42166161e2565b101580614ba457506001600160681b0382115b80614bb557506001600160681b0381115b15614be4578754600080614bca8585856150ba565b6000808d559a508a99509097509550614c47945050505050565b909450925060009150819050614c47565b617080614c088863ffffffff42166161e2565b10614c3a5784546001600160681b038082169160681c1680821715614c37578754600080614bca8585856150ba565b50505b5060009250829150819050805b95509550955095915050565b806001600160801b038116811461402d57600080fd5b600286900b6000908152602088905260408120805482614c898289614acd565b6001600160801b031690506d09745258e83de0d0f4e400fce799811115614cc3576040516312dc1b2560e11b815260040160405180910390fd5b6001830154600f0b85614ce75788600f0b81600f0b614ce2919061648a565b614cf9565b88600f0b81600f0b614cf99190616440565b6001850180546001600160801b0319166001600160801b0392909216919091179055818455811594506000839003614d4b57841594508960020b8b60020b13614d4b5760038401879055600284018890555b50505050979650505050505050565b600285810b60009081526020889052604080822087840b8084529183209293849391929088900b1215614dd0578860020b8760020b12614dab57816002015486039350816003015485039250614dba565b81600201549350816003015492505b6002810154600382015494039390920391610caf565b81600201548160020154039350816003015481600301540392505050965096945050505050565b8354600f84900b600003614e2157806001600160801b0316600003614e1c5750612338565b614e37565b614e2b8185614acd565b6001600160801b031685555b600185015460028601546000858314614e6e5760018801869055614e6b8387036001600160801b038616600160801b613cef565b90505b6000858314614e9b5760028901869055614e988387036001600160801b038716600160801b613cef565b90505b6001600160801b038282171615614ee157600389018054600160801b6001600160801b03808316860181166001600160801b031990931683178290048116850116021790555b505050505050505050565b60095463010000008104600290810b919081900b90600160c81b900463ffffffff168282828915614f2d57614f258c898386868c615134565b919450925090505b8815614f4957614f418b898386868c615134565b919450925090505b8260020b8660020b141580614f6457508160020b8560020b14155b80614f7b57508363ffffffff168163ffffffff1614155b15614fd7576009805462ffffff80861663010000000265ffffffffffff1963ffffffff8616600160c81b02167fffffff00000000ffffffffffffffffffffffffffffffffffffff00000000000090931692909217908516171790555b505050505050505050505050565b60008082600f0b121561500d576150056117418585856000036000615229565b60000361501d565b61501d6117418585856001615229565b949350505050565b60008082600f0b12156150455761500561174185858560000360006152d6565b61501d61174185858560016152d6565b600061501d83858460016152d6565b600061501d8484846001615229565b600061508385858585600161533d565b95945050505050565b600061501d8385846000615229565b600061501d84848460006152d6565b600061508385858585600061533d565b600080808086156150f4576150f07f000000000000000000000000000000000000000000000000000000000000000086896130a3565b8691505b8515615128576151257f000000000000000000000000000000000000000000000000000000000000000086886130a3565b50845b90969095509350505050565b6000806000831561517e5760008061514d60038c61556d565b915091508a60020b8860020b0361516657819750615177565b8a60020b8760020b03615177578096505b5050615207565b6000808a60020b8860020b12801561519b57508a60020b8760020b135b156151c457508690508560028a810b908c900b13156151bc578a96506151f7565b8a97506151f7565b6151d26008600a8b8e6156db565b600281810b600090815260036020526040902060010154600160801b9004900b925090505b61520460038c8484615790565b50505b60006152176008600a8a8d615886565b969a9599509597509395505050505050565b60006001600160a01b038585038116908516811061524657600080fd5b7bffffffffffffffffffffffffffffffff000000000000000000000000606085901b168361529f57866001600160a01b031661528c8383896001600160a01b0316613cef565b816152995761529961626e565b046152cb565b6152cb6152b68383896001600160a01b0316613ed3565b886001600160a01b0316808204910615150190565b979650505050505050565b6000846001600160a01b0316846001600160a01b031610156152f757600080fd5b6001600160a01b0385850316826153255761532081856001600160801b0316600160601b613cef565b613b94565b613b9481856001600160801b0316600160601b613ed3565b6000856001600160a01b031660000361535557600080fd5b846001600160801b031660000361536b57600080fd5b8360000361537a575084615083565b81151583151503615488577bffffffffffffffffffffffffffffffff000000000000000000000000606086901b168215615436576001600160a01b038716858102908682816153cb576153cb61626e565b04036153fb578181018281106153f9576153ef838a6001600160a01b031683613ed3565b9350505050615083565b505b61542d82615422888b6001600160a01b0316868161541b5761541b61626e565b049061591e565b808204910615150190565b92505050615083565b6001600160a01b038716858102908682816154535761545361626e565b041461545e57600080fd5b80821161546a57600080fd5b61542d615483838a6001600160a01b0316848603613ed3565b61592e565b81156154f5576154ee6154836001600160a01b038611156154c0576154bb86600160601b896001600160801b0316613cef565b6154de565b6001600160801b038716606087901b816154dc576154dc61626e565b045b6001600160a01b0389169061591e565b9050615083565b60006001600160a01b038511156155235761551e85600160601b886001600160801b0316613ed3565b615540565b615540606086901b6001600160801b038816808204910615150190565b905080876001600160a01b03161161555757600080fd5b6001600160a01b03871603905095945050505050565b600281810b60008181526020859052604081206001810180548383557fffffffffffffffffffff000000000000000000000000000000000000000000008116909155818501839055600390910191909155600160801b8104830b92600160981b909104900b90620d89e71914806155f557506155ec620d89e71961629a565b60020b8360020b145b1561564e57600283900b6000908152602085905260409020600101805462ffffff808516600160801b0262ffffff60801b19918516600160981b029190911665ffffffffffff60801b19909216919091171790556156d4565b8060020b8260020b0361567457604051630d6e094960e01b815260040160405180910390fd5b600282810b6000908152602086905260408082206001908101805462ffffff808816600160981b0262ffffff60981b19909216919091179091559385900b83529120018054918416600160801b0262ffffff60801b199092169190911790555b9250929050565b600190810190600090600883811d610d8a01901c90829061ffff83161b851663ffffffff161561573e5761570f8785615944565b9094509092509050801561572457505061501d565b61573586610d8b840160010b615944565b90945090925090505b806157815761575c8563ffffffff168360010193508360010b615975565b9093509050806157745750620d89e8915061501d9050565b61577e8684615ac3565b92505b6152cb87610d89198501615ac3565b600283900b620d89e71914806157b757506157ae620d89e71961629a565b60020b8360020b145b612338578260020b8260020b1280156157d557508260020b8160020b135b6157f25760405163e45ac17d60e01b815260040160405180910390fd5b600283810b600090815260209590955260408086206001908101805465ffffffffffff60801b1916600160981b62ffffff878116820262ffffff60801b1990811693909317600160801b8a831681029190911790945597860b8a52848a208401805462ffffff60981b191698909916908102979097179097559390920b865290942090930180549092169202919091179055565b816000806158c38785600881901d600181810b60009081526020949094526040909320805460ff9093169390931b80831890935591811490151891565b91509150811561591457610d8a01600181810b60081d80820b6000908152602089905260409020805460ff9094169290921b808418909255821591909214818118935014615914576001811b831892505b5050949350505050565b8082018281101561221957600080fd5b806001600160a01b038116811461402d57600080fd5b600881901d600181900b60009081526020849052604081205481906159699085615975565b93969095509293505050565b60008060ff831684811c808303615991578460ff179350615aba565b7f555555555555555555555555555555555555555555555555555555555555555560008290038216908116156001600160801b0382161560071b1777ffffffffffffffff0000000000000000ffffffffffffffff82161560061b177bffffffff00000000ffffffff00000000ffffffff00000000ffffffff82161560051b177dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff82161560041b177eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff82161560031b177f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f82161560021b177f33333333333333333333333333333333333333333333333333333333333333339091161560011b1760ff1685019350600192505b50509250929050565b600181900b600090815260208390526040902054600882901b90615ae79082615975565b509392505050565b610ced6164b2565b8035600281900b811461402d57600080fd5b6001600160801b0381168114610d6b57600080fd5b600080600080600060a08688031215615b3657600080fd5b615b3f86615af7565b9450615b4d60208701615af7565b93506040860135615b5d81615b09565b94979396509394606081013594506080013592915050565b60008060408385031215615b8857600080fd5b50508035926020909101359150565b6001600160a01b0381168114610d6b57600080fd5b8035801515811461402d57600080fd5b60008083601f840112615bce57600080fd5b50813567ffffffffffffffff811115615be657600080fd5b6020830191508360208285010111156156d457600080fd5b60008060008060008060a08789031215615c1757600080fd5b8635615c2281615b97565b9550615c3060208801615bac565b9450604087013593506060870135615c4781615b97565b9250608087013567ffffffffffffffff811115615c6357600080fd5b615c6f89828a01615bbc565b979a9699509497509295939492505050565b61ffff81168114610d6b57600080fd5b600060208284031215615ca357600080fd5b8135613bc381615c81565b600080600080600060808688031215615cc657600080fd5b615ccf86615af7565b9450615cdd60208701615af7565b93506040860135615ced81615b09565b9250606086013567ffffffffffffffff811115615d0957600080fd5b615d1588828901615bbc565b969995985093965092949392505050565b600080600080600060808688031215615d3e57600080fd5b8535615d4981615b97565b94506020860135935060408601359250606086013567ffffffffffffffff811115615d0957600080fd5b600080600080600060a08688031215615d8b57600080fd5b8535615d9681615b97565b9450615da460208701615af7565b9350615db260408701615af7565b92506060860135615dc281615b09565b91506080860135615dd281615b09565b809150509295509295909350565b600060208284031215615df257600080fd5b5035919050565b600080600060608486031215615e0e57600080fd5b8335615e1981615b97565b95602085013595506040909401359392505050565b600080600080600080600060c0888a031215615e4957600080fd5b8735615e5481615b97565b96506020880135615e6481615b97565b9550615e7260408901615bac565b9450606088013593506080880135615e8981615b97565b925060a088013567ffffffffffffffff811115615ea557600080fd5b615eb18a828b01615bbc565b989b979a50959850939692959293505050565b600060208284031215615ed657600080fd5b8135613bc381615b09565b600080600080600080600060c0888a031215615efc57600080fd5b8735615f0781615b97565b96506020880135615f1781615b97565b9550615f2560408901615af7565b9450615f3360608901615af7565b93506080880135615e8981615b09565b60008060008060808587031215615f5957600080fd5b615f6285615af7565b93506020850135615f7281615b09565b93969395505050506040820135916060013590565b600060208284031215615f9957600080fd5b813560ff81168114613bc357600080fd5b600080600080600060a08688031215615fc257600080fd5b615fcb86615bac565b9450602086013593506040860135615b5d81615b97565b600060208284031215615ff457600080fd5b81358060010b8114613bc357600080fd5b60006020828403121561601757600080fd5b8135613bc381615b97565b6000806040838503121561603557600080fd5b82359150602083013561604781615b97565b809150509250929050565b60006020828403121561606457600080fd5b613bc382615af7565b6000806040838503121561608057600080fd5b823561608b81615b09565b9150602083013561604781615b09565b815181526020808301519082015260408101612219565b6000815180845260005b818110156160d8576020818501810151868301820152016160bc565b506000602082860101526020601f19601f83011685010191505092915050565b60006001600160a01b0380891683528088166020840152508560020b60408301528460020b60608301526001600160801b038416608083015260c060a083015261614560c08301846160b2565b98975050505050505050565b60008060006060848603121561616657600080fd5b8351925060208401519150604084015161617f81615b09565b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b808201808211156122195761221961618a565b600081600f0b6f7fffffffffffffffffffffffffffffff1981036161d9576161d961618a565b60000392915050565b818103818111156122195761221961618a565b6001600160801b038181168382160190808211156162155761621561618a565b5092915050565b6001600160a01b0385168152836020820152826040820152608060608201526000613b9460808301846160b2565b6000806040838503121561625d57600080fd5b505080516020909101519092909150565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052600160045260246000fd5b60008160020b627fffff1981036161d9576161d961618a565b60008260020b8260020b028060020b91508082146162155761621561618a565b600282810b9082900b03627fffff198112627fffff821317156122195761221961618a565b600281810b9083900b01627fffff8113627fffff19821217156122195761221961618a565b60006001600160a01b0380891683528088166020840152861515604084015285606084015280851660808401525060c060a083015261614560c08301846160b2565b60006020828403121561637157600080fd5b8151613bc381615c81565b6000806040838503121561638f57600080fd5b825161639a81615b09565b602084015190925061604781615b09565b62ffffff8181168382160190808211156162155761621561618a565b6000604082840312156163d957600080fd5b6040516040810181811067ffffffffffffffff8211171561640a57634e487b7160e01b600052604160045260246000fd5b604052823581526020928301359281019290925250919050565b60006040828403121561643657600080fd5b613bc383836163c7565b81810360008312801583831316838312821617156162155761621561618a565b60006020828403121561647257600080fd5b81516001600160e01b031981168114613bc357600080fd5b80820182811260008312801582168215821617156164aa576164aa61618a565b505092915050565b634e487b7160e01b600052605160045260246000fdfea164736f6c6343000814000a",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103205760003560e01c80639e922180116101a7578063d8544cf3116100ee578063ef01df4f11610097578063f3a016ab11610071578063f3a016ab1461095e578063f637731d14610971578063fff6cae91461098457600080fd5b8063ef01df4f146108af578063f085a610146108c2578063f30dba93146108d557600080fd5b8063e76c01e4116100c8578063e76c01e414610800578063e8ae2b6914610893578063ecdecf42146108a657600080fd5b8063d8544cf3146107b2578063d8619037146107c5578063ddca3f43146107e557600080fd5b8063c5390e2d11610150578063d0c93a7c1161012a578063d0c93a7c1461076a578063d21220a71461077e578063d5c35a7e146107a557600080fd5b8063c5390e2d14610724578063c677e3e014610737578063cc1f97cf1461075757600080fd5b8063b563f74211610181578063b563f742146106d7578063bca57f81146106ea578063c45a0155146106fd57600080fd5b80639e92218014610671578063a1eded8714610684578063aafe29c0146106a057600080fd5b8063514ea4bf1161026b5780637bd78025116102145780639734b577116101ee5780639734b577146105ed57806397ce1c51146106005780639e4e02271461065e57600080fd5b80637bd78025146105a05780638380edb7146105bc5780638e005553146105da57600080fd5b80636378ae44116102455780636378ae441461055d57806370cf754a1461057457806377f8c3a91461058957600080fd5b8063514ea4bf146104a157806353e978681461051e578063578b9a361461053157600080fd5b80631a686502116102cd5780633b3bc70e116102a75780633b3bc70e14610468578063490e6cbc1461047b5780634f1eb3d81461048e57600080fd5b80631a686502146104185780631dd19cb41461044d578063240a875a1461045557600080fd5b80630cdd53f6116102fe5780630cdd53f61461039e5780630dfe1681146103b1578063128acb08146103f057600080fd5b8063050a4d21146103255780630606e855146103515780630902f1ac14610366575b600080fd5b600954610339906301000000900460020b81565b60405160029190910b81526020015b60405180910390f35b61036461035f366004615b1e565b61098c565b005b600c546001600160801b0380821691600160801b9004165b604080516001600160801b03938416815292909116602083015201610348565b6103646103ac366004615b75565b610a81565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610348565b6104036103fe366004615bfe565b610ab5565b60408051928352602083019190915201610348565b60095461043590660100000000000090046001600160801b031681565b6040516001600160801b039091168152602001610348565b610364610cbc565b610364610463366004615c91565b610cef565b610403610476366004615cae565b610d6e565b610364610489366004615d26565b610fbb565b61037e61049c366004615d73565b611373565b6104ea6104af366004615de0565b600b602052600090815260409020805460018201546002830154600390930154919290916001600160801b0380821691600160801b90041685565b604080519586526020860194909452928401919091526001600160801b03908116606084015216608082015260a001610348565b6007546103d8906001600160a01b031681565b60095461054890600160c81b900463ffffffff1681565b60405163ffffffff9091168152602001610348565b61056660005481565b604051908152602001610348565b6104356d09745258e83de0d0f4e400fce79981565b60045461054890600160d01b900463ffffffff1681565b6004546001600160681b0380821691600160681b90041661037e565b600254600160e01b900460ff165b6040519015158152602001610348565b6103646105e8366004615c91565b61153f565b6103646105fb366004615df9565b6115aa565b610608611642565b604080516001600160a01b039098168852600296870b602089015261ffff9095169487019490945260ff90921660608601526001600160801b03166080850152820b60a0840152900b60c082015260e001610348565b61040361066c366004615e2e565b6116d8565b61036461067f366004615ec4565b611a00565b6005546001600160681b0380821691600160681b90041661037e565b6106b36106ae366004615ee1565b611ab5565b6040805193845260208401929092526001600160801b031690820152606001610348565b6103646106e5366004615f43565b611e67565b6103646106f8366004615f87565b611fdb565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b610364610732366004615faa565b61202e565b610566610745366004615fe2565b60086020526000908152604090205481565b610364610765366004616005565b6120d4565b60095461033990600160b01b900460020b81565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b6009546103399060020b81565b6103646107c0366004616005565b6120f7565b6105666107d3366004615fe2565b600a6020526000908152604090205481565b6107ed612172565b60405161ffff9091168152602001610348565b6002805461084b916001600160a01b03821691600160a01b810490910b9061ffff600160b81b820481169160ff600160c81b8204811692600160d01b83041691600160e01b90041686565b604080516001600160a01b03909716875260029590950b602087015261ffff9384169486019490945260ff9091166060850152166080830152151560a082015260c001610348565b6105ca6108a1366004616022565b612216565b61056660015481565b6006546103d8906001600160a01b031681565b6103646108d0366004616052565b61221f565b6109276108e3366004616052565b60036020819052600091825260409091208054600182015460028084015493909401549193600f82900b93600160801b8304820b93600160981b90930490910b9186565b60408051968752600f9590950b6020870152600293840b94860194909452910b6060840152608083015260a082015260c001610348565b61036461096c36600461606d565b612288565b61036461097f366004616005565b61233e565b61036461253d565b60006040518060400160405280848152602001838152506040516020016109b3919061609b565b60408051601f19818403018152908290526302abf8a760e61b82529150309063aafe29c0906109f090339084908b908b908b9089906004016160f8565b6060604051808303816000875af1158015610a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a339190616151565b505060408051808201909152600288810b825287900b6020909101525050600f805462ffffff95861663010000000265ffffffffffff19909116959096169490941794909417909255505050565b81600d6000828254610a9391906161a0565b9250508190555080600e6000828254610aac91906161a0565b90915550505050565b600080600080610acb8a8a8a8a60008b8b61256f565b91509150610ad7612728565b6040805160608101825260008082526020808301829052828401829052835180850190945281845283015290610b1084848d8d8d612761565b6001600160801b03909116604088015260029190910b60208701526001600160a01b03909116855291975095509050600080610b4a612e89565b915091508c15610be0576000871215610b8b57610b8b7f00000000000000000000000000000000000000000000000000000000000000008f896000036130a3565b610b9788888c8c613115565b600d54610ba489846161a0565b1115610bc357604051633ed6d50560e21b815260040160405180910390fd5b610bdb888885600001516000876020015160006131e4565b610c67565b6000881215610c1757610c177f00000000000000000000000000000000000000000000000000000000000000008f8a6000036130a3565b610c2388888c8c613115565b600e54610c3088836161a0565b1115610c4f57604051633ed6d50560e21b815260040160405180910390fd5b610c67888860008660000151600088602001516131e4565b610c838e89898760000151886040015189602001518c8c613527565b50505050610c9f6002805460ff60e01b1916600160e01b179055565b610caf8a8a8a8a88888c8c6135da565b5050965096945050505050565b610cc46136e9565b610ccc612728565b610cd533613714565b610ced6002805460ff60e01b1916600160e01b179055565b565b610cf7613861565b610cff61388b565b6103e861ffff82161180610d22575060025461ffff828116600160d01b90920416145b80610d44575061ffff811615801590610d4457506007546001600160a01b0316155b15610d625760405163a709b9af60e01b815260040160405180910390fd5b610d6b81613951565b50565b6000808686610d7d82826139c2565b6f7fffffffffffffffffffffffffffffff6001600160801b0388161115610db757604051638995290f60e01b815260040160405180910390fd5b6000610dc2886161b3565b90506000610dd4338c8c858c8c613a44565b9050610dde612728565b610de6612e89565b50506000610df5338d8d613b9e565b9050610e03818d8d86613bca565b909750955062ffffff821615610e79576000808815610e3e57610e2f8962ffffff8616620f4240613cef565b9150610e3b828a6161e2565b98505b8715610e6657610e578862ffffff8616620f4240613cef565b9050610e6381896161e2565b97505b610e7660008060008086866131e4565b50505b86861715610ede576003810154610e9a9088906001600160801b03166161f5565b6003820154610eba908890600160801b90046001600160801b03166161f5565b6001600160801b039182169116600160801b026001600160801b0319161760038201555b506001600160801b0389168617851715610f85576040805162ffffff83168152905133917f1a25098b7a731ae33ed362388b593b876963dfde0efb4db9c0befeed637ff26b919081900360200190a2604080516001600160801b038b16815260208101889052808201879052905160028c810b92908e900b9133917f0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c919081900360600190a45b610f9d6002805460ff60e01b1916600160e01b179055565b610fad338c8c858a8a8e8e613d88565b505050509550959350505050565b600254600160c81b9004601016156110a1576006546040516346f0547760e11b80825233600483018181526001600160a01b038a81166024860152604485018a90526064850189905260a06084860190815260a486018890526110a19694959190941693638de0a8ee93928c928c928c928c928c929060c401848480828437600081840152601f19601f8201169050808301925050509750505050505050506020604051808303816000875af1158015611079573d6000803e3d6000fd5b505050506040513d602081101561108f57600080fd5b50516001600160e01b03191690613e96565b6110a9612728565b6000806000806110b7612e89565b909250905060008815611100576110d3896064620f4240613ed3565b90506111007f00000000000000000000000000000000000000000000000000000000000000008b8b6130a3565b6000881561114457611117896064620f4240613ed3565b90506111447f00000000000000000000000000000000000000000000000000000000000000008c8b6130a3565b61115082828a8a613f53565b600d5495508561116083866161a0565b111561117f576040516336de50ff60e11b815260040160405180910390fd5b600e5494508461118f82856161a0565b11156111ae5760405163c998149f60e01b815260040160405180910390fd5b60025495849003959483900394600160d01b900461ffff16801561120e57600087156111e4576111e188836103e8613cef565b90505b600087156111fc576111f988846103e8613cef565b90505b61120b828284846000806131e4565b50505b604080518c8152602081018c90528082018990526060810188905290516001600160a01b038e169133917fbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca6339181900360800190a3505050505061127f6002805460ff60e01b1916600160e01b179055565b600254600160c81b90046020161561136a5761136a63343d37ff60e01b600660009054906101000a90046001600160a01b03166001600160a01b031663343d37ff338b8b8b89898d8d6040518963ffffffff1660e01b815260040180896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505099505050505050505050506020604051808303816000875af1158015611079573d6000803e3d6000fd5b50505050505050565b60008061137e612728565b600061138b338888613b9e565b60038101549091506001600160801b0380821691600160801b900481169087168210156113b6578196505b806001600160801b0316866001600160801b031611156113d4578095505b6001600160801b03878717161561151a576001600160801b0387830381168783038216600160801b026001600160801b03191617600385015587955086945085161561144e5761144e7f00000000000000000000000000000000000000000000000000000000000000008b876001600160801b03166130a3565b6001600160801b03841615611491576114917f00000000000000000000000000000000000000000000000000000000000000008b866001600160801b03166130a3565b6114b9856001600160801b0316600003856001600160801b03166000036000806000806131e4565b604080516001600160a01b038c1681526001600160801b038088166020830152861681830152905160028a810b92908c900b9133917f70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0919081900360600190a45b6115326002805460ff60e01b1916600160e01b179055565b5050509550959350505050565b61154761388b565b600254600160c81b8104608016151590600160e01b900460ff1661157e57604051636798480960e11b815260040160405180910390fd5b801561159d576040516369cdc70760e11b815260040160405180910390fd5b6115a682613fb4565b5050565b60006040518060400160405280848152602001838152506040516020016115d1919061609b565b60408051601f19818403018152908290526312439b2f60e21b82529150309063490e6cbc9061160a90879087908790879060040161621c565b600060405180830381600087803b15801561162457600080fd5b505af1158015611638573d6000803e3d6000fd5b5050505050505050565b600280546001600160a01b03811691600160a01b8204900b9061ffff600160b81b8204169060ff600160c81b820481169160009182918291600160e01b90910416806116a157604051636798480960e11b815260040160405180910390fd5b505060095495969495939492936001600160801b03660100000000000082041693600282810b9450630100000090920490910b9150565b60008060008612156116fd576040516334cb3a0160e11b815260040160405180910390fd5b611705612728565b60008715611760576000611718600d5490565b90506117278860008888613115565b6000611732600d5490565b905061174661174183836161e2565b61401e565b92506117598360008060008060006131e4565b50506117aa565b600061176b600e5490565b905061177a6000898888613115565b6000611785600e5490565b905061179461174183836161e2565b92506117a76000846000806000806131e4565b50505b8681146117b5578096505b50856000036117d757604051633ed6d50560e21b815260040160405180910390fd5b6117ef6002805460ff60e01b1916600160e01b179055565b6000806118028a8a8a8a60018b8b61256f565b9150915061180e612728565b611816612e89565b5050604080516060810182526000808252602080830182905282840182905283518085019094528184528301529061185184848d8d8d612761565b6001600160801b03909116604088015260029190910b60208701526001600160a01b039091168552919750955090508a1561191b5760008512156118bd576118bd7f00000000000000000000000000000000000000000000000000000000000000008d876000036130a3565b858a038a87146118f2576118f27f00000000000000000000000000000000000000000000000000000000000000008f836130a3565b6119156118fe8261401e565b6000038784600001516000866020015160006131e4565b506119ac565b6000861215611952576119527f00000000000000000000000000000000000000000000000000000000000000008d886000036130a3565b848a038a8614611987576119877f00000000000000000000000000000000000000000000000000000000000000008f836130a3565b6119aa876119948361401e565b60000360008560000151600087602001516131e4565b505b6119c88c87878560000151866040015187602001518a8a613527565b6119e06002805460ff60e01b1916600160e01b179055565b6119f08c8c8c8c8a8a8e8e6135da565b5050505097509795505050505050565b600f5463010000008104600290810b91900b03611a1c57600080fd5b600f54604051631d9de38760e11b8152600282810b6004830152630100000090920490910b60248201526001600160801b038216604482015260806064820152600060848201523090633b3bc70e9060a40160408051808303816000875af1158015611a8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab0919061624a565b505050565b60008060008787611ac682826139c2565b876001600160801b0316600003611af05760405163e6ace6df60e01b815260040160405180910390fd5b611b0f8b8b8b611b088c6001600160801b0316614032565b8b8b613a44565b50611b18612728565b60028054600160a01b810490910b906001600160a01b03166000819003611b525760405163812eb65560e01b815260040160405180910390fd5b600954600160b01b9004600290810b9081908d900b81611b7457611b7461626e565b078160020b8e60020b81611b8a57611b8a61626e565b071760020b15611bad57604051635f6e14f360e01b815260040160405180910390fd5b50611bcc8c8c611bc58d6001600160801b0316614032565b8585614045565b50909750955060009150819050611be1612e89565b91509150611bf187878b8b6140f4565b8615611c105781611c01600d5490565b611c0b91906161e2565b611c13565b60005b91508515611c345780611c25600e5490565b611c2f91906161e2565b611c37565b60005b905086821015611c5c57611c558a6001600160801b03168389613cef565b9450611c60565b8994505b85811015611ca0576000611c7e8b6001600160801b03168389613cef565b9050856001600160801b0316816001600160801b03161015611c9e578095505b505b846001600160801b0316600003611cca57604051632fae8a9b60e21b815260040160405180910390fd5b6000611cd78e8e8e613b9e565b9050611cf6818e8e611cf18a6001600160801b0316614032565b613bca565b9098509650508615611d4b5786821115611d3c57611d377f00000000000000000000000000000000000000000000000000000000000000008f8985036130a3565b611d4b565b868214611d4b57611d4b616284565b8515611d9a5785811115611d8b57611d867f00000000000000000000000000000000000000000000000000000000000000008f8884036130a3565b611d9a565b858114611d9a57611d9a616284565b611daa87876000806000806131e4565b8a60020b8c60020b8e6001600160a01b03167f7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde33898c8c60405180856001600160a01b03168152602001846001600160801b0316815260200183815260200182815260200194505050505060405180910390a4611e356002805460ff60e01b1916600160e01b179055565b611e568d8d8d611e4d896001600160801b0316614032565b8b8b8f8f613d88565b505050509750975097945050505050565b60008460020b1215611e7f57611e7c8461629a565b93505b611e8c620d89e71961629a565b611e979060026162b3565b60020b8460020b1315611ebf57611eb1620d89e71961629a565b611ebc9060026162b3565b93505b60028054600160a01b9004900b6000611ed886836162d3565b90506000611ee687846162f8565b90506000604051806040016040528087815260200186815250604051602001611f0f919061609b565b60408051601f19818403018152908290526302abf8a760e61b82529150309063aafe29c090611f4c9033908490889088908e9089906004016160f8565b6060604051808303816000875af1158015611f6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8f9190616151565b505060408051808201909152600285810b825284900b6020909101525050600f805462ffffff93841665ffffffffffff1990911617630100000093909216929092021790555050505050565b611fe3613861565b6006546001600160a01b03168061200d57604051639e727ce360e01b815260040160405180910390fd5b336001600160a01b038216146120255761202561388b565b6115a682614133565b6000604051806040016040528084815260200183815250604051602001612055919061609b565b60408051601f1981840301815290829052639e4e022760e01b825291503090639e4e02279061209290839081908b908b908b90899060040161631d565b60408051808303816000875af11580156120b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611638919061624a565b6120dc613861565b6120e461388b565b6120ee6000614133565b610d6b8161419c565b6120ff613861565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146121375761213761388b565b6001600160a01b03811615801561215a5750600254600160d01b900461ffff1615155b15612169576121696000613951565b610d6b816141f7565b600254600160b81b810461ffff1690600160c81b900460ff8116906080161561221257600660009054906101000a90046001600160a01b03166001600160a01b031663f70d93626040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220c919061635f565b91505090565b5090565b60015b92915050565b612227613861565b61222f61388b565b60008160020b13158061224757506101f4600282900b135b806122615750600954600282810b600160b01b909204900b145b1561227f57604051632bf827d160e21b815260040160405180910390fd5b610d6b81614252565b600f5463010000008104600290810b91900b036122a457600080fd5b600f546040516309e3d67b60e31b81523060048201819052600283810b6024840152630100000090930490920b60448201526001600160801b03808516606483015283166084820152634f1eb3d89060a40160408051808303816000875af1158015612314573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612338919061637c565b50505050565b6000612349826142bb565b6002549091506001600160a01b03161561237657604051631499a6b760e21b815260040160405180910390fd5b600280546001600160a01b03841676ffffffffffffffffffffffffffffffffffffffffffffff199091168117600160a01b62ffffff851602178255604080519182529183900b602082015281517f98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c95929181900390910190a16006546001600160a01b03161561245f57600654604080516318dbf60160e21b8082523360048301526001600160a01b038681166024840152925161245f9491939091169163636fd80491604480830192602092919082900301816000875af1158015611079573d6000803e3d6000fd5b60006001606461246e81613fb4565b61247782614252565b61ffff83161580159061249357506007546001600160a01b0316155b156124b15760405163a709b9af60e01b815260040160405180910390fd5b6124ba83613951565b600254600160c81b900460401615612536576006546040805163416eb29160e11b8082523360048301526001600160a01b038981166024840152600289900b60448401529251612536949193909116916382dd652291606480830192602092919082900301816000875af1158015611079573d6000803e3d6000fd5b5050505050565b6125456136e9565b61254d612728565b612555612e89565b5050610ced6002805460ff60e01b1916600160e01b179055565b6002546000908190600160c81b900460ff1661258d81600116151590565b1561271a576006546001600160a01b031633036125b157600080925092505061271c565b6000600660009054906101000a90046001600160a01b03166001600160a01b031663029c1cb7338d8d8d8d8d8d8d6040518963ffffffff1660e01b815260040180896001600160a01b03168152602001886001600160a01b031681526020018715158152602001868152602001856001600160a01b031681526020018415158152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505099505050505050505050506060604051808303816000875af115801561268e573d6000803e3d6000fd5b505050506040513d60608110156126a457600080fd5b50805160208201516040909201519195509093509050608082161580156126df575060008462ffffff1611806126df575060008362ffffff16115b156126fd57604051633a4528ef60e01b815260040160405180910390fd5b6127186001600160e01b0319821663029c1cb760e01b613e96565b505b505b97509795505050505050565b600254600160e01b900460ff1661275257604051636798480960e11b815260040160405180910390fd5b6002805460ff60e01b19169055565b6000806000806000612786604051806040016040528060008152602001600081525090565b876000036127a7576040516301e76e6160e61b815260040160405180910390fd5b600160ff1b88036127cb576040516334cb3a0160e11b815260040160405180910390fd5b6040805161016081018252600060208201819052606082018190526080820181905260a0820181905262ffffff8d16610140830152808b1360c08301529181018a9052600954600281810b61012084015263010000008204810b610100840152805461ffff600160d01b820481168552600160b81b82041660e08501526001600160a01b0381169850600160a01b9004900b9550660100000000000090046001600160801b03169350908590036128955760405163812eb65560e01b815260040160405180910390fd5b62ffffff8c16156128dd576128aa8b8d6163ab565b62ffffff1660e08201819052620f4240116128d8576040516315b2afa960e01b815260040160405180910390fd5b61292f565b62ffffff8b161561292f578a8160e0018181516128fa91906163ab565b62ffffff90811690915260e0830151620f4240911610905061292f576040516315b2afa960e01b815260040160405180910390fd5b891561298f57846001600160a01b0316886001600160a01b031610158061296457506401000276a36001600160a01b03891611155b1561298257604051631662672360e01b815260040160405180910390fd5b60005460808201526129f4565b846001600160a01b0316886001600160a01b03161115806129cd575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b03891610155b156129eb57604051631662672360e01b815260040160405180910390fd5b60015460808201525b612a266040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60008b612a3857826101200151612a3f565b8261010001515b6001600160a01b03881683529050612a56816145ce565b6001600160a01b0390811660208401819052612a93918e918a918e161182151514612a85578460200151612a87565b8c5b888f8860e001516148a9565b60808601526060850152604084015260c084015190975015612aeb57612ac2826080015183604001510161401e565b8b039a50612ae1612ad6836060015161401e565b606085015190614a77565b6060840152612b23565b612af8826060015161401e565b8b019a50612b1d612b12836080015184604001510161401e565b606085015190614a8d565b60608401525b825115612b6557825160808301516000916103e891612b4191614aa3565b81612b4e57612b4e61626e565b608085018051929091049182900390528551018552505b600083610140015162ffffff16118015612b88575060008360e0015162ffffff16115b15612bc9576000612bb1836080015185610140015162ffffff168660e0015162ffffff16613cef565b60808401805182900390526020860180519091019052505b6001600160801b03851615612c0057612bf48260800151600160801b876001600160801b0316613cef565b60808401805190910190525b8160200151876001600160a01b031603612d1c578260200151612c3b57600160208401528b612c3157600054612c35565b6001545b60a08401525b60008c15612caa5750608083015160a0840151600283810b600081815260036020819052604082209081018054828601805490980390975595909403909455600190920154600160801b810490910b61010087015261012086019190915260001983019750600f0b9003612d0a565b5060a08301516080840151600283810b60008181526003602081905260409091209081018054828501805490970390965594909303909355600190910154600160981b810490910b6101208601526101008501919091529095508590600f0b5b612d148682614acd565b955050612d3e565b81516001600160a01b03881614612d3e57612d36876142bb565b955050612d65565b508915801590612d605750886001600160a01b0316866001600160a01b031614155b612a26575b60008a83604001510390508260c0015115158c151514612d8a57826060015181612d91565b8083606001515b6002805476ffffffffffffffffffffffffffffffffffffffffffffff1916600160a01b62ffffff8b160273ffffffffffffffffffffffffffffffffffffffff1916176001600160a01b038b161790556020850151919a509850159050612e5e576101008201516101208301516009805462ffffff92831665ffffffffffff199091161763010000009290931691909102919091177fffffffffffffffffffff00000000000000000000000000000000ffffffffffff1666010000000000006001600160801b038716021790555b8a15612e71576080820151600055612e7a565b60808201516001555b50509550955095509550955095565b600080612e95600d5490565b600e5490925090506001600160801b03821180612eb857506001600160801b0381115b15612f7b576007546001600160a01b03166001600160801b03831115612f2157612f167f0000000000000000000000000000000000000000000000000000000000000000826ffffffffffffffffffffffffffffffffe1986016130a3565b6001600160801b0392505b6001600160801b03821115612f7957612f6e7f0000000000000000000000000000000000000000000000000000000000000000826ffffffffffffffffffffffffffffffffe1985016130a3565b6001600160801b0391505b505b600954660100000000000090046001600160801b03166000819003612f9f57509091565b600c546001600160801b0380821691600160801b9004168185118185118180612fc55750805b1561309a578115612ffd57612ff3846001600160801b03168803600160801b876001600160801b0316613cef565b6000805490910190555b801561303057613026836001600160801b03168703600160801b876001600160801b0316613cef565b6001805490910190555b604080516001600160801b038087168a0382528516880360208201527fef10ebb00f0dbc72ad4602e94abbbda6f3d40632714f70e9c8fa30d5d44289c9910160405180910390a16001600160801b03808816908716600160801b026001600160801b03191617600c555b50505050509091565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036130f95780600d60008282546130ee91906161e2565b90915550611ab09050565b80600e600082825461310b91906161e2565b9091555050505050565b60008412806131245750600083125b156131445760008413806131385750600083135b61314457613144616284565b801561319857600061315882840184616424565b90508060000151600d600082825461317091906161a0565b90915550506020810151600e805460009061318c9084906161a0565b90915550612338915050565b60008413156131be5783600d60008282546131b391906161a0565b909155506123389050565b60008313156123385782600e60008282546131d991906161a0565b909155505050505050565b60008411806131f35750600083115b806131fe5750600082115b806132095750600081115b1561349b5760048054600790600160d01b900463ffffffff166000808080806132358c8c888a8c614b47565b935093509350935080821760001461327b576132508261401e565b61325a908f616440565b6132638261401e565b61326d908f616440565b909e509c50600194506132e1565b6001600160681b0384841716156132e157600480547fffffffffffff000000000000000000000000000000000000000000000000000016600160681b6001600160681b03868116919091026cffffffffffffffffffffffffff1916919091179086161790555b60059750600696506132fc8a8a8863ffffffff168a8c614b47565b92965090945092509050818117156133ef576133178261401e565b613321908f616440565b61332a8261401e565b613334908f616440565b809e50819f505050600194506133ea63aa6b14bb60e01b600660009054906101000a90046001600160a01b03166001600160a01b031663aa6b14bb85856040518363ffffffff1660e01b8152600401613397929190918252602082015260400190565b6020604051808303816000875af11580156133b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133da9190616460565b6001600160e01b03191690613e96565b613455565b6001600160681b03848417161561345557600580547fffffffffffff000000000000000000000000000000000000000000000000000016600160681b6001600160681b03868116919091026cffffffffffffffffffffffffff1916919091179086161790555b841561349257600480547fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff16600160d01b4263ffffffff16021790555b50505050505050505b8585171561351f57600c546001600160801b0380821691600160801b90041687156134de576134d26134cd898461648a565b614c53565b6001600160801b031691505b86156134fd576134f16134cd888361648a565b6001600160801b031690505b6001600160801b039182169116600160801b026001600160801b03191617600c555b505050505050565b6040805162ffffff808516825283166020820152815133927f9443903d84c9719611bd4bba871daaf18a3950d00d5d78b1a2fa701f76df54ff928290030190a260408051888152602081018890526001600160a01b03878116828401526001600160801b0387166060830152600286900b60808301529151918a169133917fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67919081900360a00190a35050505050505050565b60028054600160c81b90041615611638576006546001600160a01b0316331461163857611638639cb5a96360e01b600660009054906101000a90046001600160a01b03166001600160a01b0316639cb5a963338c8c8c8c8c8c8c8c6040518a63ffffffff1660e01b8152600401808a6001600160a01b03168152602001896001600160a01b031681526020018815158152602001878152602001866001600160a01b03168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509a50505050505050505050506020604051808303816000875af1158015611079573d6000803e3d6000fd5b6006546001600160a01b03163314610ced57604051634994c26960e11b815260040160405180910390fd5b600080613720600d5490565b600e54600c5491935091506001600160801b0380821691600160801b900416818411806137555750806001600160801b031683115b1561253657816001600160801b03168411156137a8576137a87f0000000000000000000000000000000000000000000000000000000000000000866137a36001600160801b038616886161e2565b6130a3565b806001600160801b03168311156137f1576137f17f0000000000000000000000000000000000000000000000000000000000000000866137a36001600160801b038516876161e2565b6001600160a01b0385167fb94331e4420f16b156f53c397a8adcd09481283ee7830f7b688b22858e9db80b61382f6001600160801b038516876161e2565b6138426001600160801b038516876161e2565b6040805192835260208301919091520160405180910390a25050505050565b600254600160e01b900460ff16610ced57604051636798480960e11b815260040160405180910390fd5b6040805163e8ae2b6960e01b81527fb73ce166ead2f8e9add217713a7989e4edfba9625f71dfd2516204bb67ad3442600482015233602482015290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163e8ae2b699160448083019260209291908290030181865afa15801561391c573d6000803e3d6000fd5b505050506040513d602081101561393257600080fd5b5051610ced57604051634994c26960e11b815260040160405180910390fd5b600280547fffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff16600160d01b61ffff8416908102919091179091556040519081527f3647dccc990d4941b0b05b32527ef493a98d6187b20639ca2f9743f3b55ca5e1906020015b60405180910390a150565b6139cf620d89e71961629a565b60020b8160020b13156139f557604051631445443d60e01b815260040160405180910390fd5b8160020b8160020b13613a1b5760405163d9a841a760e01b815260040160405180910390fd5b620d89e719600283900b12156115a657604051631d1ac7f160e21b815260040160405180910390fd5b600254600090600160c81b900460041615613b94576006546001600160a01b03163303613a7357506000613b94565b600654604051632f1208d960e11b815233600482018181526001600160a01b038b8116602485015260028b810b60448601528a900b6064850152600f89900b608485015260c060a4850190815260c485018890526000959190911693635e2411b293928d928d928d928d928d928d92919060e401848480828437600081840152601f19601f8201169050808301925050509850505050505050505060408051808303816000875af1158015613b2c573d6000803e3d6000fd5b505050506040513d6040811015613b4257600080fd5b50805160209091015192509050620f424062ffffff831610613b77576040516315b2afa960e01b815260040160405180910390fd5b613b926001600160e01b03198216632f1208d960e11b613e96565b505b9695505050505050565b62ffffff818116908316601885811b91909117901b176000908152600b602052604090205b9392505050565b6002805460008054600154919384936001600160a01b03811693600160a01b90910490910b918491829190600f89900b15613c2657613c1060038c878c86866000614c69565b9350613c2360038b878c86866001614c69565b92505b600080613c3860038e8e8a8888614d5a565b91509150613c488e8c8484614df7565b5050505086600f0b600014613ce2578180613c605750805b15613c7957613c79898984848760008d600f0b12614eec565b6000613c888a8a8a8789614045565b91985096509050600f81900b15613ce057600954613cb990660100000000000090046001600160801b031689614acd565b600960066101000a8154816001600160801b0302191690836001600160801b031602179055505b505b5050505094509492505050565b60008383028160001985870982811083820303915050808411613d1157600080fd5b80600003613d2457508290049050613bc3565b8385870960008581038616958690049560026003880281188089028203028089028203028089028203028089028203028089028203028089029091030291819003819004600101858411909403939093029190930391909104170290509392505050565b6006546001600160a01b0316331461163857600254600160c81b9004600816156116385761163863d685201060e01b600660009054906101000a90046001600160a01b03166001600160a01b031663d6852010338c8c8c8c8c8c8c8c6040518a63ffffffff1660e01b8152600401808a6001600160a01b03168152602001896001600160a01b031681526020018860020b81526020018760020b815260200186600f0b8152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509a50505050505050505050506020604051808303816000875af1158015611079573d6000803e3d6000fd5b6001600160e01b0319828116908216146115a65760405163d3f5153b60e01b81526001600160e01b03198216600482015260240160405180910390fd5b6000831580613ef457505082820282848281613ef157613ef161626e565b04145b15613f155760008211613f0657600080fd5b81810490829006151501613bc3565b613f20848484613cef565b905060008280613f3257613f3261626e565b8486091115613bc3576000198110613f4957600080fd5b6001019392505050565b6000613f6182840184616424565b8051909150613f719086906161a0565b600d6000828254613f8291906161a0565b90915550506020810151613f979085906161a0565b600e6000828254613fa891906161a0565b90915550505050505050565b600280547fffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff16600160b81b61ffff8416908102919091179091556040519081527f598b9f043c813aa6be3426ca60d1c65d17256312890be5118dab55b0775ebe2a906020016139b7565b80600081121561402d57600080fd5b919050565b806000600f82900b121561402d57600080fd5b600080600080614054896145ce565b90506000614061896145ce565b90506000808b60020b8960020b12156140865761407f84848c614fe5565b91506140c4565b8a60020b8960020b12156140b65761409f88848c614fe5565b91506140ac84898c615025565b90508994506140c4565b6140c184848c615025565b90505b60008a600f0b126140d65781816140df565b81600003816000035b909d909c50949a509398505050505050505050565b801561410857600061315882840184616424565b83600d600082825461411a91906161a0565b9250508190555082600e60008282546131d991906161a0565b600280547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff16600160c81b60ff8416908102919091179091556040519081527f3a6271b36c1b44bd6a0a0d56230602dc6919b7c17af57254306fadf5fee69dc3906020016139b7565b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f27a3944eff2135a57675f17e72501038982b73620d01f794c72e93d61a3932a2906020016139b7565b6007805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fb0b573c1f636e1f8bd9b415ba6c04d6dd49100bc25493fc6305b65ec0e581df3906020016139b7565b600980547fffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff16600160b01b62ffffff841602179055604051600282900b81527f01413b1d5d4c359e9a0daa7909ecda165f6e8c51fe2ff529d74b22a5a7c02645906020016139b7565b60006401000276a36001600160a01b03831610806142f6575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b03831610155b15614314576040516355cf1e2360e01b815260040160405180910390fd5b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c979088119617909417909217179091171717608081106143b557607f810383901c91506143bf565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b146145bf57886001600160a01b03166145a4826145ce565b6001600160a01b031611156145b957816145c1565b806145c1565b815b9998505050505050505050565b6000600282900b60171d62ffffff818401821816620d89e881111561460657604051633c10250f60e01b815260040160405180910390fd5b600160801b600182161561462757506ffffcb933bd6fad37aa2d162d1a5940015b6002821615614646576ffff97272373d413259a46990580e213a0260801c5b6004821615614665576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615614684576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156146a3576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156146c2576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156146e1576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615614700576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615614720576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615614740576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615614760576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615614780576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156147a0576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156147c0576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156147e0576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615614800576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615614821576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615614841576e5d6af8dedb81196699c329225ee6040260801c5b620400008210614887576204000082161561486a576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615614887576b048a170391f7dc42444e8fa20260801c5b60008560020b131561489857600019045b63ffffffff0160201c949350505050565b600080600080615aef8a6148bf576150556148c3565b6150645b9050600087126149975760006148ec8888620f42400362ffffff16620f424062ffffff16613cef565b90506148fd8a8c8b8563ffffffff16565b945084811061492a57899550614923858862ffffff1689620f42400362ffffff16613ed3565b9250614970565b6149368b8a838f615073565b9550856001600160a01b03168a6001600160a01b03160361495957614959616284565b614968868c8b8563ffffffff16565b945084880392505b61498f868c8b8f6149835761508c614987565b61509b5b63ffffffff16565b935050614a69565b615aef8b6149a75761508c6149ab565b61509b5b90506149bc8a8c8b8463ffffffff16565b935087600003975060008812156149e6576040516334cb3a0160e11b815260040160405180910390fd5b8388106149f557899550614a3a565b614a018b8a8a8f6150aa565b9550856001600160a01b03168a6001600160a01b031614614a2e57614a2b868c8b8463ffffffff16565b93505b87841115614a3a578793505b614a49868c8b8563ffffffff16565b9450614a65858862ffffff1689620f42400362ffffff16613ed3565b9250505b509650965096509692505050565b8082038281131560008312151461221957600080fd5b8181018281121560008312151461221957600080fd5b6000821580614ac457505081810281838281614ac157614ac161626e565b04145b61221957600080fd5b60008082600f0b1215614b0f57508082016001600160801b0380841690821610614b0a576040516302603ee960e31b815260040160405180910390fd5b612219565b826001600160801b03168284019150816001600160801b0316101561221957604051634cba017960e11b815260040160405180910390fd5b600080808088881715614bf55784546001600160681b038082169160681c16614b708b836161a0565b9150614b7c8a826161a0565b9050617080614b918a63ffffffff42166161e2565b101580614ba457506001600160681b0382115b80614bb557506001600160681b0381115b15614be4578754600080614bca8585856150ba565b6000808d559a508a99509097509550614c47945050505050565b909450925060009150819050614c47565b617080614c088863ffffffff42166161e2565b10614c3a5784546001600160681b038082169160681c1680821715614c37578754600080614bca8585856150ba565b50505b5060009250829150819050805b95509550955095915050565b806001600160801b038116811461402d57600080fd5b600286900b6000908152602088905260408120805482614c898289614acd565b6001600160801b031690506d09745258e83de0d0f4e400fce799811115614cc3576040516312dc1b2560e11b815260040160405180910390fd5b6001830154600f0b85614ce75788600f0b81600f0b614ce2919061648a565b614cf9565b88600f0b81600f0b614cf99190616440565b6001850180546001600160801b0319166001600160801b0392909216919091179055818455811594506000839003614d4b57841594508960020b8b60020b13614d4b5760038401879055600284018890555b50505050979650505050505050565b600285810b60009081526020889052604080822087840b8084529183209293849391929088900b1215614dd0578860020b8760020b12614dab57816002015486039350816003015485039250614dba565b81600201549350816003015492505b6002810154600382015494039390920391610caf565b81600201548160020154039350816003015481600301540392505050965096945050505050565b8354600f84900b600003614e2157806001600160801b0316600003614e1c5750612338565b614e37565b614e2b8185614acd565b6001600160801b031685555b600185015460028601546000858314614e6e5760018801869055614e6b8387036001600160801b038616600160801b613cef565b90505b6000858314614e9b5760028901869055614e988387036001600160801b038716600160801b613cef565b90505b6001600160801b038282171615614ee157600389018054600160801b6001600160801b03808316860181166001600160801b031990931683178290048116850116021790555b505050505050505050565b60095463010000008104600290810b919081900b90600160c81b900463ffffffff168282828915614f2d57614f258c898386868c615134565b919450925090505b8815614f4957614f418b898386868c615134565b919450925090505b8260020b8660020b141580614f6457508160020b8560020b14155b80614f7b57508363ffffffff168163ffffffff1614155b15614fd7576009805462ffffff80861663010000000265ffffffffffff1963ffffffff8616600160c81b02167fffffff00000000ffffffffffffffffffffffffffffffffffffff00000000000090931692909217908516171790555b505050505050505050505050565b60008082600f0b121561500d576150056117418585856000036000615229565b60000361501d565b61501d6117418585856001615229565b949350505050565b60008082600f0b12156150455761500561174185858560000360006152d6565b61501d61174185858560016152d6565b600061501d83858460016152d6565b600061501d8484846001615229565b600061508385858585600161533d565b95945050505050565b600061501d8385846000615229565b600061501d84848460006152d6565b600061508385858585600061533d565b600080808086156150f4576150f07f000000000000000000000000000000000000000000000000000000000000000086896130a3565b8691505b8515615128576151257f000000000000000000000000000000000000000000000000000000000000000086886130a3565b50845b90969095509350505050565b6000806000831561517e5760008061514d60038c61556d565b915091508a60020b8860020b0361516657819750615177565b8a60020b8760020b03615177578096505b5050615207565b6000808a60020b8860020b12801561519b57508a60020b8760020b135b156151c457508690508560028a810b908c900b13156151bc578a96506151f7565b8a97506151f7565b6151d26008600a8b8e6156db565b600281810b600090815260036020526040902060010154600160801b9004900b925090505b61520460038c8484615790565b50505b60006152176008600a8a8d615886565b969a9599509597509395505050505050565b60006001600160a01b038585038116908516811061524657600080fd5b7bffffffffffffffffffffffffffffffff000000000000000000000000606085901b168361529f57866001600160a01b031661528c8383896001600160a01b0316613cef565b816152995761529961626e565b046152cb565b6152cb6152b68383896001600160a01b0316613ed3565b886001600160a01b0316808204910615150190565b979650505050505050565b6000846001600160a01b0316846001600160a01b031610156152f757600080fd5b6001600160a01b0385850316826153255761532081856001600160801b0316600160601b613cef565b613b94565b613b9481856001600160801b0316600160601b613ed3565b6000856001600160a01b031660000361535557600080fd5b846001600160801b031660000361536b57600080fd5b8360000361537a575084615083565b81151583151503615488577bffffffffffffffffffffffffffffffff000000000000000000000000606086901b168215615436576001600160a01b038716858102908682816153cb576153cb61626e565b04036153fb578181018281106153f9576153ef838a6001600160a01b031683613ed3565b9350505050615083565b505b61542d82615422888b6001600160a01b0316868161541b5761541b61626e565b049061591e565b808204910615150190565b92505050615083565b6001600160a01b038716858102908682816154535761545361626e565b041461545e57600080fd5b80821161546a57600080fd5b61542d615483838a6001600160a01b0316848603613ed3565b61592e565b81156154f5576154ee6154836001600160a01b038611156154c0576154bb86600160601b896001600160801b0316613cef565b6154de565b6001600160801b038716606087901b816154dc576154dc61626e565b045b6001600160a01b0389169061591e565b9050615083565b60006001600160a01b038511156155235761551e85600160601b886001600160801b0316613ed3565b615540565b615540606086901b6001600160801b038816808204910615150190565b905080876001600160a01b03161161555757600080fd5b6001600160a01b03871603905095945050505050565b600281810b60008181526020859052604081206001810180548383557fffffffffffffffffffff000000000000000000000000000000000000000000008116909155818501839055600390910191909155600160801b8104830b92600160981b909104900b90620d89e71914806155f557506155ec620d89e71961629a565b60020b8360020b145b1561564e57600283900b6000908152602085905260409020600101805462ffffff808516600160801b0262ffffff60801b19918516600160981b029190911665ffffffffffff60801b19909216919091171790556156d4565b8060020b8260020b0361567457604051630d6e094960e01b815260040160405180910390fd5b600282810b6000908152602086905260408082206001908101805462ffffff808816600160981b0262ffffff60981b19909216919091179091559385900b83529120018054918416600160801b0262ffffff60801b199092169190911790555b9250929050565b600190810190600090600883811d610d8a01901c90829061ffff83161b851663ffffffff161561573e5761570f8785615944565b9094509092509050801561572457505061501d565b61573586610d8b840160010b615944565b90945090925090505b806157815761575c8563ffffffff168360010193508360010b615975565b9093509050806157745750620d89e8915061501d9050565b61577e8684615ac3565b92505b6152cb87610d89198501615ac3565b600283900b620d89e71914806157b757506157ae620d89e71961629a565b60020b8360020b145b612338578260020b8260020b1280156157d557508260020b8160020b135b6157f25760405163e45ac17d60e01b815260040160405180910390fd5b600283810b600090815260209590955260408086206001908101805465ffffffffffff60801b1916600160981b62ffffff878116820262ffffff60801b1990811693909317600160801b8a831681029190911790945597860b8a52848a208401805462ffffff60981b191698909916908102979097179097559390920b865290942090930180549092169202919091179055565b816000806158c38785600881901d600181810b60009081526020949094526040909320805460ff9093169390931b80831890935591811490151891565b91509150811561591457610d8a01600181810b60081d80820b6000908152602089905260409020805460ff9094169290921b808418909255821591909214818118935014615914576001811b831892505b5050949350505050565b8082018281101561221957600080fd5b806001600160a01b038116811461402d57600080fd5b600881901d600181900b60009081526020849052604081205481906159699085615975565b93969095509293505050565b60008060ff831684811c808303615991578460ff179350615aba565b7f555555555555555555555555555555555555555555555555555555555555555560008290038216908116156001600160801b0382161560071b1777ffffffffffffffff0000000000000000ffffffffffffffff82161560061b177bffffffff00000000ffffffff00000000ffffffff00000000ffffffff82161560051b177dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff82161560041b177eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff82161560031b177f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f82161560021b177f33333333333333333333333333333333333333333333333333333333333333339091161560011b1760ff1685019350600192505b50509250929050565b600181900b600090815260208390526040902054600882901b90615ae79082615975565b509392505050565b610ced6164b2565b8035600281900b811461402d57600080fd5b6001600160801b0381168114610d6b57600080fd5b600080600080600060a08688031215615b3657600080fd5b615b3f86615af7565b9450615b4d60208701615af7565b93506040860135615b5d81615b09565b94979396509394606081013594506080013592915050565b60008060408385031215615b8857600080fd5b50508035926020909101359150565b6001600160a01b0381168114610d6b57600080fd5b8035801515811461402d57600080fd5b60008083601f840112615bce57600080fd5b50813567ffffffffffffffff811115615be657600080fd5b6020830191508360208285010111156156d457600080fd5b60008060008060008060a08789031215615c1757600080fd5b8635615c2281615b97565b9550615c3060208801615bac565b9450604087013593506060870135615c4781615b97565b9250608087013567ffffffffffffffff811115615c6357600080fd5b615c6f89828a01615bbc565b979a9699509497509295939492505050565b61ffff81168114610d6b57600080fd5b600060208284031215615ca357600080fd5b8135613bc381615c81565b600080600080600060808688031215615cc657600080fd5b615ccf86615af7565b9450615cdd60208701615af7565b93506040860135615ced81615b09565b9250606086013567ffffffffffffffff811115615d0957600080fd5b615d1588828901615bbc565b969995985093965092949392505050565b600080600080600060808688031215615d3e57600080fd5b8535615d4981615b97565b94506020860135935060408601359250606086013567ffffffffffffffff811115615d0957600080fd5b600080600080600060a08688031215615d8b57600080fd5b8535615d9681615b97565b9450615da460208701615af7565b9350615db260408701615af7565b92506060860135615dc281615b09565b91506080860135615dd281615b09565b809150509295509295909350565b600060208284031215615df257600080fd5b5035919050565b600080600060608486031215615e0e57600080fd5b8335615e1981615b97565b95602085013595506040909401359392505050565b600080600080600080600060c0888a031215615e4957600080fd5b8735615e5481615b97565b96506020880135615e6481615b97565b9550615e7260408901615bac565b9450606088013593506080880135615e8981615b97565b925060a088013567ffffffffffffffff811115615ea557600080fd5b615eb18a828b01615bbc565b989b979a50959850939692959293505050565b600060208284031215615ed657600080fd5b8135613bc381615b09565b600080600080600080600060c0888a031215615efc57600080fd5b8735615f0781615b97565b96506020880135615f1781615b97565b9550615f2560408901615af7565b9450615f3360608901615af7565b93506080880135615e8981615b09565b60008060008060808587031215615f5957600080fd5b615f6285615af7565b93506020850135615f7281615b09565b93969395505050506040820135916060013590565b600060208284031215615f9957600080fd5b813560ff81168114613bc357600080fd5b600080600080600060a08688031215615fc257600080fd5b615fcb86615bac565b9450602086013593506040860135615b5d81615b97565b600060208284031215615ff457600080fd5b81358060010b8114613bc357600080fd5b60006020828403121561601757600080fd5b8135613bc381615b97565b6000806040838503121561603557600080fd5b82359150602083013561604781615b97565b809150509250929050565b60006020828403121561606457600080fd5b613bc382615af7565b6000806040838503121561608057600080fd5b823561608b81615b09565b9150602083013561604781615b09565b815181526020808301519082015260408101612219565b6000815180845260005b818110156160d8576020818501810151868301820152016160bc565b506000602082860101526020601f19601f83011685010191505092915050565b60006001600160a01b0380891683528088166020840152508560020b60408301528460020b60608301526001600160801b038416608083015260c060a083015261614560c08301846160b2565b98975050505050505050565b60008060006060848603121561616657600080fd5b8351925060208401519150604084015161617f81615b09565b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b808201808211156122195761221961618a565b600081600f0b6f7fffffffffffffffffffffffffffffff1981036161d9576161d961618a565b60000392915050565b818103818111156122195761221961618a565b6001600160801b038181168382160190808211156162155761621561618a565b5092915050565b6001600160a01b0385168152836020820152826040820152608060608201526000613b9460808301846160b2565b6000806040838503121561625d57600080fd5b505080516020909101519092909150565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052600160045260246000fd5b60008160020b627fffff1981036161d9576161d961618a565b60008260020b8260020b028060020b91508082146162155761621561618a565b600282810b9082900b03627fffff198112627fffff821317156122195761221961618a565b600281810b9083900b01627fffff8113627fffff19821217156122195761221961618a565b60006001600160a01b0380891683528088166020840152861515604084015285606084015280851660808401525060c060a083015261614560c08301846160b2565b60006020828403121561637157600080fd5b8151613bc381615c81565b6000806040838503121561638f57600080fd5b825161639a81615b09565b602084015190925061604781615b09565b62ffffff8181168382160190808211156162155761621561618a565b6000604082840312156163d957600080fd5b6040516040810181811067ffffffffffffffff8211171561640a57634e487b7160e01b600052604160045260246000fd5b604052823581526020928301359281019290925250919050565b60006040828403121561643657600080fd5b613bc383836163c7565b81810360008312801583831316838312821617156162155761621561618a565b60006020828403121561647257600080fd5b81516001600160e01b031981168114613bc357600080fd5b80820182811260008312801582168215821617156164aa576164aa61618a565b505092915050565b634e487b7160e01b600052605160045260246000fdfea164736f6c6343000814000a",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
