Overview
APE Balance
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
QueryData
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2024-10-21 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.17; /// @title Pool state that never changes /// @notice These parameters are fixed for a pool forever, i.e., the methods will always return the same values interface IUniswapV3PoolImmutables { /// @notice The contract that deployed the pool, which must adhere to the IUniswapV3Factory interface /// @return The contract address function factory() external view returns (address); /// @notice The first of the two tokens of the pool, sorted by address /// @return The token contract address function token0() external view returns (address); /// @notice The second of the two tokens of the pool, sorted by address /// @return The token contract address function token1() external view returns (address); /// @notice The pool's fee in hundredths of a bip, i.e. 1e-6 /// @return The fee function fee() external view returns (uint24); /// @notice The pool tick spacing /// @dev Ticks can only be used at multiples of this value, minimum of 1 and always positive /// e.g.: a tickSpacing of 3 means ticks can be initialized every 3rd tick, i.e., ..., -6, -3, 0, 3, 6, ... /// This value is an int24 to avoid casting even though it is always positive. /// @return The tick spacing function tickSpacing() external view returns (int24); /// @notice The maximum amount of position liquidity that can use any tick in the range /// @dev This parameter is enforced per tick to prevent liquidity from overflowing a uint128 at any point, and /// also prevents out-of-range liquidity from being used to prevent adding in-range liquidity to a pool /// @return The max amount of liquidity per tick function maxLiquidityPerTick() external view returns (uint128); } /// @title Pool state that can change /// @notice These methods compose the pool's state, and can change with any frequency including multiple times /// per transaction interface IUniswapV3PoolState { /// @notice The 0th storage slot in the pool stores many values, and is exposed as a single method to save gas /// when accessed externally. /// @return sqrtPriceX96 The current price of the pool as a sqrt(token1/token0) Q64.96 value /// tick The current tick of the pool, i.e. according to the last tick transition that was run. /// This value may not always be equal to SqrtTickMath.getTickAtSqrtRatio(sqrtPriceX96) if the price is on a tick /// boundary. /// observationIndex The index of the last oracle observation that was written, /// observationCardinality The current maximum number of observations stored in the pool, /// observationCardinalityNext The next maximum number of observations, to be updated when the observation. /// feeProtocol The protocol fee for both tokens of the pool. /// Encoded as two 4 bit values, where the protocol fee of token1 is shifted 4 bits and the protocol fee of token0 /// is the lower 4 bits. Used as the denominator of a fraction of the swap fee, e.g. 4 means 1/4th of the swap fee. /// unlocked Whether the pool is currently locked to reentrancy function slot0() external view returns ( uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, uint8 feeProtocol, bool unlocked ); /// @notice The fee growth as a Q128.128 fees of token0 collected per unit of liquidity for the entire life of the pool /// @dev This value can overflow the uint256 function feeGrowthGlobal0X128() external view returns (uint256); /// @notice The fee growth as a Q128.128 fees of token1 collected per unit of liquidity for the entire life of the pool /// @dev This value can overflow the uint256 function feeGrowthGlobal1X128() external view returns (uint256); /// @notice The amounts of token0 and token1 that are owed to the protocol /// @dev Protocol fees will never exceed uint128 max in either token function protocolFees() external view returns (uint128 token0, uint128 token1); /// @notice The currently in range liquidity available to the pool /// @dev This value has no relationship to the total liquidity across all ticks function liquidity() external view returns (uint128); /// @notice Look up information about a specific tick in the pool /// @param tick The tick to look up /// @return liquidityGross the total amount of position liquidity that uses the pool either as tick lower or /// tick upper, /// liquidityNet how much liquidity changes when the pool price crosses the tick, /// feeGrowthOutside0X128 the fee growth on the other side of the tick from the current tick in token0, /// feeGrowthOutside1X128 the fee growth on the other side of the tick from the current tick in token1, /// tickCumulativeOutside the cumulative tick value on the other side of the tick from the current tick /// secondsPerLiquidityOutsideX128 the seconds spent per liquidity on the other side of the tick from the current tick, /// secondsOutside the seconds spent on the other side of the tick from the current tick, /// initialized Set to true if the tick is initialized, i.e. liquidityGross is greater than 0, otherwise equal to false. /// Outside values can only be used if the tick is initialized, i.e. if liquidityGross is greater than 0. /// In addition, these values are only relative and must be used only in comparison to previous snapshots for /// a specific position. function ticks( int24 tick ) external view returns ( uint128 liquidityGross, int128 liquidityNet, uint256 feeGrowthOutside0X128, uint256 feeGrowthOutside1X128, int56 tickCumulativeOutside, uint160 secondsPerLiquidityOutsideX128, uint32 secondsOutside, bool initialized ); /// @notice Returns 256 packed tick initialized boolean values. See TickBitmap for more information function tickBitmap(int16 wordPosition) external view returns (uint256); /// @notice Returns the information about a position by the position's key /// @param key The position's key is a hash of a preimage composed by the owner, tickLower and tickUpper /// @return _liquidity The amount of liquidity in the position, /// Returns feeGrowthInside0LastX128 fee growth of token0 inside the tick range as of the last mint/burn/poke, /// Returns feeGrowthInside1LastX128 fee growth of token1 inside the tick range as of the last mint/burn/poke, /// Returns tokensOwed0 the computed amount of token0 owed to the position as of the last mint/burn/poke, /// Returns tokensOwed1 the computed amount of token1 owed to the position as of the last mint/burn/poke function positions( bytes32 key ) external view returns ( uint128 _liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, uint128 tokensOwed0, uint128 tokensOwed1 ); /// @notice Returns data about a specific observation index /// @param index The element of the observations array to fetch /// @dev You most likely want to use #observe() instead of this method to get an observation as of some amount of time /// ago, rather than at a specific index in the array. /// @return blockTimestamp The timestamp of the observation, /// Returns tickCumulative the tick multiplied by seconds elapsed for the life of the pool as of the observation timestamp, /// Returns secondsPerLiquidityCumulativeX128 the seconds per in range liquidity for the life of the pool as of the observation timestamp, /// Returns initialized whether the observation has been initialized and the values are safe to use function observations( uint256 index ) external view returns ( uint32 blockTimestamp, int56 tickCumulative, uint160 secondsPerLiquidityCumulativeX128, bool initialized ); } interface IZumiPool { function points(int24 tick) external view returns (uint256, int128, uint256, uint256, bool); function pointDelta() external view returns (int24); function orderOrEndpoint(int24 tick) external view returns (int24); function limitOrderData( int24 point ) external view returns ( uint128 sellingX, uint128 earnY, uint256 accEarnY, uint256 legacyAccEarnY, uint128 legacyEarnY, uint128 sellingY, uint128 earnX, uint128 legacyEarnX, uint256 accEarnX, uint256 legacyAccEarnX ); function pointBitmap(int16 tick) external view returns (uint256); function factory() external view returns (address); } interface IHorizonPool { function tickDistance() external view returns (int24); function ticks( int24 tick ) external view returns ( uint128 liquidityGross, int128 liquidityNet, uint256 feeGrowthOutside, uint128 secondsPerLiquidityOutside ); function initializedTicks(int24 tick) external view returns (int24 previous, int24 next); function getPoolState() external view returns (uint160 sqrtP, int24 currentTick, int24 nearestCurrentTick, bool locked); } /// @title The interface for a Uniswap V3 Pool /// @notice A Uniswap pool facilitates swapping and automated market making between any two assets that strictly conform /// to the ERC20 specification /// @dev The pool interface is broken up into many smaller pieces interface IAlgebraPool { function globalState() external view returns ( uint160 price, int24 tick, int24 prevInitializedTick, uint16 fee, uint16 timepointIndex, uint8 communityFee, bool unlocked ); function tickSpacing() external view returns (int24); function ticks( int24 tick ) external view returns ( uint128 liquidityTotal, int128 liquidityDelta, uint256 outerFeeGrowth0Token, uint256 outerFeeGrowth1Token, int24 prevTick, int24 nextTick, uint160 outerSecondsPerLiquidity, uint32 outerSecondsSpent, bool hasLimitOrders ); function tickTable(int16 wordPosition) external view returns (uint256); function prevInitializedTick() external view returns (int24); } interface IAlgebraPoolV1_9 { function globalState() external view returns ( uint160 price, int24 tick, int24 prevInitializedTick, uint16 fee, uint16 timepointIndex, uint8 communityFee, bool unlocked ); function tickSpacing() external view returns (int24); function ticks( int24 tick ) external view returns ( uint128 liquidityTotal, int128 liquidityDelta, uint256 outerFeeGrowth0Token, uint256 outerFeeGrowth1Token, int56 outerTickCumulative, uint160 outerSecondsPerLiquidity, uint32 outerSecondsSpent, bool initialized ); function tickTable(int16 wordPosition) external view returns (uint256); } interface IUniswapV3Pool is IUniswapV3PoolImmutables, IUniswapV3PoolState {} /// @title DexNativeRouter /// @notice Entrance of trading native token in web3-dex contract QueryData { int24 internal constant MIN_TICK_MINUS_1 = -887_272 - 1; int24 internal constant MAX_TICK_PLUS_1 = 887_272 + 1; struct SuperVar { int24 tickSpacing; int24 currTick; int24 right; int24 left; int24 leftMost; int24 rightMost; uint256 initPoint; uint256 initPoint2; } /** * 算法逻辑: * 1. 查到slot0对应的currTick和tickSpacing * 2. 根据currTick算出当前的word, 如果currTick < 0, 则word--. 原因是 tick 1 和 tick -1在除以256之后的word都是0, 为了区别, 将tick -1 存放在 word=-1的map上 * 3. 查到currTick对应的initPoint, 即currTick在tickMap里面的index, index值的取值范围只能是 [0, 255], 所以需要对256 取模. 利用的是 currTick/tickSpacing = index + (currTick/tickSpacing//256 - 0 ? 1)* 256 * 4. 分成两个方向进行遍历, 第一个方向从小到大, 第二个方向从大到小 * 假设tickMap查出来的结果如下: 10101010 (8bit 方便理解), initPoint = 3, 即: 1010[1]010 * 5. 方向从小到大: * 5.1 首先把结果res向右移动initPoint位,得到新的结果如下: 00010101. 移动过后,左侧用0补齐 * 5.2 取res中的最右侧元素与0b00000001进行比较, 如果为true, 此时最右侧元素的index即为原先的initPoint. 如果为false, 说明没有流动性, 则进行下一个循环 * 5.3 然后根据index 和 right值, 重新利用公式 (index + 256 * right) * tickSpacing = tick 算出tick * 5.4 根据算出的tick拿到对应的delta L和 limitOrder的数据 * 5.5 循环开始条件即为 i = initPoint, 循环次数应该为: 256 - initPoint, 即循环条件为 i < 256, 方向为 i++ * 6. 方向从大到小: * 6.1 首先把结果res向左移动256-initPoint位, 得到新的结果如下: 01000000, 移动过后, 右侧用0补齐 * 6.2 去res中的最左侧元素与0b10000000进行比较, 如果为true, 说明有流动性. 注意此时的index为原先的initPoint - 1, 而不是initPoint. 如果为false, 说明没有流动性, 则进行下一个循环 * 6.3 然后根据index 和 left, 重新利用公式 (index + 256 * left) * tickSpacing = tick 算出tick * 6.4 根据算出的tick拿到对应的delta L和 limitOrder的数据 * 6.5 循环的开始条件即为 i = initPoint - 1, 循环次数为: initPoint次, 即循环条件为 i >= 0, 方向为 i-- * * 问题是: * initPoint = 0时, 方向从大到小应该怎么处理? 此时应该进入下一个循环. */ function queryUniv3TicksSuperCompact(address pool, uint256 len) public view returns (bytes memory) { SuperVar memory tmp; tmp.tickSpacing = IUniswapV3Pool(pool).tickSpacing(); // fix-bug: pancake pool's slot returns different types of params than uniV3, which will cause problem { (, bytes memory slot0) = pool.staticcall(abi.encodeWithSignature("slot0()")); int24 currTick; assembly { currTick := mload(add(slot0, 64)) } tmp.currTick = currTick; } tmp.right = tmp.currTick / tmp.tickSpacing / int24(256); tmp.leftMost = -887_272 / tmp.tickSpacing / int24(256) - 2; tmp.rightMost = 887_272 / tmp.tickSpacing / int24(256) + 1; if (tmp.currTick < 0) { tmp.initPoint = uint256( int256(tmp.currTick) / int256(tmp.tickSpacing) - (int256(tmp.currTick) / int256(tmp.tickSpacing) / 256 - 1) * 256 ) % 256; } else { tmp.initPoint = (uint256(int256(tmp.currTick)) / uint256(int256(tmp.tickSpacing))) % 256; } tmp.initPoint2 = tmp.initPoint; if (tmp.currTick < 0) tmp.right--; bytes memory tickInfo; tmp.left = tmp.right; uint256 index = 0; while (index < len / 2 && tmp.right < tmp.rightMost) { uint256 res = IUniswapV3Pool(pool).tickBitmap(int16(tmp.right)); if (res > 0) { res = res >> tmp.initPoint; for (uint256 i = tmp.initPoint; i < 256 && index < len / 2; i++) { uint256 isInit = res & 0x01; if (isInit > 0) { int256 tick = int256((256 * tmp.right + int256(i)) * tmp.tickSpacing); // (, int128 liquidityNet,,,,,,) = IUniswapV3Pool(pool).ticks(int24(int256(tick))); // fix-bug: to make consistent with solidlyV3 and ramsesV2 int128 liquidityNet; (, bytes memory d) = pool.staticcall( abi.encodeWithSelector(IUniswapV3PoolState.ticks.selector, int24(int256(tick))) ); assembly { liquidityNet := mload(add(d, 64)) } int256 data = int256(uint256(int256(tick)) << 128) + (int256(liquidityNet) & 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff); tickInfo = bytes.concat(tickInfo, bytes32(uint256(data))); index++; } res = res >> 1; } } tmp.initPoint = 0; tmp.right++; } bool isInitPoint = true; while (index < len && tmp.left > tmp.leftMost) { uint256 res = IUniswapV3Pool(pool).tickBitmap(int16(tmp.left)); if (res > 0 && tmp.initPoint2 != 0) { res = isInitPoint ? res << ((256 - tmp.initPoint2) % 256) : res; for (uint256 i = tmp.initPoint2 - 1; i >= 0 && index < len; i--) { uint256 isInit = res & 0x8000000000000000000000000000000000000000000000000000000000000000; if (isInit > 0) { int256 tick = int256((256 * tmp.left + int256(i)) * tmp.tickSpacing); // (, int128 liquidityNet,,,,,,) = IUniswapV3Pool(pool).ticks(int24(int256(tick))); // fix-bug: to make consistent with solidlyV3 and ramsesV2 int128 liquidityNet; (, bytes memory d) = pool.staticcall( abi.encodeWithSelector(IUniswapV3PoolState.ticks.selector, int24(int256(tick))) ); assembly { liquidityNet := mload(add(d, 64)) } int256 data = int256(uint256(int256(tick)) << 128) + (int256(liquidityNet) & 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff); tickInfo = bytes.concat(tickInfo, bytes32(uint256(data))); index++; } res = res << 1; if (i == 0) break; } } isInitPoint = false; tmp.initPoint2 = 256; tmp.left--; } return tickInfo; } function queryAlgebraTicksSuperCompact(address pool, uint256 len) public view returns (bytes memory) { SuperVar memory tmp; { (, bytes memory slot0) = pool.staticcall(abi.encodeWithSignature("globalState()")); int24 currTick; assembly { currTick := mload(add(slot0, 64)) } tmp.currTick = currTick; } tmp.right = tmp.currTick / int24(256); tmp.leftMost = -887_272 / int24(256) - 2; tmp.rightMost = 887_272 / int24(256) + 1; if (tmp.currTick < 0) { tmp.initPoint = (256 - (uint256(int256(-tmp.currTick)) % 256)) % 256; } else { tmp.initPoint = uint256(int256(tmp.currTick)) % 256; } tmp.initPoint2 = tmp.initPoint; if (tmp.currTick < 0) tmp.right--; bytes memory tickInfo; tmp.left = tmp.right; uint256 index = 0; while (index < len / 2 && tmp.right < tmp.rightMost) { uint256 res = IAlgebraPoolV1_9(pool).tickTable(int16(tmp.right)); if (res > 0) { res = res >> tmp.initPoint; for (uint256 i = tmp.initPoint; i < 256 && index < len / 2; i++) { uint256 isInit = res & 0x01; if (isInit > 0) { int256 tick = int256((256 * tmp.right + int256(i))); // (, int128 liquidityNet,,,,,,) = IAlgebraPoolV1_9(pool).ticks(int24(int256(tick))); (, bytes memory deltaL) = pool.staticcall(abi.encodeWithSignature("ticks(int24)", tick)); int128 liquidityNet; assembly { liquidityNet := mload(add(deltaL, 64)) } int256 data = int256(uint256(int256(tick)) << 128) + (int256(liquidityNet) & 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff); tickInfo = bytes.concat(tickInfo, bytes32(uint256(data))); index++; } res = res >> 1; } } tmp.initPoint = 0; tmp.right++; } bool isInitPoint = true; while (index < len && tmp.left > tmp.leftMost) { uint256 res = IAlgebraPoolV1_9(pool).tickTable(int16(tmp.left)); if (res > 0 && tmp.initPoint2 != 0) { res = isInitPoint ? res << ((256 - tmp.initPoint2) % 256) : res; for (uint256 i = tmp.initPoint2 - 1; i >= 0 && index < len; i--) { uint256 isInit = res & 0x8000000000000000000000000000000000000000000000000000000000000000; if (isInit > 0) { int256 tick = int256((256 * tmp.left + int256(i))); // (, int128 liquidityNet,,,,,,) = IAlgebraPoolV1_9(pool).ticks(int24(int256(tick))); (, bytes memory deltaL) = pool.staticcall(abi.encodeWithSignature("ticks(int24)", tick)); int128 liquidityNet; assembly { liquidityNet := mload(add(deltaL, 64)) } int256 data = int256(uint256(int256(tick)) << 128) + (int256(liquidityNet) & 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff); tickInfo = bytes.concat(tickInfo, bytes32(uint256(data))); index++; } res = res << 1; if (i == 0) break; } } isInitPoint = false; tmp.initPoint2 = 256; tmp.left--; } return tickInfo; } function queryAlgebraTicksSuperCompact3_back(address pool, uint256 len) public view returns (bytes memory) { SuperVar memory tmp; tmp.tickSpacing = IAlgebraPool(pool).tickSpacing(); { (, bytes memory slot0) = pool.staticcall(abi.encodeWithSignature("globalState()")); int24 currTick; assembly { currTick := mload(add(slot0, 64)) } tmp.currTick = currTick; } tmp.right = tmp.currTick / tmp.tickSpacing / int24(256); tmp.leftMost = -887_272 / tmp.tickSpacing / int24(256) - 2; tmp.rightMost = 887_272 / tmp.tickSpacing / int24(256) + 1; if (tmp.currTick < 0) { tmp.initPoint = uint256( int256(tmp.currTick) / int256(tmp.tickSpacing) - (int256(tmp.currTick) / int256(tmp.tickSpacing) / 256 - 1) * 256 ) % 256; } else { tmp.initPoint = (uint256(int256(tmp.currTick)) / uint256(int256(tmp.tickSpacing))) % 256; } tmp.initPoint2 = tmp.initPoint; if (tmp.currTick < 0) tmp.right--; bytes memory tickInfo; tmp.left = tmp.right; uint256 index = 0; while (index < len / 2 && tmp.right < tmp.rightMost) { uint256 res = IAlgebraPoolV1_9(pool).tickTable(int16(tmp.right)); if (res > 0) { res = res >> tmp.initPoint; for (uint256 i = tmp.initPoint; i < 256 && index < len / 2; i++) { uint256 isInit = res & 0x01; if (isInit > 0) { int256 tick = int256((256 * tmp.right + int256(i)) * tmp.tickSpacing); // (, int128 liquidityNet,,,,,,) = IAlgebraPoolV1_9(pool).ticks(int24(int256(tick))); (, bytes memory deltaL) = pool.staticcall(abi.encodeWithSignature("ticks(int24)", tick)); int128 liquidityNet; assembly { liquidityNet := mload(add(deltaL, 64)) } int256 data = int256(uint256(int256(tick)) << 128) + (int256(liquidityNet) & 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff); tickInfo = bytes.concat(tickInfo, bytes32(uint256(data))); index++; } res = res >> 1; } } tmp.initPoint = 0; tmp.right++; } bool isInitPoint = true; while (index < len && tmp.left > tmp.leftMost) { uint256 res = IAlgebraPoolV1_9(pool).tickTable(int16(tmp.left)); if (res > 0 && tmp.initPoint2 != 0) { res = isInitPoint ? res << ((256 - tmp.initPoint2) % 256) : res; for (uint256 i = tmp.initPoint2 - 1; i >= 0 && index < len; i--) { uint256 isInit = res & 0x8000000000000000000000000000000000000000000000000000000000000000; if (isInit > 0) { int256 tick = int256((256 * tmp.left + int256(i)) * tmp.tickSpacing); // (, int128 liquidityNet,,,,,,) = IAlgebraPoolV1_9(pool).ticks(int24(int256(tick))); (, bytes memory deltaL) = pool.staticcall(abi.encodeWithSignature("ticks(int24)", tick)); int128 liquidityNet; assembly { liquidityNet := mload(add(deltaL, 64)) } int256 data = int256(uint256(int256(tick)) << 128) + (int256(liquidityNet) & 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff); tickInfo = bytes.concat(tickInfo, bytes32(uint256(data))); index++; } res = res << 1; if (i == 0) break; } } isInitPoint = false; tmp.initPoint2 = 256; tmp.left--; } return tickInfo; } function queryHorizonTicksSuperCompact(address pool, uint256 iteration) public view returns (bytes memory) { (, , int24 currTick, ) = IHorizonPool(pool).getPoolState(); int24 currTick2 = currTick; uint256 threshold = iteration / 2; // travel from left to right bytes memory tickInfo; while (currTick < MAX_TICK_PLUS_1 && iteration > threshold) { (, int128 liquidityNet, , ) = IHorizonPool(pool).ticks(currTick); int256 data = int256(uint256(int256(currTick)) << 128) + (int256(liquidityNet) & 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff); tickInfo = bytes.concat(tickInfo, bytes32(uint256(data))); (, int24 nextTick) = IHorizonPool(pool).initializedTicks(currTick); if (currTick == nextTick) { break; } currTick = nextTick; iteration--; } while (currTick2 > MIN_TICK_MINUS_1 && iteration > 0) { (, int128 liquidityNet, , ) = IHorizonPool(pool).ticks(currTick2); int256 data = int256(uint256(int256(currTick2)) << 128) + (int256(liquidityNet) & 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff); tickInfo = bytes.concat(tickInfo, bytes32(uint256(data))); (int24 prevTick, ) = IHorizonPool(pool).initializedTicks(currTick2); if (prevTick == currTick2) { break; } currTick2 = prevTick; iteration--; } return tickInfo; } function queryAlgebraTicksSuperCompact2(address pool, uint256 iteration) public view returns (bytes memory) { int24 currTick; { (bool s, bytes memory res) = pool.staticcall(abi.encodeWithSignature("prevInitializedTick()")); if (s) { currTick = abi.decode(res, (int24)); } else { (s, res) = pool.staticcall(abi.encodeWithSignature("globalState()")); if (s) { assembly { currTick := mload(add(res, 96)) } } } } int24 currTick2 = currTick; uint256 threshold = iteration / 2; // travel from left to right bytes memory tickInfo; while (currTick < MAX_TICK_PLUS_1 && iteration > threshold) { (, int128 liquidityNet, , , int24 prevTick, int24 nextTick, , , ) = IAlgebraPool(pool).ticks(currTick); int256 data = int256(uint256(int256(currTick)) << 128) + (int256(liquidityNet) & 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff); tickInfo = bytes.concat(tickInfo, bytes32(uint256(data))); if (currTick == nextTick) { break; } currTick = nextTick; iteration--; } while (currTick2 > MIN_TICK_MINUS_1 && iteration > 0) { (, int128 liquidityNet, , , int24 prevTick, int24 nextTick, , , ) = IAlgebraPool(pool).ticks(currTick2); int256 data = int256(uint256(int256(currTick2)) << 128) + (int256(liquidityNet) & 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff); tickInfo = bytes.concat(tickInfo, bytes32(uint256(data))); if (currTick2 == prevTick) { break; } currTick2 = prevTick; iteration--; } return tickInfo; } function queryIzumiSuperCompact(address pool, uint256 len) public view returns (bytes memory, bytes memory) { SuperVar memory tmp; tmp.tickSpacing = IZumiPool(pool).pointDelta(); { (, bytes memory slot0) = pool.staticcall(abi.encodeWithSignature("state()")); int24 currTick; assembly { currTick := mload(add(slot0, 64)) } tmp.currTick = currTick; } tmp.right = tmp.currTick / tmp.tickSpacing / int24(256); tmp.leftMost = -887_272 / tmp.tickSpacing / int24(256) - 2; tmp.rightMost = 887_272 / tmp.tickSpacing / int24(256) + 1; if (tmp.currTick < 0) { tmp.initPoint = uint256( int256(tmp.currTick) / int256(tmp.tickSpacing) - (int256(tmp.currTick) / int256(tmp.tickSpacing) / 256 - 1) * 256 ) % 256; } else { tmp.initPoint = (uint256(int256(tmp.currTick)) / uint256(int256(tmp.tickSpacing))) % 256; } tmp.initPoint2 = tmp.initPoint; if (tmp.currTick < 0) tmp.right--; bytes memory tickInfo; bytes memory limitOrderInfo; tmp.left = tmp.right; uint256 index = 0; while (index < len / 2 && tmp.right < tmp.rightMost) { uint256 res = IZumiPool(pool).pointBitmap(int16(tmp.right)); if (res > 0) { res = res >> tmp.initPoint; for (uint256 i = tmp.initPoint; i < 256; i++) { uint256 isInit = res & 0x01; if (isInit > 0) { int24 tick = int24(int256((256 * tmp.right + int256(i)) * tmp.tickSpacing)); int24 orderOrEndpoint = IZumiPool(pool).orderOrEndpoint(tick / tmp.tickSpacing); if (orderOrEndpoint & 0x01 == 0x01) { (, int128 liquidityNet, , , ) = IZumiPool(pool).points(tick); if (liquidityNet != 0) { int256 data = int256(uint256(int256(tick)) << 128) + (int256(liquidityNet) & 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff); tickInfo = bytes.concat(tickInfo, bytes32(uint256(data))); index++; } } if (orderOrEndpoint & 0x02 == 0x02) { (uint128 sellingX, , , , , uint128 sellingY, , , , ) = IZumiPool(pool).limitOrderData(tick); if (sellingX != 0 || sellingY != 0) { bytes32 data = bytes32( abi.encodePacked(int32(tick), uint112(sellingX), uint112(sellingY)) ); limitOrderInfo = bytes.concat(limitOrderInfo, data); index++; } } } res = res >> 1; } } tmp.initPoint = 0; tmp.right++; } bool isInitPoint = true; while (index < len && tmp.left > tmp.leftMost) { uint256 res = IZumiPool(pool).pointBitmap(int16(tmp.left)); if (res > 0 && tmp.initPoint2 != 0) { res = isInitPoint ? res << ((256 - tmp.initPoint2) % 256) : res; for (uint256 i = tmp.initPoint2 - 1; i >= 0 && index < len; i--) { uint256 isInit = res & 0x8000000000000000000000000000000000000000000000000000000000000000; if (isInit > 0) { int24 tick = int24(int256((256 * tmp.left + int256(i)) * tmp.tickSpacing)); int24 orderOrEndpoint = IZumiPool(pool).orderOrEndpoint(tick / tmp.tickSpacing); if (orderOrEndpoint & 0x01 == 0x01) { (, int128 liquidityNet, , , ) = IZumiPool(pool).points(tick); if (liquidityNet != 0) { int256 data = int256(uint256(int256(tick)) << 128) + (int256(liquidityNet) & 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff); tickInfo = bytes.concat(tickInfo, bytes32(uint256(data))); index++; } } if (orderOrEndpoint & 0x02 == 0x02) { (uint128 sellingX, , , , , uint128 sellingY, , , , ) = IZumiPool(pool).limitOrderData(tick); if (sellingX != 0 || sellingY != 0) { bytes32 data = bytes32( abi.encodePacked(int32(tick), uint112(sellingX), uint112(sellingY)) ); limitOrderInfo = bytes.concat(limitOrderInfo, data); index++; } } } res = res << 1; if (i == 0) break; } } isInitPoint = false; tmp.initPoint2 = 256; tmp.left--; } return (tickInfo, limitOrderInfo); } function queryAlgebraTicksSuperCompact3(address pool, uint256 len) public view returns (bytes memory) { SuperVar memory tmp; tmp.tickSpacing = 1; { (, bytes memory slot0) = pool.staticcall(abi.encodeWithSignature("globalState()")); int24 currTick; assembly { currTick := mload(add(slot0, 64)) } tmp.currTick = currTick; } int24 step = int24(int(len)) * 200; tmp.right = tmp.currTick / tmp.tickSpacing / int24(256); tmp.leftMost = (tmp.currTick - step) / tmp.tickSpacing / int24(256) - 2; tmp.rightMost = (tmp.currTick + step) / tmp.tickSpacing / int24(256) + 1; if (tmp.currTick < 0) { tmp.initPoint = uint256( int256(tmp.currTick) / int256(tmp.tickSpacing) - (int256(tmp.currTick) / int256(tmp.tickSpacing) / 256 - 1) * 256 ) % 256; } else { tmp.initPoint = (uint256(int256(tmp.currTick)) / uint256(int256(tmp.tickSpacing))) % 256; } tmp.initPoint2 = tmp.initPoint; if (tmp.currTick < 0) tmp.right--; bytes memory tickInfo; tmp.left = tmp.right; uint256 index = 0; while (index < len / 2 && tmp.right < tmp.rightMost) { uint256 res = IAlgebraPoolV1_9(pool).tickTable(int16(tmp.right)); if (res > 0) { res = res >> tmp.initPoint; for (uint256 i = tmp.initPoint; i < 256 && index < len / 2; i++) { uint256 isInit = res & 0x01; if (isInit > 0) { int256 tick = int256((256 * tmp.right + int256(i)) * tmp.tickSpacing); // (, int128 liquidityNet,,,,,,) = IAlgebraPoolV1_9(pool).ticks(int24(int256(tick))); (, bytes memory deltaL) = pool.staticcall(abi.encodeWithSignature("ticks(int24)", tick)); int128 liquidityNet; assembly { liquidityNet := mload(add(deltaL, 64)) } int256 data = int256(uint256(int256(tick)) << 128) + (int256(liquidityNet) & 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff); tickInfo = bytes.concat(tickInfo, bytes32(uint256(data))); index++; } res = res >> 1; } } tmp.initPoint = 0; tmp.right++; } bool isInitPoint = true; while (index < len && tmp.left > tmp.leftMost) { uint256 res = IAlgebraPoolV1_9(pool).tickTable(int16(tmp.left)); if (res > 0 && tmp.initPoint2 != 0) { res = isInitPoint ? res << ((256 - tmp.initPoint2) % 256) : res; for (uint256 i = tmp.initPoint2 - 1; i >= 0 && index < len; i--) { uint256 isInit = res & 0x8000000000000000000000000000000000000000000000000000000000000000; if (isInit > 0) { int256 tick = int256((256 * tmp.left + int256(i)) * tmp.tickSpacing); // (, int128 liquidityNet,,,,,,) = IAlgebraPoolV1_9(pool).ticks(int24(int256(tick))); (, bytes memory deltaL) = pool.staticcall(abi.encodeWithSignature("ticks(int24)", tick)); int128 liquidityNet; assembly { liquidityNet := mload(add(deltaL, 64)) } int256 data = int256(uint256(int256(tick)) << 128) + (int256(liquidityNet) & 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff); tickInfo = bytes.concat(tickInfo, bytes32(uint256(data))); index++; } res = res << 1; if (i == 0) break; } } isInitPoint = false; tmp.initPoint2 = 256; tmp.left--; } return tickInfo; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"len","type":"uint256"}],"name":"queryAlgebraTicksSuperCompact","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"iteration","type":"uint256"}],"name":"queryAlgebraTicksSuperCompact2","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"len","type":"uint256"}],"name":"queryAlgebraTicksSuperCompact3","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"len","type":"uint256"}],"name":"queryAlgebraTicksSuperCompact3_back","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"iteration","type":"uint256"}],"name":"queryHorizonTicksSuperCompact","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"len","type":"uint256"}],"name":"queryIzumiSuperCompact","outputs":[{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"len","type":"uint256"}],"name":"queryUniv3TicksSuperCompact","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061360e806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063c38f8f351161005b578063c38f8f35146100df578063c684206c146100f2578063ca883bec14610105578063f9f59a771461011857600080fd5b80632d6d225e14610082578063594a1bf3146100ab5780637df8773a146100cc575b600080fd5b610095610090366004612f7c565b61012b565b6040516100a29190612ff8565b60405180910390f35b6100be6100b9366004612f7c565b61088c565b6040516100a2929190613012565b6100956100da366004612f7c565b611354565b6100956100ed366004612f7c565b6119a7565b610095610100366004612f7c565b6120d4565b610095610113366004612f7c565b612442565b610095610126366004612f7c565b6127be565b6060610135612f20565b836001600160a01b031663d0c93a7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610173573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101979190613057565b60020b815260408051600481526024810182526020810180516001600160e01b03166339db007960e21b17905290516000916001600160a01b038716916101de9190613072565b600060405180830381855afa9150503d8060008114610219576040519150601f19603f3d011682016040523d82523d6000602084013e61021e565b606091505b506040015160020b602084018190528351610100935061023f9250906130ba565b61024991906130ba565b600290810b604083015281516101009061026790620d89e7196130ba565b61027191906130ba565b61027b91906130f4565b60020b608082015280516101009061029690620d89e86130ba565b6102a091906130ba565b6102ab906001613119565b600290810b60a083015260208201516000910b121561033e576101006001610100836000015160020b846020015160020b6102e6919061313e565b6102f0919061313e565b6102fa919061316c565b61030690610100613193565b826000015160020b836020015160020b610320919061313e565b61032a919061316c565b61033491906131c3565b60c082015261036b565b610100816000015160020b826020015160020b61035b91906131d7565b61036591906131c3565b60c08201525b60c081015160e08201526020810151600060029190910b121561039f5760408101805190610398826131eb565b60020b9052505b604081015160020b60608281019190915260005b6103be6002866131d7565b811080156103d957508260a0015160020b836040015160020b125b156105f6576040838101519051630633bf1f60e51b815260019190910b60048201526000906001600160a01b0388169063c677e3e090602401602060405180830381865afa15801561042f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610453919061320e565b905080156105d25760c084015190811c905b6101008110801561047f575061047c6002886131d7565b83105b156105d0576001821680156105b6576000866000015160020b8388604001516101006104ab9190613227565b60020b6104b89190613247565b6104c29190613193565b905060008a6001600160a01b0316826040516024016104e391815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663f30dba9360e01b179052516105189190613072565b600060405180830381855afa9150503d8060008114610553576040519150601f19603f3d011682016040523d82523d6000602084013e610558565b606091505b5060408101519092509050600061057c6001600160801b038316608086901b613247565b604051909150610592908a90839060200161326f565b604051602081830303815290604052985087806105ae90613291565b985050505050505b5060019190911c90806105c881613291565b915050610465565b505b600060c0850152604084018051906105e9826132aa565b60020b9052506103b39050565b60015b85821080156106155750836080015160020b846060015160020b135b1561087f576060840151604051630633bf1f60e51b815260019190910b60048201526000906001600160a01b0389169063c677e3e090602401602060405180830381865afa15801561066b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068f919061320e565b90506000811180156106a4575060e085015115155b1561085657816106b457806106d7565b6101008560e001516101006106c991906132cb565b6106d391906131c3565b81901b5b9050600060018660e001516106ec91906132cb565b90505b8784101561085457600160ff1b8216801561082c576000876000015160020b8389606001516101006107219190613227565b60020b61072e9190613247565b6107389190613193565b905060008b6001600160a01b03168260405160240161075991815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663f30dba9360e01b1790525161078e9190613072565b600060405180830381855afa9150503d80600081146107c9576040519150601f19603f3d011682016040523d82523d6000602084013e6107ce565b606091505b506040810151909250905060006107f26001600160801b038316608086901b613247565b604051909150610808908b90839060200161326f565b6040516020818303038152906040529950888061082490613291565b995050505050505b600183901b9250816000036108415750610854565b508061084c816132de565b9150506106ef565b505b61010060e08601526060850180516000935090610872826131eb565b60020b9052506105f99050565b5090925050505b92915050565b606080610897612f20565b846001600160a01b03166358c51ce66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f99190613057565b60020b815260408051600481526024810182526020810180516001600160e01b031663c19d93fb60e01b17905290516000916001600160a01b038816916109409190613072565b600060405180830381855afa9150503d806000811461097b576040519150601f19603f3d011682016040523d82523d6000602084013e610980565b606091505b506040015160020b60208401819052835161010093506109a19250906130ba565b6109ab91906130ba565b600290810b60408301528151610100906109c990620d89e7196130ba565b6109d391906130ba565b6109dd91906130f4565b60020b60808201528051610100906109f890620d89e86130ba565b610a0291906130ba565b610a0d906001613119565b600290810b60a083015260208201516000910b1215610aa0576101006001610100836000015160020b846020015160020b610a48919061313e565b610a52919061313e565b610a5c919061316c565b610a6890610100613193565b826000015160020b836020015160020b610a82919061313e565b610a8c919061316c565b610a9691906131c3565b60c0820152610acd565b610100816000015160020b826020015160020b610abd91906131d7565b610ac791906131c3565b60c08201525b60c081015160e08201526020810151600060029190910b1215610b015760408101805190610afa826131eb565b60020b9052505b604081015160020b6060828101919091528060005b610b216002886131d7565b81108015610b3c57508360a0015160020b846040015160020b125b15610efc576040848101519051634c507b9760e11b815260019190910b60048201526000906001600160a01b038a16906398a0f72e90602401602060405180830381865afa158015610b92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb6919061320e565b90508015610ed85760c085015190811c905b610100811015610ed657600182168015610ebc576000876000015160020b838960400151610100610bf99190613227565b60020b610c069190613247565b610c109190613193565b905060008c6001600160a01b031663edcba3b28a6000015184610c3391906130ba565b6040516001600160e01b031960e084901b16815260029190910b6004820152602401602060405180830381865afa158015610c72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c969190613057565b90508060011660020b600103610d7b576040516375c0e0d560e01b8152600283900b60048201526000906001600160a01b038f16906375c0e0d59060240160a060405180830381865afa158015610cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d159190613317565b50505091505080600f0b600014610d79576000610d426001600160801b038316608086901b60120b613247565b604051909150610d58908b90839060200161326f565b60405160208183030381529060405299508780610d7490613291565b985050505b505b8060021660020b600203610eb9576000808e6001600160a01b0316638790aca3856040518263ffffffff1660e01b8152600401610dc1919060029190910b815260200190565b61014060405180830381865afa158015610ddf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e03919061337e565b505050509550505050509150816001600160801b03166000141580610e3057506001600160801b03811615155b15610eb6576040805160e086901b601e0b60208201526001600160901b0319609085811b8216602484015284901b16603282015260009101604051602081830303815290604052610e809061341c565b90508981604051602001610e9592919061326f565b60405160208183030381529060405299508880610eb190613291565b995050505b50505b50505b5060019190911c9080610ece81613291565b915050610bc8565b505b600060c086015260408501805190610eef826132aa565b60020b905250610b169050565b60015b8782108015610f1b5750846080015160020b856060015160020b135b15611346576060850151604051634c507b9760e11b815260019190910b60048201526000906001600160a01b038b16906398a0f72e90602401602060405180830381865afa158015610f71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f95919061320e565b9050600081118015610faa575060e086015115155b1561131d5781610fba5780610fdd565b6101008660e00151610100610fcf91906132cb565b610fd991906131c3565b81901b5b9050600060018760e00151610ff291906132cb565b90505b8984101561131b57600160ff1b821680156112f3576000886000015160020b838a606001516101006110279190613227565b60020b6110349190613247565b61103e9190613193565b905060008d6001600160a01b031663edcba3b28b600001518461106191906130ba565b6040516001600160e01b031960e084901b16815260029190910b6004820152602401602060405180830381865afa1580156110a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c49190613057565b90508060011660020b6001036111b25760008e6001600160a01b03166375c0e0d5846040518263ffffffff1660e01b815260040161110b919060029190910b815260200190565b60a060405180830381865afa158015611128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114c9190613317565b50505091505080600f0b6000146111b05760006111796001600160801b038316608086901b60120b613247565b60405190915061118f908c90839060200161326f565b6040516020818303038152906040529a5088806111ab90613291565b995050505b505b8060021660020b6002036112f0576000808f6001600160a01b0316638790aca3856040518263ffffffff1660e01b81526004016111f8919060029190910b815260200190565b61014060405180830381865afa158015611216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123a919061337e565b505050509550505050509150816001600160801b0316600014158061126757506001600160801b03811615155b156112ed576040805160e086901b601e0b60208201526001600160901b0319609085811b8216602484015284901b166032820152600091016040516020818303038152906040526112b79061341c565b90508a816040516020016112cc92919061326f565b6040516020818303038152906040529a5089806112e890613291565b9a5050505b50505b50505b600183901b925081600003611308575061131b565b5080611313816132de565b915050610ff5565b505b61010060e08701526060860180516000935090611339826131eb565b60020b905250610eff9050565b509197909650945050505050565b606061135e612f20565b60408051600481526024810182526020810180516001600160e01b03166339db007960e21b17905290516000916001600160a01b038716916113a09190613072565b600060405180830381855afa9150503d80600081146113db576040519150601f19603f3d011682016040523d82523d6000602084013e6113e0565b606091505b506040015160020b602084018190526113fe925061010091506130ba565b600290810b6040830152611418610100620d89e7196130ba565b61142291906130f4565b60020b6080820152611439610100620d89e86130ba565b611444906001613119565b600290810b60a083015260208201516000910b121561149c5761010080826020015161146f90613443565b60020b61147c91906131c3565b611488906101006132cb565b61149291906131c3565b60c08201526114b7565b610100816020015160020b6114b191906131c3565b60c08201525b60c081015160e08201526020810151600060029190910b12156114eb57604081018051906114e4826131eb565b60020b9052505b604081015160020b60608281019190915260005b61150a6002866131d7565b8110801561152557508260a0015160020b836040015160020b125b15611730576040838101519051630633bf1f60e51b815260019190910b60048201526000906001600160a01b0388169063c677e3e090602401602060405180830381865afa15801561157b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159f919061320e565b9050801561170c5760c084015190811c905b610100811080156115cb57506115c86002886131d7565b83105b1561170a576001821680156116f05760008287604001516101006115ef9190613227565b60020b6115fc9190613247565b905060008a6001600160a01b03168260405160240161161d91815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663f30dba9360e01b179052516116529190613072565b600060405180830381855afa9150503d806000811461168d576040519150601f19603f3d011682016040523d82523d6000602084013e611692565b606091505b506040810151909250905060006116b66001600160801b038316608086901b613247565b6040519091506116cc908a90839060200161326f565b604051602081830303815290604052985087806116e890613291565b985050505050505b5060019190911c908061170281613291565b9150506115b1565b505b600060c085015260408401805190611723826132aa565b60020b9052506114ff9050565b60015b858210801561174f5750836080015160020b846060015160020b135b1561087f576060840151604051630633bf1f60e51b815260019190910b60048201526000906001600160a01b0389169063c677e3e090602401602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c9919061320e565b90506000811180156117de575060e085015115155b1561197e57816117ee5780611811565b6101008560e0015161010061180391906132cb565b61180d91906131c3565b81901b5b9050600060018660e0015161182691906132cb565b90505b8784101561197c57600160ff1b821680156119545760008288606001516101006118539190613227565b60020b6118609190613247565b905060008b6001600160a01b03168260405160240161188191815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663f30dba9360e01b179052516118b69190613072565b600060405180830381855afa9150503d80600081146118f1576040519150601f19603f3d011682016040523d82523d6000602084013e6118f6565b606091505b5060408101519092509050600061191a6001600160801b038316608086901b613247565b604051909150611930908b90839060200161326f565b6040516020818303038152906040529950888061194c90613291565b995050505050505b600183901b925081600003611969575061197c565b5080611974816132de565b915050611829565b505b61010060e0860152606085018051600093509061199a826131eb565b60020b9052506117339050565b60606119b1612f20565b6001815260408051600481526024810182526020810180516001600160e01b03166339db007960e21b17905290516000916001600160a01b038716916119f79190613072565b600060405180830381855afa9150503d8060008114611a32576040519150601f19603f3d011682016040523d82523d6000602084013e611a37565b606091505b506040015160020b60208401525060009050611a548460c8613227565b905061010082600001518360200151611a6d91906130ba565b611a7791906130ba565b600290810b6040840152825160208401516101009190611a989085906130f4565b611aa291906130ba565b611aac91906130ba565b611ab691906130f4565b60020b6080830152815160208301516101009190611ad5908490613119565b611adf91906130ba565b611ae991906130ba565b611af4906001613119565b600290810b60a084015260208301516000910b1215611b87576101006001610100846000015160020b856020015160020b611b2f919061313e565b611b39919061313e565b611b43919061316c565b611b4f90610100613193565b836000015160020b846020015160020b611b69919061313e565b611b73919061316c565b611b7d91906131c3565b60c0830152611bb4565b610100826000015160020b836020015160020b611ba491906131d7565b611bae91906131c3565b60c08301525b60c082015160e08301526020820151600060029190910b1215611be85760408201805190611be1826131eb565b60020b9052505b604082015160020b60608381019190915260005b611c076002876131d7565b81108015611c2257508360a0015160020b846040015160020b125b15611e3f576040848101519051630633bf1f60e51b815260019190910b60048201526000906001600160a01b0389169063c677e3e090602401602060405180830381865afa158015611c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9c919061320e565b90508015611e1b5760c085015190811c905b61010081108015611cc85750611cc56002896131d7565b83105b15611e1957600182168015611dff576000876000015160020b838960400151610100611cf49190613227565b60020b611d019190613247565b611d0b9190613193565b905060008b6001600160a01b031682604051602401611d2c91815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663f30dba9360e01b17905251611d619190613072565b600060405180830381855afa9150503d8060008114611d9c576040519150601f19603f3d011682016040523d82523d6000602084013e611da1565b606091505b50604081015190925090506000611dc56001600160801b038316608086901b613247565b604051909150611ddb908a90839060200161326f565b60405160208183030381529060405298508780611df790613291565b985050505050505b5060019190911c9080611e1181613291565b915050611cae565b505b600060c086015260408501805190611e32826132aa565b60020b905250611bfc9050565b60015b8682108015611e5e5750846080015160020b856060015160020b135b156120c8576060850151604051630633bf1f60e51b815260019190910b60048201526000906001600160a01b038a169063c677e3e090602401602060405180830381865afa158015611eb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed8919061320e565b9050600081118015611eed575060e086015115155b1561209f5781611efd5780611f20565b6101008660e00151610100611f1291906132cb565b611f1c91906131c3565b81901b5b9050600060018760e00151611f3591906132cb565b90505b8884101561209d57600160ff1b82168015612075576000886000015160020b838a60600151610100611f6a9190613227565b60020b611f779190613247565b611f819190613193565b905060008c6001600160a01b031682604051602401611fa291815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663f30dba9360e01b17905251611fd79190613072565b600060405180830381855afa9150503d8060008114612012576040519150601f19603f3d011682016040523d82523d6000602084013e612017565b606091505b5060408101519092509050600061203b6001600160801b038316608086901b613247565b604051909150612051908b90839060200161326f565b6040516020818303038152906040529950888061206d90613291565b995050505050505b600183901b92508160000361208a575061209d565b5080612095816132de565b915050611f38565b505b61010060e087015260608601805160009350906120bb826131eb565b60020b905250611e429050565b50909695505050505050565b60606000836001600160a01b031663217ac2376040518163ffffffff1660e01b8152600401608060405180830381865afa158015612116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213a9190613465565b5092508291506000905061214f6002866131d7565b905060605b620d89e9600285900b12801561216957508186115b156122c55760405163f30dba9360e01b8152600285900b60048201526000906001600160a01b0389169063f30dba9390602401608060405180830381865afa1580156121b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121dd91906134bb565b509092506000915061220190506001600160801b038316608088901b60120b613247565b604051909150612217908490839060200161326f565b60408051808303601f190181529082905263c0ac75cf60e01b8252600288900b600483015293506000906001600160a01b038b169063c0ac75cf906024016040805180830381865afa158015612271573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229591906134fd565b9150508060020b8760020b036122ad575050506122c5565b955085886122ba816132de565b995050505050612154565b620d89e819600284900b1380156122dc5750600086115b156124385760405163f30dba9360e01b8152600284900b60048201526000906001600160a01b0389169063f30dba9390602401608060405180830381865afa15801561232c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235091906134bb565b509092506000915061237490506001600160801b038316608087901b60120b613247565b60405190915061238a908490839060200161326f565b60408051808303601f190181529082905263c0ac75cf60e01b8252600287900b600483015293506000906001600160a01b038b169063c0ac75cf906024016040805180830381865afa1580156123e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240891906134fd565b5090508560020b8160020b0361242057505050612438565b9450848861242d816132de565b9950505050506122c5565b9695505050505050565b60408051600481526024810182526020810180516001600160e01b031663bba0f17160e01b1790529051606091600091829182916001600160a01b0388169161248a91613072565b600060405180830381855afa9150503d80600081146124c5576040519150601f19603f3d011682016040523d82523d6000602084013e6124ca565b606091505b509150915081156124f057808060200190518101906124e99190613057565b9250612582565b60408051600481526024810182526020810180516001600160e01b03166339db007960e21b17905290516001600160a01b0388169161252e91613072565b600060405180830381855afa9150503d8060008114612569576040519150601f19603f3d011682016040523d82523d6000602084013e61256e565b606091505b509092509050811561258257606081015192505b5081905060006125936002866131d7565b905060605b620d89e9600285900b1280156125ad57508186115b156126aa5760405163f30dba9360e01b8152600285900b6004820152600090819081906001600160a01b038b169063f30dba939060240161012060405180830381865afa158015612602573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126269190613530565b505050955095505050935050600083600f0b6001600160801b031660808960020b901b6126539190613247565b604051909150612669908690839060200161326f565b60405160208183030381529060405294508160020b8860020b0361269057505050506126aa565b819750898061269e906132de565b9a505050505050612598565b620d89e819600284900b1380156126c15750600086115b156124385760405163f30dba9360e01b8152600284900b6004820152600090819081906001600160a01b038b169063f30dba939060240161012060405180830381865afa158015612716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273a9190613530565b505050955095505050935050600083600f0b6001600160801b031660808860020b901b6127679190613247565b60405190915061277d908690839060200161326f565b60405160208183030381529060405294508260020b8760020b036127a45750505050612438565b82965089806127b2906132de565b9a5050505050506126aa565b60606127c8612f20565b836001600160a01b031663d0c93a7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a9190613057565b60020b815260408051600481526024810182526020810180516001600160e01b0316633850c7bd60e01b17905290516000916001600160a01b038716916128719190613072565b600060405180830381855afa9150503d80600081146128ac576040519150601f19603f3d011682016040523d82523d6000602084013e6128b1565b606091505b506040015160020b60208401819052835161010093506128d29250906130ba565b6128dc91906130ba565b600290810b60408301528151610100906128fa90620d89e7196130ba565b61290491906130ba565b61290e91906130f4565b60020b608082015280516101009061292990620d89e86130ba565b61293391906130ba565b61293e906001613119565b600290810b60a083015260208201516000910b12156129d1576101006001610100836000015160020b846020015160020b612979919061313e565b612983919061313e565b61298d919061316c565b61299990610100613193565b826000015160020b836020015160020b6129b3919061313e565b6129bd919061316c565b6129c791906131c3565b60c08201526129fe565b610100816000015160020b826020015160020b6129ee91906131d7565b6129f891906131c3565b60c08201525b60c081015160e08201526020810151600060029190910b1215612a325760408101805190612a2b826131eb565b60020b9052505b604081015160020b60608281019190915260005b612a516002866131d7565b81108015612a6c57508260a0015160020b836040015160020b125b15612c9057604083810151905163299ce14b60e11b815260019190910b60048201526000906001600160a01b03881690635339c29690602401602060405180830381865afa158015612ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae6919061320e565b90508015612c6c5760c084015190811c905b61010081108015612b125750612b0f6002886131d7565b83105b15612c6a57600182168015612c50576000866000015160020b838860400151610100612b3e9190613227565b60020b612b4b9190613247565b612b559190613193565b60408051600283900b60248083019190915282518083039091018152604490910182526020810180516001600160e01b031663f30dba9360e01b179052905191925060009182916001600160a01b038e1691612bb19190613072565b600060405180830381855afa9150503d8060008114612bec576040519150601f19603f3d011682016040523d82523d6000602084013e612bf1565b606091505b5060408101519350915060009050612c166001600160801b038416608086901b613247565b604051909150612c2c908a90839060200161326f565b60405160208183030381529060405298508780612c4890613291565b985050505050505b5060019190911c9080612c6281613291565b915050612af8565b505b600060c085015260408401805190612c83826132aa565b60020b905250612a469050565b60015b8582108015612caf5750836080015160020b846060015160020b135b1561087f57606084015160405163299ce14b60e11b815260019190910b60048201526000906001600160a01b03891690635339c29690602401602060405180830381865afa158015612d05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d29919061320e565b9050600081118015612d3e575060e085015115155b15612ef75781612d4e5780612d71565b6101008560e00151610100612d6391906132cb565b612d6d91906131c3565b81901b5b9050600060018660e00151612d8691906132cb565b90505b87841015612ef557600160ff1b82168015612ecd576000876000015160020b838960600151610100612dbb9190613227565b60020b612dc89190613247565b612dd29190613193565b60408051600283900b60248083019190915282518083039091018152604490910182526020810180516001600160e01b031663f30dba9360e01b179052905191925060009182916001600160a01b038f1691612e2e9190613072565b600060405180830381855afa9150503d8060008114612e69576040519150601f19603f3d011682016040523d82523d6000602084013e612e6e565b606091505b5060408101519350915060009050612e936001600160801b038416608086901b613247565b604051909150612ea9908b90839060200161326f565b60405160208183030381529060405299508880612ec590613291565b995050505050505b600183901b925081600003612ee25750612ef5565b5080612eed816132de565b915050612d89565b505b61010060e08601526060850180516000935090612f13826131eb565b60020b905250612c939050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b6001600160a01b0381168114612f7957600080fd5b50565b60008060408385031215612f8f57600080fd5b8235612f9a81612f64565b946020939093013593505050565b60005b83811015612fc3578181015183820152602001612fab565b50506000910152565b60008151808452612fe4816020860160208601612fa8565b601f01601f19169290920160200192915050565b60208152600061300b6020830184612fcc565b9392505050565b6040815260006130256040830185612fcc565b82810360208401526130378185612fcc565b95945050505050565b8051600281900b811461305257600080fd5b919050565b60006020828403121561306957600080fd5b61300b82613040565b60008251613084818460208701612fa8565b9190910192915050565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008160020b8360020b806130d1576130d161308e565b627fffff198214600019821416156130eb576130eb6130a4565b90059392505050565b600282810b9082900b03627fffff198112627fffff82131715610886576108866130a4565b600281810b9083900b01627fffff8113627fffff1982121715610886576108866130a4565b60008261314d5761314d61308e565b600160ff1b821460001984141615613167576131676130a4565b500590565b818103600083128015838313168383128216171561318c5761318c6130a4565b5092915050565b80820260008212600160ff1b841416156131af576131af6130a4565b8181058314821517610886576108866130a4565b6000826131d2576131d261308e565b500690565b6000826131e6576131e661308e565b500490565b60008160020b627fffff198103613204576132046130a4565b6000190192915050565b60006020828403121561322057600080fd5b5051919050565b60008260020b8260020b028060020b915080821461318c5761318c6130a4565b8082018281126000831280158216821582161715613267576132676130a4565b505092915050565b60008351613281818460208801612fa8565b9190910191825250602001919050565b6000600182016132a3576132a36130a4565b5060010190565b60008160020b627fffff81036132c2576132c26130a4565b60010192915050565b81810381811115610886576108866130a4565b6000816132ed576132ed6130a4565b506000190190565b8051600f81900b811461305257600080fd5b8051801515811461305257600080fd5b600080600080600060a0868803121561332f57600080fd5b8551945061333f602087016132f5565b9350604086015192506060860151915061335b60808701613307565b90509295509295909350565b80516001600160801b038116811461305257600080fd5b6000806000806000806000806000806101408b8d03121561339e57600080fd5b6133a78b613367565b99506133b560208c01613367565b985060408b0151975060608b015196506133d160808c01613367565b95506133df60a08c01613367565b94506133ed60c08c01613367565b93506133fb60e08c01613367565b92506101008b015191506101208b015190509295989b9194979a5092959850565b8051602080830151919081101561343d576000198160200360031b1b821691505b50919050565b60008160020b627fffff19810361345c5761345c6130a4565b60000392915050565b6000806000806080858703121561347b57600080fd5b845161348681612f64565b935061349460208601613040565b92506134a260408601613040565b91506134b060608601613307565b905092959194509250565b600080600080608085870312156134d157600080fd5b6134da85613367565b93506134e8602086016132f5565b9250604085015191506134b060608601613367565b6000806040838503121561351057600080fd5b61351983613040565b915061352760208401613040565b90509250929050565b60008060008060008060008060006101208a8c03121561354f57600080fd5b6135588a613367565b985061356660208b016132f5565b975060408a0151965060608a0151955061358260808b01613040565b945061359060a08b01613040565b935060c08a01516135a081612f64565b60e08b015190935063ffffffff811681146135ba57600080fd5b91506135c96101008b01613307565b9050929598509295985092959856fea26469706673582212202df0001e41a29ceef19ab8015c62046c1357d24ca35f1f6d6e11c66e6e81d02964736f6c63430008110033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063c38f8f351161005b578063c38f8f35146100df578063c684206c146100f2578063ca883bec14610105578063f9f59a771461011857600080fd5b80632d6d225e14610082578063594a1bf3146100ab5780637df8773a146100cc575b600080fd5b610095610090366004612f7c565b61012b565b6040516100a29190612ff8565b60405180910390f35b6100be6100b9366004612f7c565b61088c565b6040516100a2929190613012565b6100956100da366004612f7c565b611354565b6100956100ed366004612f7c565b6119a7565b610095610100366004612f7c565b6120d4565b610095610113366004612f7c565b612442565b610095610126366004612f7c565b6127be565b6060610135612f20565b836001600160a01b031663d0c93a7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610173573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101979190613057565b60020b815260408051600481526024810182526020810180516001600160e01b03166339db007960e21b17905290516000916001600160a01b038716916101de9190613072565b600060405180830381855afa9150503d8060008114610219576040519150601f19603f3d011682016040523d82523d6000602084013e61021e565b606091505b506040015160020b602084018190528351610100935061023f9250906130ba565b61024991906130ba565b600290810b604083015281516101009061026790620d89e7196130ba565b61027191906130ba565b61027b91906130f4565b60020b608082015280516101009061029690620d89e86130ba565b6102a091906130ba565b6102ab906001613119565b600290810b60a083015260208201516000910b121561033e576101006001610100836000015160020b846020015160020b6102e6919061313e565b6102f0919061313e565b6102fa919061316c565b61030690610100613193565b826000015160020b836020015160020b610320919061313e565b61032a919061316c565b61033491906131c3565b60c082015261036b565b610100816000015160020b826020015160020b61035b91906131d7565b61036591906131c3565b60c08201525b60c081015160e08201526020810151600060029190910b121561039f5760408101805190610398826131eb565b60020b9052505b604081015160020b60608281019190915260005b6103be6002866131d7565b811080156103d957508260a0015160020b836040015160020b125b156105f6576040838101519051630633bf1f60e51b815260019190910b60048201526000906001600160a01b0388169063c677e3e090602401602060405180830381865afa15801561042f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610453919061320e565b905080156105d25760c084015190811c905b6101008110801561047f575061047c6002886131d7565b83105b156105d0576001821680156105b6576000866000015160020b8388604001516101006104ab9190613227565b60020b6104b89190613247565b6104c29190613193565b905060008a6001600160a01b0316826040516024016104e391815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663f30dba9360e01b179052516105189190613072565b600060405180830381855afa9150503d8060008114610553576040519150601f19603f3d011682016040523d82523d6000602084013e610558565b606091505b5060408101519092509050600061057c6001600160801b038316608086901b613247565b604051909150610592908a90839060200161326f565b604051602081830303815290604052985087806105ae90613291565b985050505050505b5060019190911c90806105c881613291565b915050610465565b505b600060c0850152604084018051906105e9826132aa565b60020b9052506103b39050565b60015b85821080156106155750836080015160020b846060015160020b135b1561087f576060840151604051630633bf1f60e51b815260019190910b60048201526000906001600160a01b0389169063c677e3e090602401602060405180830381865afa15801561066b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068f919061320e565b90506000811180156106a4575060e085015115155b1561085657816106b457806106d7565b6101008560e001516101006106c991906132cb565b6106d391906131c3565b81901b5b9050600060018660e001516106ec91906132cb565b90505b8784101561085457600160ff1b8216801561082c576000876000015160020b8389606001516101006107219190613227565b60020b61072e9190613247565b6107389190613193565b905060008b6001600160a01b03168260405160240161075991815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663f30dba9360e01b1790525161078e9190613072565b600060405180830381855afa9150503d80600081146107c9576040519150601f19603f3d011682016040523d82523d6000602084013e6107ce565b606091505b506040810151909250905060006107f26001600160801b038316608086901b613247565b604051909150610808908b90839060200161326f565b6040516020818303038152906040529950888061082490613291565b995050505050505b600183901b9250816000036108415750610854565b508061084c816132de565b9150506106ef565b505b61010060e08601526060850180516000935090610872826131eb565b60020b9052506105f99050565b5090925050505b92915050565b606080610897612f20565b846001600160a01b03166358c51ce66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f99190613057565b60020b815260408051600481526024810182526020810180516001600160e01b031663c19d93fb60e01b17905290516000916001600160a01b038816916109409190613072565b600060405180830381855afa9150503d806000811461097b576040519150601f19603f3d011682016040523d82523d6000602084013e610980565b606091505b506040015160020b60208401819052835161010093506109a19250906130ba565b6109ab91906130ba565b600290810b60408301528151610100906109c990620d89e7196130ba565b6109d391906130ba565b6109dd91906130f4565b60020b60808201528051610100906109f890620d89e86130ba565b610a0291906130ba565b610a0d906001613119565b600290810b60a083015260208201516000910b1215610aa0576101006001610100836000015160020b846020015160020b610a48919061313e565b610a52919061313e565b610a5c919061316c565b610a6890610100613193565b826000015160020b836020015160020b610a82919061313e565b610a8c919061316c565b610a9691906131c3565b60c0820152610acd565b610100816000015160020b826020015160020b610abd91906131d7565b610ac791906131c3565b60c08201525b60c081015160e08201526020810151600060029190910b1215610b015760408101805190610afa826131eb565b60020b9052505b604081015160020b6060828101919091528060005b610b216002886131d7565b81108015610b3c57508360a0015160020b846040015160020b125b15610efc576040848101519051634c507b9760e11b815260019190910b60048201526000906001600160a01b038a16906398a0f72e90602401602060405180830381865afa158015610b92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb6919061320e565b90508015610ed85760c085015190811c905b610100811015610ed657600182168015610ebc576000876000015160020b838960400151610100610bf99190613227565b60020b610c069190613247565b610c109190613193565b905060008c6001600160a01b031663edcba3b28a6000015184610c3391906130ba565b6040516001600160e01b031960e084901b16815260029190910b6004820152602401602060405180830381865afa158015610c72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c969190613057565b90508060011660020b600103610d7b576040516375c0e0d560e01b8152600283900b60048201526000906001600160a01b038f16906375c0e0d59060240160a060405180830381865afa158015610cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d159190613317565b50505091505080600f0b600014610d79576000610d426001600160801b038316608086901b60120b613247565b604051909150610d58908b90839060200161326f565b60405160208183030381529060405299508780610d7490613291565b985050505b505b8060021660020b600203610eb9576000808e6001600160a01b0316638790aca3856040518263ffffffff1660e01b8152600401610dc1919060029190910b815260200190565b61014060405180830381865afa158015610ddf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e03919061337e565b505050509550505050509150816001600160801b03166000141580610e3057506001600160801b03811615155b15610eb6576040805160e086901b601e0b60208201526001600160901b0319609085811b8216602484015284901b16603282015260009101604051602081830303815290604052610e809061341c565b90508981604051602001610e9592919061326f565b60405160208183030381529060405299508880610eb190613291565b995050505b50505b50505b5060019190911c9080610ece81613291565b915050610bc8565b505b600060c086015260408501805190610eef826132aa565b60020b905250610b169050565b60015b8782108015610f1b5750846080015160020b856060015160020b135b15611346576060850151604051634c507b9760e11b815260019190910b60048201526000906001600160a01b038b16906398a0f72e90602401602060405180830381865afa158015610f71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f95919061320e565b9050600081118015610faa575060e086015115155b1561131d5781610fba5780610fdd565b6101008660e00151610100610fcf91906132cb565b610fd991906131c3565b81901b5b9050600060018760e00151610ff291906132cb565b90505b8984101561131b57600160ff1b821680156112f3576000886000015160020b838a606001516101006110279190613227565b60020b6110349190613247565b61103e9190613193565b905060008d6001600160a01b031663edcba3b28b600001518461106191906130ba565b6040516001600160e01b031960e084901b16815260029190910b6004820152602401602060405180830381865afa1580156110a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c49190613057565b90508060011660020b6001036111b25760008e6001600160a01b03166375c0e0d5846040518263ffffffff1660e01b815260040161110b919060029190910b815260200190565b60a060405180830381865afa158015611128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114c9190613317565b50505091505080600f0b6000146111b05760006111796001600160801b038316608086901b60120b613247565b60405190915061118f908c90839060200161326f565b6040516020818303038152906040529a5088806111ab90613291565b995050505b505b8060021660020b6002036112f0576000808f6001600160a01b0316638790aca3856040518263ffffffff1660e01b81526004016111f8919060029190910b815260200190565b61014060405180830381865afa158015611216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123a919061337e565b505050509550505050509150816001600160801b0316600014158061126757506001600160801b03811615155b156112ed576040805160e086901b601e0b60208201526001600160901b0319609085811b8216602484015284901b166032820152600091016040516020818303038152906040526112b79061341c565b90508a816040516020016112cc92919061326f565b6040516020818303038152906040529a5089806112e890613291565b9a5050505b50505b50505b600183901b925081600003611308575061131b565b5080611313816132de565b915050610ff5565b505b61010060e08701526060860180516000935090611339826131eb565b60020b905250610eff9050565b509197909650945050505050565b606061135e612f20565b60408051600481526024810182526020810180516001600160e01b03166339db007960e21b17905290516000916001600160a01b038716916113a09190613072565b600060405180830381855afa9150503d80600081146113db576040519150601f19603f3d011682016040523d82523d6000602084013e6113e0565b606091505b506040015160020b602084018190526113fe925061010091506130ba565b600290810b6040830152611418610100620d89e7196130ba565b61142291906130f4565b60020b6080820152611439610100620d89e86130ba565b611444906001613119565b600290810b60a083015260208201516000910b121561149c5761010080826020015161146f90613443565b60020b61147c91906131c3565b611488906101006132cb565b61149291906131c3565b60c08201526114b7565b610100816020015160020b6114b191906131c3565b60c08201525b60c081015160e08201526020810151600060029190910b12156114eb57604081018051906114e4826131eb565b60020b9052505b604081015160020b60608281019190915260005b61150a6002866131d7565b8110801561152557508260a0015160020b836040015160020b125b15611730576040838101519051630633bf1f60e51b815260019190910b60048201526000906001600160a01b0388169063c677e3e090602401602060405180830381865afa15801561157b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159f919061320e565b9050801561170c5760c084015190811c905b610100811080156115cb57506115c86002886131d7565b83105b1561170a576001821680156116f05760008287604001516101006115ef9190613227565b60020b6115fc9190613247565b905060008a6001600160a01b03168260405160240161161d91815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663f30dba9360e01b179052516116529190613072565b600060405180830381855afa9150503d806000811461168d576040519150601f19603f3d011682016040523d82523d6000602084013e611692565b606091505b506040810151909250905060006116b66001600160801b038316608086901b613247565b6040519091506116cc908a90839060200161326f565b604051602081830303815290604052985087806116e890613291565b985050505050505b5060019190911c908061170281613291565b9150506115b1565b505b600060c085015260408401805190611723826132aa565b60020b9052506114ff9050565b60015b858210801561174f5750836080015160020b846060015160020b135b1561087f576060840151604051630633bf1f60e51b815260019190910b60048201526000906001600160a01b0389169063c677e3e090602401602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c9919061320e565b90506000811180156117de575060e085015115155b1561197e57816117ee5780611811565b6101008560e0015161010061180391906132cb565b61180d91906131c3565b81901b5b9050600060018660e0015161182691906132cb565b90505b8784101561197c57600160ff1b821680156119545760008288606001516101006118539190613227565b60020b6118609190613247565b905060008b6001600160a01b03168260405160240161188191815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663f30dba9360e01b179052516118b69190613072565b600060405180830381855afa9150503d80600081146118f1576040519150601f19603f3d011682016040523d82523d6000602084013e6118f6565b606091505b5060408101519092509050600061191a6001600160801b038316608086901b613247565b604051909150611930908b90839060200161326f565b6040516020818303038152906040529950888061194c90613291565b995050505050505b600183901b925081600003611969575061197c565b5080611974816132de565b915050611829565b505b61010060e0860152606085018051600093509061199a826131eb565b60020b9052506117339050565b60606119b1612f20565b6001815260408051600481526024810182526020810180516001600160e01b03166339db007960e21b17905290516000916001600160a01b038716916119f79190613072565b600060405180830381855afa9150503d8060008114611a32576040519150601f19603f3d011682016040523d82523d6000602084013e611a37565b606091505b506040015160020b60208401525060009050611a548460c8613227565b905061010082600001518360200151611a6d91906130ba565b611a7791906130ba565b600290810b6040840152825160208401516101009190611a989085906130f4565b611aa291906130ba565b611aac91906130ba565b611ab691906130f4565b60020b6080830152815160208301516101009190611ad5908490613119565b611adf91906130ba565b611ae991906130ba565b611af4906001613119565b600290810b60a084015260208301516000910b1215611b87576101006001610100846000015160020b856020015160020b611b2f919061313e565b611b39919061313e565b611b43919061316c565b611b4f90610100613193565b836000015160020b846020015160020b611b69919061313e565b611b73919061316c565b611b7d91906131c3565b60c0830152611bb4565b610100826000015160020b836020015160020b611ba491906131d7565b611bae91906131c3565b60c08301525b60c082015160e08301526020820151600060029190910b1215611be85760408201805190611be1826131eb565b60020b9052505b604082015160020b60608381019190915260005b611c076002876131d7565b81108015611c2257508360a0015160020b846040015160020b125b15611e3f576040848101519051630633bf1f60e51b815260019190910b60048201526000906001600160a01b0389169063c677e3e090602401602060405180830381865afa158015611c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9c919061320e565b90508015611e1b5760c085015190811c905b61010081108015611cc85750611cc56002896131d7565b83105b15611e1957600182168015611dff576000876000015160020b838960400151610100611cf49190613227565b60020b611d019190613247565b611d0b9190613193565b905060008b6001600160a01b031682604051602401611d2c91815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663f30dba9360e01b17905251611d619190613072565b600060405180830381855afa9150503d8060008114611d9c576040519150601f19603f3d011682016040523d82523d6000602084013e611da1565b606091505b50604081015190925090506000611dc56001600160801b038316608086901b613247565b604051909150611ddb908a90839060200161326f565b60405160208183030381529060405298508780611df790613291565b985050505050505b5060019190911c9080611e1181613291565b915050611cae565b505b600060c086015260408501805190611e32826132aa565b60020b905250611bfc9050565b60015b8682108015611e5e5750846080015160020b856060015160020b135b156120c8576060850151604051630633bf1f60e51b815260019190910b60048201526000906001600160a01b038a169063c677e3e090602401602060405180830381865afa158015611eb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed8919061320e565b9050600081118015611eed575060e086015115155b1561209f5781611efd5780611f20565b6101008660e00151610100611f1291906132cb565b611f1c91906131c3565b81901b5b9050600060018760e00151611f3591906132cb565b90505b8884101561209d57600160ff1b82168015612075576000886000015160020b838a60600151610100611f6a9190613227565b60020b611f779190613247565b611f819190613193565b905060008c6001600160a01b031682604051602401611fa291815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663f30dba9360e01b17905251611fd79190613072565b600060405180830381855afa9150503d8060008114612012576040519150601f19603f3d011682016040523d82523d6000602084013e612017565b606091505b5060408101519092509050600061203b6001600160801b038316608086901b613247565b604051909150612051908b90839060200161326f565b6040516020818303038152906040529950888061206d90613291565b995050505050505b600183901b92508160000361208a575061209d565b5080612095816132de565b915050611f38565b505b61010060e087015260608601805160009350906120bb826131eb565b60020b905250611e429050565b50909695505050505050565b60606000836001600160a01b031663217ac2376040518163ffffffff1660e01b8152600401608060405180830381865afa158015612116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213a9190613465565b5092508291506000905061214f6002866131d7565b905060605b620d89e9600285900b12801561216957508186115b156122c55760405163f30dba9360e01b8152600285900b60048201526000906001600160a01b0389169063f30dba9390602401608060405180830381865afa1580156121b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121dd91906134bb565b509092506000915061220190506001600160801b038316608088901b60120b613247565b604051909150612217908490839060200161326f565b60408051808303601f190181529082905263c0ac75cf60e01b8252600288900b600483015293506000906001600160a01b038b169063c0ac75cf906024016040805180830381865afa158015612271573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229591906134fd565b9150508060020b8760020b036122ad575050506122c5565b955085886122ba816132de565b995050505050612154565b620d89e819600284900b1380156122dc5750600086115b156124385760405163f30dba9360e01b8152600284900b60048201526000906001600160a01b0389169063f30dba9390602401608060405180830381865afa15801561232c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235091906134bb565b509092506000915061237490506001600160801b038316608087901b60120b613247565b60405190915061238a908490839060200161326f565b60408051808303601f190181529082905263c0ac75cf60e01b8252600287900b600483015293506000906001600160a01b038b169063c0ac75cf906024016040805180830381865afa1580156123e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240891906134fd565b5090508560020b8160020b0361242057505050612438565b9450848861242d816132de565b9950505050506122c5565b9695505050505050565b60408051600481526024810182526020810180516001600160e01b031663bba0f17160e01b1790529051606091600091829182916001600160a01b0388169161248a91613072565b600060405180830381855afa9150503d80600081146124c5576040519150601f19603f3d011682016040523d82523d6000602084013e6124ca565b606091505b509150915081156124f057808060200190518101906124e99190613057565b9250612582565b60408051600481526024810182526020810180516001600160e01b03166339db007960e21b17905290516001600160a01b0388169161252e91613072565b600060405180830381855afa9150503d8060008114612569576040519150601f19603f3d011682016040523d82523d6000602084013e61256e565b606091505b509092509050811561258257606081015192505b5081905060006125936002866131d7565b905060605b620d89e9600285900b1280156125ad57508186115b156126aa5760405163f30dba9360e01b8152600285900b6004820152600090819081906001600160a01b038b169063f30dba939060240161012060405180830381865afa158015612602573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126269190613530565b505050955095505050935050600083600f0b6001600160801b031660808960020b901b6126539190613247565b604051909150612669908690839060200161326f565b60405160208183030381529060405294508160020b8860020b0361269057505050506126aa565b819750898061269e906132de565b9a505050505050612598565b620d89e819600284900b1380156126c15750600086115b156124385760405163f30dba9360e01b8152600284900b6004820152600090819081906001600160a01b038b169063f30dba939060240161012060405180830381865afa158015612716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273a9190613530565b505050955095505050935050600083600f0b6001600160801b031660808860020b901b6127679190613247565b60405190915061277d908690839060200161326f565b60405160208183030381529060405294508260020b8760020b036127a45750505050612438565b82965089806127b2906132de565b9a5050505050506126aa565b60606127c8612f20565b836001600160a01b031663d0c93a7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a9190613057565b60020b815260408051600481526024810182526020810180516001600160e01b0316633850c7bd60e01b17905290516000916001600160a01b038716916128719190613072565b600060405180830381855afa9150503d80600081146128ac576040519150601f19603f3d011682016040523d82523d6000602084013e6128b1565b606091505b506040015160020b60208401819052835161010093506128d29250906130ba565b6128dc91906130ba565b600290810b60408301528151610100906128fa90620d89e7196130ba565b61290491906130ba565b61290e91906130f4565b60020b608082015280516101009061292990620d89e86130ba565b61293391906130ba565b61293e906001613119565b600290810b60a083015260208201516000910b12156129d1576101006001610100836000015160020b846020015160020b612979919061313e565b612983919061313e565b61298d919061316c565b61299990610100613193565b826000015160020b836020015160020b6129b3919061313e565b6129bd919061316c565b6129c791906131c3565b60c08201526129fe565b610100816000015160020b826020015160020b6129ee91906131d7565b6129f891906131c3565b60c08201525b60c081015160e08201526020810151600060029190910b1215612a325760408101805190612a2b826131eb565b60020b9052505b604081015160020b60608281019190915260005b612a516002866131d7565b81108015612a6c57508260a0015160020b836040015160020b125b15612c9057604083810151905163299ce14b60e11b815260019190910b60048201526000906001600160a01b03881690635339c29690602401602060405180830381865afa158015612ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae6919061320e565b90508015612c6c5760c084015190811c905b61010081108015612b125750612b0f6002886131d7565b83105b15612c6a57600182168015612c50576000866000015160020b838860400151610100612b3e9190613227565b60020b612b4b9190613247565b612b559190613193565b60408051600283900b60248083019190915282518083039091018152604490910182526020810180516001600160e01b031663f30dba9360e01b179052905191925060009182916001600160a01b038e1691612bb19190613072565b600060405180830381855afa9150503d8060008114612bec576040519150601f19603f3d011682016040523d82523d6000602084013e612bf1565b606091505b5060408101519350915060009050612c166001600160801b038416608086901b613247565b604051909150612c2c908a90839060200161326f565b60405160208183030381529060405298508780612c4890613291565b985050505050505b5060019190911c9080612c6281613291565b915050612af8565b505b600060c085015260408401805190612c83826132aa565b60020b905250612a469050565b60015b8582108015612caf5750836080015160020b846060015160020b135b1561087f57606084015160405163299ce14b60e11b815260019190910b60048201526000906001600160a01b03891690635339c29690602401602060405180830381865afa158015612d05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d29919061320e565b9050600081118015612d3e575060e085015115155b15612ef75781612d4e5780612d71565b6101008560e00151610100612d6391906132cb565b612d6d91906131c3565b81901b5b9050600060018660e00151612d8691906132cb565b90505b87841015612ef557600160ff1b82168015612ecd576000876000015160020b838960600151610100612dbb9190613227565b60020b612dc89190613247565b612dd29190613193565b60408051600283900b60248083019190915282518083039091018152604490910182526020810180516001600160e01b031663f30dba9360e01b179052905191925060009182916001600160a01b038f1691612e2e9190613072565b600060405180830381855afa9150503d8060008114612e69576040519150601f19603f3d011682016040523d82523d6000602084013e612e6e565b606091505b5060408101519350915060009050612e936001600160801b038416608086901b613247565b604051909150612ea9908b90839060200161326f565b60405160208183030381529060405299508880612ec590613291565b995050505050505b600183901b925081600003612ee25750612ef5565b5080612eed816132de565b915050612d89565b505b61010060e08601526060850180516000935090612f13826131eb565b60020b905250612c939050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b6001600160a01b0381168114612f7957600080fd5b50565b60008060408385031215612f8f57600080fd5b8235612f9a81612f64565b946020939093013593505050565b60005b83811015612fc3578181015183820152602001612fab565b50506000910152565b60008151808452612fe4816020860160208601612fa8565b601f01601f19169290920160200192915050565b60208152600061300b6020830184612fcc565b9392505050565b6040815260006130256040830185612fcc565b82810360208401526130378185612fcc565b95945050505050565b8051600281900b811461305257600080fd5b919050565b60006020828403121561306957600080fd5b61300b82613040565b60008251613084818460208701612fa8565b9190910192915050565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008160020b8360020b806130d1576130d161308e565b627fffff198214600019821416156130eb576130eb6130a4565b90059392505050565b600282810b9082900b03627fffff198112627fffff82131715610886576108866130a4565b600281810b9083900b01627fffff8113627fffff1982121715610886576108866130a4565b60008261314d5761314d61308e565b600160ff1b821460001984141615613167576131676130a4565b500590565b818103600083128015838313168383128216171561318c5761318c6130a4565b5092915050565b80820260008212600160ff1b841416156131af576131af6130a4565b8181058314821517610886576108866130a4565b6000826131d2576131d261308e565b500690565b6000826131e6576131e661308e565b500490565b60008160020b627fffff198103613204576132046130a4565b6000190192915050565b60006020828403121561322057600080fd5b5051919050565b60008260020b8260020b028060020b915080821461318c5761318c6130a4565b8082018281126000831280158216821582161715613267576132676130a4565b505092915050565b60008351613281818460208801612fa8565b9190910191825250602001919050565b6000600182016132a3576132a36130a4565b5060010190565b60008160020b627fffff81036132c2576132c26130a4565b60010192915050565b81810381811115610886576108866130a4565b6000816132ed576132ed6130a4565b506000190190565b8051600f81900b811461305257600080fd5b8051801515811461305257600080fd5b600080600080600060a0868803121561332f57600080fd5b8551945061333f602087016132f5565b9350604086015192506060860151915061335b60808701613307565b90509295509295909350565b80516001600160801b038116811461305257600080fd5b6000806000806000806000806000806101408b8d03121561339e57600080fd5b6133a78b613367565b99506133b560208c01613367565b985060408b0151975060608b015196506133d160808c01613367565b95506133df60a08c01613367565b94506133ed60c08c01613367565b93506133fb60e08c01613367565b92506101008b015191506101208b015190509295989b9194979a5092959850565b8051602080830151919081101561343d576000198160200360031b1b821691505b50919050565b60008160020b627fffff19810361345c5761345c6130a4565b60000392915050565b6000806000806080858703121561347b57600080fd5b845161348681612f64565b935061349460208601613040565b92506134a260408601613040565b91506134b060608601613307565b905092959194509250565b600080600080608085870312156134d157600080fd5b6134da85613367565b93506134e8602086016132f5565b9250604085015191506134b060608601613367565b6000806040838503121561351057600080fd5b61351983613040565b915061352760208401613040565b90509250929050565b60008060008060008060008060006101208a8c03121561354f57600080fd5b6135588a613367565b985061356660208b016132f5565b975060408a0151965060608a0151955061358260808b01613040565b945061359060a08b01613040565b935060c08a01516135a081612f64565b60e08b015190935063ffffffff811681146135ba57600080fd5b91506135c96101008b01613307565b9050929598509295985092959856fea26469706673582212202df0001e41a29ceef19ab8015c62046c1357d24ca35f1f6d6e11c66e6e81d02964736f6c63430008110033
Deployed Bytecode Sourcemap
12222:29507:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23573:4353;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31590:5737;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;19631:3934::-;;;;;;:::i;:::-;;:::i;37335:4391::-;;;;;;:::i;:::-;;:::i;27934:1638::-;;;;;;:::i;:::-;;:::i;29580:2002::-;;;;;;:::i;:::-;;:::i;14854:4769::-;;;;;;:::i;:::-;;:::i;23573:4353::-;23666:12;23691:19;;:::i;:::-;23752:4;-1:-1:-1;;;;;23739:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23721:50;;;;23840:40;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23840:40:0;-1:-1:-1;;;23840:40:0;;;23824:57;;23721:15;;-1:-1:-1;;;;;23824:15:0;;;:57;;23840:40;23824:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23982:2:0;23971:14;23965:21;24015:23;;:12;;;:23;;;24087:15;;24111:3;;-1:-1:-1;24072:30:0;;-1:-1:-1;24087:15:0;24072:30;:::i;:::-;:43;;;;:::i;:::-;24060:55;;;;:9;;;:55;24152:15;;24176:3;;24141:26;;-1:-1:-1;;24141:26:0;:::i;:::-;:39;;;;:::i;:::-;:43;;;;:::i;:::-;24126:58;;:12;;;:58;24221:15;;24245:3;;24211:25;;:7;:25;:::i;:::-;:38;;;;:::i;:::-;:42;;24252:1;24211:42;:::i;:::-;24195:58;;;;:13;;;:58;24270:12;;;;24285:1;24270:16;;;24266:463;;;24593:3;24521:1;24515:3;24496;:15;;;24489:23;;24473:3;:12;;;24466:20;;:46;;;;:::i;:::-;:52;;;;:::i;:::-;:56;;;;:::i;:::-;24465:89;;24551:3;24465:89;:::i;:::-;24421:3;:15;;;24414:23;;24373:3;:12;;;24366:20;;:71;;;;:::i;:::-;:188;;;;:::i;:::-;24336:260;;;;:::i;:::-;24303:13;;;:293;24266:463;;;24714:3;24693;:15;;;24686:23;;24661:3;:12;;;24654:20;;24646:64;;;;:::i;:::-;24645:72;;;;:::i;:::-;24629:13;;;:88;24266:463;24756:13;;;;24739:14;;;:30;24786:12;;;;-1:-1:-1;24786:16:0;;;;;;24782:33;;;24804:9;;;:11;;;;;;:::i;:::-;;;;;-1:-1:-1;24782:33:0;24873:9;;;;24862:20;;24828:21;24862:8;;;:20;;;;-1:-1:-1;24925:1365:0;24940:7;24946:1;24940:3;:7;:::i;:::-;24932:5;:15;:44;;;;;24963:3;:13;;;24951:25;;:3;:9;;;:25;;;24932:44;24925:1365;;;25046:9;;;;;25007:50;;-1:-1:-1;;;25007:50:0;;4465:1:1;4454:21;;;;25007:50:0;;;4436:40:1;24993:11:0;;-1:-1:-1;;;;;25007:32:0;;;;;4409:18:1;;25007:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24993:64;-1:-1:-1;25076:7:0;;25072:1149;;25117:13;;;;25110:20;;;;25149:1057;25185:3;25181:1;:7;:26;;;;-1:-1:-1;25200:7:0;25206:1;25200:3;:7;:::i;:::-;25192:5;:15;25181:26;25149:1057;;;25260:4;25254:10;;25291;;25287:861;;25330:11;25383:3;:15;;;25351:47;;25377:1;25358:3;:9;;;25352:3;:15;;;;:::i;:::-;:27;;;;;;:::i;:::-;25351:47;;;;:::i;:::-;25330:69;;25540:19;25563:4;-1:-1:-1;;;;;25563:15:0;25619:4;25579:45;;;;;;5283:25:1;;5271:2;5256:18;;5139:175;25579:45:0;;;;-1:-1:-1;;25579:45:0;;;;;;;;;;;;;;-1:-1:-1;;;;;25579:45:0;-1:-1:-1;;;25579:45:0;;;25563:62;;;25579:45;25563:62;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25772:2:0;25760:15;;25754:22;25537:88;;-1:-1:-1;25754:22:0;-1:-1:-1;25652:19:0;25845:159;-1:-1:-1;;;;;25914:89:0;;25877:3;25852:28;;;25845:159;:::i;:::-;26042:46;;25831:173;;-1:-1:-1;26042:46:0;;26055:8;;25831:173;;26042:46;;;:::i;:::-;;;;;;;;;;;;;26031:57;;26117:7;;;;;:::i;:::-;;;;25303:845;;;;25287:861;-1:-1:-1;26185:1:0;26178:8;;;;;25209:3;;;;:::i;:::-;;;;25149:1057;;;;25072:1149;26251:1;26235:13;;;:17;26267:9;;;:11;;;;;;:::i;:::-;;;;;-1:-1:-1;24925:1365:0;;-1:-1:-1;24925:1365:0;;26319:4;26334:1559;26349:3;26341:5;:11;:38;;;;;26367:3;:12;;;26356:23;;:3;:8;;;:23;;;26341:38;26334:1559;;;26449:8;;;;26410:49;;-1:-1:-1;;;26410:49:0;;4465:1:1;4454:21;;;;26410:49:0;;;4436:40:1;26396:11:0;;-1:-1:-1;;;;;26410:32:0;;;;;4409:18:1;;26410:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26396:63;;26484:1;26478:3;:7;:30;;;;-1:-1:-1;26489:14:0;;;;:19;;26478:30;26474:1312;;;26535:11;:57;;26589:3;26535:57;;;26582:3;26564;:14;;;26558:3;:20;;;;:::i;:::-;26557:28;;;;:::i;:::-;26549:3;:37;;26535:57;26529:63;;26618:9;26647:1;26630:3;:14;;;:18;;;;:::i;:::-;26618:30;;26613:1158;26668:3;26660:5;:11;26613:1158;;;-1:-1:-1;;;26718:72:0;;26817:10;;26813:860;;26856:11;26908:3;:15;;;26877:46;;26902:1;26884:3;:8;;;26878:3;:14;;;;:::i;:::-;:26;;;;;;:::i;:::-;26877:46;;;;:::i;:::-;26856:68;;27067:19;27090:4;-1:-1:-1;;;;;27090:15:0;27146:4;27106:45;;;;;;5283:25:1;;5271:2;5256:18;;5139:175;27106:45:0;;;;-1:-1:-1;;27106:45:0;;;;;;;;;;;;;;-1:-1:-1;;;;;27106:45:0;-1:-1:-1;;;27106:45:0;;;27090:62;;;27106:45;27090:62;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27299:2:0;27287:15;;27281:22;27064:88;;-1:-1:-1;27281:22:0;-1:-1:-1;27179:19:0;27370:159;-1:-1:-1;;;;;27439:89:0;;27402:3;27377:28;;;27370:159;:::i;:::-;27567:46;;27356:173;;-1:-1:-1;27567:46:0;;27580:8;;27356:173;;27567:46;;;:::i;:::-;;;;;;;;;;;;;27556:57;;27642:7;;;;;:::i;:::-;;;;26829:844;;;;26813:860;27710:1;27703:3;:8;;27697:14;;27738:1;27743;27738:6;27734:17;;27746:5;;;27734:17;-1:-1:-1;26673:3:0;;;;:::i;:::-;;;;26613:1158;;;;26474:1312;27851:3;27834:14;;;:20;27871:8;;;:10;;27814:5;;-1:-1:-1;27871:10:0;;;;:::i;:::-;;;;;-1:-1:-1;26334:1559:0;;-1:-1:-1;26334:1559:0;;-1:-1:-1;27910:8:0;;-1:-1:-1;;;23573:4353:0;;;;;:::o;31590:5737::-;31670:12;31684;31709:19;;:::i;:::-;31767:4;-1:-1:-1;;;;;31757:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31739:46;;;;31852:34;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31852:34:0;-1:-1:-1;;;31852:34:0;;;31836:51;;31739:15;;-1:-1:-1;;;;;31836:15:0;;;:51;;31852:34;31836:51;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31988:2:0;31977:14;31971:21;32021:23;;:12;;;:23;;;32095:15;;32119:3;;-1:-1:-1;32080:30:0;;-1:-1:-1;32095:15:0;32080:30;:::i;:::-;:43;;;;:::i;:::-;32068:55;;;;:9;;;:55;32160:15;;32184:3;;32149:26;;-1:-1:-1;;32149:26:0;:::i;:::-;:39;;;;:::i;:::-;:43;;;;:::i;:::-;32134:58;;:12;;;:58;32229:15;;32253:3;;32219:25;;:7;:25;:::i;:::-;:38;;;;:::i;:::-;:42;;32260:1;32219:42;:::i;:::-;32203:58;;;;:13;;;:58;32278:12;;;;32293:1;32278:16;;;32274:463;;;32601:3;32529:1;32523:3;32504;:15;;;32497:23;;32481:3;:12;;;32474:20;;:46;;;;:::i;:::-;:52;;;;:::i;:::-;:56;;;;:::i;:::-;32473:89;;32559:3;32473:89;:::i;:::-;32429:3;:15;;;32422:23;;32381:3;:12;;;32374:20;;:71;;;;:::i;:::-;:188;;;;:::i;:::-;32344:260;;;;:::i;:::-;32311:13;;;:293;32274:463;;;32722:3;32701;:15;;;32694:23;;32669:3;:12;;;32662:20;;32654:64;;;;:::i;:::-;32653:72;;;;:::i;:::-;32637:13;;;:88;32274:463;32764:13;;;;32747:14;;;:30;32794:12;;;;-1:-1:-1;32794:16:0;;;;;;32790:33;;;32812:9;;;:11;;;;;;:::i;:::-;;;;;-1:-1:-1;32790:33:0;32919:9;;;;32908:20;;32836:21;32908:8;;;:20;;;;32836:21;-1:-1:-1;32971:2025:0;32986:7;32992:1;32986:3;:7;:::i;:::-;32978:5;:15;:44;;;;;33009:3;:13;;;32997:25;;:3;:9;;;:25;;;32978:44;32971:2025;;;33087:9;;;;;33053:45;;-1:-1:-1;;;33053:45:0;;4465:1:1;4454:21;;;;33053:45:0;;;4436:40:1;33039:11:0;;-1:-1:-1;;;;;33053:27:0;;;;;4409:18:1;;33053:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33039:59;-1:-1:-1;33117:7:0;;33113:1814;;33158:13;;;;33151:20;;;;33190:1722;33226:3;33222:1;:7;33190:1722;;;33282:4;33276:10;;33313;;33309:1545;;33352:10;33410:3;:15;;;33378:47;;33404:1;33385:3;:9;;;33379:3;:15;;;;:::i;:::-;:27;;;;;;:::i;:::-;33378:47;;;;:::i;:::-;33352:75;;33454:21;33488:4;-1:-1:-1;;;;;33478:31:0;;33517:3;:15;;;33510:4;:22;;;;:::i;:::-;33478:55;;-1:-1:-1;;;;;;33478:55:0;;;;;;;6480:1:1;6469:21;;;;33478:55:0;;;6451:40:1;6424:18;;33478:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33454:79;;33564:15;33582:4;33564:22;:30;;33590:4;33564:30;33560:633;;33659:28;;-1:-1:-1;;;33659:28:0;;6480:1:1;6469:21;;;33659:28:0;;;6451:40:1;33630:19:0;;-1:-1:-1;;;;;33659:22:0;;;;;6424:18:1;;33659:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33627:60;;;;;;33722:12;:17;;33738:1;33722:17;33718:448;;33776:11;33790:208;-1:-1:-1;;;;;33867:130:0;;33822:3;33797:28;;;;;33790:208;:::i;:::-;34044:46;;33776:222;;-1:-1:-1;34044:46:0;;34057:8;;33776:222;;34044:46;;;:::i;:::-;;;;;;;;;;;;;34033:57;;34127:7;;;;;:::i;:::-;;;;33741:425;33718:448;33596:597;33560:633;34223:15;34241:4;34223:22;:30;;34249:4;34223:30;34219:612;;34287:16;34313;34351:4;-1:-1:-1;;;;;34341:30:0;;34372:4;34341:36;;;;;;;;;;;;;;6480:1:1;6469:21;;;;6451:40;;6439:2;6424:18;;6309:188;34341:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34286:91;;;;;;;;;;;;34412:8;-1:-1:-1;;;;;34412:13:0;34424:1;34412:13;;:30;;;-1:-1:-1;;;;;;34429:13:0;;;;34412:30;34408:396;;;34540:67;;;8600:3:1;8596:16;;;;;34540:67:0;;;8584:29:1;-1:-1:-1;;;;;;8712:3:1;8708:16;;;8704:25;;8691:11;;;8684:46;8764:16;;;8760:25;8746:12;;;8739:47;-1:-1:-1;;8802:12:1;34540:67:0;;;;;;;;;;;;34494:148;;;:::i;:::-;34479:163;;34707:14;34723:4;34694:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34677:51;;34765:7;;;;;:::i;:::-;;;;34444:360;34408:396;34255:576;;34219:612;33325:1529;;33309:1545;-1:-1:-1;34891:1:0;34884:8;;;;;33231:3;;;;:::i;:::-;;;;33190:1722;;;;33113:1814;34957:1;34941:13;;;:17;34973:9;;;:11;;;;;;:::i;:::-;;;;;-1:-1:-1;32971:2025:0;;-1:-1:-1;32971:2025:0;;35025:4;35040:2236;35055:3;35047:5;:11;:38;;;;;35073:3;:12;;;35062:23;;:3;:8;;;:23;;;35047:38;35040:2236;;;35150:8;;;;35116:44;;-1:-1:-1;;;35116:44:0;;4465:1:1;4454:21;;;;35116:44:0;;;4436:40:1;35102:11:0;;-1:-1:-1;;;;;35116:27:0;;;;;4409:18:1;;35116:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35102:58;;35185:1;35179:3;:7;:30;;;;-1:-1:-1;35190:14:0;;;;:19;;35179:30;35175:1994;;;35236:11;:57;;35290:3;35236:57;;;35283:3;35265;:14;;;35259:3;:20;;;;:::i;:::-;35258:28;;;;:::i;:::-;35250:3;:37;;35236:57;35230:63;;35317:9;35346:1;35329:3;:14;;;:18;;;;:::i;:::-;35317:30;;35312:1842;35367:3;35359:5;:11;35312:1842;;;-1:-1:-1;;;35417:72:0;;35516:10;;35512:1546;;35555:10;35612:3;:15;;;35581:46;;35606:1;35588:3;:8;;;35582:3;:14;;;;:::i;:::-;:26;;;;;;:::i;:::-;35581:46;;;;:::i;:::-;35555:74;;35658:21;35692:4;-1:-1:-1;;;;;35682:31:0;;35721:3;:15;;;35714:4;:22;;;;:::i;:::-;35682:55;;-1:-1:-1;;;;;;35682:55:0;;;;;;;6480:1:1;6469:21;;;;35682:55:0;;;6451:40:1;6424:18;;35682:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35658:79;;35768:15;35786:4;35768:22;:30;;35794:4;35768:30;35764:633;;35834:19;35873:4;-1:-1:-1;;;;;35863:22:0;;35886:4;35863:28;;;;;;;;;;;;;;6480:1:1;6469:21;;;;6451:40;;6439:2;6424:18;;6309:188;35863:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35831:60;;;;;;35926:12;:17;;35942:1;35926:17;35922:448;;35980:11;35994:208;-1:-1:-1;;;;;36071:130:0;;36026:3;36001:28;;;;;35994:208;:::i;:::-;36248:46;;35980:222;;-1:-1:-1;36248:46:0;;36261:8;;35980:222;;36248:46;;;:::i;:::-;;;;;;;;;;;;;36237:57;;36331:7;;;;;:::i;:::-;;;;35945:425;35922:448;35800:597;35764:633;36427:15;36445:4;36427:22;:30;;36453:4;36427:30;36423:612;;36491:16;36517;36555:4;-1:-1:-1;;;;;36545:30:0;;36576:4;36545:36;;;;;;;;;;;;;;6480:1:1;6469:21;;;;6451:40;;6439:2;6424:18;;6309:188;36545:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36490:91;;;;;;;;;;;;36616:8;-1:-1:-1;;;;;36616:13:0;36628:1;36616:13;;:30;;;-1:-1:-1;;;;;;36633:13:0;;;;36616:30;36612:396;;;36744:67;;;8600:3:1;8596:16;;;;;36744:67:0;;;8584:29:1;-1:-1:-1;;;;;;8712:3:1;8708:16;;;8704:25;;8691:11;;;8684:46;8764:16;;;8760:25;8746:12;;;8739:47;-1:-1:-1;;8802:12:1;36744:67:0;;;;;;;;;;;;36698:148;;;:::i;:::-;36683:163;;36911:14;36927:4;36898:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36881:51;;36969:7;;;;;:::i;:::-;;;;36648:360;36612:396;36459:576;;36423:612;35528:1530;;35512:1546;37093:1;37086:3;:8;;37080:14;;37121:1;37126;37121:6;37117:17;;37129:5;;;37117:17;-1:-1:-1;35372:3:0;;;;:::i;:::-;;;;35312:1842;;;;35175:1994;37234:3;37217:14;;;:20;37254:8;;;:10;;37197:5;;-1:-1:-1;37254:10:0;;;;:::i;:::-;;;;;-1:-1:-1;35040:2236:0;;-1:-1:-1;35040:2236:0;;-1:-1:-1;37294:8:0;;37304:14;;-1:-1:-1;31590:5737:0;-1:-1:-1;;;;;31590:5737:0:o;19631:3934::-;19718:12;19743:19;;:::i;:::-;19831:40;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19831:40:0;-1:-1:-1;;;19831:40:0;;;19815:57;;19793:18;;-1:-1:-1;;;;;19815:15:0;;;:57;;19831:40;19815:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19973:2:0;19962:14;19956:21;20006:23;;:12;;;:23;;;20063:25;;-1:-1:-1;20084:3:0;;-1:-1:-1;20063:25:0;:::i;:::-;20051:37;;;;:9;;;:37;20114:21;20131:3;-1:-1:-1;;20114:21:0;:::i;:::-;:25;;;;:::i;:::-;20099:40;;:12;;;:40;20166:20;20182:3;20166:7;:20;:::i;:::-;:24;;20189:1;20166:24;:::i;:::-;20150:40;;;;:13;;;:40;20207:12;;;;20222:1;20207:16;;;20203:201;;;20305:3;20297;20280;:12;;;20279:13;;;:::i;:::-;20272:21;;20264:36;;;;:::i;:::-;20257:44;;:3;:44;:::i;:::-;20256:52;;;;:::i;:::-;20240:13;;;:68;20203:201;;;20389:3;20372;:12;;;20365:20;;20357:35;;;;:::i;:::-;20341:13;;;:51;20203:201;20431:13;;;;20414:14;;;:30;20461:12;;;;-1:-1:-1;20461:16:0;;;;;;20457:33;;;20479:9;;;:11;;;;;;:::i;:::-;;;;;-1:-1:-1;20457:33:0;20548:9;;;;20537:20;;20503:21;20537:8;;;:20;;;;-1:-1:-1;20600:1347:0;20615:7;20621:1;20615:3;:7;:::i;:::-;20607:5;:15;:44;;;;;20638:3;:13;;;20626:25;;:3;:9;;;:25;;;20607:44;20600:1347;;;20721:9;;;;;20682:50;;-1:-1:-1;;;20682:50:0;;4465:1:1;4454:21;;;;20682:50:0;;;4436:40:1;20668:11:0;;-1:-1:-1;;;;;20682:32:0;;;;;4409:18:1;;20682:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20668:64;-1:-1:-1;20751:7:0;;20747:1131;;20792:13;;;;20785:20;;;;20824:1039;20860:3;20856:1;:7;:26;;;;-1:-1:-1;20875:7:0;20881:1;20875:3;:7;:::i;:::-;20867:5;:15;20856:26;20824:1039;;;20935:4;20929:10;;20966;;20962:843;;21005:11;21052:1;21033:3;:9;;;21027:3;:15;;;;:::i;:::-;:27;;;;;;:::i;:::-;21005:51;;21197:19;21220:4;-1:-1:-1;;;;;21220:15:0;21276:4;21236:45;;;;;;5283:25:1;;5271:2;5256:18;;5139:175;21236:45:0;;;;-1:-1:-1;;21236:45:0;;;;;;;;;;;;;;-1:-1:-1;;;;;21236:45:0;-1:-1:-1;;;21236:45:0;;;21220:62;;;21236:45;21220:62;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21429:2:0;21417:15;;21411:22;21194:88;;-1:-1:-1;21411:22:0;-1:-1:-1;21309:19:0;21502:159;-1:-1:-1;;;;;21571:89:0;;21534:3;21509:28;;;21502:159;:::i;:::-;21699:46;;21488:173;;-1:-1:-1;21699:46:0;;21712:8;;21488:173;;21699:46;;;:::i;:::-;;;;;;;;;;;;;21688:57;;21774:7;;;;;:::i;:::-;;;;20978:827;;;;20962:843;-1:-1:-1;21842:1:0;21835:8;;;;;20884:3;;;;:::i;:::-;;;;20824:1039;;;;20747:1131;21908:1;21892:13;;;:17;21924:9;;;:11;;;;;;:::i;:::-;;;;;-1:-1:-1;20600:1347:0;;-1:-1:-1;20600:1347:0;;21976:4;21991:1541;22006:3;21998:5;:11;:38;;;;;22024:3;:12;;;22013:23;;:3;:8;;;:23;;;21998:38;21991:1541;;;22106:8;;;;22067:49;;-1:-1:-1;;;22067:49:0;;4465:1:1;4454:21;;;;22067:49:0;;;4436:40:1;22053:11:0;;-1:-1:-1;;;;;22067:32:0;;;;;4409:18:1;;22067:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22053:63;;22141:1;22135:3;:7;:30;;;;-1:-1:-1;22146:14:0;;;;:19;;22135:30;22131:1294;;;22192:11;:57;;22246:3;22192:57;;;22239:3;22221;:14;;;22215:3;:20;;;;:::i;:::-;22214:28;;;;:::i;:::-;22206:3;:37;;22192:57;22186:63;;22275:9;22304:1;22287:3;:14;;;:18;;;;:::i;:::-;22275:30;;22270:1140;22325:3;22317:5;:11;22270:1140;;;-1:-1:-1;;;22375:72:0;;22474:10;;22470:842;;22513:11;22559:1;22541:3;:8;;;22535:3;:14;;;;:::i;:::-;:26;;;;;;:::i;:::-;22513:50;;22706:19;22729:4;-1:-1:-1;;;;;22729:15:0;22785:4;22745:45;;;;;;5283:25:1;;5271:2;5256:18;;5139:175;22745:45:0;;;;-1:-1:-1;;22745:45:0;;;;;;;;;;;;;;-1:-1:-1;;;;;22745:45:0;-1:-1:-1;;;22745:45:0;;;22729:62;;;22745:45;22729:62;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22938:2:0;22926:15;;22920:22;22703:88;;-1:-1:-1;22920:22:0;-1:-1:-1;22818:19:0;23009:159;-1:-1:-1;;;;;23078:89:0;;23041:3;23016:28;;;23009:159;:::i;:::-;23206:46;;22995:173;;-1:-1:-1;23206:46:0;;23219:8;;22995:173;;23206:46;;;:::i;:::-;;;;;;;;;;;;;23195:57;;23281:7;;;;;:::i;:::-;;;;22486:826;;;;22470:842;23349:1;23342:3;:8;;23336:14;;23377:1;23382;23377:6;23373:17;;23385:5;;;23373:17;-1:-1:-1;22330:3:0;;;;:::i;:::-;;;;22270:1140;;;;22131:1294;23490:3;23473:14;;;:20;23510:8;;;:10;;23453:5;;-1:-1:-1;23510:10:0;;;;:::i;:::-;;;;;-1:-1:-1;21991:1541:0;;-1:-1:-1;21991:1541:0;37335:4391;37423:12;37448:19;;:::i;:::-;37496:1;37478:19;;37566:40;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37566:40:0;-1:-1:-1;;;37566:40:0;;;37550:57;;37478:15;;-1:-1:-1;;;;;37550:15:0;;;:57;;37566:40;37550:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37708:2:0;37697:14;37691:21;37741:23;;:12;;;:23;-1:-1:-1;37622:14:0;;-1:-1:-1;37799:21:0;37809:3;37817;37799:21;:::i;:::-;37786:34;;37882:3;37858;:15;;;37843:3;:12;;;:30;;;;:::i;:::-;:43;;;;:::i;:::-;37831:55;;;;:9;;;:55;37936:15;;37913:12;;;;37960:3;;37936:15;37913:19;;37928:4;;37913:19;:::i;:::-;37912:39;;;;:::i;:::-;:52;;;;:::i;:::-;:56;;;;:::i;:::-;37897:71;;:12;;;:71;38019:15;;37996:12;;;;38043:3;;38019:15;37996:19;;38011:4;;37996:19;:::i;:::-;37995:39;;;;:::i;:::-;:52;;;;:::i;:::-;:56;;38050:1;37995:56;:::i;:::-;37979:72;;;;:13;;;:72;38068:12;;;;38083:1;38068:16;;;38064:463;;;38391:3;38319:1;38313:3;38294;:15;;;38287:23;;38271:3;:12;;;38264:20;;:46;;;;:::i;:::-;:52;;;;:::i;:::-;:56;;;;:::i;:::-;38263:89;;38349:3;38263:89;:::i;:::-;38219:3;:15;;;38212:23;;38171:3;:12;;;38164:20;;:71;;;;:::i;:::-;:188;;;;:::i;:::-;38134:260;;;;:::i;:::-;38101:13;;;:293;38064:463;;;38512:3;38491;:15;;;38484:23;;38459:3;:12;;;38452:20;;38444:64;;;;:::i;:::-;38443:72;;;;:::i;:::-;38427:13;;;:88;38064:463;38556:13;;;;38539:14;;;:30;38586:12;;;;-1:-1:-1;38586:16:0;;;;;;38582:33;;;38604:9;;;:11;;;;;;:::i;:::-;;;;;-1:-1:-1;38582:33:0;38673:9;;;;38662:20;;38628:21;38662:8;;;:20;;;;-1:-1:-1;38725:1365:0;38740:7;38746:1;38740:3;:7;:::i;:::-;38732:5;:15;:44;;;;;38763:3;:13;;;38751:25;;:3;:9;;;:25;;;38732:44;38725:1365;;;38846:9;;;;;38807:50;;-1:-1:-1;;;38807:50:0;;4465:1:1;4454:21;;;;38807:50:0;;;4436:40:1;38793:11:0;;-1:-1:-1;;;;;38807:32:0;;;;;4409:18:1;;38807:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38793:64;-1:-1:-1;38876:7:0;;38872:1149;;38917:13;;;;38910:20;;;;38949:1057;38985:3;38981:1;:7;:26;;;;-1:-1:-1;39000:7:0;39006:1;39000:3;:7;:::i;:::-;38992:5;:15;38981:26;38949:1057;;;39060:4;39054:10;;39091;;39087:861;;39130:11;39183:3;:15;;;39151:47;;39177:1;39158:3;:9;;;39152:3;:15;;;;:::i;:::-;:27;;;;;;:::i;:::-;39151:47;;;;:::i;:::-;39130:69;;39340:19;39363:4;-1:-1:-1;;;;;39363:15:0;39419:4;39379:45;;;;;;5283:25:1;;5271:2;5256:18;;5139:175;39379:45:0;;;;-1:-1:-1;;39379:45:0;;;;;;;;;;;;;;-1:-1:-1;;;;;39379:45:0;-1:-1:-1;;;39379:45:0;;;39363:62;;;39379:45;39363:62;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39572:2:0;39560:15;;39554:22;39337:88;;-1:-1:-1;39554:22:0;-1:-1:-1;39452:19:0;39645:159;-1:-1:-1;;;;;39714:89:0;;39677:3;39652:28;;;39645:159;:::i;:::-;39842:46;;39631:173;;-1:-1:-1;39842:46:0;;39855:8;;39631:173;;39842:46;;;:::i;:::-;;;;;;;;;;;;;39831:57;;39917:7;;;;;:::i;:::-;;;;39103:845;;;;39087:861;-1:-1:-1;39985:1:0;39978:8;;;;;39009:3;;;;:::i;:::-;;;;38949:1057;;;;38872:1149;40051:1;40035:13;;;:17;40067:9;;;:11;;;;;;:::i;:::-;;;;;-1:-1:-1;38725:1365:0;;-1:-1:-1;38725:1365:0;;40119:4;40134:1559;40149:3;40141:5;:11;:38;;;;;40167:3;:12;;;40156:23;;:3;:8;;;:23;;;40141:38;40134:1559;;;40249:8;;;;40210:49;;-1:-1:-1;;;40210:49:0;;4465:1:1;4454:21;;;;40210:49:0;;;4436:40:1;40196:11:0;;-1:-1:-1;;;;;40210:32:0;;;;;4409:18:1;;40210:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40196:63;;40284:1;40278:3;:7;:30;;;;-1:-1:-1;40289:14:0;;;;:19;;40278:30;40274:1312;;;40335:11;:57;;40389:3;40335:57;;;40382:3;40364;:14;;;40358:3;:20;;;;:::i;:::-;40357:28;;;;:::i;:::-;40349:3;:37;;40335:57;40329:63;;40418:9;40447:1;40430:3;:14;;;:18;;;;:::i;:::-;40418:30;;40413:1158;40468:3;40460:5;:11;40413:1158;;;-1:-1:-1;;;40518:72:0;;40617:10;;40613:860;;40656:11;40708:3;:15;;;40677:46;;40702:1;40684:3;:8;;;40678:3;:14;;;;:::i;:::-;:26;;;;;;:::i;:::-;40677:46;;;;:::i;:::-;40656:68;;40867:19;40890:4;-1:-1:-1;;;;;40890:15:0;40946:4;40906:45;;;;;;5283:25:1;;5271:2;5256:18;;5139:175;40906:45:0;;;;-1:-1:-1;;40906:45:0;;;;;;;;;;;;;;-1:-1:-1;;;;;40906:45:0;-1:-1:-1;;;40906:45:0;;;40890:62;;;40906:45;40890:62;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41099:2:0;41087:15;;41081:22;40864:88;;-1:-1:-1;41081:22:0;-1:-1:-1;40979:19:0;41170:159;-1:-1:-1;;;;;41239:89:0;;41202:3;41177:28;;;41170:159;:::i;:::-;41367:46;;41156:173;;-1:-1:-1;41367:46:0;;41380:8;;41156:173;;41367:46;;;:::i;:::-;;;;;;;;;;;;;41356:57;;41442:7;;;;;:::i;:::-;;;;40629:844;;;;40613:860;41510:1;41503:3;:8;;41497:14;;41538:1;41543;41538:6;41534:17;;41546:5;;;41534:17;-1:-1:-1;40473:3:0;;;;:::i;:::-;;;;40413:1158;;;;40274:1312;41651:3;41634:14;;;:20;41671:8;;;:10;;41614:5;;-1:-1:-1;41671:10:0;;;;:::i;:::-;;;;;-1:-1:-1;40134:1559:0;;-1:-1:-1;40134:1559:0;;-1:-1:-1;41710:8:0;;37335:4391;-1:-1:-1;;;;;;37335:4391:0:o;27934:1638::-;28027:12;28057:14;28090:4;-1:-1:-1;;;;;28077:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;28052:58:0;-1:-1:-1;28052:58:0;;-1:-1:-1;28121:15:0;;-1:-1:-1;28178:13:0;28190:1;28178:9;:13;:::i;:::-;28158:33;;28242:21;28276:626;12352:11;28283:26;;;;;:51;;;;;28325:9;28313;:21;28283:51;28276:626;;;28381:34;;-1:-1:-1;;;28381:34:0;;6480:1:1;6469:21;;;28381:34:0;;;6451:40:1;28354:19:0;;-1:-1:-1;;;;;28381:24:0;;;;;6424:18:1;;28381:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;28351:64:0;;-1:-1:-1;28432:11:0;;-1:-1:-1;28446:151:0;;-1:-1:-1;;;;;;28507:89:0;;28482:3;28453:32;;;;;28446:151;:::i;:::-;28623:46;;28432:165;;-1:-1:-1;28623:46:0;;28636:8;;28432:165;;28623:46;;;:::i;:::-;;;;;;;-1:-1:-1;;28623:46:0;;;;;;;-1:-1:-1;;;28705:45:0;;6480:1:1;6469:21;;;28705:45:0;;;6451:40:1;28623:46:0;-1:-1:-1;28687:14:0;;-1:-1:-1;;;;;28705:35:0;;;;;6424:18:1;;28705:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28684:66;;;28781:8;28769:20;;:8;:20;;;28765:66;;28810:5;;;;;28765:66;28856:8;-1:-1:-1;28856:8:0;28879:11;;;;:::i;:::-;;;;28336:566;;;28276:626;;;-1:-1:-1;;28921:28:0;;;;;:45;;;;;28965:1;28953:9;:13;28921:45;28914:623;;;29013:35;;-1:-1:-1;;;29013:35:0;;6480:1:1;6469:21;;;29013:35:0;;;6451:40:1;28986:19:0;;-1:-1:-1;;;;;29013:24:0;;;;;6424:18:1;;29013:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;28983:65:0;;-1:-1:-1;29063:11:0;;-1:-1:-1;29077:152:0;;-1:-1:-1;;;;;;29139:89:0;;29114:3;29084:33;;;;;29077:152;:::i;:::-;29255:46;;29063:166;;-1:-1:-1;29255:46:0;;29268:8;;29063:166;;29255:46;;;:::i;:::-;;;;;;;-1:-1:-1;;29255:46:0;;;;;;;-1:-1:-1;;;29337:46:0;;6480:1:1;6469:21;;;29337:46:0;;;6451:40:1;29255:46:0;-1:-1:-1;29317:14:0;;-1:-1:-1;;;;;29337:35:0;;;;;6424:18:1;;29337:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29316:67;;;29414:9;29402:21;;:8;:21;;;29398:67;;29444:5;;;;;29398:67;29491:8;-1:-1:-1;29491:8:0;29514:11;;;;:::i;:::-;;;;28968:569;;;28914:623;;;29556:8;27934:1638;-1:-1:-1;;;;;;27934:1638:0:o;29580:2002::-;29784:48;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29784:48:0;-1:-1:-1;;;29784:48:0;;;29768:65;;29674:12;;29699:14;;;;;;-1:-1:-1;;;;;29768:15:0;;;:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29739:94;;;;29852:1;29848:343;;;29896:3;29885:24;;;;;;;;;;;;:::i;:::-;29874:35;;29848:343;;;29977:40;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29977:40:0;-1:-1:-1;;;29977:40:0;;;29961:57;;-1:-1:-1;;;;;29961:15:0;;;:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29950:68:0;;-1:-1:-1;29950:68:0;-1:-1:-1;30037:139:0;;;;30130:2;30125:3;30121:12;30115:19;30103:31;;30037:139;-1:-1:-1;30232:8:0;;-1:-1:-1;30214:15:0;30271:13;30283:1;30271:9;:13;:::i;:::-;30251:33;;30333:21;30367:585;12352:11;30374:26;;;;;:51;;;;;30416:9;30404;:21;30374:51;30367:585;;;30510:34;;-1:-1:-1;;;30510:34:0;;6480:1:1;6469:21;;;30510:34:0;;;6451:40:1;30445:19:0;;;;;;-1:-1:-1;;;;;30510:24:0;;;;;6424:18:1;;30510:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30442:102;;;;;;;;;;;;30561:11;30643:12;30636:20;;-1:-1:-1;;;;;30636:89:0;30611:3;30597:8;30590:16;;30582:32;;30575:151;;;;:::i;:::-;30752:46;;30561:165;;-1:-1:-1;30752:46:0;;30765:8;;30561:165;;30752:46;;;:::i;:::-;;;;;;;;;;;;;30741:57;;30831:8;30819:20;;:8;:20;;;30815:66;;30860:5;;;;;;30815:66;30906:8;30895:19;;30929:11;;;;;:::i;:::-;;;;30427:525;;;;30367:585;;;-1:-1:-1;;30971:28:0;;;;;:45;;;;;31015:1;31003:9;:13;30971:45;30964:583;;;31101:35;;-1:-1:-1;;;31101:35:0;;6480:1:1;6469:21;;;31101:35:0;;;6451:40:1;31036:19:0;;;;;;-1:-1:-1;;;;;31101:24:0;;;;;6424:18:1;;31101:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31033:103;;;;;;;;;;;;31153:11;31236:12;31229:20;;-1:-1:-1;;;;;31229:89:0;31204:3;31189:9;31182:17;;31174:33;;31167:152;;;;:::i;:::-;31345:46;;31153:166;;-1:-1:-1;31345:46:0;;31358:8;;31153:166;;31345:46;;;:::i;:::-;;;;;;;;;;;;;31334:57;;31425:8;31412:21;;:9;:21;;;31408:67;;31454:5;;;;;;31408:67;31501:8;31489:20;;31524:11;;;;;:::i;:::-;;;;31018:529;;;;30964:583;;14854:4769;14939:12;14964:19;;:::i;:::-;15027:4;-1:-1:-1;;;;;15012:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14994:52;;;;15225:34;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15225:34:0;-1:-1:-1;;;15225:34:0;;;15209:51;;14994:15;;-1:-1:-1;;;;;15209:15:0;;;:51;;15225:34;15209:51;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15361:2:0;15350:14;15344:21;15394:23;;:12;;;:23;;;15468:15;;15492:3;;-1:-1:-1;15453:30:0;;-1:-1:-1;15468:15:0;15453:30;:::i;:::-;:43;;;;:::i;:::-;15441:55;;;;:9;;;:55;15533:15;;15557:3;;15522:26;;-1:-1:-1;;15522:26:0;:::i;:::-;:39;;;;:::i;:::-;:43;;;;:::i;:::-;15507:58;;:12;;;:58;15602:15;;15626:3;;15592:25;;:7;:25;:::i;:::-;:38;;;;:::i;:::-;:42;;15633:1;15592:42;:::i;:::-;15576:58;;;;:13;;;:58;15651:12;;;;15666:1;15651:16;;;15647:463;;;15974:3;15902:1;15896:3;15877;:15;;;15870:23;;15854:3;:12;;;15847:20;;:46;;;;:::i;:::-;:52;;;;:::i;:::-;:56;;;;:::i;:::-;15846:89;;15932:3;15846:89;:::i;:::-;15802:3;:15;;;15795:23;;15754:3;:12;;;15747:20;;:71;;;;:::i;:::-;:188;;;;:::i;:::-;15717:260;;;;:::i;:::-;15684:13;;;:293;15647:463;;;16095:3;16074;:15;;;16067:23;;16042:3;:12;;;16035:20;;16027:64;;;;:::i;:::-;16026:72;;;;:::i;:::-;16010:13;;;:88;15647:463;16137:13;;;;16120:14;;;:30;16167:12;;;;-1:-1:-1;16167:16:0;;;;;;16163:33;;;16185:9;;;:11;;;;;;:::i;:::-;;;;;-1:-1:-1;16163:33:0;16254:9;;;;16243:20;;16209:21;16243:8;;;:20;;;;-1:-1:-1;16306:1524:0;16321:7;16327:1;16321:3;:7;:::i;:::-;16313:5;:15;:44;;;;;16344:3;:13;;;16332:25;;:3;:9;;;:25;;;16313:44;16306:1524;;;16426:9;;;;;16388:49;;-1:-1:-1;;;16388:49:0;;4465:1:1;4454:21;;;;16388:49:0;;;4436:40:1;16374:11:0;;-1:-1:-1;;;;;16388:31:0;;;;;4409:18:1;;16388:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16374:63;-1:-1:-1;16456:7:0;;16452:1309;;16497:13;;;;16490:20;;;;16529:1217;16565:3;16561:1;:7;:26;;;;-1:-1:-1;16580:7:0;16586:1;16580:3;:7;:::i;:::-;16572:5;:15;16561:26;16529:1217;;;16640:4;16634:10;;16671;;16667:1021;;16710:11;16763:3;:15;;;16731:47;;16757:1;16738:3;:9;;;16732:3;:15;;;;:::i;:::-;:27;;;;;;:::i;:::-;16731:47;;;;:::i;:::-;17112:79;;;6480:1:1;6469:21;;;17112:79:0;;;;6451:40:1;;;;17112:79:0;;;;;;;;;;6424:18:1;;;;17112:79:0;;;;;;;-1:-1:-1;;;;;17112:79:0;-1:-1:-1;;;17112:79:0;;;17066:152;;6469:21:1;;-1:-1:-1;16999:19:0;;;;-1:-1:-1;;;;;17066:15:0;;;:152;;17112:79;17066:152;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17314:2:0;17307:10;;17301:17;;-1:-1:-1;17045:173:0;-1:-1:-1;17371:11:0;;-1:-1:-1;17385:159:0;-1:-1:-1;;;;;17454:89:0;;17417:3;17392:28;;;17385:159;:::i;:::-;17582:46;;17371:173;;-1:-1:-1;17582:46:0;;17595:8;;17371:173;;17582:46;;;:::i;:::-;;;;;;;;;;;;;17571:57;;17657:7;;;;;:::i;:::-;;;;16683:1005;;;;16667:1021;-1:-1:-1;17725:1:0;17718:8;;;;;16589:3;;;;:::i;:::-;;;;16529:1217;;;;16452:1309;17791:1;17775:13;;;:17;17807:9;;;:11;;;;;;:::i;:::-;;;;;-1:-1:-1;16306:1524:0;;-1:-1:-1;16306:1524:0;;17859:4;17874:1716;17889:3;17881:5;:11;:38;;;;;17907:3;:12;;;17896:23;;:3;:8;;;:23;;;17881:38;17874:1716;;;17988:8;;;;17950:48;;-1:-1:-1;;;17950:48:0;;4465:1:1;4454:21;;;;17950:48:0;;;4436:40:1;17936:11:0;;-1:-1:-1;;;;;17950:31:0;;;;;4409:18:1;;17950:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17936:62;;18023:1;18017:3;:7;:30;;;;-1:-1:-1;18028:14:0;;;;:19;;18017:30;18013:1470;;;18074:11;:57;;18128:3;18074:57;;;18121:3;18103;:14;;;18097:3;:20;;;;:::i;:::-;18096:28;;;;:::i;:::-;18088:3;:37;;18074:57;18068:63;;18155:9;18184:1;18167:3;:14;;;:18;;;;:::i;:::-;18155:30;;18150:1318;18205:3;18197:5;:11;18150:1318;;;-1:-1:-1;;;18255:72:0;;18354:10;;18350:1020;;18393:11;18445:3;:15;;;18414:46;;18439:1;18421:3;:8;;;18415:3;:14;;;;:::i;:::-;:26;;;;;;:::i;:::-;18414:46;;;;:::i;:::-;18794:79;;;6480:1:1;6469:21;;;18794:79:0;;;;6451:40:1;;;;18794:79:0;;;;;;;;;;6424:18:1;;;;18794:79:0;;;;;;;-1:-1:-1;;;;;18794:79:0;-1:-1:-1;;;18794:79:0;;;18748:152;;6469:21:1;;-1:-1:-1;18681:19:0;;;;-1:-1:-1;;;;;18748:15:0;;;:152;;18794:79;18748:152;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18996:2:0;18989:10;;18983:17;;-1:-1:-1;18727:173:0;-1:-1:-1;19053:11:0;;-1:-1:-1;19067:159:0;-1:-1:-1;;;;;19136:89:0;;19099:3;19074:28;;;19067:159;:::i;:::-;19264:46;;19053:173;;-1:-1:-1;19264:46:0;;19277:8;;19053:173;;19264:46;;;:::i;:::-;;;;;;;;;;;;;19253:57;;19339:7;;;;;:::i;:::-;;;;18366:1004;;;;18350:1020;19407:1;19400:3;:8;;19394:14;;19435:1;19440;19435:6;19431:17;;19443:5;;;19431:17;-1:-1:-1;18210:3:0;;;;:::i;:::-;;;;18150:1318;;;;18013:1470;19548:3;19531:14;;;:20;19568:8;;;:10;;19511:5;;-1:-1:-1;19568:10:0;;;;:::i;:::-;;;;;-1:-1:-1;17874:1716:0;;-1:-1:-1;17874:1716:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:315::-;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:1:o;470:250::-;555:1;565:113;579:6;576:1;573:13;565:113;;;655:11;;;649:18;636:11;;;629:39;601:2;594:10;565:113;;;-1:-1:-1;;712:1:1;694:16;;687:27;470:250::o;725:270::-;766:3;804:5;798:12;831:6;826:3;819:19;847:76;916:6;909:4;904:3;900:14;893:4;886:5;882:16;847:76;:::i;:::-;977:2;956:15;-1:-1:-1;;952:29:1;943:39;;;;984:4;939:50;;725:270;-1:-1:-1;;725:270:1:o;1000:217::-;1147:2;1136:9;1129:21;1110:4;1167:44;1207:2;1196:9;1192:18;1184:6;1167:44;:::i;:::-;1159:52;1000:217;-1:-1:-1;;;1000:217:1:o;1222:377::-;1415:2;1404:9;1397:21;1378:4;1441:44;1481:2;1470:9;1466:18;1458:6;1441:44;:::i;:::-;1533:9;1525:6;1521:22;1516:2;1505:9;1501:18;1494:50;1561:32;1586:6;1578;1561:32;:::i;:::-;1553:40;1222:377;-1:-1:-1;;;;;1222:377:1:o;1604:164::-;1681:13;;1734:1;1723:20;;;1713:31;;1703:59;;1758:1;1755;1748:12;1703:59;1604:164;;;:::o;1773:204::-;1841:6;1894:2;1882:9;1873:7;1869:23;1865:32;1862:52;;;1910:1;1907;1900:12;1862:52;1933:38;1961:9;1933:38;:::i;1982:287::-;2111:3;2149:6;2143:13;2165:66;2224:6;2219:3;2212:4;2204:6;2200:17;2165:66;:::i;:::-;2247:16;;;;;1982:287;-1:-1:-1;;1982:287:1:o;2274:127::-;2335:10;2330:3;2326:20;2323:1;2316:31;2366:4;2363:1;2356:15;2390:4;2387:1;2380:15;2406:127;2467:10;2462:3;2458:20;2455:1;2448:31;2498:4;2495:1;2488:15;2522:4;2519:1;2512:15;2538:275;2576:1;2617;2614;2603:16;2653:1;2650;2639:16;2674:3;2664:37;;2681:18;;:::i;:::-;-1:-1:-1;;2717:21:1;;-1:-1:-1;;2740:15:1;;2713:43;2710:69;;;2759:18;;:::i;:::-;2793:14;;;2538:275;-1:-1:-1;;;2538:275:1:o;2818:193::-;2916:1;2905:16;;;2887;;;;2883:39;-1:-1:-1;;2937:23:1;;2972:8;2962:19;;2934:48;2931:74;;;2985:18;;:::i;3016:189::-;3112:1;3083:16;;;3101;;;;3079:39;3166:7;3133:18;;-1:-1:-1;;3153:22:1;;3130:46;3127:72;;;3179:18;;:::i;3210:193::-;3249:1;3275;3265:35;;3280:18;;:::i;:::-;-1:-1:-1;;;3316:18:1;;-1:-1:-1;;3336:13:1;;3312:38;3309:64;;;3353:18;;:::i;:::-;-1:-1:-1;3387:10:1;;3210:193::o;3408:200::-;3474:9;;;3447:4;3502:9;;3530:10;;3542:12;;;3526:29;3565:12;;;3557:21;;3523:56;3520:82;;;3582:18;;:::i;:::-;3520:82;3408:200;;;;:::o;3613:237::-;3685:9;;;3652:7;3710:9;;-1:-1:-1;;;3721:18:1;;3706:34;3703:60;;;3743:18;;:::i;:::-;3816:1;3807:7;3802:16;3799:1;3796:23;3792:1;3785:9;3782:38;3772:72;;3824:18;;:::i;3855:112::-;3887:1;3913;3903:35;;3918:18;;:::i;:::-;-1:-1:-1;3952:9:1;;3855:112::o;3972:120::-;4012:1;4038;4028:35;;4043:18;;:::i;:::-;-1:-1:-1;4077:9:1;;3972:120::o;4097:192::-;4134:3;4181:5;4178:1;4167:20;4215:7;4211:12;4202:7;4199:25;4196:51;;4227:18;;:::i;:::-;-1:-1:-1;;4263:20:1;;4097:192;-1:-1:-1;;4097:192:1:o;4487:184::-;4557:6;4610:2;4598:9;4589:7;4585:23;4581:32;4578:52;;;4626:1;4623;4616:12;4578:52;-1:-1:-1;4649:16:1;;4487:184;-1:-1:-1;4487:184:1:o;4676:237::-;4714:7;4791:1;4788;4777:16;4773:1;4770;4759:16;4755:39;4828:11;4825:1;4814:26;4803:37;;4871:11;4862:7;4859:24;4849:58;;4887:18;;:::i;4918:216::-;4982:9;;;5010:11;;;4957:3;5040:9;;5068:10;;5064:19;;5093:10;;5085:19;;5061:44;5058:70;;;5108:18;;:::i;:::-;5058:70;;4918:216;;;;:::o;5319:383::-;5476:3;5514:6;5508:13;5530:66;5589:6;5584:3;5577:4;5569:6;5565:17;5530:66;:::i;:::-;5618:16;;;;5643:21;;;-1:-1:-1;5691:4:1;5680:16;;5319:383;-1:-1:-1;5319:383:1:o;5707:135::-;5746:3;5767:17;;;5764:43;;5787:18;;:::i;:::-;-1:-1:-1;5834:1:1;5823:13;;5707:135::o;5847:183::-;5884:3;5931:5;5928:1;5917:20;5961:8;5952:7;5949:21;5946:47;;5973:18;;:::i;:::-;6022:1;6009:15;;5847:183;-1:-1:-1;;5847:183:1:o;6035:128::-;6102:9;;;6123:11;;;6120:37;;;6137:18;;:::i;6168:136::-;6207:3;6235:5;6225:39;;6244:18;;:::i;:::-;-1:-1:-1;;;6280:18:1;;6168:136::o;6502:166::-;6580:13;;6633:2;6622:21;;;6612:32;;6602:60;;6658:1;6655;6648:12;6673:164;6749:13;;6798;;6791:21;6781:32;;6771:60;;6827:1;6824;6817:12;6842:470;6944:6;6952;6960;6968;6976;7029:3;7017:9;7008:7;7004:23;7000:33;6997:53;;;7046:1;7043;7036:12;6997:53;7075:9;7069:16;7059:26;;7104:48;7148:2;7137:9;7133:18;7104:48;:::i;:::-;7094:58;;7192:2;7181:9;7177:18;7171:25;7161:35;;7236:2;7225:9;7221:18;7215:25;7205:35;;7259:47;7301:3;7290:9;7286:19;7259:47;:::i;:::-;7249:57;;6842:470;;;;;;;;:::o;7317:192::-;7396:13;;-1:-1:-1;;;;;7438:46:1;;7428:57;;7418:85;;7499:1;7496;7489:12;7514:884;7665:6;7673;7681;7689;7697;7705;7713;7721;7729;7737;7790:3;7778:9;7769:7;7765:23;7761:33;7758:53;;;7807:1;7804;7797:12;7758:53;7830:40;7860:9;7830:40;:::i;:::-;7820:50;;7889:49;7934:2;7923:9;7919:18;7889:49;:::i;:::-;7879:59;;7978:2;7967:9;7963:18;7957:25;7947:35;;8022:2;8011:9;8007:18;8001:25;7991:35;;8045:50;8090:3;8079:9;8075:19;8045:50;:::i;:::-;8035:60;;8114:50;8159:3;8148:9;8144:19;8114:50;:::i;:::-;8104:60;;8183:50;8228:3;8217:9;8213:19;8183:50;:::i;:::-;8173:60;;8252:50;8297:3;8286:9;8282:19;8252:50;:::i;:::-;8242:60;;8342:3;8331:9;8327:19;8321:26;8311:36;;8387:3;8376:9;8372:19;8366:26;8356:36;;7514:884;;;;;;;;;;;;;:::o;8825:297::-;8943:12;;8990:4;8979:16;;;8973:23;;8943:12;9008:16;;9005:111;;;9102:1;9098:6;9088;9082:4;9078:17;9075:1;9071:25;9067:38;9060:5;9056:50;9047:59;;9005:111;;8825:297;;;:::o;9127:184::-;9161:3;9208:5;9205:1;9194:20;9242:7;9238:12;9229:7;9226:25;9223:51;;9254:18;;:::i;:::-;9294:1;9290:15;;9127:184;-1:-1:-1;;9127:184:1:o;9316:493::-;9406:6;9414;9422;9430;9483:3;9471:9;9462:7;9458:23;9454:33;9451:53;;;9500:1;9497;9490:12;9451:53;9532:9;9526:16;9551:31;9576:5;9551:31;:::i;:::-;9601:5;-1:-1:-1;9625:47:1;9668:2;9653:18;;9625:47;:::i;:::-;9615:57;;9691:47;9734:2;9723:9;9719:18;9691:47;:::i;:::-;9681:57;;9757:46;9799:2;9788:9;9784:18;9757:46;:::i;:::-;9747:56;;9316:493;;;;;;;:::o;9814:438::-;9910:6;9918;9926;9934;9987:3;9975:9;9966:7;9962:23;9958:33;9955:53;;;10004:1;10001;9994:12;9955:53;10027:40;10057:9;10027:40;:::i;:::-;10017:50;;10086:48;10130:2;10119:9;10115:18;10086:48;:::i;:::-;10076:58;;10174:2;10163:9;10159:18;10153:25;10143:35;;10197:49;10242:2;10231:9;10227:18;10197:49;:::i;10257:285::-;10332:6;10340;10393:2;10381:9;10372:7;10368:23;10364:32;10361:52;;;10409:1;10406;10399:12;10361:52;10432:38;10460:9;10432:38;:::i;:::-;10422:48;;10489:47;10532:2;10521:9;10517:18;10489:47;:::i;:::-;10479:57;;10257:285;;;;;:::o;10547:953::-;10680:6;10688;10696;10704;10712;10720;10728;10736;10744;10797:3;10785:9;10776:7;10772:23;10768:33;10765:53;;;10814:1;10811;10804:12;10765:53;10837:40;10867:9;10837:40;:::i;:::-;10827:50;;10896:48;10940:2;10929:9;10925:18;10896:48;:::i;:::-;10886:58;;10984:2;10973:9;10969:18;10963:25;10953:35;;11028:2;11017:9;11013:18;11007:25;10997:35;;11051:48;11094:3;11083:9;11079:19;11051:48;:::i;:::-;11041:58;;11118:48;11161:3;11150:9;11146:19;11118:48;:::i;:::-;11108:58;;11209:3;11198:9;11194:19;11188:26;11223:31;11248:5;11223:31;:::i;:::-;11323:3;11308:19;;11302:26;11273:5;;-1:-1:-1;11372:10:1;11359:24;;11347:37;;11337:65;;11398:1;11395;11388:12;11337:65;11421:7;-1:-1:-1;11447:47:1;11489:3;11474:19;;11447:47;:::i;:::-;11437:57;;10547:953;;;;;;;;;;;:::o
Swarm Source
ipfs://2df0001e41a29ceef19ab8015c62046c1357d24ca35f1f6d6e11c66e6e81d029
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.