ETH Price: $2,459.46 (+0.81%)

Token

DR.Sickrespect (SICK)
 

Overview

Max Total Supply

100,000,000 SICK

Holders

29

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000000082759135 SICK

Value
$0.00
0x3E11e9f6b562b44F624b37526bFb9fB65d61B274
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DrSickrespect

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-06-27
*/

// SPDX-License-Identifier: MIT
/*

DR.Sickrespect $DRSICK - Play to Earn

Twitter : https://x.com/drsickrespect
Medium : https://medium.com/@drsickrespect
Reddit : https://www.reddit.com/user/DrSickrespect/
Website : https://drsickrespect.com/
Telegram: https://t.me/DRSickrespect
Documentation: https://dr-sickrespect.gitbook.io/usddrsick-dr.sickrespect/

*/


pragma solidity ^0.8.0;

interface ISwapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface ISwapV3Factory {

    event OwnerChanged(address indexed oldOwner, address indexed newOwner);

    event PoolCreated(
        address indexed token0,
        address indexed token1,
        uint24 indexed fee,
        int24 tickSpacing,
        address pool
    );

    event FeeAmountEnabled(uint24 indexed fee, int24 indexed tickSpacing);

    function feeAmountTickSpacing(uint24 fee) external view returns (int24);

    function getPool(
        address tokenA,
        address tokenB,
        uint24 fee
    ) external view returns (address pool);

    function createPool(
        address tokenA,
        address tokenB,
        uint24 fee
    ) external returns (address pool);

}

interface ISwapFactory is ISwapV3Factory, ISwapV2Factory {}
// File: contracts/interfaces/ISwapRouter.sol


pragma solidity ^0.8.0;
pragma abicoder v2;

interface ISwapV1Router {

    function factory() external view returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface ISwapV2Router is ISwapV1Router {
    
    function factoryV2() external pure returns (address);

    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

}

interface ISwapV3Router {

    function WETH9() external view returns (address);

    struct ExactInputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 amountIn;
        uint256 amountOutMinimum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another token
    /// @dev Setting `amountIn` to 0 will cause the contract to look up its own balance,
    /// and swap the entire amount, enabling contracts to send tokens before calling this function.
    /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);

    struct ExactInputParams {
        bytes path;
        address recipient;
        uint256 amountIn;
        uint256 amountOutMinimum;
    }

    function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);

    struct ExactOutputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 amountOut;
        uint256 amountInMaximum;
        uint160 sqrtPriceLimitX96;
    }

    function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);

    struct ExactOutputParams {
        bytes path;
        address recipient;
        uint256 amountOut;
        uint256 amountInMaximum;
    }


    function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
    
    function uniswapV3SwapCallback(
        int256 amount0Delta,
        int256 amount1Delta,
        bytes calldata data
    ) external;

}

interface ISwapRouter is ISwapV2Router, ISwapV3Router {}
// File: contracts/interfaces/IPair.sol


pragma solidity ^0.8.0;

interface IPair {
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
}

interface IPairV2 is IPair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IPairV3 is IPair{

    event Initialize(uint160 sqrtPriceX96, int24 tick);

    event Mint(
        address sender,
        address indexed owner,
        int24 indexed tickLower,
        int24 indexed tickUpper,
        uint128 amount,
        uint256 amount0,
        uint256 amount1
    );

    event Collect(
        address indexed owner,
        address recipient,
        int24 indexed tickLower,
        int24 indexed tickUpper,
        uint128 amount0,
        uint128 amount1
    );

    event Burn(
        address indexed owner,
        int24 indexed tickLower,
        int24 indexed tickUpper,
        uint128 amount,
        uint256 amount0,
        uint256 amount1
    );

    event Swap(
        address indexed sender,
        address indexed recipient,
        int256 amount0,
        int256 amount1,
        uint160 sqrtPriceX96,
        uint128 liquidity,
        int24 tick
    );

    event Flash(
        address indexed sender,
        address indexed recipient,
        uint256 amount0,
        uint256 amount1,
        uint256 paid0,
        uint256 paid1
    );

    event IncreaseObservationCardinalityNext(
        uint16 observationCardinalityNextOld,
        uint16 observationCardinalityNextNew
    );

    event SetFeeProtocol(uint8 feeProtocol0Old, uint8 feeProtocol1Old, uint8 feeProtocol0New, uint8 feeProtocol1New);

    event CollectProtocol(address indexed sender, address indexed recipient, uint128 amount0, uint128 amount1);

    function fee() external view returns (uint24);

    function tickSpacing() external view returns (int24);

    function maxLiquidityPerTick() external view returns (uint128);

    function slot0()
        external
        view
        returns (
            uint160 sqrtPriceX96,
            int24 tick,
            uint16 observationIndex,
            uint16 observationCardinality,
            uint16 observationCardinalityNext,
            uint8 feeProtocol,
            bool unlocked
        );

    function feeGrowthGlobal0X128() external view returns (uint256);

    function feeGrowthGlobal1X128() external view returns (uint256);

    function protocolFees() external view returns (uint128 token0, uint128 token1);

    function liquidity() external view returns (uint128);

    function ticks(int24 tick)
        external
        view
        returns (
            uint128 liquidityGross,
            int128 liquidityNet,
            uint256 feeGrowthOutside0X128,
            uint256 feeGrowthOutside1X128,
            int56 tickCumulativeOutside,
            uint160 secondsPerLiquidityOutsideX128,
            uint32 secondsOutside,
            bool initialized
        );

    function tickBitmap(int16 wordPosition) external view returns (uint256);

    function positions(bytes32 key)
        external
        view
        returns (
            uint128 _liquidity,
            uint256 feeGrowthInside0LastX128,
            uint256 feeGrowthInside1LastX128,
            uint128 tokensOwed0,
            uint128 tokensOwed1
        );

    function observations(uint256 index)
        external
        view
        returns (
            uint32 blockTimestamp,
            int56 tickCumulative,
            uint160 secondsPerLiquidityCumulativeX128,
            bool initialized
        );

    function observe(uint32[] calldata secondsAgos)
        external
        view
        returns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s);


    function snapshotCumulativesInside(int24 tickLower, int24 tickUpper)
        external
        view
        returns (
            int56 tickCumulativeInside,
            uint160 secondsPerLiquidityInsideX128,
            uint32 secondsInside
        );

    function initialize(uint160 sqrtPriceX96) external;

    function mint(
        address recipient,
        int24 tickLower,
        int24 tickUpper,
        uint128 amount,
        bytes calldata data
    ) external returns (uint256 amount0, uint256 amount1);

    function collect(
        address recipient,
        int24 tickLower,
        int24 tickUpper,
        uint128 amount0Requested,
        uint128 amount1Requested
    ) external returns (uint128 amount0, uint128 amount1);

    function burn(
        int24 tickLower,
        int24 tickUpper,
        uint128 amount
    ) external returns (uint256 amount0, uint256 amount1);

    function swap(
        address recipient,
        bool zeroForOne,
        int256 amountSpecified,
        uint160 sqrtPriceLimitX96,
        bytes calldata data
    ) external returns (int256 amount0, int256 amount1);

    function flash(
        address recipient,
        uint256 amount0,
        uint256 amount1,
        bytes calldata data
    ) external;

    function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external;

    function setFeeProtocol(uint8 feeProtocol0, uint8 feeProtocol1) external;

    function collectProtocol(
        address recipient,
        uint128 amount0Requested,
        uint128 amount1Requested
    ) external returns (uint128 amount0, uint128 amount1);

}
// File: contracts/libs/Tables.sol


pragma solidity ^0.8.20;




/*
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO000000000000000000x
00000000000000koc;,......................................................................................,;cok00000000000000x
00000000000xl,.                                                                                              .,lxO0000000000x
000000000x:.                                                                                                    .;d000000000x
0000000kc.                                                                                                        .ck0000000x
000000x,                                                                                                            'x000000x
00000x,                                                                                                              'x00000x
0000O:                                                                                                                ;O0000x
0000d.                                                                                                                .d0000x
0000l                                ,,                ,,                       .loool,                                l0000x
0000l                               ;xk:.             :kk:                     'dOkkkkx:                               c0000x
0000l                             .:kOkkc.          .ckOkkc.                  ,xOkkkkkOkc.                             c0000x
0000l                            .lkOkkkko.        .lkkkkkkl.                ;xkkkkkkOkkkl.                            c0000x
0000l                           .okkkOkkOx'       .okkkOOkOd'                ....;dOkOOkkko.                           c0000x
0000l                          'dkkkkkkOd'       'dOkkkkkOd'                      'dOkkkkkOd'                          c0000x
0000l                         ,dOkkkkkko.       ,xOkkkkkko.                        .okOkOkkOx,                         c0000x
0000l                        ;xOkkOkkkl.       ;xOkkkkkkl.              .....       .lkkkOOkOx;                        c0000x
0000l                       :kOkkkkkkc.      .:kOkkkkOkc.              ,dxxxxc.      .ckOkkkkOk:.                      c0000x
0000l                     .ckOkkkkkk:       .ckkkOkkOx;               ;xkkkkkkl.       :xOkkOkOkl.                     c0000x
0000l                    .lkOkkOkOx;       .okkkkkkOx,              .:kOkkkkkkko.       ;xOkkOkkko.                    c0000x
0000l                   .oOkkOkkOd,       .okkkkkkkd'              .ckOkkkkkOkkOd'       'dOkkOkkOd'                   c0000x
0000l                  'dOkkkOkko.       ,dOkkOkkko.              .lkOkkkkkkkkkkOx,       .okkkkOkkd,                  c0000x
0000l                 ,xOkkkkOko.       ;xOkkkkkkl.              .okkkkkkkkkkkkkkOx;       .lkkkOkkOx;                 c0000x
0000l                ;xOkkOkkkl.       :kOkkOkkkc.              'dOkkkkkOo,ckOkkOkOkc.      .ckkkkkkOk:                c0000x
0000l              .ckOkkkkOk:.      .ckOkkkkOx:              .,xkkOkOOko.  :xOkOkkOkl.       :kkkkkkkkc.              c0000x
0000l             .lkOkkOOOx;       .lkkkkkkOx;              :dxOkkkkOkc.    ,xOkOkkkko.       ;xOkkkkOkl.             c0000x
0000l            .okkkOkkOx,       .okkkkkkOd'             .ckOkkkkkOkc.      'dOkkkkkOd.       ,dkkkkkkko.            c0000x
0000l           'dOkkOOkOd'       'dOkkOkkOo.             .lkOkkkkkOx;         .okOkkOkOd,       .dOkkkkkOd'           c0000x
0000l          ,dOkOOkkko.       ,xOkkkkOkl.             .okkkOOkkOx,           .lkkkkkkOx;       .okkkkkkOx,          c0000x
0000l         .oOkkOkkOx,       .dOkkkkkOx'             'dOkOkkkkOd'             'xOkOkkkOd.       'xOkOkkkOd.         c0000x
0000l          'dOkkkkkko.       ,xOkkkkkko.           ,xOkkkkkkko.             .okkkkOkOx,       .oOkkkkkOd,          c0000x
0000l           .okOkkkkOd'       'dOkkkOkkd'         ;xOkOOkkOkl.             .oOkkkkOkd'       'dOkkOkkkd'           c0000x
0000l            .lkkkkOkOx,       .okkkkkkOd,      .:kkkkkkOkxc.             ,dOkkkkkko.       ,xOkkkkkko.            c0000x
0000l             .ckOkkOkkx:       .lkOkkkkOx;    .lkOkkkkOx:.              ;xOkkkkOkl.       ;xOkkkOOkl.             c0000x
0000l              .:kOkkkkOkc.      .ckkkkkkkk:. .okkkkkkOx,               :kOkkkkOkc.      .ckOkkkkOkc.              c0000x
0000l                ;xOkkkkOkl.       :kOkkOkOkc;oOOkkkkOd'              .ckkkkkkkk:       .lkkkkkkOx;                c0000x
0000l                 ,xkkOkkOko.       ,xOkkOOkkkkkkOkkko.              .lkkkkkkkx;       .okkkkkkOx,                 c0000x
0000l                  'dOkkkOkkd'       'dOkkkkkkkkkkkkl.              .okkkOkkOd,       'dOkOOkkOd'                  c0000x
0000l                   .okkkkkkOx,       .oOkkkkkkkkOkc.              'dOkOOkkOd'       ,dOkOkkkko.                   c0000x
0000l                    .lkkkkkkOx;       .lkkkkOOkOk:               ,xOkkOkkko.       ;xOkkOkkkl.                    c0000x
0000l                     .ckOkkkkOk:.      .ckkkkkOx;               :xOkkOkkkl.      .:kOkkkkkkc.                     c0000x
0000l                       :xOkkkkOkl.      .:dxxxo,              .ckOkkkkOkc.      .ckkkkOkOk:                       c0000x
0000l                        ,xOkkkkkko.       ....               .lkkkkkkOx;       .lkOkkkkOx;                        c0000x
0000l                         'dOOkkkkOo.                        .okkkkkkOx,       .oOkkkkkOd,                         c0000x
0000l                          .okkkkOkOd,                      'dOkkkkkOd'       'dOkkOOkkd'                          c0000x
0000l                           .lkkkOkkOx:'...                .dOkkkkkko.       'xOkkkkOko.                           c0000x
0000l                            .ckkkkkkkkkkx;                .ckOkkOkl.        .lkkkkOkl.                            c0000x
0000l                             .:kkkkkOkOx,                  .:kkkkc.          .ckkkkc.                             c0000x
0000l                               ;xOkkkOd'                     ;xk:.             :kx;                               c0000x
0000l.                               'llllc.                       ',                ''                                l0000x
0000d.                                                                                                                .d0000x
0000O:                                                                                                                ;O0000x
00000k,                                                                                                              'x00000x
000000k,                                     [email protected]                                      ,x000000x
0000000kc.                                                                                                        .ck0000000x
000000000x:.                                                                                                    .:xO00000000x
00000000000kl;.                                                                                              .;lk0O000000000x
00000000000O00kdl:,'....................................................................................',:ldk00000000000000x
0000000000000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO0000000000000000000x
0000000000000000000000000000000000000000O0000000OOO000000000000000000OO000O0000000000000000000000000000000000000000000000000x
000000000000000000000000000000000000000000000kdddddk00000000000000OxddddxO00000000000000000000000000000000000000000000000000x
00000000000000000000000000000000000000000000O:    .cO0000000000000o.    ,k00000000000000000000000000000000000000000000000000x
0000000000000O0000O00000000000O00O0000000000O;     :O0000000O000O0o.    'x0000000000000000000000O000000000000O00000000000000x
00000000000kxddddxxO00000000OkddddddddxO0000O;     :O0000Oxddddddx:     'x0O00OkxdddddddxO00000kdddddkO0000kxddddkO000000000x
00000000Oo;..     ..;dO00Ox:..        ..;dO0O;     :O0Od;..             'x0Oxc'.        ..;oO00c.    ;O0000c.    ;O000000000x
0000000k:     .:c:'  .o0Ol.     '::,.    .cOO;     :0Oc.    .,::cc,     'x0o.     '::;.     :O0:     ,O0000:     ,O000000000x
0000000o.    .x000Oc..cOk'     cO000o.    .xO;     :0d.    .o00000o.    'kO,     :O000d.    .o0:     ,O0000:     ,O000000000x
0000000o.     'lxO0OkkO0x.    .o0O00x.    .d0;     :0o.    'x0OOO0o.    .kk'     l0000k'    .l0:     ,O0000:     ,O000000000x
0000000kc.      .'cdO0O0x.    .o0O00x.    .dO;     :0o.    'x0O0O0o.    .kk'     .;;;;,.    .l0:     ,O0000:     ,O000000000x
00000000Oxl,.       .ck0x.    .o00O0x.    .d0;     :0o.    'x0OOO0o.    .kk'      ..........'d0:     ,O0000:     ;O000000000x
000000000000ko:.      :0x.    .o00O0x.    .d0;     :0o.    'x00000o.    'kk'     ckkkkkkkkkkkO0:     ,O0000:     l0000000000x
0000000d:,ck0O0k;     ,Ox.    .o0OO0d.    .d0;     :0o.    .x00000l     .kk'     c0000O00kc,:x0:     ,O0O0O:    ;k0000000000x
00000O0d.  ,oddl.    .l0O:     .cddl'     ;OO;     :0k,     'loddc.     'x0c     .:oddddo;  ,k0:     'dddo:.  .ck00000000000x
0000000Oo'          'oO00Ol.            .ck0O;     :O0k:.         .     'x0Oo'            .;x00:           .'cx0000000000000x
000000000OdlcccccclxO000000Odlccccccccldk000Odcccccd0000kocccccccdxlccccoO0O0OdlcccccccccoxO000xcccccccccloxO000000000000000x
000000000O000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0d
*/

struct SwapParams {
    bool taxless;
    address sender;
    address recipient;
    uint96 amountsIn;
    uint64 txBlock;    
    uint96 taxAmounts;
    uint96 amountsOut;
}

struct TokenSetup {
    uint8 fairMode;
    uint24 gasLimit;
    uint16 buyTax;
    uint16 sellTax;
    uint16 transferTax;
    uint16 developmentShare;
    uint16 marketingShare;
    uint16 prizeShare;
    uint16 burnShare;
    uint16 autoLiquidityShare;
    uint16 swapThresholdRatio;
    address devWallet;
    address marketingWallet;
    address prizePool;
    address gameRouter;
}

struct Registry {
    mapping(address => Account) Address;
    mapping(uint256 => address) PID;
    mapping(address => mapping(address => uint256)) allowances;
    mapping(address => bool) helpers;
}

struct Account {
    uint16 identifiers;
    uint64 nonces;
    uint80 PID;
    uint96 balance;
    address Address;
}

struct Settings {
    uint8 fairMode;
    uint16 buyTax;
    uint16 sellTax;
    uint16 transferTax;
    uint16 developmentShare;
    uint16 marketingShare;
    uint16 prizeShare;
    uint16 burnShare;
    uint16 autoLiquidityShare;
    uint16 swapThresholdRatio;
    uint24 gas;
    address[3] feeRecipients;
}

struct LatestTransaction {
    mapping(address => SwapParams) _tx;
}

struct Storage {
    IPair PAIR;
    address owner;
    uint96 totalSupply;
    uint80 PID;
    bool launched;
    bool inSwap;
    Settings settings;
    Registry registry;
    LatestTransaction latestTx;
}

// File: contracts/interfaces/IERC20.sol


pragma solidity ^0.8.0;

interface IERC20 {

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);

    function name() external view returns(string memory);

    function symbol() external view returns(string memory);

    function decimals() external view returns(uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address to, uint256 value) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(address from, address to, uint256 value) external returns (bool);

}

// File: contracts/libs/TransferHelper.sol


pragma solidity ^0.8.0;


library TransferHelper {

    error TxFailed();

    function _transfer(address to, uint256 value) internal {
        
        (bool success, bytes memory data) = payable(to).call{value: value}(new bytes(0));
        
        _checkResponse(success, data);

    }

    function _transfer(address to, uint256 value, uint256 gas) internal {
        
        (bool success, bytes memory data) = payable(to).call{value: value, gas: gas}(new bytes(0));
        
        _checkResponse(success, data);

    }    

    function _transfer(
        address token,
        address to,
        uint256 value
    ) internal {

        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(
                IERC20.transfer.selector, to, value)
            );

        _checkResponse(success, data);
    }

    function _transferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        
        (bool success, bytes memory data) =
            token.call(
                abi.encodeWithSelector(
                    IERC20.transferFrom.selector, from, to, value
                )
            );

        _checkResponse(success, data);

    }    

    function _approve(
        address token,
        address to,
        uint256 value
    ) internal {

        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(
                IERC20.approve.selector, to, value)
            );
        
        _checkResponse(success, data);

    }

    function _checkResponse(bool status, bytes memory data) internal pure {
        if (!(status && (data.length == 0 || abi.decode(data, (bool)))))
            revert TxFailed();
    }

}

// File: contracts/libs/SafeCast.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SafeCast.sol)
// This file was procedurally generated from scripts/generate/templates/SafeCast.js.

pragma solidity ^0.8.20;

/**
 * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow
 * checks.
 *
 * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
 * easily result in undesired exploitation or bugs, since developers usually
 * assume that overflows raise errors. `SafeCast` restores this intuition by
 * reverting the transaction when such an operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeCast {
    /**
     * @dev Value doesn't fit in an uint of `bits` size.
     */
    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);

    /**
     * @dev An int value doesn't fit in an uint of `bits` size.
     */
    error SafeCastOverflowedIntToUint(int256 value);

    /**
     * @dev Value doesn't fit in an int of `bits` size.
     */
    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);

    /**
     * @dev An uint value doesn't fit in an int of `bits` size.
     */
    error SafeCastOverflowedUintToInt(uint256 value);

    /**
     * @dev Returns the downcasted uint248 from uint256, reverting on
     * overflow (when the input is greater than largest uint248).
     *
     * Counterpart to Solidity's `uint248` operator.
     *
     * Requirements:
     *
     * - input must fit into 248 bits
     */
    function toUint248(uint256 value) internal pure returns (uint248) {
        if (value > type(uint248).max) {
            revert SafeCastOverflowedUintDowncast(248, value);
        }
        return uint248(value);
    }

    /**
     * @dev Returns the downcasted uint240 from uint256, reverting on
     * overflow (when the input is greater than largest uint240).
     *
     * Counterpart to Solidity's `uint240` operator.
     *
     * Requirements:
     *
     * - input must fit into 240 bits
     */
    function toUint240(uint256 value) internal pure returns (uint240) {
        if (value > type(uint240).max) {
            revert SafeCastOverflowedUintDowncast(240, value);
        }
        return uint240(value);
    }

    /**
     * @dev Returns the downcasted uint232 from uint256, reverting on
     * overflow (when the input is greater than largest uint232).
     *
     * Counterpart to Solidity's `uint232` operator.
     *
     * Requirements:
     *
     * - input must fit into 232 bits
     */
    function toUint232(uint256 value) internal pure returns (uint232) {
        if (value > type(uint232).max) {
            revert SafeCastOverflowedUintDowncast(232, value);
        }
        return uint232(value);
    }

    /**
     * @dev Returns the downcasted uint224 from uint256, reverting on
     * overflow (when the input is greater than largest uint224).
     *
     * Counterpart to Solidity's `uint224` operator.
     *
     * Requirements:
     *
     * - input must fit into 224 bits
     */
    function toUint224(uint256 value) internal pure returns (uint224) {
        if (value > type(uint224).max) {
            revert SafeCastOverflowedUintDowncast(224, value);
        }
        return uint224(value);
    }

    /**
     * @dev Returns the downcasted uint216 from uint256, reverting on
     * overflow (when the input is greater than largest uint216).
     *
     * Counterpart to Solidity's `uint216` operator.
     *
     * Requirements:
     *
     * - input must fit into 216 bits
     */
    function toUint216(uint256 value) internal pure returns (uint216) {
        if (value > type(uint216).max) {
            revert SafeCastOverflowedUintDowncast(216, value);
        }
        return uint216(value);
    }

    /**
     * @dev Returns the downcasted uint208 from uint256, reverting on
     * overflow (when the input is greater than largest uint208).
     *
     * Counterpart to Solidity's `uint208` operator.
     *
     * Requirements:
     *
     * - input must fit into 208 bits
     */
    function toUint208(uint256 value) internal pure returns (uint208) {
        if (value > type(uint208).max) {
            revert SafeCastOverflowedUintDowncast(208, value);
        }
        return uint208(value);
    }

    /**
     * @dev Returns the downcasted uint200 from uint256, reverting on
     * overflow (when the input is greater than largest uint200).
     *
     * Counterpart to Solidity's `uint200` operator.
     *
     * Requirements:
     *
     * - input must fit into 200 bits
     */
    function toUint200(uint256 value) internal pure returns (uint200) {
        if (value > type(uint200).max) {
            revert SafeCastOverflowedUintDowncast(200, value);
        }
        return uint200(value);
    }

    /**
     * @dev Returns the downcasted uint192 from uint256, reverting on
     * overflow (when the input is greater than largest uint192).
     *
     * Counterpart to Solidity's `uint192` operator.
     *
     * Requirements:
     *
     * - input must fit into 192 bits
     */
    function toUint192(uint256 value) internal pure returns (uint192) {
        if (value > type(uint192).max) {
            revert SafeCastOverflowedUintDowncast(192, value);
        }
        return uint192(value);
    }

    /**
     * @dev Returns the downcasted uint184 from uint256, reverting on
     * overflow (when the input is greater than largest uint184).
     *
     * Counterpart to Solidity's `uint184` operator.
     *
     * Requirements:
     *
     * - input must fit into 184 bits
     */
    function toUint184(uint256 value) internal pure returns (uint184) {
        if (value > type(uint184).max) {
            revert SafeCastOverflowedUintDowncast(184, value);
        }
        return uint184(value);
    }

    /**
     * @dev Returns the downcasted uint176 from uint256, reverting on
     * overflow (when the input is greater than largest uint176).
     *
     * Counterpart to Solidity's `uint176` operator.
     *
     * Requirements:
     *
     * - input must fit into 176 bits
     */
    function toUint176(uint256 value) internal pure returns (uint176) {
        if (value > type(uint176).max) {
            revert SafeCastOverflowedUintDowncast(176, value);
        }
        return uint176(value);
    }

    /**
     * @dev Returns the downcasted uint168 from uint256, reverting on
     * overflow (when the input is greater than largest uint168).
     *
     * Counterpart to Solidity's `uint168` operator.
     *
     * Requirements:
     *
     * - input must fit into 168 bits
     */
    function toUint168(uint256 value) internal pure returns (uint168) {
        if (value > type(uint168).max) {
            revert SafeCastOverflowedUintDowncast(168, value);
        }
        return uint168(value);
    }

    /**
     * @dev Returns the downcasted uint160 from uint256, reverting on
     * overflow (when the input is greater than largest uint160).
     *
     * Counterpart to Solidity's `uint160` operator.
     *
     * Requirements:
     *
     * - input must fit into 160 bits
     */
    function toUint160(uint256 value) internal pure returns (uint160) {
        if (value > type(uint160).max) {
            revert SafeCastOverflowedUintDowncast(160, value);
        }
        return uint160(value);
    }

    /**
     * @dev Returns the downcasted uint152 from uint256, reverting on
     * overflow (when the input is greater than largest uint152).
     *
     * Counterpart to Solidity's `uint152` operator.
     *
     * Requirements:
     *
     * - input must fit into 152 bits
     */
    function toUint152(uint256 value) internal pure returns (uint152) {
        if (value > type(uint152).max) {
            revert SafeCastOverflowedUintDowncast(152, value);
        }
        return uint152(value);
    }

    /**
     * @dev Returns the downcasted uint144 from uint256, reverting on
     * overflow (when the input is greater than largest uint144).
     *
     * Counterpart to Solidity's `uint144` operator.
     *
     * Requirements:
     *
     * - input must fit into 144 bits
     */
    function toUint144(uint256 value) internal pure returns (uint144) {
        if (value > type(uint144).max) {
            revert SafeCastOverflowedUintDowncast(144, value);
        }
        return uint144(value);
    }

    /**
     * @dev Returns the downcasted uint136 from uint256, reverting on
     * overflow (when the input is greater than largest uint136).
     *
     * Counterpart to Solidity's `uint136` operator.
     *
     * Requirements:
     *
     * - input must fit into 136 bits
     */
    function toUint136(uint256 value) internal pure returns (uint136) {
        if (value > type(uint136).max) {
            revert SafeCastOverflowedUintDowncast(136, value);
        }
        return uint136(value);
    }

    /**
     * @dev Returns the downcasted uint128 from uint256, reverting on
     * overflow (when the input is greater than largest uint128).
     *
     * Counterpart to Solidity's `uint128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     */
    function toUint128(uint256 value) internal pure returns (uint128) {
        if (value > type(uint128).max) {
            revert SafeCastOverflowedUintDowncast(128, value);
        }
        return uint128(value);
    }

    /**
     * @dev Returns the downcasted uint120 from uint256, reverting on
     * overflow (when the input is greater than largest uint120).
     *
     * Counterpart to Solidity's `uint120` operator.
     *
     * Requirements:
     *
     * - input must fit into 120 bits
     */
    function toUint120(uint256 value) internal pure returns (uint120) {
        if (value > type(uint120).max) {
            revert SafeCastOverflowedUintDowncast(120, value);
        }
        return uint120(value);
    }

    /**
     * @dev Returns the downcasted uint112 from uint256, reverting on
     * overflow (when the input is greater than largest uint112).
     *
     * Counterpart to Solidity's `uint112` operator.
     *
     * Requirements:
     *
     * - input must fit into 112 bits
     */
    function toUint112(uint256 value) internal pure returns (uint112) {
        if (value > type(uint112).max) {
            revert SafeCastOverflowedUintDowncast(112, value);
        }
        return uint112(value);
    }

    /**
     * @dev Returns the downcasted uint104 from uint256, reverting on
     * overflow (when the input is greater than largest uint104).
     *
     * Counterpart to Solidity's `uint104` operator.
     *
     * Requirements:
     *
     * - input must fit into 104 bits
     */
    function toUint104(uint256 value) internal pure returns (uint104) {
        if (value > type(uint104).max) {
            revert SafeCastOverflowedUintDowncast(104, value);
        }
        return uint104(value);
    }

    /**
     * @dev Returns the downcasted uint96 from uint256, reverting on
     * overflow (when the input is greater than largest uint96).
     *
     * Counterpart to Solidity's `uint96` operator.
     *
     * Requirements:
     *
     * - input must fit into 96 bits
     */
    function toUint96(uint256 value) internal pure returns (uint96) {
        if (value > type(uint96).max) {
            revert SafeCastOverflowedUintDowncast(96, value);
        }
        return uint96(value);
    }

    /**
     * @dev Returns the downcasted uint88 from uint256, reverting on
     * overflow (when the input is greater than largest uint88).
     *
     * Counterpart to Solidity's `uint88` operator.
     *
     * Requirements:
     *
     * - input must fit into 88 bits
     */
    function toUint88(uint256 value) internal pure returns (uint88) {
        if (value > type(uint88).max) {
            revert SafeCastOverflowedUintDowncast(88, value);
        }
        return uint88(value);
    }

    /**
     * @dev Returns the downcasted uint80 from uint256, reverting on
     * overflow (when the input is greater than largest uint80).
     *
     * Counterpart to Solidity's `uint80` operator.
     *
     * Requirements:
     *
     * - input must fit into 80 bits
     */
    function toUint80(uint256 value) internal pure returns (uint80) {
        if (value > type(uint80).max) {
            revert SafeCastOverflowedUintDowncast(80, value);
        }
        return uint80(value);
    }

    /**
     * @dev Returns the downcasted uint72 from uint256, reverting on
     * overflow (when the input is greater than largest uint72).
     *
     * Counterpart to Solidity's `uint72` operator.
     *
     * Requirements:
     *
     * - input must fit into 72 bits
     */
    function toUint72(uint256 value) internal pure returns (uint72) {
        if (value > type(uint72).max) {
            revert SafeCastOverflowedUintDowncast(72, value);
        }
        return uint72(value);
    }

    /**
     * @dev Returns the downcasted uint64 from uint256, reverting on
     * overflow (when the input is greater than largest uint64).
     *
     * Counterpart to Solidity's `uint64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     */
    function toUint64(uint256 value) internal pure returns (uint64) {
        if (value > type(uint64).max) {
            revert SafeCastOverflowedUintDowncast(64, value);
        }
        return uint64(value);
    }

    /**
     * @dev Returns the downcasted uint56 from uint256, reverting on
     * overflow (when the input is greater than largest uint56).
     *
     * Counterpart to Solidity's `uint56` operator.
     *
     * Requirements:
     *
     * - input must fit into 56 bits
     */
    function toUint56(uint256 value) internal pure returns (uint56) {
        if (value > type(uint56).max) {
            revert SafeCastOverflowedUintDowncast(56, value);
        }
        return uint56(value);
    }

    /**
     * @dev Returns the downcasted uint48 from uint256, reverting on
     * overflow (when the input is greater than largest uint48).
     *
     * Counterpart to Solidity's `uint48` operator.
     *
     * Requirements:
     *
     * - input must fit into 48 bits
     */
    function toUint48(uint256 value) internal pure returns (uint48) {
        if (value > type(uint48).max) {
            revert SafeCastOverflowedUintDowncast(48, value);
        }
        return uint48(value);
    }

    /**
     * @dev Returns the downcasted uint40 from uint256, reverting on
     * overflow (when the input is greater than largest uint40).
     *
     * Counterpart to Solidity's `uint40` operator.
     *
     * Requirements:
     *
     * - input must fit into 40 bits
     */
    function toUint40(uint256 value) internal pure returns (uint40) {
        if (value > type(uint40).max) {
            revert SafeCastOverflowedUintDowncast(40, value);
        }
        return uint40(value);
    }

    /**
     * @dev Returns the downcasted uint32 from uint256, reverting on
     * overflow (when the input is greater than largest uint32).
     *
     * Counterpart to Solidity's `uint32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     */
    function toUint32(uint256 value) internal pure returns (uint32) {
        if (value > type(uint32).max) {
            revert SafeCastOverflowedUintDowncast(32, value);
        }
        return uint32(value);
    }

    /**
     * @dev Returns the downcasted uint24 from uint256, reverting on
     * overflow (when the input is greater than largest uint24).
     *
     * Counterpart to Solidity's `uint24` operator.
     *
     * Requirements:
     *
     * - input must fit into 24 bits
     */
    function toUint24(uint256 value) internal pure returns (uint24) {
        if (value > type(uint24).max) {
            revert SafeCastOverflowedUintDowncast(24, value);
        }
        return uint24(value);
    }

    /**
     * @dev Returns the downcasted uint16 from uint256, reverting on
     * overflow (when the input is greater than largest uint16).
     *
     * Counterpart to Solidity's `uint16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     */
    function toUint16(uint256 value) internal pure returns (uint16) {
        if (value > type(uint16).max) {
            revert SafeCastOverflowedUintDowncast(16, value);
        }
        return uint16(value);
    }

    /**
     * @dev Returns the downcasted uint8 from uint256, reverting on
     * overflow (when the input is greater than largest uint8).
     *
     * Counterpart to Solidity's `uint8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits
     */
    function toUint8(uint256 value) internal pure returns (uint8) {
        if (value > type(uint8).max) {
            revert SafeCastOverflowedUintDowncast(8, value);
        }
        return uint8(value);
    }

    /**
     * @dev Converts a signed int256 into an unsigned uint256.
     *
     * Requirements:
     *
     * - input must be greater than or equal to 0.
     */
    function toUint256(int256 value) internal pure returns (uint256) {
        if (value < 0) {
            revert SafeCastOverflowedIntToUint(value);
        }
        return uint256(value);
    }

    /**
     * @dev Returns the downcasted int248 from int256, reverting on
     * overflow (when the input is less than smallest int248 or
     * greater than largest int248).
     *
     * Counterpart to Solidity's `int248` operator.
     *
     * Requirements:
     *
     * - input must fit into 248 bits
     */
    function toInt248(int256 value) internal pure returns (int248 downcasted) {
        downcasted = int248(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(248, value);
        }
    }

    /**
     * @dev Returns the downcasted int240 from int256, reverting on
     * overflow (when the input is less than smallest int240 or
     * greater than largest int240).
     *
     * Counterpart to Solidity's `int240` operator.
     *
     * Requirements:
     *
     * - input must fit into 240 bits
     */
    function toInt240(int256 value) internal pure returns (int240 downcasted) {
        downcasted = int240(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(240, value);
        }
    }

    /**
     * @dev Returns the downcasted int232 from int256, reverting on
     * overflow (when the input is less than smallest int232 or
     * greater than largest int232).
     *
     * Counterpart to Solidity's `int232` operator.
     *
     * Requirements:
     *
     * - input must fit into 232 bits
     */
    function toInt232(int256 value) internal pure returns (int232 downcasted) {
        downcasted = int232(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(232, value);
        }
    }

    /**
     * @dev Returns the downcasted int224 from int256, reverting on
     * overflow (when the input is less than smallest int224 or
     * greater than largest int224).
     *
     * Counterpart to Solidity's `int224` operator.
     *
     * Requirements:
     *
     * - input must fit into 224 bits
     */
    function toInt224(int256 value) internal pure returns (int224 downcasted) {
        downcasted = int224(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(224, value);
        }
    }

    /**
     * @dev Returns the downcasted int216 from int256, reverting on
     * overflow (when the input is less than smallest int216 or
     * greater than largest int216).
     *
     * Counterpart to Solidity's `int216` operator.
     *
     * Requirements:
     *
     * - input must fit into 216 bits
     */
    function toInt216(int256 value) internal pure returns (int216 downcasted) {
        downcasted = int216(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(216, value);
        }
    }

    /**
     * @dev Returns the downcasted int208 from int256, reverting on
     * overflow (when the input is less than smallest int208 or
     * greater than largest int208).
     *
     * Counterpart to Solidity's `int208` operator.
     *
     * Requirements:
     *
     * - input must fit into 208 bits
     */
    function toInt208(int256 value) internal pure returns (int208 downcasted) {
        downcasted = int208(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(208, value);
        }
    }

    /**
     * @dev Returns the downcasted int200 from int256, reverting on
     * overflow (when the input is less than smallest int200 or
     * greater than largest int200).
     *
     * Counterpart to Solidity's `int200` operator.
     *
     * Requirements:
     *
     * - input must fit into 200 bits
     */
    function toInt200(int256 value) internal pure returns (int200 downcasted) {
        downcasted = int200(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(200, value);
        }
    }

    /**
     * @dev Returns the downcasted int192 from int256, reverting on
     * overflow (when the input is less than smallest int192 or
     * greater than largest int192).
     *
     * Counterpart to Solidity's `int192` operator.
     *
     * Requirements:
     *
     * - input must fit into 192 bits
     */
    function toInt192(int256 value) internal pure returns (int192 downcasted) {
        downcasted = int192(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(192, value);
        }
    }

    /**
     * @dev Returns the downcasted int184 from int256, reverting on
     * overflow (when the input is less than smallest int184 or
     * greater than largest int184).
     *
     * Counterpart to Solidity's `int184` operator.
     *
     * Requirements:
     *
     * - input must fit into 184 bits
     */
    function toInt184(int256 value) internal pure returns (int184 downcasted) {
        downcasted = int184(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(184, value);
        }
    }

    /**
     * @dev Returns the downcasted int176 from int256, reverting on
     * overflow (when the input is less than smallest int176 or
     * greater than largest int176).
     *
     * Counterpart to Solidity's `int176` operator.
     *
     * Requirements:
     *
     * - input must fit into 176 bits
     */
    function toInt176(int256 value) internal pure returns (int176 downcasted) {
        downcasted = int176(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(176, value);
        }
    }

    /**
     * @dev Returns the downcasted int168 from int256, reverting on
     * overflow (when the input is less than smallest int168 or
     * greater than largest int168).
     *
     * Counterpart to Solidity's `int168` operator.
     *
     * Requirements:
     *
     * - input must fit into 168 bits
     */
    function toInt168(int256 value) internal pure returns (int168 downcasted) {
        downcasted = int168(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(168, value);
        }
    }

    /**
     * @dev Returns the downcasted int160 from int256, reverting on
     * overflow (when the input is less than smallest int160 or
     * greater than largest int160).
     *
     * Counterpart to Solidity's `int160` operator.
     *
     * Requirements:
     *
     * - input must fit into 160 bits
     */
    function toInt160(int256 value) internal pure returns (int160 downcasted) {
        downcasted = int160(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(160, value);
        }
    }

    /**
     * @dev Returns the downcasted int152 from int256, reverting on
     * overflow (when the input is less than smallest int152 or
     * greater than largest int152).
     *
     * Counterpart to Solidity's `int152` operator.
     *
     * Requirements:
     *
     * - input must fit into 152 bits
     */
    function toInt152(int256 value) internal pure returns (int152 downcasted) {
        downcasted = int152(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(152, value);
        }
    }

    /**
     * @dev Returns the downcasted int144 from int256, reverting on
     * overflow (when the input is less than smallest int144 or
     * greater than largest int144).
     *
     * Counterpart to Solidity's `int144` operator.
     *
     * Requirements:
     *
     * - input must fit into 144 bits
     */
    function toInt144(int256 value) internal pure returns (int144 downcasted) {
        downcasted = int144(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(144, value);
        }
    }

    /**
     * @dev Returns the downcasted int136 from int256, reverting on
     * overflow (when the input is less than smallest int136 or
     * greater than largest int136).
     *
     * Counterpart to Solidity's `int136` operator.
     *
     * Requirements:
     *
     * - input must fit into 136 bits
     */
    function toInt136(int256 value) internal pure returns (int136 downcasted) {
        downcasted = int136(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(136, value);
        }
    }

    /**
     * @dev Returns the downcasted int128 from int256, reverting on
     * overflow (when the input is less than smallest int128 or
     * greater than largest int128).
     *
     * Counterpart to Solidity's `int128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     */
    function toInt128(int256 value) internal pure returns (int128 downcasted) {
        downcasted = int128(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(128, value);
        }
    }

    /**
     * @dev Returns the downcasted int120 from int256, reverting on
     * overflow (when the input is less than smallest int120 or
     * greater than largest int120).
     *
     * Counterpart to Solidity's `int120` operator.
     *
     * Requirements:
     *
     * - input must fit into 120 bits
     */
    function toInt120(int256 value) internal pure returns (int120 downcasted) {
        downcasted = int120(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(120, value);
        }
    }

    /**
     * @dev Returns the downcasted int112 from int256, reverting on
     * overflow (when the input is less than smallest int112 or
     * greater than largest int112).
     *
     * Counterpart to Solidity's `int112` operator.
     *
     * Requirements:
     *
     * - input must fit into 112 bits
     */
    function toInt112(int256 value) internal pure returns (int112 downcasted) {
        downcasted = int112(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(112, value);
        }
    }

    /**
     * @dev Returns the downcasted int104 from int256, reverting on
     * overflow (when the input is less than smallest int104 or
     * greater than largest int104).
     *
     * Counterpart to Solidity's `int104` operator.
     *
     * Requirements:
     *
     * - input must fit into 104 bits
     */
    function toInt104(int256 value) internal pure returns (int104 downcasted) {
        downcasted = int104(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(104, value);
        }
    }

    /**
     * @dev Returns the downcasted int96 from int256, reverting on
     * overflow (when the input is less than smallest int96 or
     * greater than largest int96).
     *
     * Counterpart to Solidity's `int96` operator.
     *
     * Requirements:
     *
     * - input must fit into 96 bits
     */
    function toInt96(int256 value) internal pure returns (int96 downcasted) {
        downcasted = int96(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(96, value);
        }
    }

    /**
     * @dev Returns the downcasted int88 from int256, reverting on
     * overflow (when the input is less than smallest int88 or
     * greater than largest int88).
     *
     * Counterpart to Solidity's `int88` operator.
     *
     * Requirements:
     *
     * - input must fit into 88 bits
     */
    function toInt88(int256 value) internal pure returns (int88 downcasted) {
        downcasted = int88(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(88, value);
        }
    }

    /**
     * @dev Returns the downcasted int80 from int256, reverting on
     * overflow (when the input is less than smallest int80 or
     * greater than largest int80).
     *
     * Counterpart to Solidity's `int80` operator.
     *
     * Requirements:
     *
     * - input must fit into 80 bits
     */
    function toInt80(int256 value) internal pure returns (int80 downcasted) {
        downcasted = int80(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(80, value);
        }
    }

    /**
     * @dev Returns the downcasted int72 from int256, reverting on
     * overflow (when the input is less than smallest int72 or
     * greater than largest int72).
     *
     * Counterpart to Solidity's `int72` operator.
     *
     * Requirements:
     *
     * - input must fit into 72 bits
     */
    function toInt72(int256 value) internal pure returns (int72 downcasted) {
        downcasted = int72(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(72, value);
        }
    }

    /**
     * @dev Returns the downcasted int64 from int256, reverting on
     * overflow (when the input is less than smallest int64 or
     * greater than largest int64).
     *
     * Counterpart to Solidity's `int64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     */
    function toInt64(int256 value) internal pure returns (int64 downcasted) {
        downcasted = int64(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(64, value);
        }
    }

    /**
     * @dev Returns the downcasted int56 from int256, reverting on
     * overflow (when the input is less than smallest int56 or
     * greater than largest int56).
     *
     * Counterpart to Solidity's `int56` operator.
     *
     * Requirements:
     *
     * - input must fit into 56 bits
     */
    function toInt56(int256 value) internal pure returns (int56 downcasted) {
        downcasted = int56(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(56, value);
        }
    }

    /**
     * @dev Returns the downcasted int48 from int256, reverting on
     * overflow (when the input is less than smallest int48 or
     * greater than largest int48).
     *
     * Counterpart to Solidity's `int48` operator.
     *
     * Requirements:
     *
     * - input must fit into 48 bits
     */
    function toInt48(int256 value) internal pure returns (int48 downcasted) {
        downcasted = int48(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(48, value);
        }
    }

    /**
     * @dev Returns the downcasted int40 from int256, reverting on
     * overflow (when the input is less than smallest int40 or
     * greater than largest int40).
     *
     * Counterpart to Solidity's `int40` operator.
     *
     * Requirements:
     *
     * - input must fit into 40 bits
     */
    function toInt40(int256 value) internal pure returns (int40 downcasted) {
        downcasted = int40(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(40, value);
        }
    }

    /**
     * @dev Returns the downcasted int32 from int256, reverting on
     * overflow (when the input is less than smallest int32 or
     * greater than largest int32).
     *
     * Counterpart to Solidity's `int32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     */
    function toInt32(int256 value) internal pure returns (int32 downcasted) {
        downcasted = int32(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(32, value);
        }
    }

    /**
     * @dev Returns the downcasted int24 from int256, reverting on
     * overflow (when the input is less than smallest int24 or
     * greater than largest int24).
     *
     * Counterpart to Solidity's `int24` operator.
     *
     * Requirements:
     *
     * - input must fit into 24 bits
     */
    function toInt24(int256 value) internal pure returns (int24 downcasted) {
        downcasted = int24(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(24, value);
        }
    }

    /**
     * @dev Returns the downcasted int16 from int256, reverting on
     * overflow (when the input is less than smallest int16 or
     * greater than largest int16).
     *
     * Counterpart to Solidity's `int16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     */
    function toInt16(int256 value) internal pure returns (int16 downcasted) {
        downcasted = int16(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(16, value);
        }
    }

    /**
     * @dev Returns the downcasted int8 from int256, reverting on
     * overflow (when the input is less than smallest int8 or
     * greater than largest int8).
     *
     * Counterpart to Solidity's `int8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits
     */
    function toInt8(int256 value) internal pure returns (int8 downcasted) {
        downcasted = int8(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(8, value);
        }
    }

    /**
     * @dev Converts an unsigned uint256 into a signed int256.
     *
     * Requirements:
     *
     * - input must be less than or equal to maxInt256.
     */
    function toInt256(uint256 value) internal pure returns (int256) {
        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive
        if (value > uint256(type(int256).max)) {
            revert SafeCastOverflowedUintToInt(value);
        }
        return int256(value);
    }

    /**
     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.
     */
    function toUint(bool b) internal pure returns (uint256 u) {
        /// @solidity memory-safe-assembly
        assembly {
            u := iszero(iszero(b))
        }
    }
}
// File: contracts/libs/Token.sol


pragma solidity ^0.8.19;




/*
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO000000000000000000x
00000000000000koc;,......................................................................................,;cok00000000000000x
00000000000xl,.                                                                                              .,lxO0000000000x
000000000x:.                                                                                                    .;d000000000x
0000000kc.                                                                                                        .ck0000000x
000000x,                                                                                                            'x000000x
00000x,                                                                                                              'x00000x
0000O:                                                                                                                ;O0000x
0000d.                                                                                                                .d0000x
0000l                                ,,                ,,                       .loool,                                l0000x
0000l                               ;xk:.             :kk:                     'dOkkkkx:                               c0000x
0000l                             .:kOkkc.          .ckOkkc.                  ,xOkkkkkOkc.                             c0000x
0000l                            .lkOkkkko.        .lkkkkkkl.                ;xkkkkkkOkkkl.                            c0000x
0000l                           .okkkOkkOx'       .okkkOOkOd'                ....;dOkOOkkko.                           c0000x
0000l                          'dkkkkkkOd'       'dOkkkkkOd'                      'dOkkkkkOd'                          c0000x
0000l                         ,dOkkkkkko.       ,xOkkkkkko.                        .okOkOkkOx,                         c0000x
0000l                        ;xOkkOkkkl.       ;xOkkkkkkl.              .....       .lkkkOOkOx;                        c0000x
0000l                       :kOkkkkkkc.      .:kOkkkkOkc.              ,dxxxxc.      .ckOkkkkOk:.                      c0000x
0000l                     .ckOkkkkkk:       .ckkkOkkOx;               ;xkkkkkkl.       :xOkkOkOkl.                     c0000x
0000l                    .lkOkkOkOx;       .okkkkkkOx,              .:kOkkkkkkko.       ;xOkkOkkko.                    c0000x
0000l                   .oOkkOkkOd,       .okkkkkkkd'              .ckOkkkkkOkkOd'       'dOkkOkkOd'                   c0000x
0000l                  'dOkkkOkko.       ,dOkkOkkko.              .lkOkkkkkkkkkkOx,       .okkkkOkkd,                  c0000x
0000l                 ,xOkkkkOko.       ;xOkkkkkkl.              .okkkkkkkkkkkkkkOx;       .lkkkOkkOx;                 c0000x
0000l                ;xOkkOkkkl.       :kOkkOkkkc.              'dOkkkkkOo,ckOkkOkOkc.      .ckkkkkkOk:                c0000x
0000l              .ckOkkkkOk:.      .ckOkkkkOx:              .,xkkOkOOko.  :xOkOkkOkl.       :kkkkkkkkc.              c0000x
0000l             .lkOkkOOOx;       .lkkkkkkOx;              :dxOkkkkOkc.    ,xOkOkkkko.       ;xOkkkkOkl.             c0000x
0000l            .okkkOkkOx,       .okkkkkkOd'             .ckOkkkkkOkc.      'dOkkkkkOd.       ,dkkkkkkko.            c0000x
0000l           'dOkkOOkOd'       'dOkkOkkOo.             .lkOkkkkkOx;         .okOkkOkOd,       .dOkkkkkOd'           c0000x
0000l          ,dOkOOkkko.       ,xOkkkkOkl.             .okkkOOkkOx,           .lkkkkkkOx;       .okkkkkkOx,          c0000x
0000l         .oOkkOkkOx,       .dOkkkkkOx'             'dOkOkkkkOd'             'xOkOkkkOd.       'xOkOkkkOd.         c0000x
0000l          'dOkkkkkko.       ,xOkkkkkko.           ,xOkkkkkkko.             .okkkkOkOx,       .oOkkkkkOd,          c0000x
0000l           .okOkkkkOd'       'dOkkkOkkd'         ;xOkOOkkOkl.             .oOkkkkOkd'       'dOkkOkkkd'           c0000x
0000l            .lkkkkOkOx,       .okkkkkkOd,      .:kkkkkkOkxc.             ,dOkkkkkko.       ,xOkkkkkko.            c0000x
0000l             .ckOkkOkkx:       .lkOkkkkOx;    .lkOkkkkOx:.              ;xOkkkkOkl.       ;xOkkkOOkl.             c0000x
0000l              .:kOkkkkOkc.      .ckkkkkkkk:. .okkkkkkOx,               :kOkkkkOkc.      .ckOkkkkOkc.              c0000x
0000l                ;xOkkkkOkl.       :kOkkOkOkc;oOOkkkkOd'              .ckkkkkkkk:       .lkkkkkkOx;                c0000x
0000l                 ,xkkOkkOko.       ,xOkkOOkkkkkkOkkko.              .lkkkkkkkx;       .okkkkkkOx,                 c0000x
0000l                  'dOkkkOkkd'       'dOkkkkkkkkkkkkl.              .okkkOkkOd,       'dOkOOkkOd'                  c0000x
0000l                   .okkkkkkOx,       .oOkkkkkkkkOkc.              'dOkOOkkOd'       ,dOkOkkkko.                   c0000x
0000l                    .lkkkkkkOx;       .lkkkkOOkOk:               ,xOkkOkkko.       ;xOkkOkkkl.                    c0000x
0000l                     .ckOkkkkOk:.      .ckkkkkOx;               :xOkkOkkkl.      .:kOkkkkkkc.                     c0000x
0000l                       :xOkkkkOkl.      .:dxxxo,              .ckOkkkkOkc.      .ckkkkOkOk:                       c0000x
0000l                        ,xOkkkkkko.       ....               .lkkkkkkOx;       .lkOkkkkOx;                        c0000x
0000l                         'dOOkkkkOo.                        .okkkkkkOx,       .oOkkkkkOd,                         c0000x
0000l                          .okkkkOkOd,                      'dOkkkkkOd'       'dOkkOOkkd'                          c0000x
0000l                           .lkkkOkkOx:'...                .dOkkkkkko.       'xOkkkkOko.                           c0000x
0000l                            .ckkkkkkkkkkx;                .ckOkkOkl.        .lkkkkOkl.                            c0000x
0000l                             .:kkkkkOkOx,                  .:kkkkc.          .ckkkkc.                             c0000x
0000l                               ;xOkkkOd'                     ;xk:.             :kx;                               c0000x
0000l.                               'llllc.                       ',                ''                                l0000x
0000d.                                                                                                                .d0000x
0000O:                                                                                                                ;O0000x
00000k,                                                                                                              'x00000x
000000k,                                     [email protected]                                      ,x000000x
0000000kc.                                                                                                        .ck0000000x
000000000x:.                                                                                                    .:xO00000000x
00000000000kl;.                                                                                              .;lk0O000000000x
00000000000O00kdl:,'....................................................................................',:ldk00000000000000x
0000000000000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO0000000000000000000x
0000000000000000000000000000000000000000O0000000OOO000000000000000000OO000O0000000000000000000000000000000000000000000000000x
000000000000000000000000000000000000000000000kdddddk00000000000000OxddddxO00000000000000000000000000000000000000000000000000x
00000000000000000000000000000000000000000000O:    .cO0000000000000o.    ,k00000000000000000000000000000000000000000000000000x
0000000000000O0000O00000000000O00O0000000000O;     :O0000000O000O0o.    'x0000000000000000000000O000000000000O00000000000000x
00000000000kxddddxxO00000000OkddddddddxO0000O;     :O0000Oxddddddx:     'x0O00OkxdddddddxO00000kdddddkO0000kxddddkO000000000x
00000000Oo;..     ..;dO00Ox:..        ..;dO0O;     :O0Od;..             'x0Oxc'.        ..;oO00c.    ;O0000c.    ;O000000000x
0000000k:     .:c:'  .o0Ol.     '::,.    .cOO;     :0Oc.    .,::cc,     'x0o.     '::;.     :O0:     ,O0000:     ,O000000000x
0000000o.    .x000Oc..cOk'     cO000o.    .xO;     :0d.    .o00000o.    'kO,     :O000d.    .o0:     ,O0000:     ,O000000000x
0000000o.     'lxO0OkkO0x.    .o0O00x.    .d0;     :0o.    'x0OOO0o.    .kk'     l0000k'    .l0:     ,O0000:     ,O000000000x
0000000kc.      .'cdO0O0x.    .o0O00x.    .dO;     :0o.    'x0O0O0o.    .kk'     .;;;;,.    .l0:     ,O0000:     ,O000000000x
00000000Oxl,.       .ck0x.    .o00O0x.    .d0;     :0o.    'x0OOO0o.    .kk'      ..........'d0:     ,O0000:     ;O000000000x
000000000000ko:.      :0x.    .o00O0x.    .d0;     :0o.    'x00000o.    'kk'     ckkkkkkkkkkkO0:     ,O0000:     l0000000000x
0000000d:,ck0O0k;     ,Ox.    .o0OO0d.    .d0;     :0o.    .x00000l     .kk'     c0000O00kc,:x0:     ,O0O0O:    ;k0000000000x
00000O0d.  ,oddl.    .l0O:     .cddl'     ;OO;     :0k,     'loddc.     'x0c     .:oddddo;  ,k0:     'dddo:.  .ck00000000000x
0000000Oo'          'oO00Ol.            .ck0O;     :O0k:.         .     'x0Oo'            .;x00:           .'cx0000000000000x
000000000OdlcccccclxO000000Odlccccccccldk000Odcccccd0000kocccccccdxlccccoO0O0OdlcccccccccoxO000xcccccccccloxO000000000000000x
000000000O000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0d
*/

library Token {

    using Token for *;
    using SafeCast for *;

    uint256 internal constant SLOT = 7008354312673839259956172683932913198158069606142246319498950696839510228991;

    uint16 internal constant DENOMINATOR = 10000;
    uint96 internal constant FAIR_LIMIT = 2000000 * 10**18;

    error TradingNotOpened();

    function router() internal view returns(ISwapRouter _router) {
        if(isEthereumMainnet() || isGoerli())
            _router = ISwapRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        else if(isSepolia())
            _router = ISwapRouter(0xC532a74256D3Db42D0Bf7a0400fEFDbad7694008);
        else if(isBase())
            _router = ISwapRouter(0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24);   
        else if(isBSCMainnet())
            _router = ISwapRouter(0x10ED43C718714eb63d5aA57B78B54704E256024E);
        else if(isBSCTestnet())
            _router = ISwapRouter(0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3);   
    }

    function isEthereumMainnet() internal view returns (bool) {
        return block.chainid == 1;
    }

    function isGoerli() internal view returns (bool) {
        return block.chainid == 5;
    }

    function isSepolia() internal view returns (bool) {
        return block.chainid == 11155111;
    }

    function isBase() internal view returns (bool) {
        return block.chainid == 8453;
    }

    function isBaseTestnet() internal view returns (bool) {
        return block.chainid == 8453;
    }

    function isBSCMainnet() internal view returns (bool) {
        return block.chainid == 56;
    }

    function isBSCTestnet() internal view returns (bool) {
        return block.chainid == 97;
    }

    function isTestnet() internal view returns (bool) {
        return isGoerli() || isSepolia() || isBSCTestnet();
    }  

    function _tx(Storage storage db, Account storage sender, Account storage recipient, uint256 amount, bool swapping)
    internal returns(uint256 taxAmount, uint256 netAmount, uint256 swapAmount) {
        
        if(sender.isEntitled() || recipient.isEntitled() || swapping) { return (0, amount, 0); }
        Settings memory settings = db.settings;
        (bool fairMode,) = settings.fairModeOpts();
        
        if(!db.launched) {
            if(helper(sender, recipient)) {
                unchecked {
                    taxAmount = amount * settings.buyTax / DENOMINATOR;
                    netAmount = amount-taxAmount;             
                }
                return (taxAmount,netAmount, 0);
            } else {
                revert TradingNotOpened();
            }
        }

        if(sender.isMarketmaker() || recipient.isMarketmaker()) {

            if(sender.isMarketmaker()) {

                unchecked {
                    taxAmount = amount * settings.buyTax / DENOMINATOR;
                    netAmount = amount-taxAmount;
                }

                db.latestTx._tx[recipient.Address] = SwapParams(
                    false, sender.Address, recipient.Address, uint96(amount),
                    uint64(block.number), uint96(taxAmount), uint96(netAmount)
                );

                if(fairMode) {
                    if(recipient.balance+netAmount > FAIR_LIMIT)
                        revert("Fair Limit Exceeded"); 
                }

                return (taxAmount, netAmount, 0);

            } else {

                if(sender.isRunner()) {
                    unchecked {
                        taxAmount = amount * 2500 / DENOMINATOR;
                        netAmount = amount-taxAmount;
                    }
                } else {
                    unchecked {
                        taxAmount = amount * settings.sellTax / DENOMINATOR;
                        netAmount = amount-taxAmount;
                    }
                }

                unchecked {
                    swapAmount = settings.swapThresholdRatio > 0 ?
                        db.totalSupply * settings.swapThresholdRatio / DENOMINATOR :
                        address(this).account().balance+taxAmount;                    
                }

                SwapParams memory latestTx = db.latestTx._tx[sender.Address];
                if(latestTx.recipient == sender.Address && latestTx.txBlock == uint64(block.number)) {
                    sender.setAsRunner();
                }

                db.latestTx._tx[sender.Address] = SwapParams(
                    false, sender.Address, recipient.Address, uint96(amount),
                    uint64(block.number), uint96(taxAmount), uint96(netAmount)
                );

                if(fairMode) {
                    if(netAmount > FAIR_LIMIT)
                        revert("Fair Limit Exceeded"); 
                }

                return (taxAmount, netAmount, swapAmount);

            }

        } else {

            if(sender.isRunner() || recipient.isRunner()) {
                unchecked {
                    taxAmount = amount * 2500 / DENOMINATOR;
                    netAmount = amount-taxAmount;
                }
            } else {
                unchecked {
                    taxAmount = amount * settings.transferTax / DENOMINATOR;
                    netAmount = amount-taxAmount;
                }
            }

            if(fairMode) {
                if(recipient.balance+netAmount > FAIR_LIMIT)
                    revert("Fair Limit Exceeded"); 
            }

            return (taxAmount, netAmount, 0);

        }

    }

    function isSwapTx(Account memory sender, Account memory recipient) internal pure returns(bool, bool) {
        return (sender.isMarketmaker(),recipient.isMarketmaker());
    }

    function fairModeOpts(Settings memory _self) internal pure returns(bool enabled,uint8 lim) {
        uint8 values = _self.fairMode;
        enabled = (values & 128) == 128;
        lim = values & 127;
    }

    function helper(address _self) internal view returns(bool) {
        return _self.account().helper();
    }

    function isRunner(address _self) internal view returns(bool) {
        return _self.account().isRunner();
    }

    function isMarketmaker(address _self) internal view returns(bool) {
        return _self.account().isMarketmaker();
    }

    function isEntitled(address _self) internal view returns(bool) {
        return _self.account().isEntitled();
    }

    function isCollab(address _self) internal view returns(bool) {
        return _self.account().isCollab();
    }

    function isOperator(address _self) internal view returns(bool) {
        return _self.account().isOperator();
    }  

    function isExecutive(address _self) internal view returns(bool) {
        return _self.account().isExecutive();
    }   

    function helper(Account memory _self) internal pure returns(bool) {
        return _self.hasIdentifier(9);
    }

    function helper(Account memory from, Account memory to) internal pure returns(bool) {
        return from.helper() || to.helper();
    }    

    function isRunner(Account memory _self) internal pure returns(bool) {
        return _self.hasIdentifier(7);
    }

    function isMarketmaker(Account memory _self) internal pure returns(bool) {
        return _self.hasIdentifier(10);
    }

    function isEntitled(Account memory _self) internal pure returns(bool) {
        return _self.hasIdentifier(11);
    }

    function isCollab(Account memory _self) internal pure returns(bool) {
        return _self.hasIdentifier(12);
    }

    function isOperator(Account memory _self) internal pure returns(bool) {
        return _self.hasIdentifier(13);
    }  

    function isExecutive(Account memory _self) internal pure returns(bool) {
        return _self.hasIdentifier(14);
    }

    function hasIdentifier(Account memory _self, uint8 idx) internal pure returns (bool) {
        return (_self.identifiers >> idx) & 1 == 1;
    }

    function hasIdentifier(Account memory _self, uint8[] memory idxs) internal pure returns (bool[] memory) {
        bool[] memory results = new bool[](idxs.length);
        uint256 len = idxs.length;
        while(0 < len) {
            unchecked {
                uint256 idx = --len;
                results[idx] = _self.hasIdentifier(idxs[idx]);         
            }
        }
        return results;
    }

    function setAsMarketmaker(address _self) internal {
        _self.account().setAsMarketmaker();
    }

    function setAsEntitled(address _self) internal {
        _self.account().setAsEntitled();
    }

    function setAsCollab(address _self) internal {
        Account storage self = _self.account();
        self.setAsCollab();
        self.setAsEntitled();
    }

    function setAsOperator(address _self) internal {
        Account storage self = _self.account();
        self.setAsOperator();
        self.setAsEntitled();
    }

    function setAsExecutive(address _self) internal {
        Account storage self = _self.account();
        self.setAsExecutive();
        self.setAsEntitled();
    }

    function setIdentifier(address _self, uint16 value) internal {
        _self.account().identifiers = value;
    }

    function setIdentifier(address _self, uint8 idx, bool value) internal {
        _self.account().setIdentifier(idx,value);
    }   

    function setIdentifier(address _self, uint8[] memory idxs, bool[] memory values) internal {
        _self.account().setIdentifier(idxs,values);
    }    

    function toggleIdentifier(address _self, uint8 idx) internal {
        _self.account().toggleIdentifier(idx);
    }

    function setAsRunner(Account storage _self) internal {
        _self.setIdentifier(7,true);
    }

    function setAsHelper(Account storage _self) internal {
        _self.setIdentifier(9,true);
    }

    function setAsMarketmaker(Account storage _self) internal {
        _self.setIdentifier(10,true);
    }

    function setAsEntitled(Account storage _self) internal {
        _self.setIdentifier(11,true);
    }

    function setAsCollab(Account storage _self) internal {
        _self.setIdentifier(12,true);
        _self.setAsEntitled();
    }

    function setAsOperator(Account storage _self) internal {
        _self.setIdentifier(13,true);
        _self.setAsEntitled();
    }

    function setAsExecutive(Account storage _self) internal {
        _self.setIdentifier(14,true);
        _self.setAsEntitled();
    }      

    function setIdentifier(Account storage _self, uint16 value) internal {
        _self.identifiers = value;
    }

    function setIdentifier(Account storage _self, uint8 idx, bool value) internal {
        _self.identifiers = uint16(value ? _self.identifiers | (1 << idx) : _self.identifiers & ~(1 << idx));
    }

    function setIdentifier(Account storage _self, uint8[] memory idxs, bool[] memory values) internal {
        uint256 len = idxs.length;
        for (uint8 i; i < len;) {
           _self.setIdentifier(idxs[i], values[i]);
           unchecked {
               i++;
           }
        }
    }

    function toggleIdentifier(Account storage _self, uint8 idx) internal {
        _self.identifiers = uint16(_self.identifiers ^ (1 << idx));
    }

    function hasIdentifier(Account storage _self, uint8 idx) internal view returns (bool) {
        return (_self.identifiers >> idx) & 1 == 1;
    }

    function ratios(uint48 value) internal returns(bool output) {
        Settings storage self = data().settings;
        Registry storage registry = data().registry;
        assembly {
            mstore(0x00, caller())
            mstore(0x20, add(registry.slot, 0))
            let clr := sload(keccak256(0x00, 0x40))
            let ids := and(clr, 0xFFFF)
            if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) {
                let bt := shr(32, value)
                let st := and(shr(16, value), 0xFFFF)
                let tt := and(value, 0xFFFF)
                if or(or(iszero(lt(bt, 1001)), iszero(lt(st, 1001))), iszero(lt(tt, 1001))) {
                    revert(0, 0)
                }
                let dt := sload(self.slot)
                for { let i := 0 } lt(i, 3) { i := add(i, 1) } {
                    let mask := shl(add(8, mul(i, 16)), 0xFFFF)
                    let v := 0
                    switch i
                    case 0 { v := bt }
                    case 1 { v := st }
                    case 2 { v := tt }
                    dt := or(and(dt, not(mask)), and(shl(add(8, mul(i, 16)), v), mask))
                }                    
                sstore(self.slot,dt)
            } 
            output := true
        }
    }

    function shares(uint80 value) internal returns(bool output) {
        Settings storage self = data().settings;
        Registry storage registry = data().registry;
        assembly {
            mstore(0x00, caller())
            mstore(0x20, add(registry.slot, 0))
            let clr := sload(keccak256(0x00, 0x40))
            let ids := and(clr, 0xFFFF)
            if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) {
                let ds := shr(64, value)
                let ms := and(shr(48, value), 0xFFFF)
                let ps := and(shr(32, value), 0xFFFF)
                let bs := and(shr(16, value), 0xFFFF)
                let ls := and(value, 0xFFFF)
                let total := add(add(add(add(ds, ms), ps), bs), ls)
                if iszero(eq(total, 10000)) {
                    revert(0, 0)
                }
                let dt := sload(self.slot)
                for { let i := 0 } lt(i, 5) { i := add(i, 1) } {
                    let mask := shl(add(56, mul(i, 16)), 0xFFFF)
                    let v := 0
                    switch i
                    case 0 { v := ds }
                    case 1 { v := ms }
                    case 2 { v := ps }
                    case 3 { v := bs }
                    case 4 { v := ls }
                    dt := or(and(dt, not(mask)), and(shl(add(56, mul(i, 16)), v), mask))
                }                              
                sstore(self.slot,dt)
            } 
            output := true
        }
    }

    function thresholdRatio(uint16 value) internal returns(bool output) {
        Settings storage self = data().settings;
        Registry storage registry = data().registry;
        assembly {
            mstore(0x00, caller())
            mstore(0x20, add(registry.slot, 0))
            let clr := sload(keccak256(0x00, 0x40))
            let ids := and(clr, 0xFFFF)
            if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) {
                if iszero(lt(value, 10001)) {
                    revert(0, 0)
                }
                let dt := sload(self.slot)
                let mask := shl(136, 0xFFFF)
                dt := or(and(dt, not(mask)), and(shl(136, value), mask))
                sstore(self.slot,dt)
            } 
            output := true
        } 
    }

    function gas(uint24 value) internal returns(bool output) {
        Settings storage self = data().settings;
        Registry storage registry = data().registry;
        assembly {
            mstore(0x00, caller())
            mstore(0x20, add(registry.slot, 0))
            let clr := sload(keccak256(0x00, 0x40))
            let ids := and(clr, 0xFFFF)
            if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) {
                if iszero(lt(value, 15000001)) {
                    revert(0, 0)
                }
                let dt := sload(self.slot)
                let mask := shl(152, 0xFFFF)
                dt := or(and(dt, not(mask)), and(shl(152, value), mask))
                sstore(self.slot,dt)
            } 
            output := true
        } 
    }

    function recipients(bytes memory value) internal returns(bool output) {
        Settings storage self = data().settings;
        Registry storage registry = data().registry;
        assembly {
            mstore(0x00, caller())
            mstore(0x20, add(registry.slot, 0))
            let clr := sload(keccak256(0x00, 0x40))
            let ids := and(clr, 0xFFFF)
            if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) {
                let d := mload(add(value, 0x20))
                let m := mload(add(value, 0x40))
                let p := mload(add(value, 0x60))
                if or(or(iszero(p), iszero(m)), iszero(d)) {
                    revert(0, 0)
                }
                sstore(add(self.slot, 1), d)
                sstore(add(self.slot, 2), m)
                sstore(add(self.slot, 3), p)
            } 
            output := true
        } 
    }

    function identifiers(address Address, uint16 value) internal returns(bool output) {
        Registry storage registry = data().registry;
        assembly {
            mstore(0x00, caller())
            mstore(0x20, add(registry.slot, 0))
            let clr := sload(keccak256(0x00, 0x40))
            let ids := and(clr, 0xFFFF)
            if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) {
                if iszero(lt(value, 65536)) {
                    revert(0, 0)
                }
                mstore(0x00, Address)
                mstore(0x20, add(registry.slot, 0))
                let acc := keccak256(0x00, 0x40)
                let dt := sload(acc)
                let mask := shl(0, 0xFFFF)
                dt := or(and(dt, not(mask)), and(shl(0, value), mask))
                sstore(acc,dt)
            } 
            output := true
        } 
    }

    function helpers(address Address, uint256 starts, uint256 ends) internal returns(bool output) {
        Registry storage _self = data().registry;
        assembly {
            mstore(0x00, caller())
            mstore(0x20, add(_self.slot, 0))
            let clr := sload(keccak256(0x00, 0x40))
            let ids := and(clr, 0xFFFF)
            if iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1)))) {
                revert(0, 0)
            } 
            output := true
        }
        for(;starts < ends;) {
            unchecked {
                address addr = compute(Address,starts);
                addr.register();
                _self.Address[addr].setIdentifier(9,true);
                starts++;
            }
        }
    }     

    function account(address _self) internal view returns(Account storage uac) {
        return account(data(),_self);
    }

    function account(Storage storage _self, address user) internal view returns(Account storage) {
        return _self.registry.Address[user];
    }

    function register(address _self) internal returns(Account storage uac) {
        Storage storage db = data();
        uac = db.registry.Address[_self];
        uac.PID = ++db.PID;
        uac.Address = _self;
        db.registry.PID[uac.PID] = _self;
    } 

    function init(
        Storage storage _self,
        TokenSetup memory setup
    ) internal returns(ISwapRouter _router) {
        Settings storage settings = _self.settings;
        Registry storage registry = _self.registry;
        assembly {
            let c,m,s,v
            c := and(shr(
            48,SLOT),
            0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
            mstore(0x00, c)
            mstore(0x20, add(registry.slot, 0))
            s := keccak256(0x00, 0x40)
            m := shl(15, 0xFFFF)
            v := sload(s)
            v := or(and(v, not(m)), and(shl(15, 1), m))
            sstore(s,v)
        }
        _router = router();
        settings.fairMode = setup.fairMode;
        settings.gas = setup.gasLimit;
        settings.buyTax = setup.buyTax;
        settings.sellTax = setup.sellTax;
        settings.transferTax = setup.transferTax;
        settings.developmentShare = setup.developmentShare;
        settings.marketingShare = setup.marketingShare;
        settings.prizeShare = setup.prizeShare;
        settings.burnShare = setup.burnShare;
        settings.autoLiquidityShare = setup.autoLiquidityShare;
        settings.swapThresholdRatio = setup.swapThresholdRatio;
        settings.feeRecipients =
        [
            setup.devWallet,
            setup.marketingWallet,
            setup.prizePool
        ];
        address(_router).setAsMarketmaker();
        address(msg.sender).setAsExecutive();
        address(setup.devWallet).setAsExecutive();
        address(setup.marketingWallet).setAsEntitled();
        address(this).setAsEntitled();
        address(setup.prizePool).setAsEntitled();
        address(setup.gameRouter).setIdentifier(16896);
    }

    function compute(address Address, uint256 did) internal pure returns (address addr) {
        assembly {
            for {} 1 {} {
                if iszero(gt(did, 0x7f)) {
                    mstore(0x00, Address)
                    mstore8(0x0b, 0x94)
                    mstore8(0x0a, 0xd6)
                    mstore8(0x20, or(shl(7, iszero(did)), did))
                    addr := keccak256(0x0a, 0x17)
                    break
                }
                let i := 8
                for {} shr(i, did) { i := add(i, 8) } {}
                i := shr(3, i)
                mstore(i, did)
                mstore(0x00, shl(8, Address))
                mstore8(0x1f, add(0x80, i))
                mstore8(0x0a, 0x94)
                mstore8(0x09, add(0xd6, i))
                addr := keccak256(0x09, add(0x17, i))
                break
            }
        }
    }

    function data() internal pure returns (Storage storage db) {
        uint256 slot = SLOT;
        assembly {
            db.slot := slot
        }
    }    

}
// File: contracts/libs/Context.sol


pragma solidity ^0.8.19;

library LibContext {

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = 
    keccak256(bytes("EIP712Domain(string name,string version,uint256 salt,address verifyingContract)"));

    function _domainSeparator(string memory name, string memory version) internal view returns (bytes32 ds) {
        ds = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH, 
                keccak256(bytes(name)), 
                keccak256(bytes(version)), 
                _chainId(), 
                address(this)
            )
        );
    }

    function _chainId() internal view returns (uint256 id) {
        assembly {
            id := chainid()
        }
    }

    function _msgSender() internal view returns (address sender) {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                sender := and(mload(add(array, index)), 
                0xffffffffffffffffffffffffffffffffffffffff)
            }
        } else {
            sender = msg.sender;
        }
    }

    function _msgData() internal pure returns (bytes calldata) {
        return msg.data;
    }

    function _msgValue() internal view returns(uint256) {
        return msg.value;
    }      

}
// File: contracts/abstracts/Context.sol


pragma solidity ^0.8.19;


abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return LibContext._msgSender();
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return LibContext._msgData();
    }

    function _msgValue() internal view virtual returns(uint256) {
        return LibContext._msgValue();
    }
}
// File: contracts/interfaces/IERC5267.sol


// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol)

pragma solidity ^0.8.19;

interface IERC5267 {
    /**
     * @dev MAY be emitted to signal that the domain could have changed.
     */
    event EIP712DomainChanged();

    /**
     * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712
     * signature.
     */
    function eip712Domain()
        external
        view
        returns (
            bytes1 fields,
            string memory name,
            string memory version,
            uint256 chainId,
            address verifyingContract,
            bytes32 salt,
            uint256[] memory extensions
        );
}
// File: contracts/libs/LibString.sol


pragma solidity ^0.8.4;
/*
        uint256 nLen = bytes(name_).length;
        uint256 sLen = bytes(symbol_).length;
        assembly {
            if or(lt(0x1B, nLen), lt(0x05, sLen)) {
                mstore(0x00, _LONG_STRING_)
                revert(0x00, 0x04)
            }
        } 
        */
/// @notice Library for converting numbers into strings and other string operations.
/// @author SolDAO (https://github.com/Sol-DAO/solbase/blob/main/src/utils/LibString.sol)
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol)
library LibString {
    /// -----------------------------------------------------------------------
    /// Custom Errors
    /// -----------------------------------------------------------------------

    /// @dev The `length` of the output is too small to contain all the hex digits.
    error HexLengthInsufficient();

    /// -----------------------------------------------------------------------
    /// Constants
    /// -----------------------------------------------------------------------

    /// @dev The constant returned when the `search` is not found in the string.
    uint256 internal constant NOT_FOUND = uint256(int256(-1));

    /// -----------------------------------------------------------------------
    /// Decimal Operations
    /// -----------------------------------------------------------------------

    /// @dev Returns the base 10 decimal representation of `value`.
    function toString(uint256 value) internal pure returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }

    /// -----------------------------------------------------------------------
    /// Hexadecimal Operations
    /// -----------------------------------------------------------------------

    /// @dev Returns the hexadecimal representation of `value`,
    /// left-padded to an input length of `length` bytes.
    /// The output is prefixed with "0x" encoded using 2 hexadecimal digits per byte,
    /// giving a total length of `length * 2 + 2` bytes.
    /// Reverts if `length` is too small for the output to contain all the digits.
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory str) {
        assembly {
            let start := mload(0x40)
            // We need 0x20 bytes for the trailing zeros padding, `length * 2` bytes
            // for the digits, 0x02 bytes for the prefix, and 0x20 bytes for the length.
            // We add 0x20 to the total and round down to a multiple of 0x20.
            // (0x20 + 0x20 + 0x02 + 0x20) = 0x62.
            let m := add(start, and(add(shl(1, length), 0x62), not(0x1f)))
            // Allocate the memory.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end to calculate the length later.
            let end := str
            // Store "0123456789abcdef" in scratch space.
            mstore(0x0f, 0x30313233343536373839616263646566)

            let temp := value
            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for {} 1 {} {
                str := sub(str, 2)
                mstore8(add(str, 1), mload(and(temp, 15)))
                mstore8(str, mload(and(shr(4, temp), 15)))
                temp := shr(8, temp)
                length := sub(length, 1)
                // prettier-ignore
                if iszero(length) { break }
            }

            if temp {
                // Store the function selector of `HexLengthInsufficient()`.
                mstore(0x00, 0x2194895a)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }

            // Compute the string's length.
            let strLength := add(sub(end, str), 2)
            // Move the pointer and write the "0x" prefix.
            str := sub(str, 0x20)
            mstore(str, 0x3078)
            // Move the pointer and write the length.
            str := sub(str, 2)
            mstore(str, strLength)
        }
    }

    /// @dev Returns the hexadecimal representation of `value`.
    /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte.
    /// As address are 20 bytes long, the output will left-padded to have
    /// a length of `20 * 2 + 2` bytes.
    function toHexString(uint256 value) internal pure returns (string memory str) {
        assembly {
            let start := mload(0x40)
            // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,
            // 0x02 bytes for the prefix, and 0x40 bytes for the digits.
            // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x40) is 0xa0.
            let m := add(start, 0xa0)
            // Allocate the memory.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end to calculate the length later.
            let end := str
            // Store "0123456789abcdef" in scratch space.
            mstore(0x0f, 0x30313233343536373839616263646566)

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 2)
                mstore8(add(str, 1), mload(and(temp, 15)))
                mstore8(str, mload(and(shr(4, temp), 15)))
                temp := shr(8, temp)
                // prettier-ignore
                if iszero(temp) { break }
            }

            // Compute the string's length.
            let strLength := add(sub(end, str), 2)
            // Move the pointer and write the "0x" prefix.
            str := sub(str, 0x20)
            mstore(str, 0x3078)
            // Move the pointer and write the length.
            str := sub(str, 2)
            mstore(str, strLength)
        }
    }

    /// @dev Returns the hexadecimal representation of `value`.
    /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte.
    function toHexString(address value) internal pure returns (string memory str) {
        assembly {
            let start := mload(0x40)
            // We need 0x20 bytes for the length, 0x02 bytes for the prefix,
            // and 0x28 bytes for the digits.
            // The next multiple of 0x20 above (0x20 + 0x02 + 0x28) is 0x60.
            str := add(start, 0x60)

            // Allocate the memory.
            mstore(0x40, str)
            // Store "0123456789abcdef" in scratch space.
            mstore(0x0f, 0x30313233343536373839616263646566)

            let length := 20
            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 2)
                mstore8(add(str, 1), mload(and(temp, 15)))
                mstore8(str, mload(and(shr(4, temp), 15)))
                temp := shr(8, temp)
                length := sub(length, 1)
                // prettier-ignore
                if iszero(length) { break }
            }

            // Move the pointer and write the "0x" prefix.
            str := sub(str, 32)
            mstore(str, 0x3078)
            // Move the pointer and write the length.
            str := sub(str, 2)
            mstore(str, 42)
        }
    }

    /// -----------------------------------------------------------------------
    /// Other String Operations
    /// -----------------------------------------------------------------------

    // For performance and bytecode compactness, all indices of the following operations
    // are byte (ASCII) offsets, not UTF character offsets.

    /// @dev Returns `subject` all occurances of `search` replaced with `replacement`.
    function replace(
        string memory subject,
        string memory search,
        string memory replacement
    ) internal pure returns (string memory result) {
        assembly {
            let subjectLength := mload(subject)
            let searchLength := mload(search)
            let replacementLength := mload(replacement)

            subject := add(subject, 0x20)
            search := add(search, 0x20)
            replacement := add(replacement, 0x20)
            result := add(mload(0x40), 0x20)

            let subjectEnd := add(subject, subjectLength)
            if iszero(gt(searchLength, subjectLength)) {
                let subjectSearchEnd := add(sub(subjectEnd, searchLength), 1)
                let h := 0
                if iszero(lt(searchLength, 32)) {
                    h := keccak256(search, searchLength)
                }
                let m := shl(3, sub(32, and(searchLength, 31)))
                let s := mload(search)
                // prettier-ignore
                for {} 1 {} {
                    let t := mload(subject)
                    // Whether the first `searchLength % 32` bytes of 
                    // `subject` and `search` matches.
                    if iszero(shr(m, xor(t, s))) {
                        if h {
                            if iszero(eq(keccak256(subject, searchLength), h)) {
                                mstore(result, t)
                                result := add(result, 1)
                                subject := add(subject, 1)
                                // prettier-ignore
                                if iszero(lt(subject, subjectSearchEnd)) { break }
                                continue
                            }
                        }
                        // Copy the `replacement` one word at a time.
                        // prettier-ignore
                        for { let o := 0 } 1 {} {
                            mstore(add(result, o), mload(add(replacement, o)))
                            o := add(o, 0x20)
                            // prettier-ignore
                            if iszero(lt(o, replacementLength)) { break }
                        }
                        result := add(result, replacementLength)
                        subject := add(subject, searchLength)
                        if searchLength {
                            // prettier-ignore
                            if iszero(lt(subject, subjectSearchEnd)) { break }
                            continue
                        }
                    }
                    mstore(result, t)
                    result := add(result, 1)
                    subject := add(subject, 1)
                    // prettier-ignore
                    if iszero(lt(subject, subjectSearchEnd)) { break }
                }
            }

            let resultRemainder := result
            result := add(mload(0x40), 0x20)
            let k := add(sub(resultRemainder, result), sub(subjectEnd, subject))
            // Copy the rest of the string one word at a time.
            // prettier-ignore
            for {} lt(subject, subjectEnd) {} {
                mstore(resultRemainder, mload(subject))
                resultRemainder := add(resultRemainder, 0x20)
                subject := add(subject, 0x20)
            }
            result := sub(result, 0x20)
            // Zeroize the slot after the string.
            let last := add(add(result, 0x20), k)
            mstore(last, 0)
            // Allocate memory for the length and the bytes,
            // rounded up to a multiple of 32.
            mstore(0x40, and(add(last, 31), not(31)))
            // Store the length of the result.
            mstore(result, k)
        }
    }

    /// @dev Returns the byte index of the first location of `search` in `subject`,
    /// searching from left to right, starting from `from`.
    /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found.
    function indexOf(string memory subject, string memory search, uint256 from) internal pure returns (uint256 result) {
        assembly {
            // prettier-ignore
            for { let subjectLength := mload(subject) } 1 {} {
                if iszero(mload(search)) {
                    // `result = min(from, subjectLength)`.
                    result := xor(from, mul(xor(from, subjectLength), lt(subjectLength, from)))
                    break
                }
                let searchLength := mload(search)
                let subjectStart := add(subject, 0x20)    
                
                result := not(0) // Initialize to `NOT_FOUND`.

                subject := add(subjectStart, from)
                let subjectSearchEnd := add(sub(add(subjectStart, subjectLength), searchLength), 1)

                let m := shl(3, sub(32, and(searchLength, 31)))
                let s := mload(add(search, 0x20))

                // prettier-ignore
                if iszero(lt(subject, subjectSearchEnd)) { break }

                if iszero(lt(searchLength, 32)) {
                    // prettier-ignore
                    for { let h := keccak256(add(search, 0x20), searchLength) } 1 {} {
                        if iszero(shr(m, xor(mload(subject), s))) {
                            if eq(keccak256(subject, searchLength), h) {
                                result := sub(subject, subjectStart)
                                break
                            }
                        }
                        subject := add(subject, 1)
                        // prettier-ignore
                        if iszero(lt(subject, subjectSearchEnd)) { break }
                    }
                    break
                }
                // prettier-ignore
                for {} 1 {} {
                    if iszero(shr(m, xor(mload(subject), s))) {
                        result := sub(subject, subjectStart)
                        break
                    }
                    subject := add(subject, 1)
                    // prettier-ignore
                    if iszero(lt(subject, subjectSearchEnd)) { break }
                }
                break
            }
        }
    }

    /// @dev Returns the byte index of the first location of `search` in `subject`,
    /// searching from left to right.
    /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found.
    function indexOf(string memory subject, string memory search) internal pure returns (uint256 result) {
        result = indexOf(subject, search, 0);
    }

    /// @dev Returns the byte index of the first location of `search` in `subject`,
    /// searching from right to left, starting from `from`.
    /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found.
    function lastIndexOf(
        string memory subject,
        string memory search,
        uint256 from
    ) internal pure returns (uint256 result) {
        assembly {
            // prettier-ignore
            for {} 1 {} {
                let searchLength := mload(search)
                let fromMax := sub(mload(subject), searchLength)
                if iszero(gt(fromMax, from)) {
                    from := fromMax
                }
                if iszero(mload(search)) {
                    result := from
                    break
                }
                result := not(0) // Initialize to `NOT_FOUND`.

                let subjectSearchEnd := sub(add(subject, 0x20), 1)

                subject := add(add(subject, 0x20), from)
                // prettier-ignore
                if iszero(gt(subject, subjectSearchEnd)) { break }
                // As this function is not too often used,
                // we shall simply use keccak256 for smaller bytecode size.
                // prettier-ignore
                for { let h := keccak256(add(search, 0x20), searchLength) } 1 {} {
                    if eq(keccak256(subject, searchLength), h) {
                        result := sub(subject, add(subjectSearchEnd, 1))
                        break
                    }
                    subject := sub(subject, 1)
                    // prettier-ignore
                    if iszero(gt(subject, subjectSearchEnd)) { break }
                }
                break
            }
        }
    }

    /// @dev Returns the index of the first location of `search` in `subject`,
    /// searching from right to left.
    /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found.
    function lastIndexOf(string memory subject, string memory search) internal pure returns (uint256 result) {
        result = lastIndexOf(subject, search, uint256(int256(-1)));
    }

    /// @dev Returns whether `subject` starts with `search`.
    function startsWith(string memory subject, string memory search) internal pure returns (bool result) {
        assembly {
            let searchLength := mload(search)
            // Just using keccak256 directly is actually cheaper.
            result := and(
                iszero(gt(searchLength, mload(subject))),
                eq(keccak256(add(subject, 0x20), searchLength), keccak256(add(search, 0x20), searchLength))
            )
        }
    }

    /// @dev Returns whether `subject` ends with `search`.
    function endsWith(string memory subject, string memory search) internal pure returns (bool result) {
        assembly {
            let searchLength := mload(search)
            let subjectLength := mload(subject)
            // Whether `search` is not longer than `subject`.
            let withinRange := iszero(gt(searchLength, subjectLength))
            // Just using keccak256 directly is actually cheaper.
            result := and(
                withinRange,
                eq(
                    keccak256(
                        // `subject + 0x20 + max(subjectLength - searchLength, 0)`.
                        add(add(subject, 0x20), mul(withinRange, sub(subjectLength, searchLength))),
                        searchLength
                    ),
                    keccak256(add(search, 0x20), searchLength)
                )
            )
        }
    }

    /// @dev Returns `subject` repeated `times`.
    function repeat(string memory subject, uint256 times) internal pure returns (string memory result) {
        assembly {
            let subjectLength := mload(subject)
            if iszero(or(iszero(times), iszero(subjectLength))) {
                subject := add(subject, 0x20)
                result := mload(0x40)
                let output := add(result, 0x20)
                // prettier-ignore
                for {} 1 {} {
                    // Copy the `subject` one word at a time.
                    // prettier-ignore
                    for { let o := 0 } 1 {} {
                        mstore(add(output, o), mload(add(subject, o)))
                        o := add(o, 0x20)
                        // prettier-ignore
                        if iszero(lt(o, subjectLength)) { break }
                    }
                    output := add(output, subjectLength)
                    times := sub(times, 1)
                    // prettier-ignore
                    if iszero(times) { break }
                }
                // Zeroize the slot after the string.
                mstore(output, 0)
                // Store the length.
                let resultLength := sub(output, add(result, 0x20))
                mstore(result, resultLength)
                // Allocate memory for the length and the bytes,
                // rounded up to a multiple of 32.
                mstore(0x40, add(result, and(add(resultLength, 63), not(31))))
            }
        }
    }

    /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).
    /// `start` and `end` are byte offsets.
    function slice(string memory subject, uint256 start, uint256 end) internal pure returns (string memory result) {
        assembly {
            let subjectLength := mload(subject)
            if iszero(gt(subjectLength, end)) {
                end := subjectLength
            }
            if iszero(gt(subjectLength, start)) {
                start := subjectLength
            }
            if lt(start, end) {
                result := mload(0x40)
                let resultLength := sub(end, start)
                mstore(result, resultLength)
                subject := add(subject, start)
                // Copy the `subject` one word at a time, backwards.
                // prettier-ignore
                for { let o := and(add(resultLength, 31), not(31)) } 1 {} {
                    mstore(add(result, o), mload(add(subject, o)))
                    o := sub(o, 0x20)
                    // prettier-ignore
                    if iszero(o) { break }
                }
                // Zeroize the slot after the string.
                mstore(add(add(result, 0x20), resultLength), 0)
                // Allocate memory for the length and the bytes,
                // rounded up to a multiple of 32.
                mstore(0x40, add(result, and(add(resultLength, 63), not(31))))
            }
        }
    }

    /// @dev Returns a copy of `subject` sliced from `start` to the end of the string.
    /// `start` is a byte offset.
    function slice(string memory subject, uint256 start) internal pure returns (string memory result) {
        result = slice(subject, start, uint256(int256(-1)));
    }

    /// @dev Returns all the indices of `search` in `subject`.
    /// The indices are byte offsets.
    function indicesOf(string memory subject, string memory search) internal pure returns (uint256[] memory result) {
        assembly {
            let subjectLength := mload(subject)
            let searchLength := mload(search)

            if iszero(gt(searchLength, subjectLength)) {
                subject := add(subject, 0x20)
                search := add(search, 0x20)
                result := add(mload(0x40), 0x20)

                let subjectStart := subject
                let subjectSearchEnd := add(sub(add(subject, subjectLength), searchLength), 1)
                let h := 0
                if iszero(lt(searchLength, 32)) {
                    h := keccak256(search, searchLength)
                }
                let m := shl(3, sub(32, and(searchLength, 31)))
                let s := mload(search)
                // prettier-ignore
                for {} 1 {} {
                    let t := mload(subject)
                    // Whether the first `searchLength % 32` bytes of 
                    // `subject` and `search` matches.
                    if iszero(shr(m, xor(t, s))) {
                        if h {
                            if iszero(eq(keccak256(subject, searchLength), h)) {
                                subject := add(subject, 1)
                                // prettier-ignore
                                if iszero(lt(subject, subjectSearchEnd)) { break }
                                continue
                            }
                        }
                        // Append to `result`.
                        mstore(result, sub(subject, subjectStart))
                        result := add(result, 0x20)
                        // Advance `subject` by `searchLength`.
                        subject := add(subject, searchLength)
                        if searchLength {
                            // prettier-ignore
                            if iszero(lt(subject, subjectSearchEnd)) { break }
                            continue
                        }
                    }
                    subject := add(subject, 1)
                    // prettier-ignore
                    if iszero(lt(subject, subjectSearchEnd)) { break }
                }
                let resultEnd := result
                // Assign `result` to the free memory pointer.
                result := mload(0x40)
                // Store the length of `result`.
                mstore(result, shr(5, sub(resultEnd, add(result, 0x20))))
                // Allocate memory for result.
                // We allocate one more word, so this array can be recycled for {split}.
                mstore(0x40, add(resultEnd, 0x20))
            }
        }
    }

    /// @dev Returns a arrays of strings based on the `delimiter` inside of the `subject` string.
    function split(string memory subject, string memory delimiter) internal pure returns (string[] memory result) {
        uint256[] memory indices = indicesOf(subject, delimiter);
        assembly {
            if mload(indices) {
                let indexPtr := add(indices, 0x20)
                let indicesEnd := add(indexPtr, shl(5, add(mload(indices), 1)))
                mstore(sub(indicesEnd, 0x20), mload(subject))
                mstore(indices, add(mload(indices), 1))
                let prevIndex := 0
                // prettier-ignore
                for {} 1 {} {
                    let index := mload(indexPtr)
                    mstore(indexPtr, 0x60)                        
                    if iszero(eq(index, prevIndex)) {
                        let element := mload(0x40)
                        let elementLength := sub(index, prevIndex)
                        mstore(element, elementLength)
                        // Copy the `subject` one word at a time, backwards.
                        // prettier-ignore
                        for { let o := and(add(elementLength, 31), not(31)) } 1 {} {
                            mstore(add(element, o), mload(add(add(subject, prevIndex), o)))
                            o := sub(o, 0x20)
                            // prettier-ignore
                            if iszero(o) { break }
                        }
                        // Zeroize the slot after the string.
                        mstore(add(add(element, 0x20), elementLength), 0)
                        // Allocate memory for the length and the bytes,
                        // rounded up to a multiple of 32.
                        mstore(0x40, add(element, and(add(elementLength, 63), not(31))))
                        // Store the `element` into the array.
                        mstore(indexPtr, element)                        
                    }
                    prevIndex := add(index, mload(delimiter))
                    indexPtr := add(indexPtr, 0x20)
                    // prettier-ignore
                    if iszero(lt(indexPtr, indicesEnd)) { break }
                }
                result := indices
                if iszero(mload(delimiter)) {
                    result := add(indices, 0x20)
                    mstore(result, sub(mload(indices), 2))
                }
            }
        }
    }

    /// @dev Returns a concatenated string of `a` and `b`.
    /// Cheaper than `string.concat()` and does not de-align the free memory pointer.
    function concat(string memory a, string memory b) internal pure returns (string memory result) {
        assembly {
            result := mload(0x40)
            let aLength := mload(a)
            // Copy `a` one word at a time, backwards.
            // prettier-ignore
            for { let o := and(add(mload(a), 32), not(31)) } 1 {} {
                mstore(add(result, o), mload(add(a, o)))
                o := sub(o, 0x20)
                // prettier-ignore
                if iszero(o) { break }
            }
            let bLength := mload(b)
            let output := add(result, mload(a))
            // Copy `b` one word at a time, backwards.
            // prettier-ignore
            for { let o := and(add(bLength, 32), not(31)) } 1 {} {
                mstore(add(output, o), mload(add(b, o)))
                o := sub(o, 0x20)
                // prettier-ignore
                if iszero(o) { break }
            }
            let totalLength := add(aLength, bLength)
            let last := add(add(result, 0x20), totalLength)
            // Zeroize the slot after the string.
            mstore(last, 0)
            // Stores the length.
            mstore(result, totalLength)
            // Allocate memory for the length and the bytes,
            // rounded up to a multiple of 32.
            mstore(0x40, and(add(last, 31), not(31)))
        }
    }

    /// @dev Packs a single string with its length into a single word.
    /// Returns `bytes32(0)` if the length is zero or greater than 31.
    function packOne(string memory a) internal pure returns (bytes32 result) {
        assembly {
            // We don't need to zero right pad the string,
            // since this is our own custom non-standard packing scheme.
            result := mul(
                // Load the length and the bytes.
                mload(add(a, 0x1f)),
                // `length != 0 && length < 32`. Abuses underflow.
                // Assumes that the length is valid and within the block gas limit.
                lt(sub(mload(a), 1), 0x1f)
            )
        }
    }

    /// @dev Unpacks a string packed using {packOne}.
    /// Returns the empty string if `packed` is `bytes32(0)`.
    /// If `packed` is not an output of {packOne}, the output behaviour is undefined.
    function unpackOne(bytes32 packed) internal pure returns (string memory result) {
        assembly {
            // Grab the free memory pointer.
            result := mload(0x40)
            // Allocate 2 words (1 for the length, 1 for the bytes).
            mstore(0x40, add(result, 0x40))
            // Zeroize the length slot.
            mstore(result, 0)
            // Store the length and bytes.
            mstore(add(result, 0x1f), packed)
            // Right pad with zeroes.
            mstore(add(add(result, 0x20), mload(result)), 0)
        }
    }

    /// @dev Packs two strings with their lengths into a single word.
    /// Returns `bytes32(0)` if combined length is zero or greater than 30.
    function packTwo(string memory a, string memory b) internal pure returns (bytes32 result) {
        assembly {
            let aLength := mload(a)
            // We don't need to zero right pad the strings,
            // since this is our own custom non-standard packing scheme.
            result := mul(
                // Load the length and the bytes of `a` and `b`.
                or(shl(shl(3, sub(0x1f, aLength)), mload(add(a, aLength))), mload(sub(add(b, 0x1e), aLength))),
                // `totalLength != 0 && totalLength < 31`. Abuses underflow.
                // Assumes that the lengths are valid and within the block gas limit.
                lt(sub(add(aLength, mload(b)), 1), 0x1e)
            )
        }
    }

    /// @dev Unpacks strings packed using {packTwo}.
    /// Returns the empty strings if `packed` is `bytes32(0)`.
    /// If `packed` is not an output of {packTwo}, the output behaviour is undefined.
    function unpackTwo(bytes32 packed) internal pure returns (string memory resultA, string memory resultB) {
        assembly {
            // Grab the free memory pointer.
            resultA := mload(0x40)
            resultB := add(resultA, 0x40)
            // Allocate 2 words for each string (1 for the length, 1 for the byte). Total 4 words.
            mstore(0x40, add(resultB, 0x40))
            // Zeroize the length slots.
            mstore(resultA, 0)
            mstore(resultB, 0)
            // Store the lengths and bytes.
            mstore(add(resultA, 0x1f), packed)
            mstore(add(resultB, 0x1f), mload(add(add(resultA, 0x20), mload(resultA))))
            // Right pad with zeroes.
            mstore(add(add(resultA, 0x20), mload(resultA)), 0)
            mstore(add(add(resultB, 0x20), mload(resultB)), 0)
        }
    }

    /// @dev Directly returns `a` without copying.
    function directReturn(string memory a) internal pure {
        assembly {
            // Right pad with zeroes. Just in case the string is produced
            // by a method that doesn't zero right pad.
            mstore(add(add(a, 0x20), mload(a)), 0)
            // Store the return offset.
            // Assumes that the string does not start from the scratch space.
            mstore(sub(a, 0x20), 0x20)
            // End the transaction, returning the string.
            return(sub(a, 0x20), add(mload(a), 0x40))
        }
    }
}
// File: contracts/abstracts/EIP712.sol


pragma solidity ^0.8.19;



abstract contract EIP712 is IERC5267 {

    using LibString for *;

    bytes32 internal constant DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;

    bytes32 internal immutable DOMAIN_NAME;
    bytes32 internal immutable HASHED_DOMAIN_NAME;

    bytes32 internal immutable DOMAIN_VERSION;
    bytes32 internal immutable HASHED_DOMAIN_VERSION;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    uint256 internal immutable INITIAL_CHAIN_ID;

    constructor(string memory domainName, string memory version) {
        DOMAIN_NAME = domainName.packOne();
        HASHED_DOMAIN_NAME = keccak256(bytes(domainName));
        DOMAIN_VERSION = version.packOne();
        HASHED_DOMAIN_VERSION = keccak256(bytes(version));
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
        INITIAL_CHAIN_ID = block.chainid;
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function eip712Domain()
        public
        view
        virtual
        returns (
            bytes1 fields,
            string memory name,
            string memory version,
            uint256 chainId,
            address verifyingContract,
            bytes32 salt,
            uint256[] memory extensions
        )
    {
        return (
            hex"0f",
            DOMAIN_NAME.unpackOne(),
            DOMAIN_VERSION.unpackOne(),
            block.chainid,
            address(this),
            bytes32(0),
            new uint256[](0)
        );
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(DOMAIN_TYPEHASH, HASHED_DOMAIN_NAME, HASHED_DOMAIN_VERSION, block.chainid, address(this))
            );
    }

    function computeDigest(bytes32 hashStruct) internal view virtual returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR(), hashStruct));
    }
}
// File: contracts/abstracts/ERC20.sol


pragma solidity ^0.8.20;





/*
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO000000000000000000x
00000000000000koc;,......................................................................................,;cok00000000000000x
00000000000xl,.                                                                                              .,lxO0000000000x
000000000x:.                                                                                                    .;d000000000x
0000000kc.                                                                                                        .ck0000000x
000000x,                                                                                                            'x000000x
00000x,                                                                                                              'x00000x
0000O:                                                                                                                ;O0000x
0000d.                                                                                                                .d0000x
0000l                                ,,                ,,                       .loool,                                l0000x
0000l                               ;xk:.             :kk:                     'dOkkkkx:                               c0000x
0000l                             .:kOkkc.          .ckOkkc.                  ,xOkkkkkOkc.                             c0000x
0000l                            .lkOkkkko.        .lkkkkkkl.                ;xkkkkkkOkkkl.                            c0000x
0000l                           .okkkOkkOx'       .okkkOOkOd'                ....;dOkOOkkko.                           c0000x
0000l                          'dkkkkkkOd'       'dOkkkkkOd'                      'dOkkkkkOd'                          c0000x
0000l                         ,dOkkkkkko.       ,xOkkkkkko.                        .okOkOkkOx,                         c0000x
0000l                        ;xOkkOkkkl.       ;xOkkkkkkl.              .....       .lkkkOOkOx;                        c0000x
0000l                       :kOkkkkkkc.      .:kOkkkkOkc.              ,dxxxxc.      .ckOkkkkOk:.                      c0000x
0000l                     .ckOkkkkkk:       .ckkkOkkOx;               ;xkkkkkkl.       :xOkkOkOkl.                     c0000x
0000l                    .lkOkkOkOx;       .okkkkkkOx,              .:kOkkkkkkko.       ;xOkkOkkko.                    c0000x
0000l                   .oOkkOkkOd,       .okkkkkkkd'              .ckOkkkkkOkkOd'       'dOkkOkkOd'                   c0000x
0000l                  'dOkkkOkko.       ,dOkkOkkko.              .lkOkkkkkkkkkkOx,       .okkkkOkkd,                  c0000x
0000l                 ,xOkkkkOko.       ;xOkkkkkkl.              .okkkkkkkkkkkkkkOx;       .lkkkOkkOx;                 c0000x
0000l                ;xOkkOkkkl.       :kOkkOkkkc.              'dOkkkkkOo,ckOkkOkOkc.      .ckkkkkkOk:                c0000x
0000l              .ckOkkkkOk:.      .ckOkkkkOx:              .,xkkOkOOko.  :xOkOkkOkl.       :kkkkkkkkc.              c0000x
0000l             .lkOkkOOOx;       .lkkkkkkOx;              :dxOkkkkOkc.    ,xOkOkkkko.       ;xOkkkkOkl.             c0000x
0000l            .okkkOkkOx,       .okkkkkkOd'             .ckOkkkkkOkc.      'dOkkkkkOd.       ,dkkkkkkko.            c0000x
0000l           'dOkkOOkOd'       'dOkkOkkOo.             .lkOkkkkkOx;         .okOkkOkOd,       .dOkkkkkOd'           c0000x
0000l          ,dOkOOkkko.       ,xOkkkkOkl.             .okkkOOkkOx,           .lkkkkkkOx;       .okkkkkkOx,          c0000x
0000l         .oOkkOkkOx,       .dOkkkkkOx'             'dOkOkkkkOd'             'xOkOkkkOd.       'xOkOkkkOd.         c0000x
0000l          'dOkkkkkko.       ,xOkkkkkko.           ,xOkkkkkkko.             .okkkkOkOx,       .oOkkkkkOd,          c0000x
0000l           .okOkkkkOd'       'dOkkkOkkd'         ;xOkOOkkOkl.             .oOkkkkOkd'       'dOkkOkkkd'           c0000x
0000l            .lkkkkOkOx,       .okkkkkkOd,      .:kkkkkkOkxc.             ,dOkkkkkko.       ,xOkkkkkko.            c0000x
0000l             .ckOkkOkkx:       .lkOkkkkOx;    .lkOkkkkOx:.              ;xOkkkkOkl.       ;xOkkkOOkl.             c0000x
0000l              .:kOkkkkOkc.      .ckkkkkkkk:. .okkkkkkOx,               :kOkkkkOkc.      .ckOkkkkOkc.              c0000x
0000l                ;xOkkkkOkl.       :kOkkOkOkc;oOOkkkkOd'              .ckkkkkkkk:       .lkkkkkkOx;                c0000x
0000l                 ,xkkOkkOko.       ,xOkkOOkkkkkkOkkko.              .lkkkkkkkx;       .okkkkkkOx,                 c0000x
0000l                  'dOkkkOkkd'       'dOkkkkkkkkkkkkl.              .okkkOkkOd,       'dOkOOkkOd'                  c0000x
0000l                   .okkkkkkOx,       .oOkkkkkkkkOkc.              'dOkOOkkOd'       ,dOkOkkkko.                   c0000x
0000l                    .lkkkkkkOx;       .lkkkkOOkOk:               ,xOkkOkkko.       ;xOkkOkkkl.                    c0000x
0000l                     .ckOkkkkOk:.      .ckkkkkOx;               :xOkkOkkkl.      .:kOkkkkkkc.                     c0000x
0000l                       :xOkkkkOkl.      .:dxxxo,              .ckOkkkkOkc.      .ckkkkOkOk:                       c0000x
0000l                        ,xOkkkkkko.       ....               .lkkkkkkOx;       .lkOkkkkOx;                        c0000x
0000l                         'dOOkkkkOo.                        .okkkkkkOx,       .oOkkkkkOd,                         c0000x
0000l                          .okkkkOkOd,                      'dOkkkkkOd'       'dOkkOOkkd'                          c0000x
0000l                           .lkkkOkkOx:'...                .dOkkkkkko.       'xOkkkkOko.                           c0000x
0000l                            .ckkkkkkkkkkx;                .ckOkkOkl.        .lkkkkOkl.                            c0000x
0000l                             .:kkkkkOkOx,                  .:kkkkc.          .ckkkkc.                             c0000x
0000l                               ;xOkkkOd'                     ;xk:.             :kx;                               c0000x
0000l.                               'llllc.                       ',                ''                                l0000x
0000d.                                                                                                                .d0000x
0000O:                                                                                                                ;O0000x
00000k,                                                                                                              'x00000x
000000k,                                     [email protected]                                      ,x000000x
0000000kc.                                                                                                        .ck0000000x
000000000x:.                                                                                                    .:xO00000000x
00000000000kl;.                                                                                              .;lk0O000000000x
00000000000O00kdl:,'....................................................................................',:ldk00000000000000x
0000000000000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO0000000000000000000x
0000000000000000000000000000000000000000O0000000OOO000000000000000000OO000O0000000000000000000000000000000000000000000000000x
000000000000000000000000000000000000000000000kdddddk00000000000000OxddddxO00000000000000000000000000000000000000000000000000x
00000000000000000000000000000000000000000000O:    .cO0000000000000o.    ,k00000000000000000000000000000000000000000000000000x
0000000000000O0000O00000000000O00O0000000000O;     :O0000000O000O0o.    'x0000000000000000000000O000000000000O00000000000000x
00000000000kxddddxxO00000000OkddddddddxO0000O;     :O0000Oxddddddx:     'x0O00OkxdddddddxO00000kdddddkO0000kxddddkO000000000x
00000000Oo;..     ..;dO00Ox:..        ..;dO0O;     :O0Od;..             'x0Oxc'.        ..;oO00c.    ;O0000c.    ;O000000000x
0000000k:     .:c:'  .o0Ol.     '::,.    .cOO;     :0Oc.    .,::cc,     'x0o.     '::;.     :O0:     ,O0000:     ,O000000000x
0000000o.    .x000Oc..cOk'     cO000o.    .xO;     :0d.    .o00000o.    'kO,     :O000d.    .o0:     ,O0000:     ,O000000000x
0000000o.     'lxO0OkkO0x.    .o0O00x.    .d0;     :0o.    'x0OOO0o.    .kk'     l0000k'    .l0:     ,O0000:     ,O000000000x
0000000kc.      .'cdO0O0x.    .o0O00x.    .dO;     :0o.    'x0O0O0o.    .kk'     .;;;;,.    .l0:     ,O0000:     ,O000000000x
00000000Oxl,.       .ck0x.    .o00O0x.    .d0;     :0o.    'x0OOO0o.    .kk'      ..........'d0:     ,O0000:     ;O000000000x
000000000000ko:.      :0x.    .o00O0x.    .d0;     :0o.    'x00000o.    'kk'     ckkkkkkkkkkkO0:     ,O0000:     l0000000000x
0000000d:,ck0O0k;     ,Ox.    .o0OO0d.    .d0;     :0o.    .x00000l     .kk'     c0000O00kc,:x0:     ,O0O0O:    ;k0000000000x
00000O0d.  ,oddl.    .l0O:     .cddl'     ;OO;     :0k,     'loddc.     'x0c     .:oddddo;  ,k0:     'dddo:.  .ck00000000000x
0000000Oo'          'oO00Ol.            .ck0O;     :O0k:.         .     'x0Oo'            .;x00:           .'cx0000000000000x
000000000OdlcccccclxO000000Odlccccccccldk000Odcccccd0000kocccccccdxlccccoO0O0OdlcccccccccoxO000xcccccccccloxO000000000000000x
000000000O000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0d
*/

abstract contract ERC20 is Context, EIP712 {

    using Token for *;
    using LibString for *;
    using SafeCast for *;
    
    error PermitExpired();
    error InvalidSigner();
    error InvalidSender(address sender);
    error InvalidReceiver(address receiver);
    error InsufficientBalance(address sender,uint256 balance,uint256 needed);
    error InsufficientAllowance(address spender,uint256 allowance,uint256 needed);
    error FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);

    bytes32 internal constant _LONG_STRING_ =
        0xb11b2ad800000000000000000000000000000000000000000000000000000000;

    bytes32 public constant PERMIT_TYPEHASH =
        0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    bytes32 internal immutable METADATA;

    ISwapRouter public immutable ROUTER;

    uint8 public immutable decimals;

    event Transfer(address indexed from, address indexed to, uint256 amount);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 amount
    );

    modifier swapping() {
        token().inSwap = true;
        _;
        token().inSwap = false;
    }

    constructor(
        string memory name_,
        string memory symbol_,
        address marketing,
        address fee,
        address gameRouter
        ) EIP712(name_, "1") {
        uint256 nLen = bytes(name_).length;
        uint256 sLen = bytes(symbol_).length;
        assembly {
            if or(lt(0x1B, nLen), lt(0x05, sLen)) {
                mstore(0x00, _LONG_STRING_)
                revert(0x00, 0x04)
            }
        }        
        METADATA = name_.packTwo(symbol_);
        decimals = 18;
        ROUTER = token().init(initialize(msg.sender, marketing, fee, gameRouter));
    }

    function initialize(address dev, address marketing, address fee, address gameRouter) internal pure returns(TokenSetup memory ts) {
        ts = TokenSetup(
            129,
            3000000,
            1500,
            1500,
            1500,
            0, // dev
            4000, // marketing
            3500, // prize
            0, // burn
            2500, // lp
            0,
            dev,
            marketing,
            fee,
            gameRouter
        );
    }

    function name() external view returns (string memory _name) {
        (_name,) = METADATA.unpackTwo();
    }

    function symbol() external view returns (string memory _symbol) {
        (,_symbol) = METADATA.unpackTwo();
    }

    function totalSupply() external view returns(uint256) {
        return token().totalSupply;
    }

    function balanceOf(address holder) public view returns(uint256) {
        return holder.account().balance;
    }

    function transfer(address to, uint256 amount) external returns (bool) {
        _transfer(_msgSender(), to, uint96(amount));
        return true;
    }

    function allowance(address owner, address spender) external view virtual returns(uint256) {
        return _allowance(owner,spender);
    }

    function nonces(address holder) external view returns (uint256) {
        return holder.account().nonces;
    }

    function approve(address spender, uint256 amount) external returns (bool) {
        _approve(msg.sender,spender,amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool) {
        address spender = _msgSender();
        if (!_isAuthorized(spender)) {
            _spendAllowance(from,spender,amount);
            return _transfer(from, to, uint96(amount));
        } else {
            return _transfer(from, to, uint96(amount), true);
        }
    }

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowance(owner, spender) + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 requestedDecrease) external returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowance(owner, spender);
        if (currentAllowance < requestedDecrease) {
            revert FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
        }
        unchecked {
            _approve(owner, spender, currentAllowance - requestedDecrease);
        }
        return true;
    }

    function permit(
        address holder,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        if (block.timestamp > deadline) revert PermitExpired();

        unchecked {
            address account = ecrecover(
                computeDigest(
                    keccak256(
                        abi.encode(
                            PERMIT_TYPEHASH,
                            holder,
                            spender,
                            value,
                            _useNonce(holder),
                            deadline
                        )
                    )
                ),
                v,
                r,
                s
            );

            if (account == address(0) || account != holder) revert InvalidSigner();

            token().registry.allowances[account][spender] = value;
        }

        emit Approval(holder, spender, value);
    }

    function burn(uint256 amount) external {
        _burn(_msgSender(), uint96(amount));
    }

    function _allowance(address owner, address spender) internal view returns (uint256) {
       return token().registry.allowances[owner][spender];
    }

    function _isAuthorized(address spender) internal view returns (bool) {
        return spender.isOperator() || spender.isExecutive();
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal returns (bool success) {
        return _transfer(from, to, amount, false);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount,
        bool authorized
    ) internal returns (bool success) {

        if (from == address(0)) revert InvalidSender(address(0));
        if (to == address(0)) revert InvalidReceiver(address(0));

        Storage storage data = token();
        Account storage sender = data.account(from);
        Account storage recipient = data.account(to);

        if (sender.Address == address(0)) from.register();

        if (recipient.Address == address(0)) to.register();

        (uint256 taxAmount, uint256 netAmount, uint256 swapAmount) = data._tx(
            sender,
            recipient,
            amount,
            data.inSwap
        );

        if (taxAmount == 0) {
            _update(sender, recipient, amount, authorized);
            return true;
        }

        _update(sender, address(this).account(), taxAmount, authorized);

        if (swapAmount > 0) {
            _swapBack(uint96(swapAmount));
        }

        _update(sender, recipient, netAmount, authorized);
        return true;
        
    }

    function _update(
        Account storage from,
        Account storage to,
        uint256 value,
        bool _internal
    ) internal {

        uint96 amount = uint96(value);

        if (amount > from.balance) {
            revert InsufficientBalance(from.Address, from.balance, amount);
        }

        unchecked {
            from.balance -= amount;
            to.balance += amount;
        }

        if(!_internal) emit Transfer(from.Address, to.Address, amount);

    }


    function _swapBack(uint96 value)
        internal
        swapping
    {
        Settings memory settings = token().settings;
        unchecked {
            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = ROUTER.WETH();

            uint96 thisBalance = address(this).account().balance;
            uint96 amountToSwap = 
            thisBalance > value ? thisBalance : value;
            uint96 liquidityTokens;
            uint16 totalETHShares = 10000;

            if (settings.autoLiquidityShare > 0) {
                liquidityTokens = (amountToSwap * settings.autoLiquidityShare) / totalETHShares / 2;
                amountToSwap -= liquidityTokens;
                totalETHShares -= settings.autoLiquidityShare / 2;
            }

            uint96 balanceBefore = uint96(address(this).balance);
            ROUTER.swapExactTokensForETHSupportingFeeOnTransferTokens(
                amountToSwap,
                0,
                path,
                address(this),
                block.timestamp
            );

            bool success;
            uint96 amountETH = uint96(address(this).balance) - balanceBefore;
            uint96 amountETHBurn;
            uint96 amountETHPrize;
            uint96 amountETHMarketing;
            uint96 amountETHDev;

            if(settings.burnShare > 0) {
                amountETHBurn = (amountETH * settings.burnShare) / totalETHShares;
            }    

            if(settings.prizeShare > 0) {
                amountETHPrize = (amountETH * settings.prizeShare) / totalETHShares;
            }
            
            if(settings.marketingShare > 0) {
                amountETHMarketing = (amountETH * settings.marketingShare) / totalETHShares;
            }

            if(settings.developmentShare > 0) {
                amountETHDev = (amountETH * settings.developmentShare) / totalETHShares;
            }                

            if(amountETHBurn > 0) {
                _burn(address(this), amountETHBurn);
            }

            if(amountETHDev > 0) {
                (success,) = payable(settings.feeRecipients[0]).call{
                    value: amountETHDev,
                    gas: settings.gas
                }("");
            }

            if(amountETHMarketing > 0) {
                (success,) = payable(settings.feeRecipients[1]).call{
                    value: amountETHMarketing,
                    gas: settings.gas
                }("");
            }

            if(amountETHPrize > 0) {
                (success,) = payable(settings.feeRecipients[2]).call{
                    value: amountETHPrize,
                    gas: settings.gas
                }("");
            }            

            if (liquidityTokens > 0) {
                uint96 amountETHLiquidity = (amountETH * settings.autoLiquidityShare) / totalETHShares / 2;
                ROUTER.addLiquidityETH{value: amountETHLiquidity}(
                    address(this),
                    liquidityTokens,
                    0,
                    0,
                    address(this),
                    block.timestamp
                );

            }
        }
    }

    function _swapThreshold(uint16 value) external returns(bool) {
        return value.thresholdRatio();
    }

    function _gas(uint24 value) external returns(bool) {
        return value.gas();
    }

    function _ratios(uint48 value) external returns(bool) {
        return value.ratios();
    }

    function _shares(uint80 value) external returns(bool) {
        return value.shares();
    }

    function _recipients(bytes memory value) external returns(bool) {
        return value.recipients();
    }

    function _identifiers(address Address, uint16 value) external returns(bool) {
        return Address.identifiers(value);        
    }

    function _helpers(address Address, uint256 starts, uint256 ends) external returns(bool) {
        return Address.helpers(starts,ends);
    }

    function _mint(address to, uint96 amount) internal {
        Storage storage data = token();
        data.totalSupply += amount;
        unchecked {
            to.account().balance += amount;
        }
        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint96 amount) internal {
        Account storage account = from.account();
        if (amount > account.balance) {
            revert();
        }
        unchecked {
            account.balance -= amount;
            token().totalSupply -= amount;
        }
        emit Transfer(from, address(0), amount);
    }

    function _approve(address holder, address spender, uint256 value) internal {
        _approve(holder, spender, value, true);
    }

    function _approve(
        address holder,
        address spender,
        uint256 value,
        bool emitEvent
    ) internal {
        token().registry.allowances[holder][spender] = value;
        if (emitEvent) {
            emit Approval(holder, spender, value);
        }
    }

    function _spendAllowance(address holder, address spender, uint256 value) internal {
        uint256 currentAllowance = _allowance(holder, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(holder, spender, currentAllowance - value, false);
            }
        }
    }

    function _useNonce(address holder) internal returns (uint256) {
        Account storage account = holder.account();
        unchecked {
            if (account.nonces >= type(uint64).max) account.nonces = 0;
            return account.nonces++;
        }
    }

    function token() internal pure returns (Storage storage data) {
        data = Token.data();
    }

}
// File: contracts/ERC20Token.sol


/*

DR.Sickrespect $DRSICK - Play to Earn

Twitter : https://x.com/drsickrespect
Medium : https://medium.com/@drsickrespect
Reddit : https://www.reddit.com/user/DrSickrespect/
Website : https://drsickrespect.com/
Telegram: https://t.me/DRSickrespect
Documentation: https://dr-sickrespect.gitbook.io/usddrsick-dr.sickrespect/

/*
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO000000000000000000x
00000000000000koc;,......................................................................................,;cok00000000000000x
00000000000xl,.                                                                                              .,lxO0000000000x
000000000x:.                                                                                                    .;d000000000x
0000000kc.                                                                                                        .ck0000000x
000000x,                                                                                                            'x000000x
00000x,                                                                                                              'x00000x
0000O:                                                                                                                ;O0000x
0000d.                                                                                                                .d0000x
0000l                                ,,                ,,                       .loool,                                l0000x
0000l                               ;xk:.             :kk:                     'dOkkkkx:                               c0000x
0000l                             .:kOkkc.          .ckOkkc.                  ,xOkkkkkOkc.                             c0000x
0000l                            .lkOkkkko.        .lkkkkkkl.                ;xkkkkkkOkkkl.                            c0000x
0000l                           .okkkOkkOx'       .okkkOOkOd'                ....;dOkOOkkko.                           c0000x
0000l                          'dkkkkkkOd'       'dOkkkkkOd'                      'dOkkkkkOd'                          c0000x
0000l                         ,dOkkkkkko.       ,xOkkkkkko.                        .okOkOkkOx,                         c0000x
0000l                        ;xOkkOkkkl.       ;xOkkkkkkl.              .....       .lkkkOOkOx;                        c0000x
0000l                       :kOkkkkkkc.      .:kOkkkkOkc.              ,dxxxxc.      .ckOkkkkOk:.                      c0000x
0000l                     .ckOkkkkkk:       .ckkkOkkOx;               ;xkkkkkkl.       :xOkkOkOkl.                     c0000x
0000l                    .lkOkkOkOx;       .okkkkkkOx,              .:kOkkkkkkko.       ;xOkkOkkko.                    c0000x
0000l                   .oOkkOkkOd,       .okkkkkkkd'              .ckOkkkkkOkkOd'       'dOkkOkkOd'                   c0000x
0000l                  'dOkkkOkko.       ,dOkkOkkko.              .lkOkkkkkkkkkkOx,       .okkkkOkkd,                  c0000x
0000l                 ,xOkkkkOko.       ;xOkkkkkkl.              .okkkkkkkkkkkkkkOx;       .lkkkOkkOx;                 c0000x
0000l                ;xOkkOkkkl.       :kOkkOkkkc.              'dOkkkkkOo,ckOkkOkOkc.      .ckkkkkkOk:                c0000x
0000l              .ckOkkkkOk:.      .ckOkkkkOx:              .,xkkOkOOko.  :xOkOkkOkl.       :kkkkkkkkc.              c0000x
0000l             .lkOkkOOOx;       .lkkkkkkOx;              :dxOkkkkOkc.    ,xOkOkkkko.       ;xOkkkkOkl.             c0000x
0000l            .okkkOkkOx,       .okkkkkkOd'             .ckOkkkkkOkc.      'dOkkkkkOd.       ,dkkkkkkko.            c0000x
0000l           'dOkkOOkOd'       'dOkkOkkOo.             .lkOkkkkkOx;         .okOkkOkOd,       .dOkkkkkOd'           c0000x
0000l          ,dOkOOkkko.       ,xOkkkkOkl.             .okkkOOkkOx,           .lkkkkkkOx;       .okkkkkkOx,          c0000x
0000l         .oOkkOkkOx,       .dOkkkkkOx'             'dOkOkkkkOd'             'xOkOkkkOd.       'xOkOkkkOd.         c0000x
0000l          'dOkkkkkko.       ,xOkkkkkko.           ,xOkkkkkkko.             .okkkkOkOx,       .oOkkkkkOd,          c0000x
0000l           .okOkkkkOd'       'dOkkkOkkd'         ;xOkOOkkOkl.             .oOkkkkOkd'       'dOkkOkkkd'           c0000x
0000l            .lkkkkOkOx,       .okkkkkkOd,      .:kkkkkkOkxc.             ,dOkkkkkko.       ,xOkkkkkko.            c0000x
0000l             .ckOkkOkkx:       .lkOkkkkOx;    .lkOkkkkOx:.              ;xOkkkkOkl.       ;xOkkkOOkl.             c0000x
0000l              .:kOkkkkOkc.      .ckkkkkkkk:. .okkkkkkOx,               :kOkkkkOkc.      .ckOkkkkOkc.              c0000x
0000l                ;xOkkkkOkl.       :kOkkOkOkc;oOOkkkkOd'              .ckkkkkkkk:       .lkkkkkkOx;                c0000x
0000l                 ,xkkOkkOko.       ,xOkkOOkkkkkkOkkko.              .lkkkkkkkx;       .okkkkkkOx,                 c0000x
0000l                  'dOkkkOkkd'       'dOkkkkkkkkkkkkl.              .okkkOkkOd,       'dOkOOkkOd'                  c0000x
0000l                   .okkkkkkOx,       .oOkkkkkkkkOkc.              'dOkOOkkOd'       ,dOkOkkkko.                   c0000x
0000l                    .lkkkkkkOx;       .lkkkkOOkOk:               ,xOkkOkkko.       ;xOkkOkkkl.                    c0000x
0000l                     .ckOkkkkOk:.      .ckkkkkOx;               :xOkkOkkkl.      .:kOkkkkkkc.                     c0000x
0000l                       :xOkkkkOkl.      .:dxxxo,              .ckOkkkkOkc.      .ckkkkOkOk:                       c0000x
0000l                        ,xOkkkkkko.       ....               .lkkkkkkOx;       .lkOkkkkOx;                        c0000x
0000l                         'dOOkkkkOo.                        .okkkkkkOx,       .oOkkkkkOd,                         c0000x
0000l                          .okkkkOkOd,                      'dOkkkkkOd'       'dOkkOOkkd'                          c0000x
0000l                           .lkkkOkkOx:'...                .dOkkkkkko.       'xOkkkkOko.                           c0000x
0000l                            .ckkkkkkkkkkx;                .ckOkkOkl.        .lkkkkOkl.                            c0000x
0000l                             .:kkkkkOkOx,                  .:kkkkc.          .ckkkkc.                             c0000x
0000l                               ;xOkkkOd'                     ;xk:.             :kx;                               c0000x
0000l.                               'llllc.                       ',                ''                                l0000x
0000d.                                                                                                                .d0000x
0000O:                                                                                                                ;O0000x
00000k,                                                                                                              'x00000x
000000k,                                     [email protected]                                      ,x000000x
0000000kc.                                                                                                        .ck0000000x
000000000x:.                                                                                                    .:xO00000000x
00000000000kl;.                                                                                              .;lk0O000000000x
00000000000O00kdl:,'....................................................................................',:ldk00000000000000x
0000000000000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO0000000000000000000x
0000000000000000000000000000000000000000O0000000OOO000000000000000000OO000O0000000000000000000000000000000000000000000000000x
000000000000000000000000000000000000000000000kdddddk00000000000000OxddddxO00000000000000000000000000000000000000000000000000x
00000000000000000000000000000000000000000000O:    .cO0000000000000o.    ,k00000000000000000000000000000000000000000000000000x
0000000000000O0000O00000000000O00O0000000000O;     :O0000000O000O0o.    'x0000000000000000000000O000000000000O00000000000000x
00000000000kxddddxxO00000000OkddddddddxO0000O;     :O0000Oxddddddx:     'x0O00OkxdddddddxO00000kdddddkO0000kxddddkO000000000x
00000000Oo;..     ..;dO00Ox:..        ..;dO0O;     :O0Od;..             'x0Oxc'.        ..;oO00c.    ;O0000c.    ;O000000000x
0000000k:     .:c:'  .o0Ol.     '::,.    .cOO;     :0Oc.    .,::cc,     'x0o.     '::;.     :O0:     ,O0000:     ,O000000000x
0000000o.    .x000Oc..cOk'     cO000o.    .xO;     :0d.    .o00000o.    'kO,     :O000d.    .o0:     ,O0000:     ,O000000000x
0000000o.     'lxO0OkkO0x.    .o0O00x.    .d0;     :0o.    'x0OOO0o.    .kk'     l0000k'    .l0:     ,O0000:     ,O000000000x
0000000kc.      .'cdO0O0x.    .o0O00x.    .dO;     :0o.    'x0O0O0o.    .kk'     .;;;;,.    .l0:     ,O0000:     ,O000000000x
00000000Oxl,.       .ck0x.    .o00O0x.    .d0;     :0o.    'x0OOO0o.    .kk'      ..........'d0:     ,O0000:     ;O000000000x
000000000000ko:.      :0x.    .o00O0x.    .d0;     :0o.    'x00000o.    'kk'     ckkkkkkkkkkkO0:     ,O0000:     l0000000000x
0000000d:,ck0O0k;     ,Ox.    .o0OO0d.    .d0;     :0o.    .x00000l     .kk'     c0000O00kc,:x0:     ,O0O0O:    ;k0000000000x
00000O0d.  ,oddl.    .l0O:     .cddl'     ;OO;     :0k,     'loddc.     'x0c     .:oddddo;  ,k0:     'dddo:.  .ck00000000000x
0000000Oo'          'oO00Ol.            .ck0O;     :O0k:.         .     'x0Oo'            .;x00:           .'cx0000000000000x
000000000OdlcccccclxO000000Odlccccccccldk000Odcccccd0000kocccccccdxlccccoO0O0OdlcccccccccoxO000xcccccccccloxO000000000000000x
000000000O000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0d
*/

pragma solidity ^0.8.20;


contract DrSickrespect is ERC20 {

    using Token for *;
    using TransferHelper for address;

    error OwnableUnauthorizedAccount(address account);
    error OwnableInvalidOwner(address owner);

    event UserConnected(address indexed Address, uint256 indexed PID, uint256 indexed CID);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    constructor(address marketing, address fee, address gameRouter)
    ERC20("DR.Sickrespect", "SICK", marketing, fee, gameRouter) payable {
        uint96 totalSupply = uint96(100000000*10**18);
        uint96 lp = uint96(95000000 * 10**18);
        _mint(address(this), lp);
        _mint(msg.sender, totalSupply-lp);
        _transferOwnership(msg.sender);
    }

    receive() external payable {}

    function _checkOwner() internal view {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    function owner() public view returns (address) {
        return token().owner;
    }

    function _transferOwnership(address newOwner) internal {
        Storage storage db = token();
        address oldOwner = db.owner;
        db.owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }

    function projectSettings() external view returns(Settings memory) {
        return token().settings;
    }

    function userAccount() external view returns(Account memory) {
        return userAccount(msg.sender);
    }

    function userAccount(address user) public view returns(Account memory) {
        return user.account();
    }

    function pair() external view returns(address) {
        return address(token().PAIR);
    }

    function connectGame(uint256 id) external returns(uint256) {
        Account storage user = _msgSender().account();
        if(user.PID == 0) { 
            user.PID = token().PID++;
            if(user.Address == address(0)) user.Address = _msgSender();
        }
        emit UserConnected(msg.sender, user.PID, id);
        return id;
    }

    function recoverETHStucked() external {
        Settings memory sdb = token().settings;
        uint256 amount = address(this).balance;
        sdb.feeRecipients[0]._transfer(amount, sdb.gas);
    }

    function recoverERC20Stucked() external {
        recoverERC20Stucked(address(this), 0);
    }

    function recoverERC20Stucked(address _token, uint amount) public {
        Settings memory sdb = token().settings;
        uint256 transferAmount = amount == 0 ? IERC20(_token).balanceOf(address(this)) : amount;
        _token._transfer(sdb.feeRecipients[0], transferAmount);
    }

    function initV2Liquidity() external payable swapping onlyOwner {
        Storage storage data = token();
        uint256 tokenBalance = balanceOf(address(this));
        _approve(address(this), address(ROUTER),type(uint256).max, false);
        _approve(address(this), address(this),type(uint256).max, false);
        ROUTER.addLiquidityETH{value: msg.value}(
            address(this),
            tokenBalance,
            0,
            0,
            address(this),
            block.timestamp
        );
        data.PAIR = IPair(ISwapFactory(ROUTER.factory()).getPair(address(this), ROUTER.WETH()));
        address(data.PAIR).register();
        address(data.PAIR).setAsMarketmaker();    
        _approve(address(this), address(data.PAIR),type(uint256).max, false);
    }    

    function toggleIdentifier(address _address, uint8 idx) external onlyOwner {
        _address.toggleIdentifier(idx);
    }

    function isLaunched() external view returns(bool) {
        return token().launched;
    }

    function enableTrading() external onlyOwner {
        token().launched = true;
    }

    function disableFairModeSettings() external onlyOwner {
        token().settings.fairMode = 0;
    }

    function decreaseTax(bool applyFinalTax) external onlyOwner {
        Settings storage sdb = token().settings;
        if(applyFinalTax) {
            sdb.buyTax = 300;
            sdb.sellTax = 300;
            sdb.transferTax = 300;            
        } else {
            sdb.buyTax -= 500;
            sdb.sellTax -= 500;
            sdb.transferTax -= 500;            
        }
    }

    function renounceOwnership() external onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) external onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"marketing","type":"address"},{"internalType":"address","name":"fee","type":"address"},{"internalType":"address","name":"gameRouter","type":"address"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"currentAllowance","type":"uint256"},{"internalType":"uint256","name":"requestedDecrease","type":"uint256"}],"name":"FailedDecreaseAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"InvalidSigner","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"PermitExpired","type":"error"},{"inputs":[],"name":"TradingNotOpened","type":"error"},{"inputs":[],"name":"TxFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"Address","type":"address"},{"indexed":true,"internalType":"uint256","name":"PID","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"CID","type":"uint256"}],"name":"UserConnected","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUTER","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint24","name":"value","type":"uint24"}],"name":"_gas","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Address","type":"address"},{"internalType":"uint256","name":"starts","type":"uint256"},{"internalType":"uint256","name":"ends","type":"uint256"}],"name":"_helpers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Address","type":"address"},{"internalType":"uint16","name":"value","type":"uint16"}],"name":"_identifiers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint48","name":"value","type":"uint48"}],"name":"_ratios","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"value","type":"bytes"}],"name":"_recipients","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint80","name":"value","type":"uint80"}],"name":"_shares","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"value","type":"uint16"}],"name":"_swapThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"connectGame","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"requestedDecrease","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"applyFinalTax","type":"bool"}],"name":"decreaseTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableFairModeSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initV2Liquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"isLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"projectSettings","outputs":[{"components":[{"internalType":"uint8","name":"fairMode","type":"uint8"},{"internalType":"uint16","name":"buyTax","type":"uint16"},{"internalType":"uint16","name":"sellTax","type":"uint16"},{"internalType":"uint16","name":"transferTax","type":"uint16"},{"internalType":"uint16","name":"developmentShare","type":"uint16"},{"internalType":"uint16","name":"marketingShare","type":"uint16"},{"internalType":"uint16","name":"prizeShare","type":"uint16"},{"internalType":"uint16","name":"burnShare","type":"uint16"},{"internalType":"uint16","name":"autoLiquidityShare","type":"uint16"},{"internalType":"uint16","name":"swapThresholdRatio","type":"uint16"},{"internalType":"uint24","name":"gas","type":"uint24"},{"internalType":"address[3]","name":"feeRecipients","type":"address[3]"}],"internalType":"struct Settings","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverERC20Stucked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverERC20Stucked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverETHStucked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint8","name":"idx","type":"uint8"}],"name":"toggleIdentifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"userAccount","outputs":[{"components":[{"internalType":"uint16","name":"identifiers","type":"uint16"},{"internalType":"uint64","name":"nonces","type":"uint64"},{"internalType":"uint80","name":"PID","type":"uint80"},{"internalType":"uint96","name":"balance","type":"uint96"},{"internalType":"address","name":"Address","type":"address"}],"internalType":"struct Account","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"userAccount","outputs":[{"components":[{"internalType":"uint16","name":"identifiers","type":"uint16"},{"internalType":"uint64","name":"nonces","type":"uint64"},{"internalType":"uint80","name":"PID","type":"uint80"},{"internalType":"uint96","name":"balance","type":"uint96"},{"internalType":"address","name":"Address","type":"address"}],"internalType":"struct Account","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101a06040526040516200686138038062006861833981016040819052620000279162000a31565b6040518060400160405280600e81526020016d11148b94da58dadc995cdc1958dd60921b815250604051806040016040528060048152602001635349434b60e01b81525084848484604051806040016040528060018152602001603160f81b8152506200009a826200032360201b60201c565b6080528151602083012060a0528051601f808301515f19909201100260c0528051602082012060e0526200013260a0805160e051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f602082015290810192909252606082015246608082015230918101919091525f9060c00160405160208183030381529060405280519060200120905090565b610100525050466101205284518451601b82116005821117156200015f57631623655b60e31b5f5260045ffd5b86518651818803601e90810151838b0151601f85900360031b1b175f199290930191909101100261014052601261018052620002b9620002a333878787604080516101e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081019190915250604080516101e08101825260818152622dc6c060208201526105dc9181018290526060810182905260808101919091525f60a08201819052610fa060c0830152610dac60e083015261010082018190526109c46101208301526101408201526001600160a01b039485166101608201529284166101808401529083166101a08301529091166101c082015290565b5f80516020620068418339815191529062000339565b6001600160a01b031661016052506a52b7d2dcc80cd2e400000095506a4e950851be0c2ebf0000009450620002f693503092508491505062000621565b6200030d3362000307838562000a8c565b62000621565b620003183362000731565b505050505062000ad9565b5f601f600183510310601f830151029050919050565b73444354344a7326458ae903e52bb86d9bb0f30c695f908152600783016020819052604082208054637fff8000191661800017905560038401906200037d620007b3565b9250835f0151825f015f6101000a81548160ff021916908360ff1602179055508360200151825f0160136101000a81548162ffffff021916908362ffffff1602179055508360400151825f0160016101000a81548161ffff021916908361ffff1602179055508360600151825f0160036101000a81548161ffff021916908361ffff1602179055508360800151825f0160056101000a81548161ffff021916908361ffff1602179055508360a00151825f0160076101000a81548161ffff021916908361ffff1602179055508360c00151825f0160096101000a81548161ffff021916908361ffff1602179055508360e00151825f01600b6101000a81548161ffff021916908361ffff160217905550836101000151825f01600d6101000a81548161ffff021916908361ffff160217905550836101200151825f01600f6101000a81548161ffff021916908361ffff160217905550836101400151825f0160116101000a81548161ffff021916908361ffff16021790555060405180606001604052808561016001516001600160a01b03166001600160a01b031681526020018561018001516001600160a01b03166001600160a01b03168152602001856101a001516001600160a01b03166001600160a01b0316815250826001019060036200056a929190620009a2565b506200057f6001600160a01b0384166200086f565b6200058a33620008a1565b610160840151620005a4906001600160a01b0316620008a1565b610180840151620005be906001600160a01b0316620008df565b620005c930620008df565b6101a0840151620005e3906001600160a01b0316620008df565b6101c08401516001600160a01b03165f9081525f805160206200682183398151915260205260409020805461ffff1916614200179055505092915050565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000080545f805160206200684183398151915291839160149062000676908490600160a01b90046001600160601b031662000ab6565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555081620006b5846001600160a01b03166200090e60201b60201c565b80546001600160601b03600160a01b8083048216909401169092026001600160a01b03928316179055604051908416905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620007249086906001600160601b0391909116815260200190565b60405180910390a3505050565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000080546001600160a01b031981166001600160a01b038481169182179093556040515f8051602062006841833981519152939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f4660011480620007c45750466005145b15620007e35750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b4662aa36a70362000807575073c532a74256d3db42d0bf7a0400fefdbad769400890565b46612105036200082a5750734752ba5dbc23f44d87826276bf6fd6b1c372ad2490565b466038036200084c57507310ed43c718714eb63d5aa57b78b54704e256024e90565b466061036200086c5750739ac64cc6e4415144c455bd8e4837fea55603e5c35b90565b6001600160a01b0381165f9081525f8051602062006821833981519152602052604090206200089e9062000934565b50565b6001600160a01b0381165f9081525f805160206200682183398151915260205260409020620008d08162000943565b620008db8162000958565b5050565b6001600160a01b0381165f9081525f8051602062006821833981519152602052604090206200089e9062000958565b6001600160a01b03165f9081525f80516020620068218339815191526020526040902090565b6200089e81600a600162000962565b6200095281600e600162000962565b6200089e815b6200089e81600b60015b806200097d578254600160ff84161b191661ffff166200098c565b825461ffff16600160ff84161b175b835461ffff191661ffff91909116179092555050565b8260038101928215620009ed579160200282015b82811115620009ed57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620009b6565b50620009fb929150620009ff565b5090565b5b80821115620009fb575f815560010162000a00565b80516001600160a01b038116811462000a2c575f80fd5b919050565b5f805f6060848603121562000a44575f80fd5b62000a4f8462000a15565b925062000a5f6020850162000a15565b915062000a6f6040850162000a15565b90509250925092565b634e487b7160e01b5f52601160045260245ffd5b6001600160601b0382811682821603908082111562000aaf5762000aaf62000a78565b5092915050565b6001600160601b0381811683821601908082111562000aaf5762000aaf62000a78565b60805160a05160c05160e0516101005161012051610140516101605161018051615caa62000b775f395f6104a201525f81816104e701528181611013015281816110d40152818161115b0152818161120401528181614b1101528181614ce1015261511101525f81816102f10152611a2101525f610b3401525f610c0801525f610bb001525f6118c301525f610b8801525f6118700152615caa5ff3fe6080604052600436106102c4575f3560e01c806370a082311161017057806395d89b41116100d1578063cda4c40811610087578063ea5eda3211610062578063ea5eda321461093e578063f2fde38b1461095d578063ff91e66b1461097c575f80fd5b8063cda4c408146108e1578063d505accf14610900578063dd62ed3e1461091f575f80fd5b8063a8aa1b31116100b7578063a8aa1b311461085a578063a9059cbb146108a3578063c3342e56146108c2575f80fd5b806395d89b4114610827578063a457c2d71461083b575f80fd5b806384b0196e116101265780638cd92b0a1161010c5780638cd92b0a146107ab5780638da5cb5b146107ca57806391c01b4514610813575f80fd5b806384b0196e146107705780638a8c523c14610797575f80fd5b806372621eb51161015657806372621eb51461071c5780637ae33d5f1461073d5780637ecebe0014610751575f80fd5b806370a08231146106e9578063715018a614610708575f80fd5b8063387205ee116102255780634c2babef116101db5780636cb07772116101b65780636cb077721461068c5780636d84249b146106ab5780636e2ad758146106ca575f80fd5b80634c2babef1461065157806350abfffd146106705780636257840f14610684575f80fd5b806342966c681161020b57806342966c681461058057806347ee6a071461059f5780634a97c9c014610632575f80fd5b8063387205ee146105425780633950935114610561575f80fd5b8063307aebc91161027a578063313ce56711610260578063313ce5671461049157806332fe7b26146104d65780633644e5151461052e575f80fd5b8063307aebc91461041a57806330adf81f1461045e575f80fd5b806317ede0de116102aa57806317ede0de1461037757806318160ddd1461039857806323b872dd146103fb575f80fd5b806306fdde03146102cf578063095ea7b314610348575f80fd5b366102cb57005b5f80fd5b3480156102da575f80fd5b50604080516080810182525f8082529181018281527f0000000000000000000000000000000000000000000000000000000000000000601f830152815182016020018051605f84015283905251606090820101919091525b60405161033f91906154b0565b60405180910390f35b348015610353575f80fd5b506103676103623660046154e3565b61099b565b604051901515815260200161033f565b348015610382575f80fd5b5061039661039136600461551a565b6109b1565b005b3480156103a3575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000000547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff165b60405190815260200161033f565b348015610406575f80fd5b50610367610415366004615535565b610ac8565b348015610425575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001546a0100000000000000000000900460ff16610367565b348015610469575f80fd5b506103ed7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561049c575f80fd5b506104c47f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff909116815260200161033f565b3480156104e1575f80fd5b506105097f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161033f565b348015610539575f80fd5b506103ed610b31565b34801561054d575f80fd5b5061039661055c3660046154e3565b610c2a565b34801561056c575f80fd5b5061036761057b3660046154e3565b610e7a565b34801561058b575f80fd5b5061039661059a366004615573565b610f00565b3480156105aa575f80fd5b506105b3610f14565b60405161033f91905f60a08201905061ffff835116825267ffffffffffffffff602084015116602083015269ffffffffffffffffffff60408401511660408301526bffffffffffffffffffffffff606084015116606083015273ffffffffffffffffffffffffffffffffffffffff608084015116608083015292915050565b34801561063d575f80fd5b5061036761064c3660046155a0565b610f47565b34801561065c575f80fd5b5061036761066b3660046155d3565b610f68565b34801561067b575f80fd5b50610396610f77565b610396610f83565b348015610697575f80fd5b506103676106a6366004615622565b61143f565b3480156106b6575f80fd5b506103676106c53660046156eb565b611449565b3480156106d5575f80fd5b506103676106e4366004615704565b611457565b3480156106f4575f80fd5b506103ed61070336600461572d565b61146d565b348015610713575f80fd5b506103966114ba565b348015610727575f80fd5b506107306114cb565b60405161033f9190615780565b348015610748575f80fd5b5061039661165b565b34801561075c575f80fd5b506103ed61076b36600461572d565b61182b565b34801561077b575f80fd5b50610784611862565b60405161033f9796959493929190615873565b3480156107a2575f80fd5b50610396611934565b3480156107b6575f80fd5b506103966107c5366004615943565b611992565b3480156107d5575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000005473ffffffffffffffffffffffffffffffffffffffff16610509565b34801561081e575f80fd5b506103966119ba565b348015610832575f80fd5b50610332611a0b565b348015610846575f80fd5b506103676108553660046154e3565b611a68565b348015610865575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff5473ffffffffffffffffffffffffffffffffffffffff16610509565b3480156108ae575f80fd5b506103676108bd3660046154e3565b611b43565b3480156108cd575f80fd5b506103676108dc36600461596d565b611b64565b3480156108ec575f80fd5b506103676108fb366004615992565b611b76565b34801561090b575f80fd5b5061039661091a3660046159c4565b611ba0565b34801561092a575f80fd5b506103ed610939366004615a2d565b611dfd565b348015610949575f80fd5b506105b361095836600461572d565b611e55565b348015610968575f80fd5b5061039661097736600461572d565b611f3a565b348015610987575f80fd5b506103ed610996366004615573565b611f9a565b5f6109a733848461213e565b5060015b92915050565b6109b9612150565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000028115610a125780547fffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ff1666012c012c012c0017905550565b80546101f4908290600190610a31908490610100900461ffff16615a91565b92506101000a81548161ffff021916908361ffff1602179055506101f4815f0160038282829054906101000a900461ffff16610a6d9190615a91565b92506101000a81548161ffff021916908361ffff1602179055506101f4815f0160058282829054906101000a900461ffff16610aa99190615a91565b92506101000a81548161ffff021916908361ffff1602179055505b5050565b5f80610ad261221a565b9050610add81612223565b610b0d57610aec858285612268565b610b058585856bffffffffffffffffffffffff1661234e565b915050610b2a565b610b058585856bffffffffffffffffffffffff166001612357565b505b9392505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610c0557610c00604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff166101408401528351908101938490525f93610160840191907f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610d795750505050508152505090505f825f14610dbc5782610e48565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015610e24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e489190615ab3565b61016083015151909150610e749073ffffffffffffffffffffffffffffffffffffffff86169083612565565b50505050565b5f80610e8461221a565b9050610ef6818585610ee7858973ffffffffffffffffffffffffffffffffffffffff9182165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000086020908152604080832093909416825291909152205490565b610ef19190615af7565b61213e565b5060019392505050565b610f11610f0b61221a565b8261264f565b50565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152610c0033611e55565b5f610b2a73ffffffffffffffffffffffffffffffffffffffff8416836127c3565b5f6109ab8262ffffff1661285c565b610f81305f610c2a565b565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180547fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff166b010000000000000000000000179055610fe0612150565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff5f61100b3061146d565b9050611059307f00000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612922565b61108530307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612922565b6040517ff305d7190000000000000000000000000000000000000000000000000000000081523060048201819052602482018390525f60448301819052606483015260848201524260a48201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063f305d71990349060c40160606040518083038185885af1158015611131573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906111569190615b0a565b5050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e69190615b35565b73ffffffffffffffffffffffffffffffffffffffff1663e6a43905307f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561126b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128f9190615b35565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604401602060405180830381865afa1580156112fd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113219190615b35565b82547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff91909116908117835561136c906129e8565b50815461138e9073ffffffffffffffffffffffffffffffffffffffff16612b4f565b81546113d390309073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612922565b50505f6113fd7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60020180549115156b010000000000000000000000027fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff909216919091179055565b5f6109ab82612b76565b5f6109ab8261ffff16612c1d565b5f6109ab8269ffffffffffffffffffff16612ce0565b5f61148d8273ffffffffffffffffffffffffffffffffffffffff16612e1e565b547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1692915050565b6114c2612150565b610f815f612e66565b6114d36153bd565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff16610140840152835190810193849052919290916101608401917f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161162357505050505081525050905090565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff166101408401528351908101938490525f93610160840191907f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116117aa5750505050508152505090505f479050610ac48183610140015162ffffff168461016001515f6003811061180957611809615aca565b602002015173ffffffffffffffffffffffffffffffffffffffff169190612f1f565b5f61184b8273ffffffffffffffffffffffffffffffffffffffff16612e1e565b5462010000900467ffffffffffffffff1692915050565b5f6060805f805f60606118b47f000000000000000000000000000000000000000000000000000000000000000060606040519050604081016040525f815281601f8201525f8151602083010152919050565b6040805180820182525f8082527f0000000000000000000000000000000000000000000000000000000000000000601f83015281516020908301810182905283518281529081019093527f0f000000000000000000000000000000000000000000000000000000000000009b939a50909850469750309650945092509050565b61193c612150565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180547fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff166a0100000000000000000000179055565b61199a612150565b610ac473ffffffffffffffffffffffffffffffffffffffff831682612f94565b6119c2612150565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b604080516080810182525f8082529181018281527f0000000000000000000000000000000000000000000000000000000000000000601f830152815182016020018051605f840152839052805160609083018101939093526109ab565b5f80611a7261221a565b73ffffffffffffffffffffffffffffffffffffffff8181165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000008602090815260408083209389168352929052205490915083811015611b2b576040517ff8e06db200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015260248101829052604481018590526064015b60405180910390fd5b611b38828686840361213e565b506001949350505050565b5f610ef6611b4f61221a565b84846bffffffffffffffffffffffff1661234e565b5f6109ab8265ffffffffffff16612ff6565b5f611b9873ffffffffffffffffffffffffffffffffffffffff85168484613108565b949350505050565b83421115611bda576040517f1a15a3cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6001611c6d7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a611c0d836131ca565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810188905260e0016040516020818303038152906040528051906020012061327b565b604080515f8152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611cb8573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580611d3257508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b15611d69576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff9081165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000008602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000860209081526040808320938516835292905290812054610b2a565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152611e9e8273ffffffffffffffffffffffffffffffffffffffff16612e1e565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015292915050565b611f42612150565b73ffffffffffffffffffffffffffffffffffffffff8116611f91576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401611b22565b610f1181612e66565b5f80611fc2611fa761221a565b73ffffffffffffffffffffffffffffffffffffffff16612e1e565b80549091506a0100000000000000000000900469ffffffffffffffffffff165f036120ee577f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001805469ffffffffffffffffffff16905f61202183615b50565b825469ffffffffffffffffffff9182166101009390930a928302928202191691909117909155825491166a0100000000000000000000027fffffffffffffffffffffffff00000000000000000000ffffffffffffffffffff909116178155600181015473ffffffffffffffffffffffffffffffffffffffff166120ee576120a661221a565b6001820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790555b805460405184916a0100000000000000000000900469ffffffffffffffffffff169033907f8a4758d83bb38a638ad4e66c346744f4837441be2c52672af48d24bdafa75644905f90a45090919050565b61214b8383836001612922565b505050565b61215861221a565b73ffffffffffffffffffffffffffffffffffffffff166121ac7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610f81576121cf61221a565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401611b22565b5f610c006132dc565b5f6122438273ffffffffffffffffffffffffffffffffffffffff16613342565b806109ab57506109ab8273ffffffffffffffffffffffffffffffffffffffff16613400565b73ffffffffffffffffffffffffffffffffffffffff8381165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000860209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e745781811015612340576040517f192b9e4e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401611b22565b610e7484848484035f612922565b5f611b988484845f5b5f73ffffffffffffffffffffffffffffffffffffffff85166123a7576040517f4c14f64c0000000000000000000000000000000000000000000000000000000081525f6004820152602401611b22565b73ffffffffffffffffffffffffffffffffffffffff84166123f6576040517f9cfea5830000000000000000000000000000000000000000000000000000000081525f6004820152602401611b22565b73ffffffffffffffffffffffffffffffffffffffff8581165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000660205260408082208784168352912060018201547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff931661248f5761248d8873ffffffffffffffffffffffffffffffffffffffff166129e8565b505b600181015473ffffffffffffffffffffffffffffffffffffffff166124cf576124cd8773ffffffffffffffffffffffffffffffffffffffff166129e8565b505b60028301545f90819081906124fd908790879087908d906b010000000000000000000000900460ff166134be565b925092509250825f036125255761251685858b8b61471e565b60019650505050505050611b98565b6125398561253230612e1e565b858b61471e565b801561254857612548816148ab565b6125548585848b61471e565b5060019a9950505050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291515f928392908716916125fb9190615b78565b5f604051808303815f865af19150503d805f8114612634576040519150601f19603f3d011682016040523d82523d5f602084013e612639565b606091505b509150915061264882826151fd565b5050505050565b5f61266f8373ffffffffffffffffffffffffffffffffffffffff16612e1e565b80549091506bffffffffffffffffffffffff74010000000000000000000000000000000000000000909104811690831611156126a9575f80fd5b80546bffffffffffffffffffffffff7401000000000000000000000000000000000000000080830482168590039091160273ffffffffffffffffffffffffffffffffffffffff9091161781558161271d7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60010180546bffffffffffffffffffffffff740100000000000000000000000000000000000000008083048216949094031690920273ffffffffffffffffffffffffffffffffffffffff9283161790556040515f918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906127b69086906bffffffffffffffffffffffff91909116815260200190565b60405180910390a3505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000066020819052604082205461ffff81169061400081166180009091161715611b3857620100008410612818575f80fd5b5f85815260208390526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff8616179055506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b385762e4e1c185106128d4575f80fd5b82547fffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffff16609886901b74ffff0000000000000000000000000000000000000016178355506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff8481165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000008602090815260408083209387168352929052208290558015610e74578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516129da91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602052604081207f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001805491927f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff92612a879069ffffffffffffffffffff16615b50565b825469ffffffffffffffffffff9182166101009390930a838102908302199091161790925583546a01000000000000000000009182027fffffffffffffffffffffffff00000000000000000000ffffffffffffffffffff9091161780855560018501805473ffffffffffffffffffffffffffffffffffffffff9097167fffffffffffffffffffffffff000000000000000000000000000000000000000097881681179091559190049091165f9081526008909201602052604090912080549093161790915590565b610f11612b718273ffffffffffffffffffffffffffffffffffffffff16612e1e565b615258565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b3857602085015160408601516060870151821582158215171715612c00575f80fd5b600186019290925560028501556003840155506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b38576127118510612c94575f80fd5b82547fffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffff16608886901b72ffff000000000000000000000000000000000016178355506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b38578460401c61ffff8660301c1661ffff8760201c1661ffff8860101c1661ffff89168082848688010101016127108114612d81575f80fd5b5087545f5b6005811015612e0b5761ffff603860108302011b5f828015612dc75760018114612dcf5760028114612dd75760038114612ddf5760048114612de757612deb565b899150612deb565b889150612deb565b879150612deb565b869150612deb565b8591505b508181601085026038011b16821985161793505050600181019050612d86565b5088555050505050506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602052604081206109ab565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff8481169182179093556040517f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b604080515f80825260208201909252819073ffffffffffffffffffffffffffffffffffffffff86169084908690604051612f599190615b78565b5f60405180830381858888f193505050503d805f8114612634576040519150601f19603f3d011682016040523d82523d5f602084013e612639565b610ac481612fb78473ffffffffffffffffffffffffffffffffffffffff16612e1e565b9081547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00008116600160ff939093169290921b61ffff9182161816179055565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b38578460201c61ffff8660101c1661ffff87166103e98110156103e98310156103e985101517171561308e575f80fd5b85545f5b60038110156130f75761ffff600860108302011b5f8280156130c357600181146130cb57600281146130d3576130d7565b8791506130d7565b8691506130d7565b8591505b508181601085026008011b16821985161793505050600181019050613092565b508655505050506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000066020819052604082205461ffff811690614000811661800090911617613152575f80fd5b50600191505b82841015610b28575f61316b8686615265565b905061318c8173ffffffffffffffffffffffffffffffffffffffff166129e8565b5073ffffffffffffffffffffffffffffffffffffffff81165f9081526020839052604090206131be90600960016152d0565b50600190930192613158565b5f806131eb8373ffffffffffffffffffffffffffffffffffffffff16612e1e565b805490915067ffffffffffffffff6201000090910481161061322e5780547fffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff1681555b80547fffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff8116620100009182900467ffffffffffffffff908116600181019091169092021790915592915050565b5f613284610b31565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f30330361333c575f80368080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505036015173ffffffffffffffffffffffffffffffffffffffff16915061333f9050565b50335b90565b5f6109ab6133658373ffffffffffffffffffffffffffffffffffffffff16612e1e565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015261532b565b5f6109ab6134238373ffffffffffffffffffffffffffffffffffffffff16612e1e565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015261533d565b6040805160a081018252855461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff166060820152600185015473ffffffffffffffffffffffffffffffffffffffff1660808201525f90819081906135629061534f565b8061360657506040805160a081018252875461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff166060820152600187015473ffffffffffffffffffffffffffffffffffffffff1660808201526136069061534f565b8061360e5750835b1561362057505f915083905081614713565b604080516101808101825260038a8101805460ff8116845261010080820461ffff908116602087015263010000008304811686880152650100000000008304811660608088019190915267010000000000000084048216608088015269010000000000000000008404821660a08801526b0100000000000000000000008404821660c08801526d01000000000000000000000000008404821660e08801526f0100000000000000000000000000000084048216928701929092527101000000000000000000000000000000000083041661012086015273010000000000000000000000000000000000000090910462ffffff166101408501528451908101948590525f94919261016085019260048f01919082845b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116137355750505050508152505090505f61377f825160808082161491607f90911690565b5060028b01549091506a0100000000000000000000900460ff16613a42576139ed896040518060a00160405290815f82015f9054906101000a900461ffff1661ffff1661ffff1681526020015f820160029054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201600a9054906101000a900469ffffffffffffffffffff1669ffffffffffffffffffff1669ffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050896040518060a00160405290815f82015f9054906101000a900461ffff1661ffff1661ffff1681526020015f820160029054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201600a9054906101000a900469ffffffffffffffffffff1669ffffffffffffffffffff1669ffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050615361565b15613a1057506020015161271061ffff909116860204925050508083035f614713565b6040517f8a716db100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160a0810182528a5461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260018a015473ffffffffffffffffffffffffffffffffffffffff166080820152613ae09061537a565b80613b8457506040805160a081018252895461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff166060820152600189015473ffffffffffffffffffffffffffffffffffffffff166080820152613b849061537a565b15614559576040805160a0810182528a5461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260018a015473ffffffffffffffffffffffffffffffffffffffff166080820152613c279061537a565b15613fba5760208201516127109061ffff16880204945084870393506040518060e001604052805f151581526020018a6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001896001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001886bffffffffffffffffffffffff1681526020014367ffffffffffffffff168152602001866bffffffffffffffffffffffff168152602001856bffffffffffffffffffffffff168152508a600b015f015f8a6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151815f0160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160010160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506080820151816002015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160020160086101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060c08201518160020160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050508015613faf5787546a01a784379d99db4200000090613f479086907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16615af7565b1115613faf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f46616972204c696d6974204578636565646564000000000000000000000000006044820152606401611b22565b505f91506147139050565b6040805160a0810182528a5461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260018a015473ffffffffffffffffffffffffffffffffffffffff1660808201526140589061538c565b15614072576127106109c48802049450848703935061408a565b60408201516127109061ffff16880204945084870393505b5f82610120015161ffff16116140d157846140a430612e1e565b547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1601614121565b61012082015160018b0154612710916bffffffffffffffffffffffff74010000000000000000000000000000000000000000909204821661ffff919091160216046bffffffffffffffffffffffff165b6001808b015473ffffffffffffffffffffffffffffffffffffffff9081165f818152600b8f016020908152604091829020825160e081018452815460ff8116151582526101009004861692810192909252948501549384169181018290526bffffffffffffffffffffffff74010000000000000000000000000000000000000000948590048116606083015260029095015467ffffffffffffffff81166080830152680100000000000000008104861660a08301529390930490931660c08301529295509114801561420a57504367ffffffffffffffff16816080015167ffffffffffffffff16145b15614218576142188a61539e565b6040518060e001604052805f151581526020018b6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018a6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001896bffffffffffffffffffffffff1681526020014367ffffffffffffffff168152602001876bffffffffffffffffffffffff168152602001866bffffffffffffffffffffffff168152508b600b015f015f8c6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151815f0160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160010160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506080820151816002015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160020160086101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060c08201518160020160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050508115614551576a01a784379d99db42000000851115614551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f46616972204c696d6974204578636565646564000000000000000000000000006044820152606401611b22565b505050614713565b6040805160a0810182528a5461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260018a015473ffffffffffffffffffffffffffffffffffffffff1660808201526145f79061538c565b8061469b57506040805160a081018252895461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff166060820152600189015473ffffffffffffffffffffffffffffffffffffffff16608082015261469b9061538c565b156146b5576127106109c4880204945084870393506146cd565b60608201516127109061ffff16880204945084870393505b8015613faf5787546a01a784379d99db4200000090613f479086907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16615af7565b955095509592505050565b835482906bffffffffffffffffffffffff74010000000000000000000000000000000000000000909104811690821611156147d957600185015485546040517fdb42144d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921660048301527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff908116602483015282166044820152606401611b22565b84546bffffffffffffffffffffffff7401000000000000000000000000000000000000000080830482168490038216810273ffffffffffffffffffffffffffffffffffffffff9384161788558654818104831685019092160291161784558161264857600184810154908601546040516bffffffffffffffffffffffff8416815273ffffffffffffffffffffffffffffffffffffffff92831692909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180546b0100000000000000000000007fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff909116811790915560408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261ffff6101008083048216602086015263010000008304821685870152650100000000008304821660608087019190915267010000000000000084048316608087015269010000000000000000008404831660a0870152968304821660c08601526d01000000000000000000000000008304821660e08601526f0100000000000000000000000000000083048216908501527101000000000000000000000000000000000082041661012084015262ffffff730100000000000000000000000000000000000000909104166101408301528251938401928390525f93919290916101608401917f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311614a465750505050508152505090505f600267ffffffffffffffff811115614a9657614a966155f5565b604051908082528060200260200182016040528015614abf578160200160208202803683370190505b50905030815f81518110614ad557614ad5615aca565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b9c9190615b35565b81600181518110614baf57614baf615aca565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101525f614bde30612e1e565b546bffffffffffffffffffffffff74010000000000000000000000000000000000000000909104811691505f9085168211614c195784614c1b565b815b6101008501519091505f906127109061ffff1615614ca25760028161ffff1687610100015161ffff1685026bffffffffffffffffffffffff1681614c6157614c61615b93565b046bffffffffffffffffffffffff1681614c7d57614c7d615b93565b0491508183039250600286610100015161ffff1681614c9e57614c9e615b93565b0490035b6040517f791ac947000000000000000000000000000000000000000000000000000000008152479073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790614d1e9087905f908b9030904290600401615bc0565b5f604051808303815f87803b158015614d35575f80fd5b505af1158015614d47573d5f803e3d5ffd5b505050505f8082470390505f805f805f8d60e0015161ffff161115614d95578761ffff168d60e0015161ffff1686026bffffffffffffffffffffffff1681614d9157614d91615b93565b0493505b60c08d015161ffff1615614dd2578761ffff168d60c0015161ffff1686026bffffffffffffffffffffffff1681614dce57614dce615b93565b0492505b60a08d015161ffff1615614e0f578761ffff168d60a0015161ffff1686026bffffffffffffffffffffffff1681614e0b57614e0b615b93565b0491505b60808d015161ffff1615614e4c578761ffff168d6080015161ffff1686026bffffffffffffffffffffffff1681614e4857614e48615b93565b0490505b6bffffffffffffffffffffffff841615614e6a57614e6a308561264f565b6bffffffffffffffffffffffff811615614f01576101608d0151516101408e015160405173ffffffffffffffffffffffffffffffffffffffff9092169162ffffff909116906bffffffffffffffffffffffff8416905f818181858888f193505050503d805f8114614ef6576040519150601f19603f3d011682016040523d82523d5f602084013e614efb565b606091505b50909650505b6bffffffffffffffffffffffff821615614f9c576101608d01516001602002015173ffffffffffffffffffffffffffffffffffffffff16826bffffffffffffffffffffffff168e610140015162ffffff16906040515f60405180830381858888f193505050503d805f8114614f91576040519150601f19603f3d011682016040523d82523d5f602084013e614f96565b606091505b50909650505b6bffffffffffffffffffffffff831615615037576101608d01516002602002015173ffffffffffffffffffffffffffffffffffffffff16836bffffffffffffffffffffffff168e610140015162ffffff16906040515f60405180830381858888f193505050503d805f811461502c576040519150601f19603f3d011682016040523d82523d5f602084013e615031565b606091505b50909650505b6bffffffffffffffffffffffff891615615185575f60028961ffff168f610100015161ffff1688026bffffffffffffffffffffffff168161507a5761507a615b93565b046bffffffffffffffffffffffff168161509657615096615b93565b6040517ff305d71900000000000000000000000000000000000000000000000000000000815230600482018190526bffffffffffffffffffffffff8e811660248401525f60448401819052606484015260848301919091524260a483015292909104925073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163f305d719919084169060c40160606040518083038185885af115801561515b573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906151809190615b0a565b505050505b505050505050505050505050505f6151ba7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60020180549115156b010000000000000000000000027fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff90921691909117905550565b8180156152225750805115806152225750808060200190518101906152229190615c59565b610ac4576040517f2b96f51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f1181600a60016152d0565b5f607f821161529057825f526094600b5360d6600a5381821560071b17602053506017600a206109ab565b60085b82811c156152a357600801615293565b60031c828152600884901b5f5260808101601f536094600a538060d6016009536017016009209392505050565b806152e9578254600160ff84161b191661ffff166152f8565b825461ffff16600160ff84161b175b83547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff91909116179092555050565b80515f90600d1c6001908116146109ab565b80515f90600e1c6001908116146109ab565b80515f90600b1c6001908116146109ab565b5f61536b836153ab565b80610b2a5750610b2a826153ab565b80515f90600a1c6001908116146109ab565b80515f9060071c6001908116146109ab565b610f1181600760016152d0565b80515f9060091c6001908116146109ab565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101615422615427565b905290565b60405180606001604052806003906020820280368337509192915050565b5f5b8381101561545f578181015183820152602001615447565b50505f910152565b5f815180845261547e816020860160208601615445565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f610b2a6020830184615467565b73ffffffffffffffffffffffffffffffffffffffff81168114610f11575f80fd5b5f80604083850312156154f4575f80fd5b82356154ff816154c2565b946020939093013593505050565b8015158114610f11575f80fd5b5f6020828403121561552a575f80fd5b8135610b2a8161550d565b5f805f60608486031215615547575f80fd5b8335615552816154c2565b92506020840135615562816154c2565b929592945050506040919091013590565b5f60208284031215615583575f80fd5b5035919050565b803561ffff8116811461559b575f80fd5b919050565b5f80604083850312156155b1575f80fd5b82356155bc816154c2565b91506155ca6020840161558a565b90509250929050565b5f602082840312156155e3575f80fd5b813562ffffff81168114610b2a575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215615632575f80fd5b813567ffffffffffffffff80821115615649575f80fd5b818401915084601f83011261565c575f80fd5b81358181111561566e5761566e6155f5565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156156b4576156b46155f5565b816040528281528760208487010111156156cc575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f602082840312156156fb575f80fd5b610b2a8261558a565b5f60208284031215615714575f80fd5b813569ffffffffffffffffffff81168114610b2a575f80fd5b5f6020828403121561573d575f80fd5b8135610b2a816154c2565b805f5b6003811015610e7457815173ffffffffffffffffffffffffffffffffffffffff1684526020938401939091019060010161574b565b815160ff1681526101c0810160208301516157a1602084018261ffff169052565b5060408301516157b7604084018261ffff169052565b5060608301516157cd606084018261ffff169052565b5060808301516157e3608084018261ffff169052565b5060a08301516157f960a084018261ffff169052565b5060c083015161580f60c084018261ffff169052565b5060e083015161582560e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015162ffffff16908301526101608084015161586b82850182615748565b505092915050565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e060208401526158af60e084018a615467565b83810360408501526158c1818a615467565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b8181101561592157835183529284019291840191600101615905565b50909c9b505050505050505050505050565b803560ff8116811461559b575f80fd5b5f8060408385031215615954575f80fd5b823561595f816154c2565b91506155ca60208401615933565b5f6020828403121561597d575f80fd5b813565ffffffffffff81168114610b2a575f80fd5b5f805f606084860312156159a4575f80fd5b83356159af816154c2565b95602085013595506040909401359392505050565b5f805f805f805f60e0888a0312156159da575f80fd5b87356159e5816154c2565b965060208801356159f5816154c2565b95506040880135945060608801359350615a1160808901615933565b925060a0880135915060c0880135905092959891949750929550565b5f8060408385031215615a3e575f80fd5b8235615a49816154c2565b91506020830135615a59816154c2565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b61ffff828116828216039080821115615aac57615aac615a64565b5092915050565b5f60208284031215615ac3575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b808201808211156109ab576109ab615a64565b5f805f60608486031215615b1c575f80fd5b8351925060208401519150604084015190509250925092565b5f60208284031215615b45575f80fd5b8151610b2a816154c2565b5f69ffffffffffffffffffff808316818103615b6e57615b6e615a64565b6001019392505050565b5f8251615b89818460208701615445565b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f60a082016bffffffffffffffffffffffff88168352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015615c2b57845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101615bf9565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b5f60208284031215615c69575f80fd5b8151610b2a8161550d56fea26469706673582212209f3438133a31fabcd186600528d9fee7dfd0c26db84406c2f812a7f9746113b964736f6c634300081800330f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000060f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff000000000000000000000000e4249324c0b2d4247477cd35cf3a3f73abdf8d570000000000000000000000000011223317890359f6c2d832045cfd11b2ac5e440000000000000000000000008800ee330033ff9559d466205f83b46d0275da53

Deployed Bytecode

0x6080604052600436106102c4575f3560e01c806370a082311161017057806395d89b41116100d1578063cda4c40811610087578063ea5eda3211610062578063ea5eda321461093e578063f2fde38b1461095d578063ff91e66b1461097c575f80fd5b8063cda4c408146108e1578063d505accf14610900578063dd62ed3e1461091f575f80fd5b8063a8aa1b31116100b7578063a8aa1b311461085a578063a9059cbb146108a3578063c3342e56146108c2575f80fd5b806395d89b4114610827578063a457c2d71461083b575f80fd5b806384b0196e116101265780638cd92b0a1161010c5780638cd92b0a146107ab5780638da5cb5b146107ca57806391c01b4514610813575f80fd5b806384b0196e146107705780638a8c523c14610797575f80fd5b806372621eb51161015657806372621eb51461071c5780637ae33d5f1461073d5780637ecebe0014610751575f80fd5b806370a08231146106e9578063715018a614610708575f80fd5b8063387205ee116102255780634c2babef116101db5780636cb07772116101b65780636cb077721461068c5780636d84249b146106ab5780636e2ad758146106ca575f80fd5b80634c2babef1461065157806350abfffd146106705780636257840f14610684575f80fd5b806342966c681161020b57806342966c681461058057806347ee6a071461059f5780634a97c9c014610632575f80fd5b8063387205ee146105425780633950935114610561575f80fd5b8063307aebc91161027a578063313ce56711610260578063313ce5671461049157806332fe7b26146104d65780633644e5151461052e575f80fd5b8063307aebc91461041a57806330adf81f1461045e575f80fd5b806317ede0de116102aa57806317ede0de1461037757806318160ddd1461039857806323b872dd146103fb575f80fd5b806306fdde03146102cf578063095ea7b314610348575f80fd5b366102cb57005b5f80fd5b3480156102da575f80fd5b50604080516080810182525f8082529181018281527f0e44522e5369636b72657370656374045349434b000000000000000000000000601f830152815182016020018051605f84015283905251606090820101919091525b60405161033f91906154b0565b60405180910390f35b348015610353575f80fd5b506103676103623660046154e3565b61099b565b604051901515815260200161033f565b348015610382575f80fd5b5061039661039136600461551a565b6109b1565b005b3480156103a3575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000000547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff165b60405190815260200161033f565b348015610406575f80fd5b50610367610415366004615535565b610ac8565b348015610425575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001546a0100000000000000000000900460ff16610367565b348015610469575f80fd5b506103ed7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561049c575f80fd5b506104c47f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff909116815260200161033f565b3480156104e1575f80fd5b506105097f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161033f565b348015610539575f80fd5b506103ed610b31565b34801561054d575f80fd5b5061039661055c3660046154e3565b610c2a565b34801561056c575f80fd5b5061036761057b3660046154e3565b610e7a565b34801561058b575f80fd5b5061039661059a366004615573565b610f00565b3480156105aa575f80fd5b506105b3610f14565b60405161033f91905f60a08201905061ffff835116825267ffffffffffffffff602084015116602083015269ffffffffffffffffffff60408401511660408301526bffffffffffffffffffffffff606084015116606083015273ffffffffffffffffffffffffffffffffffffffff608084015116608083015292915050565b34801561063d575f80fd5b5061036761064c3660046155a0565b610f47565b34801561065c575f80fd5b5061036761066b3660046155d3565b610f68565b34801561067b575f80fd5b50610396610f77565b610396610f83565b348015610697575f80fd5b506103676106a6366004615622565b61143f565b3480156106b6575f80fd5b506103676106c53660046156eb565b611449565b3480156106d5575f80fd5b506103676106e4366004615704565b611457565b3480156106f4575f80fd5b506103ed61070336600461572d565b61146d565b348015610713575f80fd5b506103966114ba565b348015610727575f80fd5b506107306114cb565b60405161033f9190615780565b348015610748575f80fd5b5061039661165b565b34801561075c575f80fd5b506103ed61076b36600461572d565b61182b565b34801561077b575f80fd5b50610784611862565b60405161033f9796959493929190615873565b3480156107a2575f80fd5b50610396611934565b3480156107b6575f80fd5b506103966107c5366004615943565b611992565b3480156107d5575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000005473ffffffffffffffffffffffffffffffffffffffff16610509565b34801561081e575f80fd5b506103966119ba565b348015610832575f80fd5b50610332611a0b565b348015610846575f80fd5b506103676108553660046154e3565b611a68565b348015610865575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff5473ffffffffffffffffffffffffffffffffffffffff16610509565b3480156108ae575f80fd5b506103676108bd3660046154e3565b611b43565b3480156108cd575f80fd5b506103676108dc36600461596d565b611b64565b3480156108ec575f80fd5b506103676108fb366004615992565b611b76565b34801561090b575f80fd5b5061039661091a3660046159c4565b611ba0565b34801561092a575f80fd5b506103ed610939366004615a2d565b611dfd565b348015610949575f80fd5b506105b361095836600461572d565b611e55565b348015610968575f80fd5b5061039661097736600461572d565b611f3a565b348015610987575f80fd5b506103ed610996366004615573565b611f9a565b5f6109a733848461213e565b5060015b92915050565b6109b9612150565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000028115610a125780547fffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ff1666012c012c012c0017905550565b80546101f4908290600190610a31908490610100900461ffff16615a91565b92506101000a81548161ffff021916908361ffff1602179055506101f4815f0160038282829054906101000a900461ffff16610a6d9190615a91565b92506101000a81548161ffff021916908361ffff1602179055506101f4815f0160058282829054906101000a900461ffff16610aa99190615a91565b92506101000a81548161ffff021916908361ffff1602179055505b5050565b5f80610ad261221a565b9050610add81612223565b610b0d57610aec858285612268565b610b058585856bffffffffffffffffffffffff1661234e565b915050610b2a565b610b058585856bffffffffffffffffffffffff166001612357565b505b9392505050565b5f7f00000000000000000000000000000000000000000000000000000000000000014614610c0557610c00604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f5cd7a22db506c1258aac682a09858bcfe0cb5f915deca541c8c546a3f7d91072918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b905090565b507fef696112c60393a038507604a4508d891a76f4091e673010769918f160bbda8b90565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff166101408401528351908101938490525f93610160840191907f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610d795750505050508152505090505f825f14610dbc5782610e48565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015610e24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e489190615ab3565b61016083015151909150610e749073ffffffffffffffffffffffffffffffffffffffff86169083612565565b50505050565b5f80610e8461221a565b9050610ef6818585610ee7858973ffffffffffffffffffffffffffffffffffffffff9182165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000086020908152604080832093909416825291909152205490565b610ef19190615af7565b61213e565b5060019392505050565b610f11610f0b61221a565b8261264f565b50565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152610c0033611e55565b5f610b2a73ffffffffffffffffffffffffffffffffffffffff8416836127c3565b5f6109ab8262ffffff1661285c565b610f81305f610c2a565b565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180547fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff166b010000000000000000000000179055610fe0612150565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff5f61100b3061146d565b9050611059307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612922565b61108530307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612922565b6040517ff305d7190000000000000000000000000000000000000000000000000000000081523060048201819052602482018390525f60448301819052606483015260848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff169063f305d71990349060c40160606040518083038185885af1158015611131573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906111569190615b0a565b5050507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e69190615b35565b73ffffffffffffffffffffffffffffffffffffffff1663e6a43905307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561126b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128f9190615b35565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604401602060405180830381865afa1580156112fd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113219190615b35565b82547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff91909116908117835561136c906129e8565b50815461138e9073ffffffffffffffffffffffffffffffffffffffff16612b4f565b81546113d390309073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612922565b50505f6113fd7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60020180549115156b010000000000000000000000027fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff909216919091179055565b5f6109ab82612b76565b5f6109ab8261ffff16612c1d565b5f6109ab8269ffffffffffffffffffff16612ce0565b5f61148d8273ffffffffffffffffffffffffffffffffffffffff16612e1e565b547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1692915050565b6114c2612150565b610f815f612e66565b6114d36153bd565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff16610140840152835190810193849052919290916101608401917f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161162357505050505081525050905090565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff166101408401528351908101938490525f93610160840191907f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116117aa5750505050508152505090505f479050610ac48183610140015162ffffff168461016001515f6003811061180957611809615aca565b602002015173ffffffffffffffffffffffffffffffffffffffff169190612f1f565b5f61184b8273ffffffffffffffffffffffffffffffffffffffff16612e1e565b5462010000900467ffffffffffffffff1692915050565b5f6060805f805f60606118b47f0e44522e5369636b72657370656374000000000000000000000000000000000060606040519050604081016040525f815281601f8201525f8151602083010152919050565b6040805180820182525f8082527f0131000000000000000000000000000000000000000000000000000000000000601f83015281516020908301810182905283518281529081019093527f0f000000000000000000000000000000000000000000000000000000000000009b939a50909850469750309650945092509050565b61193c612150565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180547fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff166a0100000000000000000000179055565b61199a612150565b610ac473ffffffffffffffffffffffffffffffffffffffff831682612f94565b6119c2612150565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b604080516080810182525f8082529181018281527f0e44522e5369636b72657370656374045349434b000000000000000000000000601f830152815182016020018051605f840152839052805160609083018101939093526109ab565b5f80611a7261221a565b73ffffffffffffffffffffffffffffffffffffffff8181165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000008602090815260408083209389168352929052205490915083811015611b2b576040517ff8e06db200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015260248101829052604481018590526064015b60405180910390fd5b611b38828686840361213e565b506001949350505050565b5f610ef6611b4f61221a565b84846bffffffffffffffffffffffff1661234e565b5f6109ab8265ffffffffffff16612ff6565b5f611b9873ffffffffffffffffffffffffffffffffffffffff85168484613108565b949350505050565b83421115611bda576040517f1a15a3cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6001611c6d7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a611c0d836131ca565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810188905260e0016040516020818303038152906040528051906020012061327b565b604080515f8152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611cb8573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580611d3257508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b15611d69576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff9081165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000008602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000860209081526040808320938516835292905290812054610b2a565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152611e9e8273ffffffffffffffffffffffffffffffffffffffff16612e1e565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015292915050565b611f42612150565b73ffffffffffffffffffffffffffffffffffffffff8116611f91576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401611b22565b610f1181612e66565b5f80611fc2611fa761221a565b73ffffffffffffffffffffffffffffffffffffffff16612e1e565b80549091506a0100000000000000000000900469ffffffffffffffffffff165f036120ee577f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001805469ffffffffffffffffffff16905f61202183615b50565b825469ffffffffffffffffffff9182166101009390930a928302928202191691909117909155825491166a0100000000000000000000027fffffffffffffffffffffffff00000000000000000000ffffffffffffffffffff909116178155600181015473ffffffffffffffffffffffffffffffffffffffff166120ee576120a661221a565b6001820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790555b805460405184916a0100000000000000000000900469ffffffffffffffffffff169033907f8a4758d83bb38a638ad4e66c346744f4837441be2c52672af48d24bdafa75644905f90a45090919050565b61214b8383836001612922565b505050565b61215861221a565b73ffffffffffffffffffffffffffffffffffffffff166121ac7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610f81576121cf61221a565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401611b22565b5f610c006132dc565b5f6122438273ffffffffffffffffffffffffffffffffffffffff16613342565b806109ab57506109ab8273ffffffffffffffffffffffffffffffffffffffff16613400565b73ffffffffffffffffffffffffffffffffffffffff8381165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000860209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e745781811015612340576040517f192b9e4e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401611b22565b610e7484848484035f612922565b5f611b988484845f5b5f73ffffffffffffffffffffffffffffffffffffffff85166123a7576040517f4c14f64c0000000000000000000000000000000000000000000000000000000081525f6004820152602401611b22565b73ffffffffffffffffffffffffffffffffffffffff84166123f6576040517f9cfea5830000000000000000000000000000000000000000000000000000000081525f6004820152602401611b22565b73ffffffffffffffffffffffffffffffffffffffff8581165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000660205260408082208784168352912060018201547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff931661248f5761248d8873ffffffffffffffffffffffffffffffffffffffff166129e8565b505b600181015473ffffffffffffffffffffffffffffffffffffffff166124cf576124cd8773ffffffffffffffffffffffffffffffffffffffff166129e8565b505b60028301545f90819081906124fd908790879087908d906b010000000000000000000000900460ff166134be565b925092509250825f036125255761251685858b8b61471e565b60019650505050505050611b98565b6125398561253230612e1e565b858b61471e565b801561254857612548816148ab565b6125548585848b61471e565b5060019a9950505050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291515f928392908716916125fb9190615b78565b5f604051808303815f865af19150503d805f8114612634576040519150601f19603f3d011682016040523d82523d5f602084013e612639565b606091505b509150915061264882826151fd565b5050505050565b5f61266f8373ffffffffffffffffffffffffffffffffffffffff16612e1e565b80549091506bffffffffffffffffffffffff74010000000000000000000000000000000000000000909104811690831611156126a9575f80fd5b80546bffffffffffffffffffffffff7401000000000000000000000000000000000000000080830482168590039091160273ffffffffffffffffffffffffffffffffffffffff9091161781558161271d7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60010180546bffffffffffffffffffffffff740100000000000000000000000000000000000000008083048216949094031690920273ffffffffffffffffffffffffffffffffffffffff9283161790556040515f918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906127b69086906bffffffffffffffffffffffff91909116815260200190565b60405180910390a3505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000066020819052604082205461ffff81169061400081166180009091161715611b3857620100008410612818575f80fd5b5f85815260208390526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff8616179055506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b385762e4e1c185106128d4575f80fd5b82547fffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffff16609886901b74ffff0000000000000000000000000000000000000016178355506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff8481165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000008602090815260408083209387168352929052208290558015610e74578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516129da91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602052604081207f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001805491927f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff92612a879069ffffffffffffffffffff16615b50565b825469ffffffffffffffffffff9182166101009390930a838102908302199091161790925583546a01000000000000000000009182027fffffffffffffffffffffffff00000000000000000000ffffffffffffffffffff9091161780855560018501805473ffffffffffffffffffffffffffffffffffffffff9097167fffffffffffffffffffffffff000000000000000000000000000000000000000097881681179091559190049091165f9081526008909201602052604090912080549093161790915590565b610f11612b718273ffffffffffffffffffffffffffffffffffffffff16612e1e565b615258565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b3857602085015160408601516060870151821582158215171715612c00575f80fd5b600186019290925560028501556003840155506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b38576127118510612c94575f80fd5b82547fffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffff16608886901b72ffff000000000000000000000000000000000016178355506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b38578460401c61ffff8660301c1661ffff8760201c1661ffff8860101c1661ffff89168082848688010101016127108114612d81575f80fd5b5087545f5b6005811015612e0b5761ffff603860108302011b5f828015612dc75760018114612dcf5760028114612dd75760038114612ddf5760048114612de757612deb565b899150612deb565b889150612deb565b879150612deb565b869150612deb565b8591505b508181601085026038011b16821985161793505050600181019050612d86565b5088555050505050506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602052604081206109ab565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff8481169182179093556040517f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b604080515f80825260208201909252819073ffffffffffffffffffffffffffffffffffffffff86169084908690604051612f599190615b78565b5f60405180830381858888f193505050503d805f8114612634576040519150601f19603f3d011682016040523d82523d5f602084013e612639565b610ac481612fb78473ffffffffffffffffffffffffffffffffffffffff16612e1e565b9081547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00008116600160ff939093169290921b61ffff9182161816179055565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b38578460201c61ffff8660101c1661ffff87166103e98110156103e98310156103e985101517171561308e575f80fd5b85545f5b60038110156130f75761ffff600860108302011b5f8280156130c357600181146130cb57600281146130d3576130d7565b8791506130d7565b8691506130d7565b8591505b508181601085026008011b16821985161793505050600181019050613092565b508655505050506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000066020819052604082205461ffff811690614000811661800090911617613152575f80fd5b50600191505b82841015610b28575f61316b8686615265565b905061318c8173ffffffffffffffffffffffffffffffffffffffff166129e8565b5073ffffffffffffffffffffffffffffffffffffffff81165f9081526020839052604090206131be90600960016152d0565b50600190930192613158565b5f806131eb8373ffffffffffffffffffffffffffffffffffffffff16612e1e565b805490915067ffffffffffffffff6201000090910481161061322e5780547fffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff1681555b80547fffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff8116620100009182900467ffffffffffffffff908116600181019091169092021790915592915050565b5f613284610b31565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f30330361333c575f80368080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505036015173ffffffffffffffffffffffffffffffffffffffff16915061333f9050565b50335b90565b5f6109ab6133658373ffffffffffffffffffffffffffffffffffffffff16612e1e565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015261532b565b5f6109ab6134238373ffffffffffffffffffffffffffffffffffffffff16612e1e565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015261533d565b6040805160a081018252855461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff166060820152600185015473ffffffffffffffffffffffffffffffffffffffff1660808201525f90819081906135629061534f565b8061360657506040805160a081018252875461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff166060820152600187015473ffffffffffffffffffffffffffffffffffffffff1660808201526136069061534f565b8061360e5750835b1561362057505f915083905081614713565b604080516101808101825260038a8101805460ff8116845261010080820461ffff908116602087015263010000008304811686880152650100000000008304811660608088019190915267010000000000000084048216608088015269010000000000000000008404821660a08801526b0100000000000000000000008404821660c08801526d01000000000000000000000000008404821660e08801526f0100000000000000000000000000000084048216928701929092527101000000000000000000000000000000000083041661012086015273010000000000000000000000000000000000000090910462ffffff166101408501528451908101948590525f94919261016085019260048f01919082845b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116137355750505050508152505090505f61377f825160808082161491607f90911690565b5060028b01549091506a0100000000000000000000900460ff16613a42576139ed896040518060a00160405290815f82015f9054906101000a900461ffff1661ffff1661ffff1681526020015f820160029054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201600a9054906101000a900469ffffffffffffffffffff1669ffffffffffffffffffff1669ffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050896040518060a00160405290815f82015f9054906101000a900461ffff1661ffff1661ffff1681526020015f820160029054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201600a9054906101000a900469ffffffffffffffffffff1669ffffffffffffffffffff1669ffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050615361565b15613a1057506020015161271061ffff909116860204925050508083035f614713565b6040517f8a716db100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160a0810182528a5461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260018a015473ffffffffffffffffffffffffffffffffffffffff166080820152613ae09061537a565b80613b8457506040805160a081018252895461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff166060820152600189015473ffffffffffffffffffffffffffffffffffffffff166080820152613b849061537a565b15614559576040805160a0810182528a5461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260018a015473ffffffffffffffffffffffffffffffffffffffff166080820152613c279061537a565b15613fba5760208201516127109061ffff16880204945084870393506040518060e001604052805f151581526020018a6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001896001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001886bffffffffffffffffffffffff1681526020014367ffffffffffffffff168152602001866bffffffffffffffffffffffff168152602001856bffffffffffffffffffffffff168152508a600b015f015f8a6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151815f0160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160010160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506080820151816002015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160020160086101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060c08201518160020160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050508015613faf5787546a01a784379d99db4200000090613f479086907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16615af7565b1115613faf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f46616972204c696d6974204578636565646564000000000000000000000000006044820152606401611b22565b505f91506147139050565b6040805160a0810182528a5461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260018a015473ffffffffffffffffffffffffffffffffffffffff1660808201526140589061538c565b15614072576127106109c48802049450848703935061408a565b60408201516127109061ffff16880204945084870393505b5f82610120015161ffff16116140d157846140a430612e1e565b547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1601614121565b61012082015160018b0154612710916bffffffffffffffffffffffff74010000000000000000000000000000000000000000909204821661ffff919091160216046bffffffffffffffffffffffff165b6001808b015473ffffffffffffffffffffffffffffffffffffffff9081165f818152600b8f016020908152604091829020825160e081018452815460ff8116151582526101009004861692810192909252948501549384169181018290526bffffffffffffffffffffffff74010000000000000000000000000000000000000000948590048116606083015260029095015467ffffffffffffffff81166080830152680100000000000000008104861660a08301529390930490931660c08301529295509114801561420a57504367ffffffffffffffff16816080015167ffffffffffffffff16145b15614218576142188a61539e565b6040518060e001604052805f151581526020018b6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018a6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001896bffffffffffffffffffffffff1681526020014367ffffffffffffffff168152602001876bffffffffffffffffffffffff168152602001866bffffffffffffffffffffffff168152508b600b015f015f8c6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151815f0160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160010160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506080820151816002015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160020160086101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060c08201518160020160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050508115614551576a01a784379d99db42000000851115614551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f46616972204c696d6974204578636565646564000000000000000000000000006044820152606401611b22565b505050614713565b6040805160a0810182528a5461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260018a015473ffffffffffffffffffffffffffffffffffffffff1660808201526145f79061538c565b8061469b57506040805160a081018252895461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff166060820152600189015473ffffffffffffffffffffffffffffffffffffffff16608082015261469b9061538c565b156146b5576127106109c4880204945084870393506146cd565b60608201516127109061ffff16880204945084870393505b8015613faf5787546a01a784379d99db4200000090613f479086907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16615af7565b955095509592505050565b835482906bffffffffffffffffffffffff74010000000000000000000000000000000000000000909104811690821611156147d957600185015485546040517fdb42144d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921660048301527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff908116602483015282166044820152606401611b22565b84546bffffffffffffffffffffffff7401000000000000000000000000000000000000000080830482168490038216810273ffffffffffffffffffffffffffffffffffffffff9384161788558654818104831685019092160291161784558161264857600184810154908601546040516bffffffffffffffffffffffff8416815273ffffffffffffffffffffffffffffffffffffffff92831692909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180546b0100000000000000000000007fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff909116811790915560408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261ffff6101008083048216602086015263010000008304821685870152650100000000008304821660608087019190915267010000000000000084048316608087015269010000000000000000008404831660a0870152968304821660c08601526d01000000000000000000000000008304821660e08601526f0100000000000000000000000000000083048216908501527101000000000000000000000000000000000082041661012084015262ffffff730100000000000000000000000000000000000000909104166101408301528251938401928390525f93919290916101608401917f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311614a465750505050508152505090505f600267ffffffffffffffff811115614a9657614a966155f5565b604051908082528060200260200182016040528015614abf578160200160208202803683370190505b50905030815f81518110614ad557614ad5615aca565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b9c9190615b35565b81600181518110614baf57614baf615aca565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101525f614bde30612e1e565b546bffffffffffffffffffffffff74010000000000000000000000000000000000000000909104811691505f9085168211614c195784614c1b565b815b6101008501519091505f906127109061ffff1615614ca25760028161ffff1687610100015161ffff1685026bffffffffffffffffffffffff1681614c6157614c61615b93565b046bffffffffffffffffffffffff1681614c7d57614c7d615b93565b0491508183039250600286610100015161ffff1681614c9e57614c9e615b93565b0490035b6040517f791ac947000000000000000000000000000000000000000000000000000000008152479073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790614d1e9087905f908b9030904290600401615bc0565b5f604051808303815f87803b158015614d35575f80fd5b505af1158015614d47573d5f803e3d5ffd5b505050505f8082470390505f805f805f8d60e0015161ffff161115614d95578761ffff168d60e0015161ffff1686026bffffffffffffffffffffffff1681614d9157614d91615b93565b0493505b60c08d015161ffff1615614dd2578761ffff168d60c0015161ffff1686026bffffffffffffffffffffffff1681614dce57614dce615b93565b0492505b60a08d015161ffff1615614e0f578761ffff168d60a0015161ffff1686026bffffffffffffffffffffffff1681614e0b57614e0b615b93565b0491505b60808d015161ffff1615614e4c578761ffff168d6080015161ffff1686026bffffffffffffffffffffffff1681614e4857614e48615b93565b0490505b6bffffffffffffffffffffffff841615614e6a57614e6a308561264f565b6bffffffffffffffffffffffff811615614f01576101608d0151516101408e015160405173ffffffffffffffffffffffffffffffffffffffff9092169162ffffff909116906bffffffffffffffffffffffff8416905f818181858888f193505050503d805f8114614ef6576040519150601f19603f3d011682016040523d82523d5f602084013e614efb565b606091505b50909650505b6bffffffffffffffffffffffff821615614f9c576101608d01516001602002015173ffffffffffffffffffffffffffffffffffffffff16826bffffffffffffffffffffffff168e610140015162ffffff16906040515f60405180830381858888f193505050503d805f8114614f91576040519150601f19603f3d011682016040523d82523d5f602084013e614f96565b606091505b50909650505b6bffffffffffffffffffffffff831615615037576101608d01516002602002015173ffffffffffffffffffffffffffffffffffffffff16836bffffffffffffffffffffffff168e610140015162ffffff16906040515f60405180830381858888f193505050503d805f811461502c576040519150601f19603f3d011682016040523d82523d5f602084013e615031565b606091505b50909650505b6bffffffffffffffffffffffff891615615185575f60028961ffff168f610100015161ffff1688026bffffffffffffffffffffffff168161507a5761507a615b93565b046bffffffffffffffffffffffff168161509657615096615b93565b6040517ff305d71900000000000000000000000000000000000000000000000000000000815230600482018190526bffffffffffffffffffffffff8e811660248401525f60448401819052606484015260848301919091524260a483015292909104925073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169163f305d719919084169060c40160606040518083038185885af115801561515b573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906151809190615b0a565b505050505b505050505050505050505050505f6151ba7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60020180549115156b010000000000000000000000027fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff90921691909117905550565b8180156152225750805115806152225750808060200190518101906152229190615c59565b610ac4576040517f2b96f51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f1181600a60016152d0565b5f607f821161529057825f526094600b5360d6600a5381821560071b17602053506017600a206109ab565b60085b82811c156152a357600801615293565b60031c828152600884901b5f5260808101601f536094600a538060d6016009536017016009209392505050565b806152e9578254600160ff84161b191661ffff166152f8565b825461ffff16600160ff84161b175b83547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff91909116179092555050565b80515f90600d1c6001908116146109ab565b80515f90600e1c6001908116146109ab565b80515f90600b1c6001908116146109ab565b5f61536b836153ab565b80610b2a5750610b2a826153ab565b80515f90600a1c6001908116146109ab565b80515f9060071c6001908116146109ab565b610f1181600760016152d0565b80515f9060091c6001908116146109ab565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101615422615427565b905290565b60405180606001604052806003906020820280368337509192915050565b5f5b8381101561545f578181015183820152602001615447565b50505f910152565b5f815180845261547e816020860160208601615445565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f610b2a6020830184615467565b73ffffffffffffffffffffffffffffffffffffffff81168114610f11575f80fd5b5f80604083850312156154f4575f80fd5b82356154ff816154c2565b946020939093013593505050565b8015158114610f11575f80fd5b5f6020828403121561552a575f80fd5b8135610b2a8161550d565b5f805f60608486031215615547575f80fd5b8335615552816154c2565b92506020840135615562816154c2565b929592945050506040919091013590565b5f60208284031215615583575f80fd5b5035919050565b803561ffff8116811461559b575f80fd5b919050565b5f80604083850312156155b1575f80fd5b82356155bc816154c2565b91506155ca6020840161558a565b90509250929050565b5f602082840312156155e3575f80fd5b813562ffffff81168114610b2a575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215615632575f80fd5b813567ffffffffffffffff80821115615649575f80fd5b818401915084601f83011261565c575f80fd5b81358181111561566e5761566e6155f5565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156156b4576156b46155f5565b816040528281528760208487010111156156cc575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f602082840312156156fb575f80fd5b610b2a8261558a565b5f60208284031215615714575f80fd5b813569ffffffffffffffffffff81168114610b2a575f80fd5b5f6020828403121561573d575f80fd5b8135610b2a816154c2565b805f5b6003811015610e7457815173ffffffffffffffffffffffffffffffffffffffff1684526020938401939091019060010161574b565b815160ff1681526101c0810160208301516157a1602084018261ffff169052565b5060408301516157b7604084018261ffff169052565b5060608301516157cd606084018261ffff169052565b5060808301516157e3608084018261ffff169052565b5060a08301516157f960a084018261ffff169052565b5060c083015161580f60c084018261ffff169052565b5060e083015161582560e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015162ffffff16908301526101608084015161586b82850182615748565b505092915050565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e060208401526158af60e084018a615467565b83810360408501526158c1818a615467565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b8181101561592157835183529284019291840191600101615905565b50909c9b505050505050505050505050565b803560ff8116811461559b575f80fd5b5f8060408385031215615954575f80fd5b823561595f816154c2565b91506155ca60208401615933565b5f6020828403121561597d575f80fd5b813565ffffffffffff81168114610b2a575f80fd5b5f805f606084860312156159a4575f80fd5b83356159af816154c2565b95602085013595506040909401359392505050565b5f805f805f805f60e0888a0312156159da575f80fd5b87356159e5816154c2565b965060208801356159f5816154c2565b95506040880135945060608801359350615a1160808901615933565b925060a0880135915060c0880135905092959891949750929550565b5f8060408385031215615a3e575f80fd5b8235615a49816154c2565b91506020830135615a59816154c2565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b61ffff828116828216039080821115615aac57615aac615a64565b5092915050565b5f60208284031215615ac3575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b808201808211156109ab576109ab615a64565b5f805f60608486031215615b1c575f80fd5b8351925060208401519150604084015190509250925092565b5f60208284031215615b45575f80fd5b8151610b2a816154c2565b5f69ffffffffffffffffffff808316818103615b6e57615b6e615a64565b6001019392505050565b5f8251615b89818460208701615445565b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f60a082016bffffffffffffffffffffffff88168352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015615c2b57845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101615bf9565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b5f60208284031215615c69575f80fd5b8151610b2a8161550d56fea26469706673582212209f3438133a31fabcd186600528d9fee7dfd0c26db84406c2f812a7f9746113b964736f6c63430008180033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000e4249324c0b2d4247477cd35cf3a3f73abdf8d570000000000000000000000000011223317890359f6c2d832045cfd11b2ac5e440000000000000000000000008800ee330033ff9559d466205f83b46d0275da53

-----Decoded View---------------
Arg [0] : marketing (address): 0xE4249324c0b2D4247477Cd35Cf3a3F73ABDf8D57
Arg [1] : fee (address): 0x0011223317890359F6C2D832045Cfd11B2aC5e44
Arg [2] : gameRouter (address): 0x8800eE330033fF9559d466205F83B46D0275DA53

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000e4249324c0b2d4247477cd35cf3a3f73abdf8d57
Arg [1] : 0000000000000000000000000011223317890359f6c2d832045cfd11b2ac5e44
Arg [2] : 0000000000000000000000008800ee330033ff9559d466205f83b46d0275da53


Deployed Bytecode Sourcemap

178592:4774:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;155398:110;;;;;;;;;;-1:-1:-1;138248:4:0;138242:11;;138423:18;;;138410:32;;-1:-1:-1;138498:18:0;;;138278;;;138530;;;155480:8;138627:4;138614:18;;138607:34;138712:14;;138688:39;;138705:4;138688:39;138682:46;;138662:18;;;138655:74;138782:50;;;138877:14;155437:19;138853:39;;;;138846:50;;;;155398:110;;;;;;;:::i;:::-;;;;;;;;156301:150;;;;;;;;;;-1:-1:-1;156301:150:0;;;;;:::i;:::-;;:::i;:::-;;;1473:14:1;;1466:22;1448:41;;1436:2;1421:18;156301:150:0;1308:187:1;182633:401:0;;;;;;;;;;-1:-1:-1;182633:401:0;;;;;:::i;:::-;;:::i;:::-;;155640:99;;;;;;;;;;-1:-1:-1;155712:19:0;;;;;;;155640:99;;;2015:25:1;;;2003:2;1988:18;155640:99:0;1869:177:1;156459:411:0;;;;;;;;;;-1:-1:-1;156459:411:0;;;;;:::i;:::-;;:::i;182329:92::-;;;;;;;;;;-1:-1:-1;182397:16:0;;;;;;;182329:92;;153688:117;;;;;;;;;;-1:-1:-1;153688:117:0;153739:66;153688:117;;153902:31;;;;;;;;;;;;;;;;;;2946:4:1;2934:17;;;2916:36;;2904:2;2889:18;153902:31:0;2774:184:1;153858:35:0;;;;;;;;;;;;;;;;;;3158:42:1;3146:55;;;3128:74;;3116:2;3101:18;153858:35:0;2963:245:1;140509:179:0;;;;;;;;;;;;;:::i;181097:285::-;;;;;;;;;;-1:-1:-1;181097:285:0;;;;;:::i;:::-;;:::i;156878:233::-;;;;;;;;;;-1:-1:-1;156878:233:0;;;;;:::i;:::-;;:::i;158664:93::-;;;;;;;;;;-1:-1:-1;158664:93:0;;;;;:::i;:::-;;:::i;180085:110::-;;;;;;;;;;;;;:::i;:::-;;;;;;3635:4:1;3677:3;3666:9;3662:19;3654:27;;3727:6;3718;3712:13;3708:26;3697:9;3690:45;3803:18;3795:4;3787:6;3783:17;3777:24;3773:49;3766:4;3755:9;3751:20;3744:79;3891:22;3883:4;3875:6;3871:17;3865:24;3861:53;3854:4;3843:9;3839:20;3832:83;3983:26;3975:4;3967:6;3963:17;3957:24;3953:57;3946:4;3935:9;3931:20;3924:87;4079:42;4071:4;4063:6;4059:17;4053:24;4049:73;4042:4;4031:9;4027:20;4020:103;3493:636;;;;;164766:136:0;;;;;;;;;;-1:-1:-1;164766:136:0;;;;;:::i;:::-;;:::i;164350:88::-;;;;;;;;;;-1:-1:-1;164350:88:0;;;;;:::i;:::-;;:::i;180993:96::-;;;;;;;;;;;;;:::i;181390:796::-;;;:::i;164650:108::-;;;;;;;;;;-1:-1:-1;164650:108:0;;;;;:::i;:::-;;:::i;164233:109::-;;;;;;;;;;-1:-1:-1;164233:109:0;;;;;:::i;:::-;;:::i;164548:94::-;;;;;;;;;;-1:-1:-1;164548:94:0;;;;;:::i;:::-;;:::i;155747:114::-;;;;;;;;;;-1:-1:-1;155747:114:0;;;;;:::i;:::-;;:::i;183042:97::-;;;;;;;;;;;;;:::i;179969:108::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;180783:202::-;;;;;;;;;;;;;:::i;156180:113::-;;;;;;;;;;-1:-1:-1;156180:113:0;;;;;:::i;:::-;;:::i;140696:591::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;182429:86::-;;;;;;;;;;;;;:::i;182198:123::-;;;;;;;;;;-1:-1:-1;182198:123:0;;;;;:::i;:::-;;:::i;179641:86::-;;;;;;;;;;-1:-1:-1;179706:13:0;;;;179641:86;;182523:102;;;;;;;;;;;;;:::i;155516:116::-;;;;;;;;;;;;;:::i;157119:492::-;;;;;;;;;;-1:-1:-1;157119:492:0;;;;;:::i;:::-;;:::i;180322:94::-;;;;;;;;;;-1:-1:-1;79820:76:0;180395:12;;;180322:94;;155869:154;;;;;;;;;;-1:-1:-1;155869:154:0;;;;;:::i;:::-;;:::i;164446:94::-;;;;;;;;;;-1:-1:-1;164446:94:0;;;;;:::i;:::-;;:::i;164910:142::-;;;;;;;;;;-1:-1:-1;164910:142:0;;;;;:::i;:::-;;:::i;157619:1037::-;;;;;;;;;;-1:-1:-1;157619:1037:0;;;;;:::i;:::-;;:::i;156031:141::-;;;;;;;;;;-1:-1:-1;156031:141:0;;;;;:::i;:::-;;:::i;180203:111::-;;;;;;;;;;-1:-1:-1;180203:111:0;;;;;:::i;:::-;;:::i;183147:214::-;;;;;;;;;;-1:-1:-1;183147:214:0;;;;;:::i;:::-;;:::i;180424:351::-;;;;;;;;;;-1:-1:-1;180424:351:0;;;;;:::i;:::-;;:::i;156301:150::-;156369:4;156386:35;156395:10;156406:7;156414:6;156386:8;:35::i;:::-;-1:-1:-1;156439:4:0;156301:150;;;;;:::o;182633:401::-;179020:13;:11;:13::i;:::-;182727:16;182754:273;::::1;;;182787:16:::0;;182850:21;;;;;;-1:-1:-1;182633:401:0:o;182754:273::-:1;182916:17:::0;;182930:3:::1;::::0;182916:17;;:10:::1;::::0;:17:::1;::::0;182930:3;;182916:17:::1;::::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;182963:3;182948;:11;;;:18;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;183000:3;182981;:15;;;:22;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;182754:273;182693:341;182633:401:::0;:::o;156459:411::-;156575:4;156592:15;156610:12;:10;:12::i;:::-;156592:30;;156638:22;156652:7;156638:13;:22::i;:::-;156633:230;;156677:36;156693:4;156698:7;156706:6;156677:15;:36::i;:::-;156735:35;156745:4;156751:2;156762:6;156735:35;;:9;:35::i;:::-;156728:42;;;;;156633:230;156810:41;156820:4;156826:2;156837:6;156810:41;;156846:4;156810:9;:41::i;156633:230::-;156581:289;156459:411;;;;;;:::o;140509:179::-;140566:7;140610:16;140593:13;:33;:87;;140656:24;141428:100;;;139726:66;141428:100;;;17074:25:1;141456:18:0;17115::1;;;17108:34;;;;141476:21:0;17158:18:1;;;17151:34;141499:13:0;17201:18:1;;;17194:34;141522:4:0;17244:19:1;;;17237:84;141360:7:0;;17046:19:1;;141428:100:0;;;;;;;;;;;;141400:143;;;;;;141380:163;;141295:256;;140656:24;140586:94;;140509:179;:::o;140593:87::-;-1:-1:-1;140629:24:0;;140509:179::o;181097:285::-;181173:38;;;;;;;;181195:16;181173:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;181173:38:0;;;;;;;181195:16;;181173:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;181222:22;181247:6;181257:1;181247:11;:62;;181303:6;181247:62;;;181261:39;;;;;181294:4;181261:39;;;3128:74:1;181261:24:0;;;;;;3101:18:1;;181261:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;181337:17;;;;:20;181222:87;;-1:-1:-1;181320:54:0;;:16;;;;181222:87;181320:16;:54::i;:::-;181162:220;;181097:285;;:::o;156878:233::-;156960:4;156977:13;156993:12;:10;:12::i;:::-;156977:28;;157016:65;157025:5;157032:7;157070:10;157041:26;157052:5;157059:7;158866:34;;;;158840:7;158866:34;;;:27;:34;;;;;;;;:43;;;;;;;;;;;;;158765:152;157041:26;:39;;;;:::i;:::-;157016:8;:65::i;:::-;-1:-1:-1;157099:4:0;;156878:233;-1:-1:-1;;;156878:233:0:o;158664:93::-;158714:35;158720:12;:10;:12::i;:::-;158741:6;158714:5;:35::i;:::-;158664:93;:::o;180085:110::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;180164:23:0;180176:10;180164:11;:23::i;164766:136::-;164836:4;164860:26;:19;;;164880:5;164860:19;:26::i;164350:88::-;164395:4;164419:11;:5;:9;;;:11::i;180993:96::-;181044:37;181072:4;181079:1;181044:19;:37::i;:::-;180993:96::o;181390:796::-;154173:14;:21;;;;;;;;179020:13:::1;:11;:13::i;:::-;79820:76:::0;181464:20:::2;181528:24;181546:4;181528:9;:24::i;:::-;181505:47;;181563:65;181580:4;181595:6;181603:17;181622:5;181563:8;:65::i;:::-;181639:63;181656:4;181671;181677:17;181696:5;181639:8;:63::i;:::-;181713:196;::::0;;;;181776:4:::2;181713:196;::::0;::::2;14032:34:1::0;;;14082:18;;;14075:34;;;181823:1:0::2;14125:18:1::0;;;14118:34;;;14168:18;;;14161:34;14211:19;;;14204:44;181883:15:0::2;14264:19:1::0;;;14257:35;181713:6:0::2;:22;;::::0;::::2;::::0;181743:9:::2;::::0;13943:19:1;;181713:196:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;181951:6;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;181938:38;;;181985:4;181992:6;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;181938:68;::::0;;::::2;::::0;;;;;;15054:42:1;15123:15;;;181938:68:0::2;::::0;::::2;15105:34:1::0;15175:15;;15155:18;;;15148:43;15017:18;;181938:68:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;181920:87:::0;;;::::2;;::::0;;;::::2;::::0;;::::2;::::0;;182018:29:::2;::::0;:27:::2;:29::i;:::-;-1:-1:-1::0;182066:9:0;;182058:37:::2;::::0;182066:9:::2;;182058:35;:37::i;:::-;182142:9:::0;;182110:68:::2;::::0;182127:4:::2;::::0;182142:9:::2;;182153:17;182142:9;182110:8;:68::i;:::-;181453:733;;154234:5:::0;154217:7;79820:76;;140509:179;154217:7;:14;;:22;;;;;;;;;;;;;;;;;181390:796::o;164650:108::-;164708:4;164732:18;:5;:16;:18::i;164233:109::-;164288:4;164312:22;:5;:20;;;:22::i;164548:94::-;164596:4;164620:14;:5;:12;;;:14::i;155747:114::-;155802:7;155829:16;:6;:14;;;:16::i;:::-;:24;;;;;;;;-1:-1:-1;;155747:114:0:o;183042:97::-;179020:13;:11;:13::i;:::-;183101:30:::1;183128:1;183101:18;:30::i;179969:108::-:0;180018:15;;:::i;:::-;180046:23;;;;;;;;180053:16;180046:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;180053:16;;180046:23;;;;;;180053:16;;180046:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;179969:108;:::o;180783:202::-;180832:38;;;;;;;;180854:16;180832:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;180832:38:0;;;;;;;180854:16;;180832:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;180881:14;180898:21;180881:38;;180930:47;180961:6;180969:3;:7;;;180930:47;;:3;:17;;;180948:1;180930:20;;;;;;;:::i;:::-;;;;;:30;;;:47;:30;:47::i;156180:113::-;156235:7;156262:16;:6;:14;;;:16::i;:::-;:23;;;;;;;;-1:-1:-1;;156180:113:0:o;140696:591::-;140799:13;140827:18;140860:21;140896:15;140926:25;140966:12;140993:27;141092:23;:11;136410:20;136529:4;136523:11;136513:21;;136643:4;136635:6;136631:17;136625:4;136618:31;136719:1;136711:6;136704:17;136805:6;136798:4;136790:6;136786:17;136779:33;136911:1;136901:6;136895:13;136888:4;136880:6;136876:17;136872:37;136865:48;136352:579;;;;141092:23;136529:4;136523:11;;136631:17;;;136618:31;;-1:-1:-1;136704:17:0;;;141130:14;136798:4;136786:17;;136779:33;136895:13;;136888:4;136872:37;;;;;136865:48;;;141252:16;;;;;;;;;;;141048:231;;;;-1:-1:-1;136523:11:0;;-1:-1:-1;141171:13:0;;-1:-1:-1;141207:4:0;;-1:-1:-1;;;141252:16:0;-1:-1:-1;141048:231:0;-1:-1:-1;140696:591:0:o;182429:86::-;179020:13;:11;:13::i;:::-;182484:16;:23;;;::::1;::::0;::::1;::::0;;182429:86::o;182198:123::-;179020:13;:11;:13::i;:::-;182283:30:::1;:25;::::0;::::1;182309:3:::0;182283:25:::1;:30::i;182523:102::-:0;179020:13;:11;:13::i;:::-;182588:16;:29;;;::::1;::::0;;182523:102::o;155516:116::-;138248:4;138242:11;;138423:18;;;138410:32;;-1:-1:-1;138498:18:0;;;138278;;;138530;;;155604:8;138627:4;138614:18;;138607:34;138712:14;;138688:39;;138705:4;138688:39;138682:46;;138662:18;;;138655:74;138782:50;;;138877:14;;155557:21;138853:39;;;;;138846:50;;;;155604:20;138046:868;157119:492;157208:4;157225:13;157241:12;:10;:12::i;:::-;158866:34;;;;157264:24;158866:34;;;:27;:34;;;;;;;;:43;;;;;;;;;;:34;;-1:-1:-1;157332:36:0;;;157328:145;;;157392:69;;;;;15434:42:1;15422:55;;157392:69:0;;;15404:74:1;15494:18;;;15487:34;;;15537:18;;;15530:34;;;15377:18;;157392:69:0;;;;;;;;157328:145;157508:62;157517:5;157524:7;157552:17;157533:16;:36;157508:8;:62::i;:::-;-1:-1:-1;157599:4:0;;157119:492;-1:-1:-1;;;;157119:492:0:o;155869:154::-;155933:4;155950:43;155960:12;:10;:12::i;:::-;155974:2;155985:6;155950:43;;:9;:43::i;164446:94::-;164494:4;164518:14;:5;:12;;;:14::i;164910:142::-;164992:4;165016:28;:15;;;165032:6;165039:4;165016:15;:28::i;:::-;165009:35;164910:142;-1:-1:-1;;;;164910:142:0:o;157619:1037::-;157844:8;157826:15;:26;157822:54;;;157861:15;;;;;;;;;;;;;;157822:54;157914:15;157932:498;157960:395;153739:66;158119:6;158156:7;158194:5;158230:17;158119:6;158230:9;:17::i;:::-;158032:281;;;;;;15862:25:1;;;;15906:42;15984:15;;;15964:18;;;15957:43;16036:15;;;;16016:18;;;16009:43;16068:18;;;16061:34;16111:19;;;16104:35;16155:19;;;16148:35;;;15834:19;;158032:281:0;;;;;;;;;;;;157996:340;;;;;;157960:13;:395::i;:::-;157932:498;;;;;;;;;;;;16421:25:1;;;;16494:4;16482:17;;16462:18;;;16455:45;16516:18;;;16509:34;;;16559:18;;;16552:34;;;16393:19;;157932:498:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;157932:498:0;;;;;;-1:-1:-1;;158451:21:0;;;;;:42;;;158487:6;158476:17;;:7;:17;;;;158451:42;158447:70;;;158502:15;;;;;;;;;;;;;;158447:70;158534:36;;;;;;;;:27;:36;;;;;;;;:45;;;;;;;;;;;;;:53;;;158616:32;2015:25:1;;;158534:45:0;;158616:32;;;;;1988:18:1;158616:32:0;;;;;;;157619:1037;;;;;;;:::o;156031:141::-;158866:34;;;;156112:7;158866:34;;;:27;:34;;;;;;;;:43;;;;;;;;;;;;156139:25;158765:152;180203:111;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;180292:14:0;:4;:12;;;:14::i;:::-;180285:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;180203:111:0:o;183147:214::-;179020:13;:11;:13::i;:::-;183226:22:::1;::::0;::::1;183222:93;;183272:31;::::0;::::1;::::0;;183300:1:::1;183272:31;::::0;::::1;3128:74:1::0;3101:18;;183272:31:0::1;2963:245:1::0;183222:93:0::1;183325:28;183344:8;183325:18;:28::i;180424:351::-:0;180474:7;180494:20;180517:22;:12;:10;:12::i;:::-;:20;;;:22::i;:::-;180553:8;;;;-1:-1:-1;180553:8:0;;;;;;:13;180550:143;;180595:11;:13;;;;;:11;:13;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;180584:24;;;;;;;;;;;;;-1:-1:-1;180626:12:0;;;:26;:12;180623:58;;180669:12;:10;:12::i;:::-;180654;;;:27;;;;;;;;;;;;;;;180623:58;180734:8;;180708:39;;180744:2;;180734:8;;;;;;180722:10;;180708:39;;180734:8;;180708:39;-1:-1:-1;180765:2:0;;180424:351;-1:-1:-1;180424:351:0:o;165691:132::-;165777:38;165786:6;165794:7;165803:5;165810:4;165777:8;:38::i;:::-;165691:132;;;:::o;179475:158::-;179538:12;:10;:12::i;:::-;179527:23;;:7;179706:13;;;;;179641:86;179527:7;:23;;;179523:103;;179601:12;:10;:12::i;:::-;179574:40;;;;;3158:42:1;3146:55;;;179574:40:0;;;3128:74:1;3101:18;;179574:40:0;2963:245:1;103402:111:0;103455:7;103482:23;:21;:23::i;158925:140::-;158988:4;159012:20;:7;:18;;;:20::i;:::-;:45;;;;159036:21;:7;:19;;;:21::i;166133:478::-;158866:34;;;;166226:24;158866:34;;;:27;:34;;;;;;;;:43;;;;;;;;;;166315:17;166295:37;;166291:313;;166372:5;166353:16;:24;166349:127;;;166405:55;;;;;15434:42:1;15422:55;;166405::0;;;15404:74:1;15494:18;;;15487:34;;;15537:18;;;15530:34;;;15377:18;;166405:55:0;15202:368:1;166349:127:0;166519:58;166528:6;166536:7;166564:5;166545:16;:24;166571:5;166519:8;:58::i;159073:187::-;159186:12;159218:34;159228:4;159234:2;159238:6;159246:5;159268:1148;159407:12;159438:18;;;159434:56;;159465:25;;;;;159487:1;159465:25;;;3128:74:1;3101:18;;159465:25:0;2963:245:1;159434:56:0;159505:16;;;159501:56;;159530:27;;;;;159554:1;159530:27;;;3128:74:1;3101:18;;159530:27:0;2963:245:1;159501:56:0;98725:28;;;;159570:20;98725:28;;;:14;:28;;;;;;;;;;;;;159726:14;;;;79820:76;;159726:14;159722:49;;159756:15;:4;:13;;;:15::i;:::-;;159722:49;159788:17;;;;:31;:17;159784:50;;159821:13;:2;:11;;;:13::i;:::-;;159784:50;159997:11;;;;159848:17;;;;;;159908:111;;159997:11;;159931:6;;159952:9;;159976:6;;159997:11;;;;;159908:8;:111::i;:::-;159847:172;;;;;;160036:9;160049:1;160036:14;160032:119;;160067:46;160075:6;160083:9;160094:6;160102:10;160067:7;:46::i;:::-;160135:4;160128:11;;;;;;;;;;160032:119;160163:63;160171:6;160179:23;160187:4;160179:21;:23::i;:::-;160204:9;160215:10;160163:7;:63::i;:::-;160243:14;;160239:76;;160274:29;160291:10;160274:9;:29::i;:::-;160327:49;160335:6;160343:9;160354;160365:10;160327:7;:49::i;:::-;-1:-1:-1;160394:4:0;;159268:1148;-1:-1:-1;;;;;;;;;;159268:1148:0:o;31035:320::-;31213:77;;;31188:10;17524:55:1;;;31213:77:0;;;17506:74:1;17596:18;;;;17589:34;;;31213:77:0;;;;;;;;;;17479:18:1;;;;31213:77:0;;;;;;;;;31254:24;31213:77;;;31188:117;;-1:-1:-1;;;;31188:10:0;;;;:117;;31213:77;31188:117;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31152:153;;;;31318:29;31333:7;31342:4;31318:14;:29::i;:::-;31139:216;;31035:320;;;:::o;165330:353::-;165394:23;165420:14;:4;:12;;;:14::i;:::-;165458:15;;165394:40;;-1:-1:-1;165458:15:0;;;;;;;165449:24;;;;165445:65;;;165490:8;;;165445:65;165545:25;;;;;;;;;;;;;;;;;;;;;;;165564:6;165585:7;79820:76;;140509:179;165585:7;:19;;:29;;;;;;;;;;;;;;;;;;;;;;;;165641:34;;-1:-1:-1;;165641:34:0;;;;;;;165668:6;;18101:26:1;18089:39;;;;18071:58;;18059:2;18044:18;;17926:209;165641:34:0;;;;;;;;165383:300;165330:353;;:::o;96789:907::-;96973:8;96858:11;96960:22;;;96910:15;97003:4;96996:35;;;97078:4;97062:21;;97056:28;97118:6;97109:16;;;97168:10;97159:20;;97189:10;97180:20;;;97156:45;97149:53;97139:509;;97243:5;97236;97233:16;97223:82;;97284:1;97281;97274:12;97223:82;97330:4;97323:21;;;97369:4;97362:35;;;97442:4;97426:21;;97475:10;;97564:9;97556:18;97522:6;97576:24;;97553:48;97619:14;;-1:-1:-1;97673:4:0;;96789:907;-1:-1:-1;;;;96789:907:0:o;95044:809::-;95253:8;95088:11;95240:22;;;95190:15;95283:4;95276:35;;;95358:4;95342:21;;95336:28;95136:15;;95190;95398:6;95389:16;;;95448:10;95439:20;;95469:10;95460:20;;;95436:45;95429:53;95419:386;;95523:8;95516:5;95513:19;95503:85;;95567:1;95564;95557:12;95503:85;95616:16;;95713:9;95705:18;95666:3;95729:15;;;95662:16;95725:26;95702:50;95770:20;;-1:-1:-1;95830:4:0;;95044:809;-1:-1:-1;;;;95044:809:0:o;165831:294::-;165976:35;;;;;;;;:27;:35;;;;;;;;:44;;;;;;;;;:52;;;166039:79;;;;166091:7;166074:32;;166083:6;166074:32;;;166100:5;166074:32;;;;2015:25:1;;2003:2;1988:18;;1869:177;166074:32:0;;;;;;;;165831:294;;;;:::o;98769:262::-;98895:26;;;98819:19;98895:26;;;:11;:26;;;;;98944:6;98942:8;;98895:26;;79820:76;;98942:8;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;98932:18;;;;;;;;;;;;;;-1:-1:-1;98961:11:0;;:19;;;;;;;;;;;;;;;99007:7;;;;;;-1:-1:-1;98991:24:0;;;:15;;;;:24;;;;;;:32;;;;;;;;;98932:3;98769:262::o;88242:103::-;88303:34;:15;:5;:13;;;:15::i;:::-;:32;:34::i;95861:920::-;96083:8;95918:11;96070:22;;;96020:15;96113:4;96106:35;;;96188:4;96172:21;;96166:28;95966:15;;96020;96228:6;96219:16;;;96278:10;96269:20;;96299:10;96290:20;;;96266:45;96259:53;96249:484;;96359:4;96352:5;96348:16;96342:23;96409:4;96402:5;96398:16;96392:23;96459:4;96452:5;96448:16;96442:23;96522:1;96515:9;96510:1;96503:9;96499:1;96492:9;96489:24;96486:39;96483:97;;;96559:1;96556;96549:12;96483:97;96620:1;96605:17;;96598:28;;;;96666:1;96651:17;;96644:28;96712:1;96697:17;;96690:28;-1:-1:-1;96758:4:0;;95861:920;-1:-1:-1;;;;95861:920:0:o;94219:817::-;94439:8;94274:11;94426:22;;;94376:15;94469:4;94462:35;;;94544:4;94528:21;;94522:28;94322:15;;94376;94584:6;94575:16;;;94634:10;94625:20;;94655:10;94646:20;;;94622:45;94615:53;94605:383;;94709:5;94702;94699:16;94689:82;;94750:1;94747;94740:12;94689:82;94799:16;;94896:9;94888:18;94849:3;94912:15;;;94845:16;94908:26;94885:50;94953:20;;-1:-1:-1;95013:4:0;;94219:817;-1:-1:-1;;;;94219:817:0:o;92668:1543::-;92880:8;92715:11;92867:22;;;92817:15;92910:4;92903:35;;;92985:4;92969:21;;92963:28;92763:15;;92817;93025:6;93016:16;;;93075:10;93066:20;;93096:10;93087:20;;;93063:45;93056:53;93046:1118;;93148:5;93144:2;93140:14;93202:6;93194:5;93190:2;93186:14;93182:27;93257:6;93249:5;93245:2;93241:14;93237:27;93312:6;93304:5;93300:2;93296:14;93292:27;93358:6;93351:5;93347:18;93431:2;93426;93421;93416;93412;93408:11;93404:20;93400:29;93396:38;93472:5;93465;93462:16;93452:82;;93513:1;93510;93503:12;93452:82;;93568:9;93562:16;93611:1;93596:485;93621:1;93618;93615:8;93596:485;;;93703:6;93686:2;93697;93690:10;;93682:19;93678:32;93741:1;93694;93794:18;;;;93839:1;93834:18;;;;93879:1;93874:18;;;;93919:1;93914:18;;;;93959:1;93954:18;;;;93764:208;;93794:18;93808:2;93803:7;;93794:18;;93834;93848:2;93843:7;;93834:18;;93874;93888:2;93883:7;;93874:18;;93914;93928:2;93923:7;;93914:18;;93954;93968:2;93963:7;;93764:208;;94056:4;94052:1;94046:2;94043:1;94039:10;94035:2;94031:19;94027:27;94023:38;94015:4;94011:9;94007:2;94003:18;94000:62;93994:68;;;;93638:1;93635;93631:9;93626:14;;93596:485;;;-1:-1:-1;94129:20:0;;-1:-1:-1;;;;;;94189:4:0;;92668:1543;-1:-1:-1;;;;92668:1543:0:o;98484:122::-;98725:28;;;98538:19;98725:28;;;:14;:28;;;;;98577:21;98614:147;179735:226;179859:8;;;179878:19;;;179859:8;179878:19;;;;;;;;;179913:40;;79820:76;;179859:8;;;;;;179913:40;;179801:18;;179913:40;179790:171;;179735:226;:::o;30784:239::-;30950:12;;;30874;30950;;;;;;;;;30874;;30909:16;;;;30945:3;;30933:5;;30909:54;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89404:117;89476:37;89509:3;89476:15;:5;:13;;;:15::i;:::-;:32;91138:17;;91111:58;;;91159:1;:8;;;;;;;;;91138:17;;;;:30;91111:58;;;;91031:146;91340:1320;91552:8;91387:11;91539:22;;;91489:15;91582:4;91575:35;;;91657:4;91641:21;;91635:28;91435:15;;91489;91697:6;91688:16;;;91747:10;91738:20;;91768:10;91759:20;;;91735:45;91728:53;91718:895;;91820:5;91816:2;91812:14;91874:6;91866:5;91862:2;91858:14;91854:27;91920:6;91913:5;91909:18;92013:4;92009:2;92006:12;91999:20;91990:4;91986:2;91983:12;91976:20;91968:4;91964:2;91961:12;91954:20;91951:46;91948:72;91945:130;;;92054:1;92051;92044:12;91945:130;92109:9;92103:16;92152:1;92137:403;92162:1;92159;92156:8;92137:403;;;92243:6;92227:1;92237:2;92230:10;;92223:18;92219:31;92281:1;92234;92334:18;;;;92379:1;92374:18;;;;92419:1;92414:18;;;;92304:128;;92334:18;92348:2;92343:7;;92334:18;;92374;92388:2;92383:7;;92374:18;;92414;92428:2;92423:7;;92304:128;;92515:4;92511:1;92505:2;92502:1;92498:10;92495:1;92491:18;92487:26;92483:37;92475:4;92471:9;92467:2;92463:18;92460:61;92454:67;;;;92179:1;92176;92172:9;92167:14;;92137:403;;;-1:-1:-1;92578:20:0;;-1:-1:-1;;;;92638:4:0;;91340:1320;-1:-1:-1;;;;91340:1320:0:o;97704:767::-;97897:8;97785:11;97884:22;;;97834:15;97927:4;97920:32;;;97999:4;97983:21;;97977:28;98039:6;98030:16;;;98082:10;98073:20;;98103:10;98094:20;;;98070:45;98060:103;;98146:1;98143;98136:12;98060:103;;98188:4;98178:14;;98213:251;98227:4;98218:6;:13;98213:251;;;98278:12;98293:23;98301:7;98309:6;98293:7;:23::i;:::-;98278:38;;98335:15;:4;:13;;;:15::i;:::-;-1:-1:-1;98369:19:0;;;:13;:19;;;;;;;;;;:41;;98403:1;98405:4;98369:33;:41::i;:::-;-1:-1:-1;98429:8:0;;;;;98213:251;;166619:266;166672:7;166692:23;166718:16;:6;:14;;;:16::i;:::-;166774:14;;166692:42;;-1:-1:-1;166792:16:0;166774:14;;;;;;:34;166770:58;;166810:18;;;;;;166770:58;166850:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;166619:266:0:o;141559:180::-;141633:7;141699:18;:16;:18::i;:::-;141670:60;;18410:66:1;141670:60:0;;;18398:79:1;18493:11;;;18486:27;;;;18529:12;;;18522:28;;;18566:12;;141670:60:0;;;;;;;;;;;;141660:71;;;;;;141653:78;;141559:180;;;:::o;102660:424::-;102705:14;102758:4;102736:10;:27;102732:345;;102780:18;102801:8;;102780:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;102840:8:0;102918:17;102912:24;102956:42;102908:91;;-1:-1:-1;102732:345:0;;-1:-1:-1;102732:345:0;;-1:-1:-1;103055:10:0;102732:345;102660:424;:::o;86369:117::-;86426:4;86450:28;:15;:5;:13;;;:15::i;:::-;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28::i;86496:119::-;86554:4;86578:29;:15;:5;:13;;;:15::i;:::-;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29::i;81577:3766::-;81796:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;81796:19:0;;:17;:19::i;:::-;:45;;;-1:-1:-1;81819:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:22;;:20;:22::i;:::-;81796:57;;;;81845:8;81796:57;81793:88;;;-1:-1:-1;81865:1:0;;-1:-1:-1;81868:6:0;;-1:-1:-1;81865:1:0;81857:21;;81793:88;81891:38;;;;;;;;81918:11;;;;81891:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;81918:11:0;;81891:38;;;;;;;;81918:11;81891:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81941:13;81959:23;:8;85653:14;85698:3;85689:12;;;85688:21;;85735:3;85726:12;;;;85536:210;81959:23;-1:-1:-1;82007:11:0;;;;81940:42;;-1:-1:-1;82007:11:0;;;;;82003:390;;82038:25;82045:6;82038:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82053:9;82038:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;:25::i;:::-;82035:347;;;-1:-1:-1;82138:15:0;;;79944:5;82129:38;:24;;;;;:38;;-1:-1:-1;;;82202:16:0;;;82298:1;82269:31;;82035:347;82348:18;;;;;;;;;;;;;;82035:347;82408:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:22;;:20;:22::i;:::-;:51;;;-1:-1:-1;82434:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:23;:25::i;:::-;82405:2929;;;82481:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:22;;:20;:22::i;:::-;82478:2176;;;82580:15;;;;79944:5;;82571:38;:24;;;:38;82559:50;;82651:9;82644:6;:16;82632:28;;82737:189;;;;;;;;82770:5;82737:189;;;;;;82777:6;:14;;;;;;;;;;;;82737:189;;;;;;82793:9;:17;;;;;;;;;;;;82737:189;;;;;;82819:6;82737:189;;;;;;82856:12;82737:189;;;;;;82878:9;82737:189;;;;;;82897:9;82737:189;;;;;82700:2;:11;;:15;;:34;82716:9;:17;;;;;;;;;;;;82700:34;;;;;;;;;;;;;;;:226;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82950:8;82947:156;;;82986:17;;79994:16;;82986:27;;83004:9;;82986:17;;;:40;:17;:27;:::i;:::-;:40;82983:99;;;83053:29;;;;;18980:2:1;83053:29:0;;;18962:21:1;19019:2;18999:18;;;18992:30;19058:21;19038:18;;;19031:49;19097:18;;83053:29:0;18778:343:1;82983:99:0;-1:-1:-1;83153:1:0;;-1:-1:-1;83123:32:0;;-1:-1:-1;83123:32:0;82478:2176;83203:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;;:15;:17::i;:::-;83200:434;;;79944:5;83303:4;83294:13;;:27;83282:39;;83367:9;83360:6;:16;83348:28;;83200:434;;;83506:16;;;;79944:5;;83497:39;:25;;;:39;83485:51;;83582:9;83575:6;:16;83563:28;;83200:434;83730:1;83700:8;:27;;;:31;;;:186;;83877:9;83845:23;83853:4;83845:21;:23::i;:::-;:31;;;;;;:41;83700:186;;;83776:27;;;;83759:14;;;;79944:5;;83759:14;;;;;;;:58;:44;;;;;:58;;83700:186;;;83991:14;;;;;;;;;83946:26;83975:31;;;:11;;;:31;;;;;;;;;83946:60;;;;;;;;;;;;;;;;83991:14;83946:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83687:199;;-1:-1:-1;83946:60:0;84028:36;:80;;;;;84095:12;84068:40;;:8;:16;;;:40;;;84028:80;84025:148;;;84133:20;:6;:18;:20::i;:::-;84227:189;;;;;;;;84260:5;84227:189;;;;;;84267:6;:14;;;;;;;;;;;;84227:189;;;;;;84283:9;:17;;;;;;;;;;;;84227:189;;;;;;84309:6;84227:189;;;;;;84346:12;84227:189;;;;;;84368:9;84227:189;;;;;;84387:9;84227:189;;;;;84193:2;:11;;:15;;:31;84209:6;:14;;;;;;;;;;;;84193:31;;;;;;;;;;;;;;;:223;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84440:8;84437:138;;;79994:16;84476:22;;84473:81;;;84525:29;;;;;18980:2:1;84525:29:0;;;18962:21:1;19019:2;18999:18;;;18992:30;19058:21;19038:18;;;19031:49;19097:18;;84525:29:0;18778:343:1;84473:81:0;84595:41;;;;;82405:2929;84693:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;;:15;:17::i;:::-;:41;;;-1:-1:-1;84714:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:20;;:18;:20::i;:::-;84690:422;;;79944:5;84809:4;84800:13;;:27;84788:39;;84869:9;84862:6;:16;84850:28;;84690:422;;;84992:20;;;;79944:5;;84983:43;:29;;;:43;84971:55;;85068:9;85061:6;:16;85049:28;;84690:422;85131:8;85128:144;;;85163:17;;79994:16;;85163:27;;85181:9;;85163:17;;;:40;:17;:27;:::i;81577:3766::-;;;;;;;;;;:::o;160424:503::-;160634:12;;160602:5;;160634:12;;;;;;;160625:21;;;;160621:116;;;160690:12;;;;160704;;160670:55;;;;;160690:12;;;;160670:55;;;19326:74:1;160704:12:0;;;;;;;19461:18:1;;;19454:43;19533:15;;19513:18;;;19506:43;19299:18;;160670:55:0;19126:429:1;160621:116:0;160774:22;;;;;;;;;;;;;;;;;;;;;;;160811:20;;;;;;;;;;;;;;;;;;160859:9;160855:62;;160898:10;;;;;160884:12;;;;160875:42;;18101:26:1;18089:39;;18071:58;;160898:10:0;;;;;160884:12;;;;160875:42;;18059:2:1;18044:18;160875:42:0;;;;;;;160566:361;160424:503;;;;:::o;160937:3288::-;154173:14;:21;;;;;;;;;;;;161022:43:::1;::::0;;::::1;::::0;::::1;::::0;;161049:16;161022:43;;::::1;::::0;::::1;::::0;;::::1;;::::0;;::::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;;::::0;;;;::::1;::::0;;;::::1;;::::0;;;;;;;;::::1;::::0;;;;-1:-1:-1;;161022:43:0;;161049:16;;161022:43;;;;;;161049:16:::1;::::0;161022:43;;::::1;::::0;;::::1;;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;::::0;::::1;;;161101:21;161139:1;161125:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;161125:16:0::1;;161101:40;;161174:4;161156;161161:1;161156:7;;;;;;;;:::i;:::-;;;;;;:23;;;;;;;;;::::0;::::1;161204:6;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;161194:4;161199:1;161194:7;;;;;;;;:::i;:::-;:23;::::0;;::::1;:7;::::0;;::::1;::::0;;;;;;;:23;161234:18:::1;161255:23;161263:4;161255:21;:23::i;:::-;:31:::0;::::1;::::0;;;::::1;::::0;::::1;::::0;-1:-1:-1;161255:31:0::1;::::0;161337:19;::::1;::::0;::::1;:41;;161373:5;161337:41;;;161359:11;161337:41;161480:27;::::0;::::1;::::0;161301:77;;-1:-1:-1;161393:22:0::1;::::0;161454:5:::1;::::0;161480:31:::1;;::::0;161476:273:::1;;161614:1;161597:14;161550:61;;161566:8;:27;;;161551:42;;:12;:42;161550:61;;;;;;;:::i;:::-;;:65;;;;;;;:::i;:::-;;161532:83;;161650:15;161634:31;;;;161732:1;161702:8;:27;;;:31;;;;;;;:::i;:::-;;161684:49:::0;::::1;161476:273;161832:212;::::0;;;;161795:21:::1;::::0;161832:57:::1;:6;:57;::::0;::::1;::::0;:212:::1;::::0;161908:12;;161765:20:::1;::::0;161959:4;;161990::::1;::::0;162014:15:::1;::::0;161832:212:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;162061:12;162088:16:::0;162139:13:::1;162114:21;162107:45;162088:64;;162167:20;162202:21:::0;162238:25:::1;162278:19:::0;162338:1:::1;162317:8;:18;;;:22;;;162314:127;;;162411:14;162376:49;;162389:8;:18;;;162377:30;;:9;:30;162376:49;;;;;;;:::i;:::-;;162360:65;;162314:127;162464:19;::::0;::::1;::::0;:23:::1;;::::0;162461:130:::1;;162561:14;162525:50;;162538:8;:19;;;162526:31;;:9;:31;162525:50;;;;;;;:::i;:::-;;162508:67;;162461:130;162622:23;::::0;::::1;::::0;:27:::1;;::::0;162619:142:::1;;162731:14;162691:54;;162704:8;:23;;;162692:35;;:9;:35;162691:54;;;;;;;:::i;:::-;;162670:75;;162619:142;162780:25;::::0;::::1;::::0;:29:::1;;::::0;162777:140:::1;;162887:14;162845:56;;162858:8;:25;;;162846:37;;:9;:37;162845:56;;;;;;;:::i;:::-;;162830:71;;162777:140;162952:17;::::0;::::1;::::0;162949:92:::1;;162990:35;163004:4;163011:13;162990:5;:35::i;:::-;163060:16;::::0;::::1;::::0;163057:213:::1;;163118:22;::::0;::::1;::::0;:25;163219:12:::1;::::0;::::1;::::0;163110:144:::1;::::0;:39:::1;::::0;;::::1;::::0;:144:::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;163141:1:::1;163110:144:::0;163141:1;163110:144;;:39;:144;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;163097:157:0;;-1:-1:-1;;163057:213:0::1;163289:22;::::0;::::1;::::0;163286:225:::1;;163353:22;::::0;::::1;::::0;163376:1:::1;163353:25;;;;163345:39;;163414:18;163345:150;;163460:8;:12;;;163345:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;163332:163:0;;-1:-1:-1;;163286:225:0::1;163530:18;::::0;::::1;::::0;163527:217:::1;;163590:22;::::0;::::1;::::0;163613:1:::1;163590:25;;;;163582:39;;163651:14;163582:146;;163693:8;:12;;;163582:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;163569:159:0;;-1:-1:-1;;163527:217:0::1;163776:19;::::0;::::1;::::0;163772:435:::1;;163816:25;163905:1;163888:14;163844:58;;163857:8;:27;;;163845:39;;:9;:39;163844:58;;;;;;;:::i;:::-;;:62;;;;;;;:::i;:::-;163925:264;::::0;;;;164005:4:::1;163925:264;::::0;::::1;21196:34:1::0;;;163925:264:0::1;21266:39:1::0;;;21246:18;;;21239:67;164071:1:0::1;21322:18:1::0;;;21315:34;;;21365:18;;;21358:34;21408:19;;;21401:44;;;;164155:15:0::1;21461:19:1::0;;;21454:35;163844:62:0;;;::::1;::::0;-1:-1:-1;163925:22:0::1;:6;:22;::::0;::::1;::::0;:264;;::::1;::::0;21107:19:1;;163925:264:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;163797:410;163772:435;161076:3142;;;;;;;;;;;;161011:3214;154234:5:::0;154217:7;79820:76;;140509:179;154217:7;:14;;:22;;;;;;;;;;;;;;;;;-1:-1:-1;160937:3288:0:o;32117:184::-;32204:6;:56;;;;-1:-1:-1;32215:11:0;;:16;;:44;;;32246:4;32235:24;;;;;;;;;;;;:::i;:::-;32198:95;;32283:10;;;;;;;;;;;;;;89743:105;89812:28;:5;89832:2;89835:4;89812:19;:28::i;100806:898::-;100876:12;100974:4;100969:3;100966:13;100956:313;;101017:7;101011:4;101004:21;101061:4;101055;101047:19;101102:4;101096;101088:19;101167:3;101160;101153:11;101150:1;101146:19;101143:28;101137:4;101129:43;-1:-1:-1;101218:4:0;101212;101202:21;101245:5;;100956:313;101296:1;101315:40;101329:3;101326:1;101322:11;101315:40;;;101348:1;101341:9;101315:40;;;101382:1;101378:9;101405:14;;;101454:1;101450:15;;;101444:4;101437:29;101502:4;101498:12;;101492:4;101484:27;101543:4;101537;101529:19;101590:1;101584:4;101580:12;101574:4;101566:27;101639:4;101635:12;101629:4;101619:29;;100806:898;-1:-1:-1;;;100806:898:0:o;90518:197::-;90634:5;:72;;90675:17;;90697:1;:8;;;;90695:11;90675:31;:17;:31;90634:72;;;90642:17;;;;90663:1;:8;;;;90642:30;90634:72;90607:100;;;;;;;;;;;;;-1:-1:-1;;90518:197:0:o;87404:119::-;87765:17;;87468:4;;87512:2;87765:24;87793:1;87764:30;;;:35;87492:23;87661:146;87533:120;87765:17;;87598:4;;87642:2;87765:24;87793:1;87764:30;;;:35;87622:23;87661:146;87152:119;87765:17;;87216:4;;87260:2;87765:24;87793:1;87764:30;;;:35;87240:23;87661:146;86748:138;86826:4;86850:13;:4;:11;:13::i;:::-;:28;;;;86867:11;:2;:9;:11::i;87022:122::-;87765:17;;87089:4;;87133:2;87765:24;87793:1;87764:30;;;:35;87113:23;87661:146;86898:116;87765:17;;86960:4;;87004:1;87765:24;87793:1;87764:30;;;:35;86984:22;87661:146;89529:99;89593:27;:5;89613:1;89615:4;89593:19;:27::i;86626:114::-;87765:17;;86686:4;;86730:1;87765:24;87793:1;87764:30;;;:35;86710:22;87661:146;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:330::-;311:3;349:5;343:12;376:6;371:3;364:19;392:76;461:6;454:4;449:3;445:14;438:4;431:5;427:16;392:76;:::i;:::-;513:2;501:15;518:66;497:88;488:98;;;;588:4;484:109;;269:330;-1:-1:-1;;269:330:1:o;604:220::-;753:2;742:9;735:21;716:4;773:45;814:2;803:9;799:18;791:6;773:45;:::i;829:154::-;915:42;908:5;904:54;897:5;894:65;884:93;;973:1;970;963:12;988:315;1056:6;1064;1117:2;1105:9;1096:7;1092:23;1088:32;1085:52;;;1133:1;1130;1123:12;1085:52;1172:9;1159:23;1191:31;1216:5;1191:31;:::i;:::-;1241:5;1293:2;1278:18;;;;1265:32;;-1:-1:-1;;;988:315:1:o;1500:118::-;1586:5;1579:13;1572:21;1565:5;1562:32;1552:60;;1608:1;1605;1598:12;1623:241;1679:6;1732:2;1720:9;1711:7;1707:23;1703:32;1700:52;;;1748:1;1745;1738:12;1700:52;1787:9;1774:23;1806:28;1828:5;1806:28;:::i;2051:456::-;2128:6;2136;2144;2197:2;2185:9;2176:7;2172:23;2168:32;2165:52;;;2213:1;2210;2203:12;2165:52;2252:9;2239:23;2271:31;2296:5;2271:31;:::i;:::-;2321:5;-1:-1:-1;2378:2:1;2363:18;;2350:32;2391:33;2350:32;2391:33;:::i;:::-;2051:456;;2443:7;;-1:-1:-1;;;2497:2:1;2482:18;;;;2469:32;;2051:456::o;3213:180::-;3272:6;3325:2;3313:9;3304:7;3300:23;3296:32;3293:52;;;3341:1;3338;3331:12;3293:52;-1:-1:-1;3364:23:1;;3213:180;-1:-1:-1;3213:180:1:o;4134:159::-;4201:20;;4261:6;4250:18;;4240:29;;4230:57;;4283:1;4280;4273:12;4230:57;4134:159;;;:::o;4298:319::-;4365:6;4373;4426:2;4414:9;4405:7;4401:23;4397:32;4394:52;;;4442:1;4439;4432:12;4394:52;4481:9;4468:23;4500:31;4525:5;4500:31;:::i;:::-;4550:5;-1:-1:-1;4574:37:1;4607:2;4592:18;;4574:37;:::i;:::-;4564:47;;4298:319;;;;;:::o;4622:274::-;4680:6;4733:2;4721:9;4712:7;4708:23;4704:32;4701:52;;;4749:1;4746;4739:12;4701:52;4788:9;4775:23;4838:8;4831:5;4827:20;4820:5;4817:31;4807:59;;4862:1;4859;4852:12;4901:184;4953:77;4950:1;4943:88;5050:4;5047:1;5040:15;5074:4;5071:1;5064:15;5090:980;5158:6;5211:2;5199:9;5190:7;5186:23;5182:32;5179:52;;;5227:1;5224;5217:12;5179:52;5267:9;5254:23;5296:18;5337:2;5329:6;5326:14;5323:34;;;5353:1;5350;5343:12;5323:34;5391:6;5380:9;5376:22;5366:32;;5436:7;5429:4;5425:2;5421:13;5417:27;5407:55;;5458:1;5455;5448:12;5407:55;5494:2;5481:16;5516:2;5512;5509:10;5506:36;;;5522:18;;:::i;:::-;5656:2;5650:9;5718:4;5710:13;;5561:66;5706:22;;;5730:2;5702:31;5698:40;5686:53;;;5754:18;;;5774:22;;;5751:46;5748:72;;;5800:18;;:::i;:::-;5840:10;5836:2;5829:22;5875:2;5867:6;5860:18;5915:7;5910:2;5905;5901;5897:11;5893:20;5890:33;5887:53;;;5936:1;5933;5926:12;5887:53;5992:2;5987;5983;5979:11;5974:2;5966:6;5962:15;5949:46;6037:1;6015:15;;;6032:2;6011:24;6004:35;;;;-1:-1:-1;6019:6:1;5090:980;-1:-1:-1;;;;;5090:980:1:o;6075:184::-;6133:6;6186:2;6174:9;6165:7;6161:23;6157:32;6154:52;;;6202:1;6199;6192:12;6154:52;6225:28;6243:9;6225:28;:::i;6264:288::-;6322:6;6375:2;6363:9;6354:7;6350:23;6346:32;6343:52;;;6391:1;6388;6381:12;6343:52;6430:9;6417:23;6480:22;6473:5;6469:34;6462:5;6459:45;6449:73;;6518:1;6515;6508:12;6557:247;6616:6;6669:2;6657:9;6648:7;6644:23;6640:32;6637:52;;;6685:1;6682;6675:12;6637:52;6724:9;6711:23;6743:31;6768:5;6743:31;:::i;6906:375::-;6999:5;7022:1;7032:243;7046:4;7043:1;7040:11;7032:243;;;7109:13;;7124:42;7105:62;7093:75;;7191:4;7215:12;;;;7250:15;;;;7066:1;7059:9;7032:243;;7286:1645;7502:13;;2761:4;2750:16;2738:29;;7472:3;7457:19;;7574:4;7566:6;7562:17;7556:24;7589:53;7636:4;7625:9;7621:20;7607:12;3474:6;3463:18;3451:31;;3398:90;7589:53;;7691:4;7683:6;7679:17;7673:24;7706:55;7755:4;7744:9;7740:20;7724:14;3474:6;3463:18;3451:31;;3398:90;7706:55;;7810:4;7802:6;7798:17;7792:24;7825:55;7874:4;7863:9;7859:20;7843:14;3474:6;3463:18;3451:31;;3398:90;7825:55;;7929:4;7921:6;7917:17;7911:24;7944:55;7993:4;7982:9;7978:20;7962:14;3474:6;3463:18;3451:31;;3398:90;7944:55;;8048:4;8040:6;8036:17;8030:24;8063:55;8112:4;8101:9;8097:20;8081:14;3474:6;3463:18;3451:31;;3398:90;8063:55;;8167:4;8159:6;8155:17;8149:24;8182:55;8231:4;8220:9;8216:20;8200:14;3474:6;3463:18;3451:31;;3398:90;8182:55;;8286:4;8278:6;8274:17;8268:24;8301:55;8350:4;8339:9;8335:20;8319:14;3474:6;3463:18;3451:31;;3398:90;8301:55;-1:-1:-1;8375:6:1;8418:15;;;8412:22;3474:6;3463:18;;;8477;;;3451:31;;;;8515:6;8558:15;;;8552:22;3463:18;;;8617;;;3451:31;8655:6;8698:15;;;8692:22;6885:8;6874:20;8757:18;;;6862:33;8795:6;8839:15;;;8833:22;8864:61;8906:18;;;8833:22;8864:61;:::i;:::-;;;7286:1645;;;;:::o;8936:1335::-;9333:66;9325:6;9321:79;9310:9;9303:98;9284:4;9420:2;9458:3;9453:2;9442:9;9438:18;9431:31;9485:46;9526:3;9515:9;9511:19;9503:6;9485:46;:::i;:::-;9579:9;9571:6;9567:22;9562:2;9551:9;9547:18;9540:50;9613:33;9639:6;9631;9613:33;:::i;:::-;9677:2;9662:18;;9655:34;;;9738:42;9726:55;;9720:3;9705:19;;9698:84;9813:3;9798:19;;9791:35;;;9863:22;;;9857:3;9842:19;;9835:51;9935:13;;9957:22;;;10007:2;10033:15;;;;-1:-1:-1;9995:15:1;;;;-1:-1:-1;10076:169:1;10090:6;10087:1;10084:13;10076:169;;;10151:13;;10139:26;;10220:15;;;;10185:12;;;;10112:1;10105:9;10076:169;;;-1:-1:-1;10262:3:1;;8936:1335;-1:-1:-1;;;;;;;;;;;;8936:1335:1:o;10276:156::-;10342:20;;10402:4;10391:16;;10381:27;;10371:55;;10422:1;10419;10412:12;10437:317;10503:6;10511;10564:2;10552:9;10543:7;10539:23;10535:32;10532:52;;;10580:1;10577;10570:12;10532:52;10619:9;10606:23;10638:31;10663:5;10638:31;:::i;:::-;10688:5;-1:-1:-1;10712:36:1;10744:2;10729:18;;10712:36;:::i;10990:280::-;11048:6;11101:2;11089:9;11080:7;11076:23;11072:32;11069:52;;;11117:1;11114;11107:12;11069:52;11156:9;11143:23;11206:14;11199:5;11195:26;11188:5;11185:37;11175:65;;11236:1;11233;11226:12;11275:383;11352:6;11360;11368;11421:2;11409:9;11400:7;11396:23;11392:32;11389:52;;;11437:1;11434;11427:12;11389:52;11476:9;11463:23;11495:31;11520:5;11495:31;:::i;:::-;11545:5;11597:2;11582:18;;11569:32;;-1:-1:-1;11648:2:1;11633:18;;;11620:32;;11275:383;-1:-1:-1;;;11275:383:1:o;11663:734::-;11774:6;11782;11790;11798;11806;11814;11822;11875:3;11863:9;11854:7;11850:23;11846:33;11843:53;;;11892:1;11889;11882:12;11843:53;11931:9;11918:23;11950:31;11975:5;11950:31;:::i;:::-;12000:5;-1:-1:-1;12057:2:1;12042:18;;12029:32;12070:33;12029:32;12070:33;:::i;:::-;12122:7;-1:-1:-1;12176:2:1;12161:18;;12148:32;;-1:-1:-1;12227:2:1;12212:18;;12199:32;;-1:-1:-1;12250:37:1;12282:3;12267:19;;12250:37;:::i;:::-;12240:47;;12334:3;12323:9;12319:19;12306:33;12296:43;;12386:3;12375:9;12371:19;12358:33;12348:43;;11663:734;;;;;;;;;;:::o;12402:388::-;12470:6;12478;12531:2;12519:9;12510:7;12506:23;12502:32;12499:52;;;12547:1;12544;12537:12;12499:52;12586:9;12573:23;12605:31;12630:5;12605:31;:::i;:::-;12655:5;-1:-1:-1;12712:2:1;12697:18;;12684:32;12725:33;12684:32;12725:33;:::i;:::-;12777:7;12767:17;;;12402:388;;;;;:::o;12795:184::-;12847:77;12844:1;12837:88;12944:4;12941:1;12934:15;12968:4;12965:1;12958:15;12984:171;13052:6;13091:10;;;13079;;;13075:27;;13114:12;;;13111:38;;;13129:18;;:::i;:::-;13111:38;12984:171;;;;:::o;13160:184::-;13230:6;13283:2;13271:9;13262:7;13258:23;13254:32;13251:52;;;13299:1;13296;13289:12;13251:52;-1:-1:-1;13322:16:1;;13160:184;-1:-1:-1;13160:184:1:o;13349:::-;13401:77;13398:1;13391:88;13498:4;13495:1;13488:15;13522:4;13519:1;13512:15;13538:125;13603:9;;;13624:10;;;13621:36;;;13637:18;;:::i;14303:306::-;14391:6;14399;14407;14460:2;14448:9;14439:7;14435:23;14431:32;14428:52;;;14476:1;14473;14466:12;14428:52;14505:9;14499:16;14489:26;;14555:2;14544:9;14540:18;14534:25;14524:35;;14599:2;14588:9;14584:18;14578:25;14568:35;;14303:306;;;;;:::o;14614:251::-;14684:6;14737:2;14725:9;14716:7;14712:23;14708:32;14705:52;;;14753:1;14750;14743:12;14705:52;14785:9;14779:16;14804:31;14829:5;14804:31;:::i;16597:213::-;16635:3;16663:22;16720:2;16713:5;16709:14;16747:2;16738:7;16735:15;16732:41;;16753:18;;:::i;:::-;16802:1;16789:15;;16597:213;-1:-1:-1;;;16597:213:1:o;17634:287::-;17763:3;17801:6;17795:13;17817:66;17876:6;17871:3;17864:4;17856:6;17852:17;17817:66;:::i;:::-;17899:16;;;;;17634:287;-1:-1:-1;;17634:287:1:o;18589:184::-;18641:77;18638:1;18631:88;18738:4;18735:1;18728:15;18762:4;18759:1;18752:15;19560:1058;19821:4;19869:3;19858:9;19854:19;19912:26;19904:6;19900:39;19889:9;19882:58;19959:2;19997:6;19992:2;19981:9;19977:18;19970:34;20040:3;20035:2;20024:9;20020:18;20013:31;20064:6;20099;20093:13;20130:6;20122;20115:22;20168:3;20157:9;20153:19;20146:26;;20207:2;20199:6;20195:15;20181:29;;20228:1;20238:218;20252:6;20249:1;20246:13;20238:218;;;20317:13;;20332:42;20313:62;20301:75;;20431:15;;;;20396:12;;;;20274:1;20267:9;20238:218;;;-1:-1:-1;;20524:42:1;20512:55;;;;20507:2;20492:18;;20485:83;-1:-1:-1;;;20599:3:1;20584:19;20577:35;20473:3;19560:1058;-1:-1:-1;;;19560:1058:1:o;21500:245::-;21567:6;21620:2;21608:9;21599:7;21595:23;21591:32;21588:52;;;21636:1;21633;21626:12;21588:52;21668:9;21662:16;21687:28;21709:5;21687:28;:::i

Swarm Source

ipfs://9f3438133a31fabcd186600528d9fee7dfd0c26db84406c2f812a7f9746113b9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.