ETH Price: $3,615.91 (-2.06%)
Gas: 191 Gwei

Token

CryptiQ Ecosystem (CryptiQ)
 

Overview

Max Total Supply

37,535,000 CryptiQ

Holders

454 (0.00%)

Market

Price

$0.01 @ 0.000002 ETH

Onchain Market Cap

$236,547.07

Circulating Supply Market Cap

$239,066.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
282.63 CryptiQ

Value
$1.78 ( ~0.000492269562933248 Eth) [0.0008%]
0x14f45e4ff351eb91007c646996bbbb0077884ffe
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Cryptiq Web3 Browser & Ecosystem provides a secure and seamless Web3 experience, integrating blockchain technology for enhanced privacy and user control.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
UltimateToken

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-03-07
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

library Address {
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }
    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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 totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

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

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

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor() {
        _transferOwnership(_msgSender());
    }
    modifier onlyOwner() {
        _checkOwner();
        _;
    }
    function owner() public view virtual returns (address) {
        return _owner;
    }
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IERC20Permit {
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
    function nonces(address owner) external view returns (uint256);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

library SafeERC20 {
    using Address for address;
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
    }
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
        }
    }
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
            _callOptionalReturn(token, approvalCall);
        }
    }
    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
    }

    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
        // and not revert is the subcall reverts.

        (bool success, bytes memory returndata) = address(token).call(data);
        return
            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
    }
}

pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}
interface IUniswapV2Pair {
    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 factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    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;
}

pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

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

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}
pragma solidity 0.8.19;

interface IUniswapV2Caller {
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        address router,
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        uint256 deadline
    ) external;
}
interface IFee {
    function payFee(
        uint256 _tokenType,
        address creator,
        bool isAntibot,
        address referrer
    ) external payable;
}
contract UltimateToken is IERC20, Ownable {
    using SafeERC20 for IERC20;
    struct Args {
        string name;
        string symbol;
        uint8 decimals;
        uint256 totalSupply;
        uint256 maxWallet;
        uint256 maxTransactionAmount;
        address marketingWallet;
        address mainRouter;
        address baseTokenForMarket; 
        address treasuryWallet;       
        bool isMarketingFeeBaseToken;
        uint24 sellLiquidityFee;
        uint24 buyLiquidityFee;
        uint24 sellMarketingFee;
        uint24 buyMarketingFee;
        uint24 sellTreasuryFee;
        uint24 buyTreasuryFee;
        uint24 sellRewardFee;
        uint24 buyRewardFee;
        uint24 sellBurnFee;
        uint24 buyBurnFee;
        address feeContract;
        address uniswapV2Caller;
    }
    IUniswapV2Caller public uniswapV2Caller;
    address public baseTokenForMarket;
    uint8 private _decimals;
    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcluded;
    address[] private _excluded;
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal;
    uint256 private _rTotal;
    uint256 private _tRwardFeeTotal;
    string private _name;
    string private _symbol;

    uint256 private _rewardFee;
    uint256 private _previousRewardFee;

    uint256 private _liquidityFee;
    uint256 private _previousLiquidityFee;

    uint256 private _marketingFee;
    uint256 private _previousMarketingFee;

    uint256 private _treasuryFee;
    uint256 private _previousTreasuryFee;

    uint256 private _burnFee;
    uint256 private _previousBurnFee;

    bool private inSwapAndLiquify;
    uint24 public sellRewardFee;
    uint24 public buyRewardFee;
    uint24 public sellLiquidityFee;
    uint24 public buyLiquidityFee;

    uint24 public sellMarketingFee;
    uint24 public buyMarketingFee;

    uint24 public sellTreasuryFee;
    uint24 public buyTreasuryFee;

    uint24 public sellBurnFee;
    uint24 public buyBurnFee;

    address public marketingWallet;
    bool public isMarketingFeeBaseToken;
    address public treasuryWallet;



    uint256 public minAmountToTakeFee;
    uint256 public maxWallet;
    uint256 public maxTransactionAmount;


    IUniswapV2Router02 public mainRouter;
    address public mainPair;

    mapping(address => bool) public isExcludedFromFee;
    mapping(address => bool) public isExcludedFromMaxTransactionAmount;
    mapping(address => bool) public automatedMarketMakerPairs;

    uint256 private _liquidityFeeTokens;
    uint256 private _marketingFeeTokens;
    uint256 private _treasuryFeeTokens;

    event UpdateLiquidityFee(
        uint24 newSellLiquidityFee,
        uint24 newBuyLiquidityFee,
        uint24 oldSellLiquidityFee,
        uint24 oldBuyLiquidityFee
    );
    event UpdateMarketingFee(
        uint24 newSellMarketingFee,
        uint24 newBuyMarketingFee,
        uint24 oldSellMarketingFee,
        uint24 oldBuyMarketingFee
    );
    event UpdateTreasuryFee(
        uint24 newSellTreasuryFee,
        uint24 newBuyTreasuryFee,
        uint24 oldSellTreasuryFee,
        uint24 oldBuyTreasuryFee
    );
    event UpdateBurnFee(
        uint24 newSellBurnFee,
        uint24 newBuyBurnFee,
        uint24 oldSellBurnFee,
        uint24 oldBuyBurnFee
    );
    event UpdateRewardFee(
        uint24 newSellRewardFee,
        uint24 newBuyRewardFee,
        uint24 oldSellRewardFee,
        uint24 oldBuyRewardFee
    );  
    event UpdateMarketingWallet(
        address indexed newMarketingWallet,
        bool newIsMarketingFeeBaseToken,
        address indexed oldMarketingWallet,
        bool oldIsMarketingFeeBaseToken
    );
    event UpdateTreasuryWallet(
        address indexed newTreasuryWallet,
        address indexed oldTreasuryWallet
    );
    event MainRouterUpdated(address mainRouter, address mainPair, address baseTokenForMarket);

    event UpdateMinAmountToTakeFee(uint256 newMinAmountToTakeFee, uint256 oldMinAmountToTakeFee);
    event SetAutomatedMarketMakerPair(address indexed pair, bool value);
    event ExcludedFromFee(address indexed account, bool isEx);
    event SwapAndLiquify(uint256 tokensForLiquidity, uint256 baseTokenForLiquidity);
    event MarketingFeeTaken(
        uint256 marketingFeeTokens,
        uint256 marketingFeeBaseTokenSwapped
    );
    event TreasuryFeeTaken(
        uint256 amount
    );
    event ExcludedFromMaxTransactionAmount(address indexed account, bool isExcluded);
    event UpdateMaxWallet(uint256 newMaxWallet, uint256 oldMaxWallet);
    event UpdateMaxTransactionAmount(uint256 newMaxTransactionAmount, uint256 oldMaxTransactionAmount);
    constructor(
        Args memory args,
        address[] memory autoApproveAddressList,
        address referrer
    ) payable {
        IFee(args.feeContract).payFee{value: msg.value}(4, _msgSender(), false, referrer);    
        uniswapV2Caller = IUniswapV2Caller(args.uniswapV2Caller);
        baseTokenForMarket=args.baseTokenForMarket;
        _decimals = args.decimals;
        _name = args.name;
        _symbol = args.symbol;
        _tTotal = args.totalSupply;
        _rTotal = (MAX - (MAX % _tTotal));
        _rOwned[_msgSender()] = _rTotal;
        _tOwned[_msgSender()] = _tTotal;
        require(args.marketingWallet != address(0), "marketing wallet can not be 0");
        require(args.mainRouter != address(0), "Router address can not be 0");
        require(args.treasuryWallet != address(0), "Treasury wallet can not be 0");
        require(args.treasuryWallet != args.marketingWallet, "Treasury wallet can not be same with marketing wallet");
        require(args.sellLiquidityFee+ args.sellMarketingFee + args.sellRewardFee + args.sellTreasuryFee + args.sellBurnFee <= 300000, "sell total fee <= 30%");
        require(args.buyLiquidityFee+ args.buyMarketingFee + args.buyRewardFee + args.buyTreasuryFee + args.buyBurnFee <= 300000, "buy total fee <= 30%");
        require(args.sellLiquidityFee < 150000, "each fee < 15%");
        require(args.buyLiquidityFee < 150000, "each fee < 15%");
        require(args.sellMarketingFee < 150000, "each fee < 15%");
        require(args.buyMarketingFee < 150000, "each fee < 15%");
        require(args.sellRewardFee < 150000, "each fee < 15%");
        require(args.buyRewardFee < 150000, "each fee < 15%");
        require(args.sellTreasuryFee < 150000, "each fee < 15%");
        require(args.buyTreasuryFee < 150000, "each fee < 15%");
        require(args.sellBurnFee < 150000, "each fee < 15%");
        require(args.buyBurnFee < 150000, "each fee < 15%");
        marketingWallet = args.marketingWallet;
        treasuryWallet = args.treasuryWallet;
        isMarketingFeeBaseToken = args.isMarketingFeeBaseToken;
        emit UpdateMarketingWallet(
            marketingWallet,
            isMarketingFeeBaseToken,
            address(0),
            false
        );
        emit UpdateTreasuryWallet(
            treasuryWallet,
            address(0)
        );
        mainRouter = IUniswapV2Router02(args.mainRouter);
        if(baseTokenForMarket != mainRouter.WETH()){            
            IERC20(baseTokenForMarket).approve(address(mainRouter), MAX);            
        }
        _approve(address(this), address(uniswapV2Caller), MAX);
        _approve(address(this), address(mainRouter), MAX);
        for(uint256 i=0;i<autoApproveAddressList.length;i++){
            _approve(_msgSender(), autoApproveAddressList[i], MAX);
            isExcludedFromFee[autoApproveAddressList[i]] = true;
            isExcludedFromMaxTransactionAmount[autoApproveAddressList[i]]=true;
        }

        mainPair = IUniswapV2Factory(mainRouter.factory()).createPair(
            address(this),
            baseTokenForMarket
        );
        emit MainRouterUpdated(address(mainRouter), mainPair, baseTokenForMarket);
      
        sellLiquidityFee = args.sellLiquidityFee;
        buyLiquidityFee = args.buyLiquidityFee;
        emit UpdateLiquidityFee(
            sellLiquidityFee,
            buyLiquidityFee,
            0,
            0
        );
        sellMarketingFee = args.sellMarketingFee;
        buyMarketingFee = args.buyMarketingFee;
        emit UpdateMarketingFee(
            sellMarketingFee,
            buyMarketingFee,
            0,
            0
        );
        sellTreasuryFee = args.sellTreasuryFee;
        buyTreasuryFee = args.buyTreasuryFee;
        emit UpdateTreasuryFee(
            sellTreasuryFee,
            buyTreasuryFee,
            0,
            0
        );
        sellBurnFee = args.sellBurnFee;
        buyBurnFee = args.buyBurnFee;
        emit UpdateBurnFee(
            sellBurnFee,
            buyBurnFee,
            0,
            0
        );
        sellRewardFee = args.sellRewardFee;
        buyRewardFee = args.buyRewardFee;
        emit UpdateRewardFee(
            sellRewardFee,
            buyRewardFee,
            0,
            0
        );
        minAmountToTakeFee = args.totalSupply/10000;
        emit UpdateMinAmountToTakeFee(minAmountToTakeFee, 0);
        require(args.maxTransactionAmount>=args.totalSupply / 10000, "maxTransactionAmount >= total supply / 10000");
        require(args.maxWallet>=args.totalSupply / 10000, "maxWallet >= total supply / 10000");
        maxWallet=args.maxWallet;
        emit UpdateMaxWallet(maxWallet, 0);
        maxTransactionAmount=args.maxTransactionAmount;
        emit UpdateMaxTransactionAmount(maxTransactionAmount, 0);
        _isExcluded[address(0xdead)] = true;
        _excluded.push(address(0xdead));
        _isExcluded[address(this)] = true;
        _excluded.push(address(this));
        _isExcluded[treasuryWallet] = true;
        _excluded.push(treasuryWallet);

        isExcludedFromFee[address(this)] = true;
        isExcludedFromFee[marketingWallet] = true;
        isExcludedFromFee[treasuryWallet] = true;
        isExcludedFromFee[_msgSender()] = true;
        isExcludedFromFee[address(0xdead)] = true;
        isExcludedFromMaxTransactionAmount[address(0xdead)]=true;
        isExcludedFromMaxTransactionAmount[address(this)]=true;
        isExcludedFromMaxTransactionAmount[marketingWallet]=true;
        isExcludedFromMaxTransactionAmount[treasuryWallet]=true;
        isExcludedFromMaxTransactionAmount[_msgSender()]=true;
        _setAutomatedMarketMakerPair(mainPair, true);
        emit Transfer(address(0), _msgSender(), args.totalSupply);
    }

    function updateMainPair(
        address _mainRouter,
        address _baseTokenForMarket
    ) external onlyOwner
    {
        baseTokenForMarket = _baseTokenForMarket;
        if(address(mainRouter) != _mainRouter){
            _approve(address(this), _mainRouter, MAX);
            mainRouter = IUniswapV2Router02(_mainRouter);
        } 
        mainPair = IUniswapV2Factory(mainRouter.factory()).createPair(
            address(this),
            baseTokenForMarket
        );
        if(baseTokenForMarket != mainRouter.WETH()){            
            IERC20(baseTokenForMarket).safeApprove(address(mainRouter), MAX);
        }
        emit MainRouterUpdated(address(mainRouter), mainPair, baseTokenForMarket);
        _setAutomatedMarketMakerPair(mainPair, true);

    }
 
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        (           
            // uint256 tTransferAmount,
            uint256 tRwardFee,
            uint256 tLiquidity,
            uint256 tMarketing,
            uint256 tTreasury,
            uint256 tBurn
        ) = _getTValues(amount);
        uint256 tTransferAmount = amount - tRwardFee - tLiquidity - tMarketing - tTreasury - tBurn;
        uint256 currentRate = _getRate();
        {
            //burn
            _tTotal = _tTotal - tBurn;
            _rTotal = _rTotal - tBurn*currentRate;
            emit Transfer(sender, address(0), tBurn);
        }
        {
            //marketing & liquidity & treasury burn fee collected in the token contract
            _liquidityFeeTokens = _liquidityFeeTokens+tLiquidity;
            _marketingFeeTokens = _marketingFeeTokens+tMarketing;
            _treasuryFeeTokens = _treasuryFeeTokens+tTreasury;
            uint256 tTotalFee = tLiquidity+tMarketing+tTreasury;
            _rOwned[address(this)] = _rOwned[address(this)]+tTotalFee * currentRate;
            if (_isExcluded[address(this)])
                _tOwned[address(this)] = _tOwned[address(this)]+tTotalFee;
            emit Transfer(sender, address(this), tTotalFee);
        }
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _tOwned[sender] = _tOwned[sender]-amount;
            _rOwned[sender] = _rOwned[sender]-amount*currentRate;
            _rOwned[recipient] = _rOwned[recipient]+tTransferAmount*currentRate;
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _rOwned[sender] = _rOwned[sender]-amount*currentRate;
            _tOwned[recipient] = _tOwned[recipient]+tTransferAmount;
            _rOwned[recipient] = _rOwned[recipient]+tTransferAmount*currentRate;
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _tOwned[sender] = _tOwned[sender]-amount;
            _rOwned[sender] = _rOwned[sender]-amount*currentRate;
            _tOwned[recipient] = _tOwned[recipient]+tTransferAmount;
            _rOwned[recipient] = _rOwned[recipient]+tTransferAmount*currentRate;
        } else {
            _rOwned[sender] = _rOwned[sender]-amount*currentRate;
            _rOwned[recipient] = _rOwned[recipient]+tTransferAmount*currentRate;
        }
        _reflectFee(tRwardFee*currentRate, tRwardFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }


    function updateMaxWallet(uint256 _maxWallet) external onlyOwner {
        require(_maxWallet>=_tTotal / 10000, "maxWallet >= totalSupply / 10000");
        emit UpdateMaxWallet(_maxWallet, maxWallet);
        maxWallet = _maxWallet;
    }

    function updateMaxTransactionAmount(uint256 _maxTransactionAmount)
        external
        onlyOwner
    {
        require(_maxTransactionAmount>=_tTotal / 10000, "maxTransactionAmount >= totalSupply / 10000");  
        emit UpdateMaxTransactionAmount(_maxTransactionAmount, maxTransactionAmount);
        maxTransactionAmount = _maxTransactionAmount;
    }   
    function _reflectFee(uint256 rRwardFee, uint256 tRwardFee) private {
        _rTotal = _rTotal-rRwardFee;
        _tRwardFeeTotal = _tRwardFeeTotal+tRwardFee;
    }

    function _getTValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tRwardFee = calculateRewardFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tMarketing = calculateMarketingFee(tAmount);
        uint256 tTreasury = calculateTreasuryFee(tAmount);
        uint256 tBurn = calculateBurnFee(tAmount);
        // uint256 tTransferAmount = tAmount - tRwardFee - tLiquidity - tMarketing - tTreasury - tBurn;
        return (tRwardFee, tLiquidity, tMarketing, tTreasury, tBurn);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply/tSupply;
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (
                _rOwned[_excluded[i]] > rSupply ||
                _tOwned[_excluded[i]] > tSupply
            ) return (_rTotal, _tTotal);
            rSupply = rSupply-_rOwned[_excluded[i]];
            tSupply = tSupply-_tOwned[_excluded[i]];
        }
        if (rSupply < _rTotal/_tTotal) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function removeAllFee() private {
        _previousRewardFee = _rewardFee;
        _previousLiquidityFee = _liquidityFee;
        _previousMarketingFee = _marketingFee;
        _previousTreasuryFee = _treasuryFee;
        _previousBurnFee = _burnFee;

        _burnFee = 0;
        _treasuryFee = 0;
        _marketingFee = 0;
        _rewardFee = 0;
        _liquidityFee = 0;
    }

    function restoreAllFee() private {
        _burnFee = _previousBurnFee;
        _treasuryFee = _previousTreasuryFee;
        _rewardFee = _previousRewardFee;
        _liquidityFee = _previousLiquidityFee;
        _marketingFee = _previousMarketingFee;
    }

    function calculateRewardFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*_rewardFee/(10**6);
    }

    function calculateLiquidityFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*_liquidityFee/(10**6);
    }

    function calculateMarketingFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*_marketingFee/(10**6);
    }

    function calculateTreasuryFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*_treasuryFee/(10**6);
    }

    function calculateBurnFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*_burnFee/(10**6);
    }

    /////////////////////////////////////////////////////////////////////////////////
    function name() external view returns (string memory) {
        return _name;
    }

    function symbol() external view returns (string memory) {
        return _symbol;
    }

    function decimals() external view returns (uint8) {
        return _decimals;
    }

    function totalSupply() external view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

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

    function allowance(address owner, address spender)
        external
        view
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount)
        public
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()]-amount
        );
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender]+(addedValue)
        );
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender]-(
                subtractedValue
            )
        );
        return true;
    }

    function isExcludedFromReward(address account)
        external
        view
        returns (bool)
    {
        return _isExcluded[account];
    }

    function totalFees() external view returns (uint256) {
        return _tRwardFeeTotal;
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee)
        external
        view
        returns (uint256)
    {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        uint256 currentRate = _getRate();
        if (!deductTransferFee) {            
            uint256 rAmount = tAmount*currentRate;
            return rAmount;
        } else {
            (           
                uint256 tRwardFee,
                uint256 tLiquidity,
                uint256 tMarketing,
                uint256 tTreasury,
                uint256 tBurn         
            ) = _getTValues(tAmount);
            uint256 tTransferAmount = tAmount - tRwardFee - tLiquidity - tMarketing - tTreasury - tBurn;
            uint256 rTransferAmount = tTransferAmount * currentRate;
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount)
        public
        view
        returns (uint256)
    {
        require(
            rAmount <= _rTotal,
            "Amount must be less than total reflections"
        );
        uint256 currentRate = _getRate();
        return rAmount/currentRate;
    }

    function excludeFromReward(address account) public onlyOwner {
        require(!_isExcluded[account], "Account is already excluded");
        require(
            _excluded.length + 1 <= 50,
            "Cannot exclude more than 50 accounts.  Include a previously excluded address."
        );
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) public onlyOwner {
        require(_isExcluded[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                uint256 prev_rOwned=_rOwned[account];
                _rOwned[account]=_tOwned[account]*_getRate();
                _rTotal=_rTotal-prev_rOwned+_rOwned[account];
                _isExcluded[account] = false;
                _excluded[i] = _excluded[_excluded.length - 1];
                _excluded.pop();
                break;
            }
        }
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    function updateLiquidityFee(
        uint24 _sellLiquidityFee,
        uint24 _buyLiquidityFee
    ) external onlyOwner {
        require(
            _sellLiquidityFee + sellMarketingFee + sellRewardFee + sellTreasuryFee + sellBurnFee <= 300000,
            "sell total fee <= 30%"
        );
        require(
            _buyLiquidityFee + buyMarketingFee + buyRewardFee + buyTreasuryFee + buyBurnFee <= 300000,
            "buy total fee <= 30%"
        );
        require(_sellLiquidityFee<= 150000, "sell fee <= 15%");
        require(_buyLiquidityFee<= 150000, "buy fee <= 15%");
        emit UpdateLiquidityFee(
            _sellLiquidityFee,
            _buyLiquidityFee,
            sellLiquidityFee,
            buyLiquidityFee
        );
        sellLiquidityFee = _sellLiquidityFee;
        buyLiquidityFee = _buyLiquidityFee;        
    }

    function updateMarketingFee(
        uint24 _sellMarketingFee,
        uint24 _buyMarketingFee
    ) external onlyOwner {
        require(
            _sellMarketingFee + sellLiquidityFee + sellRewardFee + sellTreasuryFee + sellBurnFee <= 300000,
            "sell total fee <= 30%"
        );
        require(
            _buyMarketingFee + buyLiquidityFee +buyRewardFee + buyTreasuryFee + buyBurnFee <= 300000,
            "buy total fee <= 30%"
        );
        require(_sellMarketingFee<= 150000, "sell fee <= 15%");
        require(_buyMarketingFee<= 150000, "buy fee <= 15%");
        emit UpdateMarketingFee(
            _sellMarketingFee,
            _buyMarketingFee,
            sellMarketingFee,
            buyMarketingFee
        );
        sellMarketingFee = _sellMarketingFee;
        buyMarketingFee = _buyMarketingFee;        
    }

    function updateRewardFee(
        uint24 _sellRewardFee,
        uint24 _buyRewardFee
    ) external onlyOwner {
        require(
            _sellRewardFee + sellLiquidityFee + sellMarketingFee + sellTreasuryFee + sellBurnFee <= 300000,
            "sell total fee <= 30%"
        );
        require(
            _buyRewardFee + buyLiquidityFee + buyMarketingFee + buyTreasuryFee + buyBurnFee <= 300000,
            "buy total fee <= 30%"
        );
        require(_sellRewardFee<= 150000, "sell fee <= 15%");
        require(_buyRewardFee<= 150000, "buy fee <= 15%");
        emit UpdateRewardFee(
            _sellRewardFee, 
            _buyRewardFee,
            sellRewardFee, 
            buyRewardFee
        );
        sellRewardFee = _sellRewardFee;
        buyRewardFee = _buyRewardFee;        
    }

    function updateTreasuryFee(
        uint24 _sellTreasuryFee,
        uint24 _buyTreasuryFee
    ) external onlyOwner {
        require(
            _sellTreasuryFee + sellLiquidityFee + sellMarketingFee + sellRewardFee + sellBurnFee <= 300000,
            "sell total fee <= 30%"
        );
        require(
            _buyTreasuryFee + buyLiquidityFee + buyMarketingFee + buyRewardFee + buyBurnFee <= 300000,
            "buy total fee <= 30%"
        );
        require(_sellTreasuryFee<= 150000, "sell fee <= 15%");
        require(_buyTreasuryFee<= 150000, "buy fee <= 15%");
        emit UpdateTreasuryFee(
            _sellTreasuryFee, 
            _buyTreasuryFee,
            sellTreasuryFee, 
            buyTreasuryFee
        );
        sellTreasuryFee = _sellTreasuryFee;
        buyTreasuryFee = _buyTreasuryFee;        
    }

    function updateBurnFee(
        uint24 _sellBurnFee,
        uint24 _buyBurnFee
    ) external onlyOwner {
        require(
            _sellBurnFee + sellLiquidityFee + sellMarketingFee + sellTreasuryFee + sellRewardFee <= 300000,
            "sell total fee <= 30%"
        );
        require(
            _buyBurnFee + buyLiquidityFee + buyMarketingFee + buyTreasuryFee + buyRewardFee <= 300000,
            "buy total fee <= 30%"
        );
        require(_sellBurnFee<= 150000, "sell fee <= 15%");
        require(_buyBurnFee<= 150000, "buy fee <= 15%");
        emit UpdateBurnFee(
            _sellBurnFee, 
            _buyBurnFee,
            sellBurnFee, 
            buyBurnFee
        );
        sellBurnFee = _sellBurnFee;
        buyBurnFee = _buyBurnFee;        
    }

    function updateMarketingWallet(
        address _marketingWallet,
        bool _isMarketingFeeBaseToken
    ) external onlyOwner {
        require(_marketingWallet != address(0), "marketing wallet can't be 0");
        require(_marketingWallet != treasuryWallet, "marketing wallet can't be same with Treasury wallet");
        emit UpdateMarketingWallet(_marketingWallet, _isMarketingFeeBaseToken,
            marketingWallet, isMarketingFeeBaseToken);
        marketingWallet = _marketingWallet;
        isMarketingFeeBaseToken = _isMarketingFeeBaseToken;
        isExcludedFromFee[_marketingWallet] = true;    
        isExcludedFromMaxTransactionAmount[_marketingWallet]=true;    
    }

    function updateTreasuryWallet(
        address _treasuryWallet
    ) external onlyOwner {
        require(_treasuryWallet != address(0), "Treasury wallet can't be 0");
        require(_treasuryWallet != address(this), "Treasury wallet can't be the same as token");
        require(marketingWallet != _treasuryWallet, "marketing wallet can't be same with Treasury wallet");
        emit UpdateTreasuryWallet(_treasuryWallet,
            treasuryWallet);
        treasuryWallet = _treasuryWallet;
        isExcludedFromFee[_treasuryWallet] = true;    
        isExcludedFromMaxTransactionAmount[_treasuryWallet]=true;           
    }

    function updateMinAmountToTakeFee(uint256 _minAmountToTakeFee)
        external
        onlyOwner
    {
        require(_minAmountToTakeFee > 0, "minAmountToTakeFee > 0");
        emit UpdateMinAmountToTakeFee(_minAmountToTakeFee, minAmountToTakeFee);
        minAmountToTakeFee = _minAmountToTakeFee;        
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;
        if (value) excludeFromReward(pair);
        else includeInReward(pair);
        isExcludedFromMaxTransactionAmount[pair] = value;
        emit SetAutomatedMarketMakerPair(pair, value);
    }


    function excludeFromFee(address account, bool isEx) external onlyOwner {
        require(isExcludedFromFee[account] != isEx, "already");
        isExcludedFromFee[account] = isEx;
        emit ExcludedFromFee(account, isEx);
    }

    function excludeFromMaxTransactionAmount(address account, bool isEx)
        external
        onlyOwner
    {
        require(isExcludedFromMaxTransactionAmount[account]!=isEx, "already");
        isExcludedFromMaxTransactionAmount[account] = isEx;
        emit ExcludedFromMaxTransactionAmount(account, isEx);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");        
        uint256 contractTokenBalance = balanceOf(address(this));
        
        uint256 totalTokensTaken = _liquidityFeeTokens + _marketingFeeTokens;
        bool overMinimumTokenBalance = totalTokensTaken >=
            minAmountToTakeFee && totalTokensTaken <= contractTokenBalance;

        // Take Fee
        if (
            !inSwapAndLiquify &&
            overMinimumTokenBalance &&
            balanceOf(mainPair) > 0 &&
            automatedMarketMakerPairs[to]
        ) {
            takeFee();
        }
        removeAllFee();

        // If any account belongs to isExcludedFromFee account then remove the fee
        if (
            !inSwapAndLiquify &&
            !isExcludedFromFee[from] &&
            !isExcludedFromFee[to]
        ) {
            // Buy
            if (automatedMarketMakerPairs[from]) {
                _rewardFee = buyRewardFee;
                _liquidityFee = buyLiquidityFee;
                _marketingFee = buyMarketingFee;
                _treasuryFee = buyTreasuryFee;
                _burnFee = buyBurnFee;
            }
            // Sell
            else if (automatedMarketMakerPairs[to]) {
                _rewardFee = sellRewardFee;
                _liquidityFee = sellLiquidityFee;
                _marketingFee = sellMarketingFee;
                _treasuryFee = sellTreasuryFee;
                _burnFee = sellBurnFee;
            }
        }
        _tokenTransfer(from, to, amount);
        restoreAllFee();
        if (!inSwapAndLiquify) {
            if (!isExcludedFromMaxTransactionAmount[from]) {
                require(
                    amount <= maxTransactionAmount,
                    "ERC20: exceeds transfer limit"
                );
            }
            if (!isExcludedFromMaxTransactionAmount[to]) {
                require(
                    balanceOf(to) <= maxWallet,
                    "ERC20: exceeds max wallet limit"
                );
            }
        }
    }

    function takeFee() private lockTheSwap {
        // Halve the amount of liquidity tokens
        uint256 tokensForLiquidity = _liquidityFeeTokens / 2;
        uint256 initialBaseTokenBalance = baseTokenForMarket==mainRouter.WETH() ? address(this).balance
            : IERC20(baseTokenForMarket).balanceOf(address(this));
        uint256 baseTokenForLiquidity;
        uint256 baseTokenForTreasury;
        if (isMarketingFeeBaseToken) {
            uint256 tokensForSwap=tokensForLiquidity+_marketingFeeTokens + _treasuryFeeTokens;
            if(tokensForSwap>0)
                swapTokensForBaseToken(tokensForSwap);
            uint256 baseTokenBalance = baseTokenForMarket==mainRouter.WETH() ? address(this).balance-initialBaseTokenBalance
                : IERC20(baseTokenForMarket).balanceOf(address(this))-initialBaseTokenBalance;
            uint256 baseTokenForMarketing = baseTokenBalance*_marketingFeeTokens/tokensForSwap;
            baseTokenForLiquidity = baseTokenBalance*tokensForLiquidity/tokensForSwap;
            baseTokenForTreasury = baseTokenBalance - baseTokenForMarketing - baseTokenForLiquidity;
            if(baseTokenForMarketing>0){
                if(baseTokenForMarket==mainRouter.WETH()){
                    (bool success, )=address(marketingWallet).call{value: baseTokenForMarketing}("");
                    if(success){                       
                        emit MarketingFeeTaken(0, baseTokenForMarketing);
                    }
                }else{
                    IERC20(baseTokenForMarket).safeTransfer(marketingWallet, baseTokenForMarketing);
                    emit MarketingFeeTaken(0, baseTokenForMarketing);
                }       
            }            
        } else {
            uint256 tokensForSwap=tokensForLiquidity + _treasuryFeeTokens;
            if(tokensForSwap>0)
                swapTokensForBaseToken(tokensForSwap);
            uint256 baseTokenBalance = baseTokenForMarket==mainRouter.WETH() ? address(this).balance-initialBaseTokenBalance
                : IERC20(baseTokenForMarket).balanceOf(address(this))-initialBaseTokenBalance;
            baseTokenForLiquidity = baseTokenBalance*tokensForLiquidity/tokensForSwap;
            baseTokenForTreasury = baseTokenBalance - baseTokenForLiquidity;
            
            if(_marketingFeeTokens>0){
                _transfer(address(this), marketingWallet, _marketingFeeTokens);
                emit MarketingFeeTaken(_marketingFeeTokens, 0);
            }            
        }

        if (tokensForLiquidity > 0 && baseTokenForLiquidity > 0) {
            addLiquidity(tokensForLiquidity, baseTokenForLiquidity);
            emit SwapAndLiquify(tokensForLiquidity, baseTokenForLiquidity);
        }
        if(baseTokenForTreasury>0){
            if(baseTokenForMarket==mainRouter.WETH()){
                (bool success, )=address(treasuryWallet).call{value: baseTokenForTreasury}("");
                if(success){                    
                    emit TreasuryFeeTaken(baseTokenForTreasury);
                }
            }else{
                IERC20(baseTokenForMarket).safeTransfer(treasuryWallet, baseTokenForTreasury);
                emit TreasuryFeeTaken(baseTokenForTreasury);
            }       
        }
        _marketingFeeTokens = 0;
        _treasuryFeeTokens = 0;
        _liquidityFeeTokens = 0;
        if(balanceOf(address(this))>0){
            if(owner()!=address(0))
                _transfer(address(this), owner(), balanceOf(address(this)));  
            else
                _transfer(address(this), treasuryWallet, balanceOf(address(this)));  
        }
    }
    
    function swapTokensForBaseToken(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = baseTokenForMarket;
        if (path[1] == mainRouter.WETH()){
            mainRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
                tokenAmount,
                0, // accept any amount of BaseToken
                path,
                address(this),
                block.timestamp
            );
        }else{
            uniswapV2Caller.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                    address(mainRouter),
                    tokenAmount,
                    0, // accept any amount of BaseToken
                    path,
                    block.timestamp
                );
        }
    }

    function addLiquidity(uint256 tokenAmount, uint256 baseTokenAmount) private {        
        if (baseTokenForMarket == mainRouter.WETH()) 
            mainRouter.addLiquidityETH{value: baseTokenAmount}(
                address(this),
                tokenAmount,
                0, // slippage is unavoidable
                0, // slippage is unavoidable
                address(0xdead),
                block.timestamp
            );
        else{
            mainRouter.addLiquidity(
                address(this),
                baseTokenForMarket,
                tokenAmount,
                baseTokenAmount,
                0,
                0,
                address(0xdead),
                block.timestamp
            );
        }            
    }

    function treasuryBurn() payable external{
        address[] memory path = new address[](2);
        path[0] = baseTokenForMarket;
        path[1] = address(this);
        
        if (path[0] == mainRouter.WETH()){
            mainRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value:msg.value}(
                0, // accept any amount of BaseToken
                path,
                treasuryWallet,
                block.timestamp
            );
        }else{
            uint256 amount = IERC20(baseTokenForMarket).balanceOf(_msgSender());
            IERC20(baseTokenForMarket).safeTransferFrom(_msgSender(), address(this), amount);
            mainRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                amount,
                0, // accept any amount of BaseToken
                path,
                treasuryWallet,
                block.timestamp
            );
        }      
        {
            //burn
            if(_isExcluded[treasuryWallet]){
                _tTotal = _tTotal - _tOwned[treasuryWallet];
                _rTotal = _rTotal - _rOwned[treasuryWallet];
                emit Transfer(treasuryWallet, address(0), _tOwned[treasuryWallet]);
                _rOwned[treasuryWallet] = 0;
                _tOwned[treasuryWallet] = 0;      
            }else{
                uint256 _tBurn = tokenFromReflection(_rOwned[treasuryWallet]);
                _tTotal = _tTotal - _tBurn;
                _rTotal = _rTotal - _rOwned[treasuryWallet];
                emit Transfer(treasuryWallet, address(0), _tBurn);
                _rOwned[treasuryWallet] = 0;
                _tOwned[treasuryWallet] = 0;  
            }        
        }
    }
    function withdrawETH() external onlyOwner {
        (bool success, )=address(owner()).call{value: address(this).balance}("");
        require(success, "Failed in withdrawal");
    }
    function withdrawToken(address token) external onlyOwner{
        require(address(this) != token, "Not allowed");
        IERC20(token).safeTransfer(owner(), IERC20(token).balanceOf(address(this)));
    }
    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"maxWallet","type":"uint256"},{"internalType":"uint256","name":"maxTransactionAmount","type":"uint256"},{"internalType":"address","name":"marketingWallet","type":"address"},{"internalType":"address","name":"mainRouter","type":"address"},{"internalType":"address","name":"baseTokenForMarket","type":"address"},{"internalType":"address","name":"treasuryWallet","type":"address"},{"internalType":"bool","name":"isMarketingFeeBaseToken","type":"bool"},{"internalType":"uint24","name":"sellLiquidityFee","type":"uint24"},{"internalType":"uint24","name":"buyLiquidityFee","type":"uint24"},{"internalType":"uint24","name":"sellMarketingFee","type":"uint24"},{"internalType":"uint24","name":"buyMarketingFee","type":"uint24"},{"internalType":"uint24","name":"sellTreasuryFee","type":"uint24"},{"internalType":"uint24","name":"buyTreasuryFee","type":"uint24"},{"internalType":"uint24","name":"sellRewardFee","type":"uint24"},{"internalType":"uint24","name":"buyRewardFee","type":"uint24"},{"internalType":"uint24","name":"sellBurnFee","type":"uint24"},{"internalType":"uint24","name":"buyBurnFee","type":"uint24"},{"internalType":"address","name":"feeContract","type":"address"},{"internalType":"address","name":"uniswapV2Caller","type":"address"}],"internalType":"struct UltimateToken.Args","name":"args","type":"tuple"},{"internalType":"address[]","name":"autoApproveAddressList","type":"address[]"},{"internalType":"address","name":"referrer","type":"address"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isEx","type":"bool"}],"name":"ExcludedFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"mainRouter","type":"address"},{"indexed":false,"internalType":"address","name":"mainPair","type":"address"},{"indexed":false,"internalType":"address","name":"baseTokenForMarket","type":"address"}],"name":"MainRouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"marketingFeeTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketingFeeBaseTokenSwapped","type":"uint256"}],"name":"MarketingFeeTaken","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":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensForLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"baseTokenForLiquidity","type":"uint256"}],"name":"SwapAndLiquify","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":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TreasuryFeeTaken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"newSellBurnFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"newBuyBurnFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldSellBurnFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldBuyBurnFee","type":"uint24"}],"name":"UpdateBurnFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"newSellLiquidityFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"newBuyLiquidityFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldSellLiquidityFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldBuyLiquidityFee","type":"uint24"}],"name":"UpdateLiquidityFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"newSellMarketingFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"newBuyMarketingFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldSellMarketingFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldBuyMarketingFee","type":"uint24"}],"name":"UpdateMarketingFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMarketingWallet","type":"address"},{"indexed":false,"internalType":"bool","name":"newIsMarketingFeeBaseToken","type":"bool"},{"indexed":true,"internalType":"address","name":"oldMarketingWallet","type":"address"},{"indexed":false,"internalType":"bool","name":"oldIsMarketingFeeBaseToken","type":"bool"}],"name":"UpdateMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxTransactionAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMaxTransactionAmount","type":"uint256"}],"name":"UpdateMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxWallet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMaxWallet","type":"uint256"}],"name":"UpdateMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMinAmountToTakeFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMinAmountToTakeFee","type":"uint256"}],"name":"UpdateMinAmountToTakeFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"newSellRewardFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"newBuyRewardFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldSellRewardFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldBuyRewardFee","type":"uint24"}],"name":"UpdateRewardFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"newSellTreasuryFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"newBuyTreasuryFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldSellTreasuryFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldBuyTreasuryFee","type":"uint24"}],"name":"UpdateTreasuryFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newTreasuryWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldTreasuryWallet","type":"address"}],"name":"UpdateTreasuryWallet","type":"event"},{"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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenForMarket","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBurnFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTreasuryFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","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":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","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":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMarketingFeeBaseToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAmountToTakeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTreasuryFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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":"treasuryBurn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Caller","outputs":[{"internalType":"contract IUniswapV2Caller","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint24","name":"_sellBurnFee","type":"uint24"},{"internalType":"uint24","name":"_buyBurnFee","type":"uint24"}],"name":"updateBurnFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"_sellLiquidityFee","type":"uint24"},{"internalType":"uint24","name":"_buyLiquidityFee","type":"uint24"}],"name":"updateLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mainRouter","type":"address"},{"internalType":"address","name":"_baseTokenForMarket","type":"address"}],"name":"updateMainPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"_sellMarketingFee","type":"uint24"},{"internalType":"uint24","name":"_buyMarketingFee","type":"uint24"}],"name":"updateMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"bool","name":"_isMarketingFeeBaseToken","type":"bool"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTransactionAmount","type":"uint256"}],"name":"updateMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAmountToTakeFee","type":"uint256"}],"name":"updateMinAmountToTakeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"_sellRewardFee","type":"uint24"},{"internalType":"uint24","name":"_buyRewardFee","type":"uint24"}],"name":"updateRewardFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"_sellTreasuryFee","type":"uint24"},{"internalType":"uint24","name":"_buyTreasuryFee","type":"uint24"}],"name":"updateTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryWallet","type":"address"}],"name":"updateTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526040516200736738038062007367833981016040819052620000269162001e31565b6200003133620012ee565b6102a08301516001600160a01b031663a5970b48346004336040516001600160e01b031960e086901b16815260048101929092526001600160a01b03908116602483015260006044830152851660648201526084016000604051808303818588803b158015620000a057600080fd5b505af1158015620000b5573d6000803e3d6000fd5b5050506102c0850151600180546001600160a01b039283166001600160a01b031990911617905561010086015160028054604089015160ff16600160a01b026001600160a81b0319909116929093169190911791909117905550508251600b906200012190826200211a565b506020830151600c906200013690826200211a565b50606083015160088190556200014f90600019620021fc565b6200015d9060001962002229565b60098190553360009081526003602090815260408083209390935560085460049091529190205560c08301516001600160a01b0316620001e45760405162461bcd60e51b815260206004820152601d60248201527f6d61726b6574696e672077616c6c65742063616e206e6f74206265203000000060448201526064015b60405180910390fd5b60e08301516001600160a01b0316620002405760405162461bcd60e51b815260206004820152601b60248201527f526f7574657220616464726573732063616e206e6f74206265203000000000006044820152606401620001db565b6101208301516001600160a01b03166200029d5760405162461bcd60e51b815260206004820152601c60248201527f54726561737572792077616c6c65742063616e206e6f742062652030000000006044820152606401620001db565b8260c001516001600160a01b03168361012001516001600160a01b0316036200032f5760405162461bcd60e51b815260206004820152603560248201527f54726561737572792077616c6c65742063616e206e6f742062652073616d652060448201527f77697468206d61726b6574696e672077616c6c657400000000000000000000006064820152608401620001db565b620493e0836102600151846101e00151856102200151866101a001518761016001516200035d919062002245565b62000369919062002245565b62000375919062002245565b62000381919062002245565b62ffffff161115620003d65760405162461bcd60e51b815260206004820152601560248201527f73656c6c20746f74616c20666565203c3d2033302500000000000000000000006044820152606401620001db565b620493e0836102800151846102000151856102400151866101c0015187610180015162000404919062002245565b62000410919062002245565b6200041c919062002245565b62000428919062002245565b62ffffff1611156200047d5760405162461bcd60e51b815260206004820152601460248201527f62757920746f74616c20666565203c3d203330250000000000000000000000006044820152606401620001db565b620249f083610160015162ffffff1610620004cc5760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b6044820152606401620001db565b620249f083610180015162ffffff16106200051b5760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b6044820152606401620001db565b620249f0836101a0015162ffffff16106200056a5760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b6044820152606401620001db565b620249f0836101c0015162ffffff1610620005b95760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b6044820152606401620001db565b620249f083610220015162ffffff1610620006085760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b6044820152606401620001db565b620249f083610240015162ffffff1610620006575760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b6044820152606401620001db565b620249f0836101e0015162ffffff1610620006a65760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b6044820152606401620001db565b620249f083610200015162ffffff1610620006f55760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b6044820152606401620001db565b620249f083610260015162ffffff1610620007445760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b6044820152606401620001db565b620249f083610280015162ffffff1610620007935760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b6044820152606401620001db565b60c083015160188054610120860151601980546001600160a01b0319166001600160a01b039283161790556101408701519381166001600160a81b031990921691909117600160a01b931515840217918290556040805160ff94840494909416151584526000602085018190529392909116917fc8dfdd9b91ac62ee1bd8be3541ea02d8e584461c794c6e49e94ccf21c71ebcca910160405180910390a36019546040516000916001600160a01b0316907f79a52cbec002ef70283103eb4140713100276944fca2819713130141d04df183908390a360e0830151601d80546001600160a01b0319166001600160a01b039092169182179055604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa158015620008c8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008ee91906200226b565b6002546001600160a01b039081169116146200098357600254601d5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af11580156200095b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000981919062002289565b505b6001546200099f9030906001600160a01b03166000196200133e565b601d54620009bb9030906001600160a01b03166000196200133e565b60005b825181101562000ab557620009f933848381518110620009e257620009e2620022a7565b60200260200101516000196200133e60201b60201c565b6001601f600085848151811062000a145762000a14620022a7565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555060016020600085848151811062000a6e5762000a6e620022a7565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558062000aac81620022bd565b915050620009be565b50601d60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000b0a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b3091906200226b565b6002546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801562000b82573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ba891906200226b565b601e80546001600160a01b0319166001600160a01b03928316908117909155601d546002546040805192851683526020830193909352909216908201527f113a6e83812f48b2f83795e33cb009afb4ba6e240c9c643c5dc75791e4ce7ab69060600160405180910390a16101608301516017805461018086015165ffffffffffff60381b1990911667010000000000000062ffffff948516810262ffffff60501b1916919091176a0100000000000000000000928516830217928390556040805191840485168252919092049092166020820152600091810182905260608101919091527fdec183740138e3a28dfd6f973ecd3bf00cd5d9b2544f6763c0a87f721444c5d19060800160405180910390a16101a0830151601780546101c086015165ffffffffffff60681b199091166d010000000000000000000000000062ffffff948516810262ffffff60801b191691909117600160801b928516830217928390556040805191840485168252919092049092166020820152600091810182905260608101919091527f70748cb9cb3bcb4dfd4fff8f2a6f23f636067b33e0244631f9abd38159c1de859060800160405180910390a16101e08301516017805461020086015165ffffffffffff60981b19909116600160981b62ffffff948516810262ffffff60b01b191691909117600160b01b928516830217928390556040805191840485168252919092049092166020820152600091810182905260608101919091527fc239c020ec275d4a3e59d37954f59c061e7302d35a1b6bad801059aafe9631ee9060800160405180910390a16102608301516017805461028086015165ffffffffffff60c81b19909116600160c81b62ffffff948516810262ffffff60e01b191691909117600160e01b928516830217928390556040805191840485168252919092049092166020820152600091810182905260608101919091527fdc717222e8a01249bcfb0a887e700321c9465eda757255fd7895bd39fab714d29060800160405180910390a16102208301516017805461024086015166ffffffffffff001990911661010062ffffff948516810262ffffff60201b191691909117640100000000928516830217928390556040805191840485168252919092049092166020820152600091810182905260608101919091527f2e7d9780ec398c47872eab5651ba43f0fa44ffed738321577e0db663fe8a05a59060800160405180910390a1612710836060015162000f449190620022d9565b601a81905560408051918252600060208301527f772a06bc936eb749842080c472181e970cd4f23bd1ab7d0b84a80aec26910434910160405180910390a1612710836060015162000f969190620022d9565b8360a001511015620010005760405162461bcd60e51b815260206004820152602c60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c20737560448201526b070706c79202f2031303030360a41b6064820152608401620001db565b6127108360600151620010149190620022d9565b83608001511015620010735760405162461bcd60e51b815260206004820152602160248201527f6d617857616c6c6574203e3d20746f74616c20737570706c79202f20313030306044820152600360fc1b6064820152608401620001db565b6080830151601b81905560408051918252600060208301527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a160a0830151601c81905560408051918252600060208301527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1600660209081527f1aecba4ebe7a4e0673e4891b2b092b2228e4322380b579fb494fad3da8586e228054600160ff19918216811790925560078054808401825560008051602062007347833981519152908101805461dead6001600160a01b031991821617909155306000818152604080822080548816891790558554808901875585018054851684179055601980546001600160a01b03908116845282842080548a168b17905581548854808c019099559790960180549787169790951696909617909355818152601f8852828120805487168817905560188054851682528382208054881689179055855485168252838220805488168917905533808352848320805489168a1790557fef94442dfc0e910ca743614215a10fad3ff708bf5378f9c5c958c9192b3bf004805489168a1790559880527fcbaad361c71be11fa6bdbe0e740c6259be964b32182da2da47b54472477c6a178054881689179055918152828120805487168817905590548316815281812080548616871790559254821683528083208054851686179055948252939020805490911682179055601e54620012a892169062001466565b606083015160405190815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505062002336565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316620013a25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401620001db565b6001600160a01b038216620014055760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620001db565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03821660009081526021602052604090205481151560ff909116151503620014fe5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401620001db565b6001600160a01b0382166000908152602160205260409020805460ff191682158015919091179091556200153d576200153782620015a5565b62001548565b62001548826200176b565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab910160405180910390a25050565b620015af620019a0565b6001600160a01b03811660009081526006602052604090205460ff16156200161a5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401620001db565b6007546032906200162d906001620022f0565b1115620016b95760405162461bcd60e51b815260206004820152604d60248201527f43616e6e6f74206578636c756465206d6f7265207468616e203530206163636f60448201527f756e74732e2020496e636c75646520612070726576696f75736c79206578636c60648201526c3ab232b21030b2323932b9b99760991b608482015260a401620001db565b6001600160a01b0381166000908152600360205260409020541562001716576001600160a01b038116600090815260036020526040902054620016fc90620019fe565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600660205260408120805460ff19166001908117909155600780549182018155909152600080516020620073478339815191520180546001600160a01b0319169091179055565b62001775620019a0565b6001600160a01b03811660009081526006602052604090205460ff16620017df5760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401620001db565b60005b6007548110156200199c57816001600160a01b0316600782815481106200180d576200180d620022a7565b6000918252602090912001546001600160a01b03160362001987576001600160a01b0382166000908152600360205260409020546200184b62001a88565b6001600160a01b03841660009081526004602052604090205462001870919062002306565b6001600160a01b03841660009081526003602052604090208190556009546200189b90839062002229565b620018a79190620022f0565b6009556001600160a01b0383166000908152600660205260409020805460ff1916905560078054620018dc9060019062002229565b81548110620018ef57620018ef620022a7565b600091825260209091200154600780546001600160a01b0390921691849081106200191e576200191e620022a7565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600780548062001960576200196062002320565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b806200199381620022bd565b915050620017e2565b5050565b6000546001600160a01b03163314620019fc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620001db565b565b600060095482111562001a675760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401620001db565b600062001a7362001a88565b905062001a818184620022d9565b9392505050565b6000808062001a9662001aae565b909250905062001aa78183620022d9565b9250505090565b6009546008546000918291825b60075481101562001c165782600360006007848154811062001ae15762001ae1620022a7565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118062001b50575081600460006007848154811062001b295762001b29620022a7565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1562001b6757600954600854945094505050509091565b600360006007838154811062001b815762001b81620022a7565b60009182526020808320909101546001600160a01b0316835282019290925260400190205462001bb2908462002229565b9250600460006007838154811062001bce5762001bce620022a7565b60009182526020808320909101546001600160a01b0316835282019290925260400190205462001bff908362002229565b91508062001c0d81620022bd565b91505062001abb565b5060085460095462001c299190620022d9565b82101562001c41576009546008549350935050509091565b90939092509050565b634e487b7160e01b600052604160045260246000fd5b6040516102e081016001600160401b038111828210171562001c865762001c8662001c4a565b60405290565b604051601f8201601f191681016001600160401b038111828210171562001cb75762001cb762001c4a565b604052919050565b600082601f83011262001cd157600080fd5b81516001600160401b0381111562001ced5762001ced62001c4a565b602062001d03601f8301601f1916820162001c8c565b828152858284870101111562001d1857600080fd5b60005b8381101562001d3857858101830151828201840152820162001d1b565b506000928101909101919091529392505050565b805160ff8116811462001d5e57600080fd5b919050565b80516001600160a01b038116811462001d5e57600080fd5b8051801515811462001d5e57600080fd5b805162ffffff8116811462001d5e57600080fd5b600082601f83011262001db257600080fd5b815160206001600160401b0382111562001dd05762001dd062001c4a565b8160051b62001de182820162001c8c565b928352848101820192828101908785111562001dfc57600080fd5b83870192505b8483101562001e265762001e168362001d63565b8252918301919083019062001e02565b979650505050505050565b60008060006060848603121562001e4757600080fd5b83516001600160401b038082111562001e5f57600080fd5b908501906102e0828803121562001e7557600080fd5b62001e7f62001c60565b82518281111562001e8f57600080fd5b62001e9d8982860162001cbf565b82525060208301518281111562001eb357600080fd5b62001ec18982860162001cbf565b60208301525062001ed56040840162001d4c565b6040820152606083015160608201526080830151608082015260a083015160a082015262001f0660c0840162001d63565b60c082015262001f1960e0840162001d63565b60e082015261010062001f2e81850162001d63565b9082015261012062001f4284820162001d63565b9082015261014062001f5684820162001d7b565b9082015261016062001f6a84820162001d8c565b9082015261018062001f7e84820162001d8c565b908201526101a062001f9284820162001d8c565b908201526101c062001fa684820162001d8c565b908201526101e062001fba84820162001d8c565b9082015261020062001fce84820162001d8c565b9082015261022062001fe284820162001d8c565b9082015261024062001ff684820162001d8c565b908201526102606200200a84820162001d8c565b908201526102806200201e84820162001d8c565b908201526102a06200203284820162001d63565b908201526102c06200204684820162001d63565b9082015260208701519095509150808211156200206257600080fd5b50620020718682870162001da0565b925050620020826040850162001d63565b90509250925092565b600181811c90821680620020a057607f821691505b602082108103620020c157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200211557600081815260208120601f850160051c81016020861015620020f05750805b601f850160051c820191505b818110156200211157828155600101620020fc565b5050505b505050565b81516001600160401b0381111562002136576200213662001c4a565b6200214e816200214784546200208b565b84620020c7565b602080601f8311600181146200218657600084156200216d5750858301515b600019600386901b1c1916600185901b17855562002111565b600085815260208120601f198616915b82811015620021b75788860151825594840194600190910190840162002196565b5085821015620021d65787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b6000826200220e576200220e620021e6565b500690565b634e487b7160e01b600052601160045260246000fd5b818103818111156200223f576200223f62002213565b92915050565b62ffffff81811683821601908082111562002264576200226462002213565b5092915050565b6000602082840312156200227e57600080fd5b62001a818262001d63565b6000602082840312156200229c57600080fd5b62001a818262001d7b565b634e487b7160e01b600052603260045260246000fd5b600060018201620022d257620022d262002213565b5060010190565b600082620022eb57620022eb620021e6565b500490565b808201808211156200223f576200223f62002213565b80820281158282048414176200223f576200223f62002213565b634e487b7160e01b600052603160045260246000fd5b61500180620023466000396000f3fe60806040526004361061039b5760003560e01c806382685df5116101dc578063cf188ad011610102578063e71dc3f5116100a0578063f2fde38b1161006f578063f2fde38b14610b33578063f637434214610b53578063f8b45b0514610b76578063fc59d23d14610b8c57600080fd5b8063e71dc3f514610a9e578063e9481eee14610ac1578063ec44adc814610af0578063f11a24d314610b1057600080fd5b8063dd62ed3e116100dc578063dd62ed3e14610a02578063de0aad5314610a48578063df8408fe14610a69578063e086e5ec14610a8957600080fd5b8063cf188ad0146109a2578063d5bf72b7146109c2578063db4091e9146109e257600080fd5b806395d89b411161017a578063aa49802311610149578063aa49802314610919578063adb873bd14610939578063b62496f51461095c578063c8c8ebe41461098c57600080fd5b806395d89b41146108a45780639a7a23d6146108b9578063a457c2d7146108d9578063a9059cbb146108f957600080fd5b806389476069116101b6578063894760691461083b5780638da5cb5b1461085b5780638f0bc16714610879578063921369131461088157600080fd5b806382685df5146107c257806385af30c5146107e257806388f820201461080257600080fd5b80634707c551116102c15780636c516a701161025f57806375f0a8741161022e57806375f0a8741461073f5780637bce5a041461075f5780637c75ad3a14610782578063809d458d146107a257600080fd5b80636c516a70146106ca57806370a08231146106ea578063715018a61461070a57806373b9e82c1461071f57600080fd5b80635342acb41161029b5780635342acb41461063357806357e62b98146106635780635c068a8c146106845780636b2fb124146106a757600080fd5b80634707c551146105d357806348a5317e146105f357806352390c021461061357600080fd5b80632ae2f121116103395780633950935111610308578063395093511461053b5780633fd1c86d1461055b5780634549b0391461057b5780634626402b1461059b57600080fd5b80632ae2f121146104af5780632d838119146104cf578063313ce567146104ef5780633685d4191461051b57600080fd5b806313114a9d1161037557806313114a9d1461043957806318160ddd146104585780631c499ab01461046d57806323b872dd1461048f57600080fd5b806306fdde03146103a7578063095ea7b3146103d25780630cfe2f3f1461040257600080fd5b366103a257005b600080fd5b3480156103b357600080fd5b506103bc610ba2565b6040516103c99190614a39565b60405180910390f35b3480156103de57600080fd5b506103f26103ed366004614a81565b610c34565b60405190151581526020016103c9565b34801561040e57600080fd5b5060175461042590600160201b900462ffffff1681565b60405162ffffff90911681526020016103c9565b34801561044557600080fd5b50600a545b6040519081526020016103c9565b34801561046457600080fd5b5060085461044a565b34801561047957600080fd5b5061048d610488366004614aad565b610c4b565b005b34801561049b57600080fd5b506103f26104aa366004614ac6565b610cf9565b3480156104bb57600080fd5b5061048d6104ca366004614b15565b610d4b565b3480156104db57600080fd5b5061044a6104ea366004614aad565b610e0a565b3480156104fb57600080fd5b50600254600160a01b900460ff1660405160ff90911681526020016103c9565b34801561052757600080fd5b5061048d610536366004614b4e565b610e8e565b34801561054757600080fd5b506103f2610556366004614a81565b6110a4565b34801561056757600080fd5b5061048d610576366004614b83565b6110db565b34801561058757600080fd5b5061044a610596366004614bb6565b6112c9565b3480156105a757600080fd5b506019546105bb906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b3480156105df57600080fd5b5061048d6105ee366004614b15565b6113be565b3480156105ff57600080fd5b506002546105bb906001600160a01b031681565b34801561061f57600080fd5b5061048d61062e366004614b4e565b611500565b34801561063f57600080fd5b506103f261064e366004614b4e565b601f6020526000908152604090205460ff1681565b34801561066f57600080fd5b506018546103f290600160a01b900460ff1681565b34801561069057600080fd5b5060175461042590600160b01b900462ffffff1681565b3480156106b357600080fd5b5060175461042590600160981b900462ffffff1681565b3480156106d657600080fd5b5061048d6106e5366004614bdb565b6116cc565b3480156106f657600080fd5b5061044a610705366004614b4e565b611937565b34801561071657600080fd5b5061048d611996565b34801561072b57600080fd5b5061048d61073a366004614aad565b6119aa565b34801561074b57600080fd5b506018546105bb906001600160a01b031681565b34801561076b57600080fd5b5060175461042590600160801b900462ffffff1681565b34801561078e57600080fd5b506001546105bb906001600160a01b031681565b3480156107ae57600080fd5b5061048d6107bd366004614b4e565b611a3d565b3480156107ce57600080fd5b5061048d6107dd366004614b83565b611bbf565b3480156107ee57600080fd5b50601e546105bb906001600160a01b031681565b34801561080e57600080fd5b506103f261081d366004614b4e565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561084757600080fd5b5061048d610856366004614b4e565b611daa565b34801561086757600080fd5b506000546001600160a01b03166105bb565b61048d611e89565b34801561088d57600080fd5b5060175461042590600160681b900462ffffff1681565b3480156108b057600080fd5b506103bc6122e1565b3480156108c557600080fd5b5061048d6108d4366004614b15565b6122f0565b3480156108e557600080fd5b506103f26108f4366004614a81565b612302565b34801561090557600080fd5b506103f2610914366004614a81565b612339565b34801561092557600080fd5b5061048d610934366004614aad565b612346565b34801561094557600080fd5b5060175461042590600160c81b900462ffffff1681565b34801561096857600080fd5b506103f2610977366004614b4e565b60216020526000908152604090205460ff1681565b34801561099857600080fd5b5061044a601c5481565b3480156109ae57600080fd5b50601d546105bb906001600160a01b031681565b3480156109ce57600080fd5b5061048d6109dd366004614b83565b612403565b3480156109ee57600080fd5b5061048d6109fd366004614b83565b6125f5565b348015610a0e57600080fd5b5061044a610a1d366004614bdb565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610a5457600080fd5b5060175461042590610100900462ffffff1681565b348015610a7557600080fd5b5061048d610a84366004614b15565b6127e3565b348015610a9557600080fd5b5061048d61289d565b348015610aaa57600080fd5b5060175461042590600160e01b900462ffffff1681565b348015610acd57600080fd5b506103f2610adc366004614b4e565b602080526000908152604090205460ff1681565b348015610afc57600080fd5b5061048d610b0b366004614b83565b61293f565b348015610b1c57600080fd5b5060175461042590600160501b900462ffffff1681565b348015610b3f57600080fd5b5061048d610b4e366004614b4e565b612b2d565b348015610b5f57600080fd5b5060175461042590600160381b900462ffffff1681565b348015610b8257600080fd5b5061044a601b5481565b348015610b9857600080fd5b5061044a601a5481565b6060600b8054610bb190614c09565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdd90614c09565b8015610c2a5780601f10610bff57610100808354040283529160200191610c2a565b820191906000526020600020905b815481529060010190602001808311610c0d57829003601f168201915b5050505050905090565b6000610c41338484612ba3565b5060015b92915050565b610c53612cc7565b612710600854610c639190614c59565b811015610cb75760405162461bcd60e51b815260206004820181905260248201527f6d617857616c6c6574203e3d20746f74616c537570706c79202f20313030303060448201526064015b60405180910390fd5b601b546040805183815260208101929092527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a1601b55565b6000610d06848484612d21565b6001600160a01b038416600090815260056020908152604080832033808552925290912054610d41918691610d3c908690614c7b565b612ba3565b5060019392505050565b610d53612cc7565b6001600160a01b038216600090815260208052604090205481151560ff909116151503610dac5760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b6044820152606401610cae565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f82170bbd72c16b30c410014b7382121a699ed119a182e48a0b6cadcc89104ac991015b60405180910390a25050565b6000600954821115610e715760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610cae565b6000610e7b613108565b9050610e878184614c59565b9392505050565b610e96612cc7565b6001600160a01b03811660009081526006602052604090205460ff16610efe5760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610cae565b60005b6007548110156110a057816001600160a01b031660078281548110610f2857610f28614c8e565b6000918252602090912001546001600160a01b03160361108e576001600160a01b038216600090815260036020526040902054610f63613108565b6001600160a01b038416600090815260046020526040902054610f869190614ca4565b6001600160a01b0384166000908152600360205260409020819055600954610faf908390614c7b565b610fb99190614cbb565b6009556001600160a01b0383166000908152600660205260409020805460ff1916905560078054610fec90600190614c7b565b81548110610ffc57610ffc614c8e565b600091825260209091200154600780546001600160a01b03909216918490811061102857611028614c8e565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600780548061106757611067614cce565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b8061109881614ce4565b915050610f01565b5050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c41918590610d3c908690614cbb565b6110e3612cc7565b601754620493e09062ffffff600160c81b82048116916101008104821691600160681b820481169161111e91600160381b9091041687614cfd565b6111289190614cfd565b6111329190614cfd565b61113c9190614cfd565b62ffffff16111561115f5760405162461bcd60e51b8152600401610cae90614d19565b601754620493e09062ffffff600160e01b8204811691600160201b8104821691600160801b820481169161119c91600160501b9091041686614cfd565b6111a69190614cfd565b6111b09190614cfd565b6111ba9190614cfd565b62ffffff1611156111dd5760405162461bcd60e51b8152600401610cae90614d48565b620249f08262ffffff1611156112055760405162461bcd60e51b8152600401610cae90614d76565b620249f08162ffffff16111561122d5760405162461bcd60e51b8152600401610cae90614d9f565b6017546040805162ffffff85811682528481166020830152600160981b8404811682840152600160b01b9093049092166060830152517fc239c020ec275d4a3e59d37954f59c061e7302d35a1b6bad801059aafe9631ee9181900360800190a16017805465ffffffffffff60981b1916600160981b62ffffff9485160262ffffff60b01b191617600160b01b9290931691909102919091179055565b600060085483111561131d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610cae565b6000611327613108565b90508261134457600061133a8286614ca4565b9250610c45915050565b60008060008060006113558961312b565b94509450945094509450600081838587898e6113719190614c7b565b61137b9190614c7b565b6113859190614c7b565b61138f9190614c7b565b6113999190614c7b565b905060006113a78883614ca4565b9850610c45975050505050505050565b5092915050565b6113c6612cc7565b6001600160a01b03821661141c5760405162461bcd60e51b815260206004820152601b60248201527f6d61726b6574696e672077616c6c65742063616e2774206265203000000000006044820152606401610cae565b6019546001600160a01b039081169083160361144a5760405162461bcd60e51b8152600401610cae90614dc7565b601854604080518315158152600160a01b830460ff16151560208201526001600160a01b03928316928516917fc8dfdd9b91ac62ee1bd8be3541ea02d8e584461c794c6e49e94ccf21c71ebcca910160405180910390a360188054911515600160a01b026001600160a81b03199092166001600160a01b039093169283179190911790556000908152601f60209081526040808320805460ff199081166001908117909255928052922080549091169091179055565b611508612cc7565b6001600160a01b03811660009081526006602052604090205460ff16156115715760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610cae565b600754603290611582906001614cbb565b111561160c5760405162461bcd60e51b815260206004820152604d60248201527f43616e6e6f74206578636c756465206d6f7265207468616e203530206163636f60448201527f756e74732e2020496e636c75646520612070726576696f75736c79206578636c60648201526c3ab232b21030b2323932b9b99760991b608482015260a401610cae565b6001600160a01b03811660009081526003602052604090205415611666576001600160a01b03811660009081526003602052604090205461164c90610e0a565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600660205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b6116d4612cc7565b600280546001600160a01b0319166001600160a01b0383811691909117909155601d5483821691161461172a5761170e3083600019612ba3565b601d80546001600160a01b0319166001600160a01b0384161790555b601d60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561177d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a19190614e1a565b6002546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af11580156117f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118169190614e1a565b601e80546001600160a01b0319166001600160a01b03928316179055601d54604080516315ab88c960e31b81529051919092169163ad5c46489160048083019260209291908290030181865afa158015611874573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118989190614e1a565b6002546001600160a01b039081169116146118cc57601d546002546118cc916001600160a01b039182169116600019613184565b601d54601e54600254604080516001600160a01b039485168152928416602084015292168183015290517f113a6e83812f48b2f83795e33cb009afb4ba6e240c9c643c5dc75791e4ce7ab69181900360600190a1601e546110a0906001600160a01b031660016132d1565b6001600160a01b03811660009081526006602052604081205460ff161561197457506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610c4590610e0a565b61199e612cc7565b6119a86000613401565b565b6119b2612cc7565b600081116119fb5760405162461bcd60e51b815260206004820152601660248201527506d696e416d6f756e74546f54616b65466565203e20360541b6044820152606401610cae565b601a546040805183815260208101929092527f772a06bc936eb749842080c472181e970cd4f23bd1ab7d0b84a80aec26910434910160405180910390a1601a55565b611a45612cc7565b6001600160a01b038116611a9b5760405162461bcd60e51b815260206004820152601a60248201527f54726561737572792077616c6c65742063616e277420626520300000000000006044820152606401610cae565b306001600160a01b03821603611b065760405162461bcd60e51b815260206004820152602a60248201527f54726561737572792077616c6c65742063616e2774206265207468652073616d604482015269329030b9903a37b5b2b760b11b6064820152608401610cae565b6018546001600160a01b03808316911603611b335760405162461bcd60e51b8152600401610cae90614dc7565b6019546040516001600160a01b03918216918316907f79a52cbec002ef70283103eb4140713100276944fca2819713130141d04df18390600090a3601980546001600160a01b039092166001600160a01b0319909216821790556000908152601f60209081526040808320805460ff199081166001908117909255928052922080549091169091179055565b611bc7612cc7565b601754620493e09062ffffff600160c81b8204811691600160981b8104821691600160681b8204811691611c0491600160381b9091041687614cfd565b611c0e9190614cfd565b611c189190614cfd565b611c229190614cfd565b62ffffff161115611c455760405162461bcd60e51b8152600401610cae90614d19565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160801b8204811691611c8291600160501b9091041686614cfd565b611c8c9190614cfd565b611c969190614cfd565b611ca09190614cfd565b62ffffff161115611cc35760405162461bcd60e51b8152600401610cae90614d48565b620249f08262ffffff161115611ceb5760405162461bcd60e51b8152600401610cae90614d76565b620249f08162ffffff161115611d135760405162461bcd60e51b8152600401610cae90614d9f565b6017546040805162ffffff858116825284811660208301526101008404811682840152600160201b9093049092166060830152517f2e7d9780ec398c47872eab5651ba43f0fa44ffed738321577e0db663fe8a05a59181900360800190a16017805466ffffffffffff00191661010062ffffff9485160266ffffff00000000191617600160201b9290931691909102919091179055565b611db2612cc7565b6001600160a01b0381163003611df85760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610cae565b611e86611e0d6000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e759190614e37565b6001600160a01b0384169190613451565b50565b604080516002808252606082018352600092602083019080368337505060025482519293506001600160a01b031691839150600090611eca57611eca614c8e565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611efe57611efe614c8e565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611f57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7b9190614e1a565b6001600160a01b031681600081518110611f9757611f97614c8e565b60200260200101516001600160a01b03160361202157601d5460195460405163b6f9de9560e01b81526001600160a01b039283169263b6f9de95923492611fea9260009288929116904290600401614e94565b6000604051808303818588803b15801561200357600080fd5b505af1158015612017573d6000803e3d6000fd5b5050505050612129565b6002546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561207a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209e9190614e37565b90506120b8336002546001600160a01b0316903084613481565b601d54601954604051635c11d79560e01b81526001600160a01b0392831692635c11d795926120f592869260009289929116904290600401614ec9565b600060405180830381600087803b15801561210f57600080fd5b505af1158015612123573d6000803e3d6000fd5b50505050505b6019546001600160a01b031660009081526006602052604090205460ff1615612217576019546001600160a01b03166000908152600460205260409020546008546121749190614c7b565b6008556019546001600160a01b031660009081526003602052604090205460095461219f9190614c7b565b6009556019546001600160a01b03166000818152600460209081526040808320549051908152919291600080516020614fac833981519152910160405180910390a3601980546001600160a01b0390811660009081526003602090815260408083208390559354909216815260049091529081205550565b6019546001600160a01b031660009081526003602052604081205461223b90610e0a565b90508060085461224b9190614c7b565b6008556019546001600160a01b03166000908152600360205260409020546009546122769190614c7b565b6009556019546040518281526000916001600160a01b031690600080516020614fac8339815191529060200160405180910390a350601980546001600160a01b0390811660009081526003602090815260408083208390559354909216815260049091529081205550565b6060600c8054610bb190614c09565b6122f8612cc7565b6110a082826132d1565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c41918590610d3c908690614c7b565b6000610c41338484612d21565b61234e612cc7565b61271060085461235e9190614c59565b8110156123c15760405162461bcd60e51b815260206004820152602b60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c53757060448201526a0706c79202f2031303030360ac1b6064820152608401610cae565b601c546040805183815260208101929092527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1601c55565b61240b612cc7565b601754620493e09062ffffff600160c81b8204811691600160981b8104821691610100820481169161244691600160681b9091041687614cfd565b6124509190614cfd565b61245a9190614cfd565b6124649190614cfd565b62ffffff1611156124875760405162461bcd60e51b8152600401610cae90614d19565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160201b82048116916124c491600160801b9091041686614cfd565b6124ce9190614cfd565b6124d89190614cfd565b6124e29190614cfd565b62ffffff1611156125055760405162461bcd60e51b8152600401610cae90614d48565b620249f08262ffffff16111561252d5760405162461bcd60e51b8152600401610cae90614d76565b620249f08162ffffff1611156125555760405162461bcd60e51b8152600401610cae90614d9f565b6017546040805162ffffff85811682528481166020830152600160381b8404811682840152600160501b9093049092166060830152517fdec183740138e3a28dfd6f973ecd3bf00cd5d9b2544f6763c0a87f721444c5d19181900360800190a1601780546cffffffffffff000000000000001916600160381b62ffffff9485160262ffffff60501b191617600160501b9290931691909102919091179055565b6125fd612cc7565b601754620493e09062ffffff6101008204811691600160981b8104821691600160681b820481169161263891600160381b9091041687614cfd565b6126429190614cfd565b61264c9190614cfd565b6126569190614cfd565b62ffffff1611156126795760405162461bcd60e51b8152600401610cae90614d19565b601754620493e09062ffffff600160201b8204811691600160b01b8104821691600160801b82048116916126b691600160501b9091041686614cfd565b6126c09190614cfd565b6126ca9190614cfd565b6126d49190614cfd565b62ffffff1611156126f75760405162461bcd60e51b8152600401610cae90614d48565b620249f08262ffffff16111561271f5760405162461bcd60e51b8152600401610cae90614d76565b620249f08162ffffff1611156127475760405162461bcd60e51b8152600401610cae90614d9f565b6017546040805162ffffff85811682528481166020830152600160c81b8404811682840152600160e01b9093049092166060830152517fdc717222e8a01249bcfb0a887e700321c9465eda757255fd7895bd39fab714d29181900360800190a16017805465ffffffffffff60c81b1916600160c81b62ffffff9485160262ffffff60e01b191617600160e01b9290931691909102919091179055565b6127eb612cc7565b6001600160a01b0382166000908152601f602052604090205481151560ff9091161515036128455760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b6044820152606401610cae565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f2d43abd87b27cee7b0aa8c6f7e0b4a3247b683262a83cbc2318b0df398a49aa99101610dfe565b6128a5612cc7565b600080546040516001600160a01b039091169047908381818185875af1925050503d80600081146128f2576040519150601f19603f3d011682016040523d82523d6000602084013e6128f7565b606091505b5050905080611e865760405162461bcd60e51b815260206004820152601460248201527311985a5b1959081a5b881dda5d1a191c985dd85b60621b6044820152606401610cae565b612947612cc7565b601754620493e09062ffffff600160c81b8204811691600160981b8104821691610100820481169161298291600160381b9091041687614cfd565b61298c9190614cfd565b6129969190614cfd565b6129a09190614cfd565b62ffffff1611156129c35760405162461bcd60e51b8152600401610cae90614d19565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160201b8204811691612a0091600160501b9091041686614cfd565b612a0a9190614cfd565b612a149190614cfd565b612a1e9190614cfd565b62ffffff161115612a415760405162461bcd60e51b8152600401610cae90614d48565b620249f08262ffffff161115612a695760405162461bcd60e51b8152600401610cae90614d76565b620249f08162ffffff161115612a915760405162461bcd60e51b8152600401610cae90614d9f565b6017546040805162ffffff85811682528481166020830152600160681b8404811682840152600160801b9093049092166060830152517f70748cb9cb3bcb4dfd4fff8f2a6f23f636067b33e0244631f9abd38159c1de859181900360800190a16017805465ffffffffffff60681b1916600160681b62ffffff9485160262ffffff60801b191617600160801b9290931691909102919091179055565b612b35612cc7565b6001600160a01b038116612b9a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cae565b611e8681613401565b6001600160a01b038316612c055760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cae565b6001600160a01b038216612c665760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cae565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000546001600160a01b031633146119a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cae565b6001600160a01b038316612d855760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cae565b6001600160a01b038216612de75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cae565b6000612df230611937565b90506000602354602254612e069190614cbb565b90506000601a548210158015612e1c5750828211155b60175490915060ff16158015612e2f5750805b8015612e505750601e54600090612e4e906001600160a01b0316611937565b115b8015612e7457506001600160a01b03851660009081526021602052604090205460ff165b15612e8157612e816134bf565b612ebc600d8054600e55600f805460105560118054601255601380546014556015805460165560009081905590819055908190559182905555565b60175460ff16158015612ee857506001600160a01b0386166000908152601f602052604090205460ff16155b8015612f0d57506001600160a01b0385166000908152601f602052604090205460ff16155b15612fde576001600160a01b03861660009081526021602052604090205460ff1615612f7b5760175462ffffff600160201b82048116600d55600160501b82048116600f55600160801b82048116601155600160b01b82048116601355600160e01b90910416601555612fde565b6001600160a01b03851660009081526021602052604090205460ff1615612fde5760175462ffffff61010082048116600d55600160381b82048116600f55600160681b82048116601155600160981b82048116601355600160c81b909104166015555b612fe9868686613d18565b61300c601654601555601454601355600e54600d55601054600f55601254601155565b60175460ff16613100576001600160a01b038616600090815260208052604090205460ff1661308757601c548411156130875760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2065786365656473207472616e73666572206c696d69740000006044820152606401610cae565b6001600160a01b038516600090815260208052604090205460ff1661310057601b546130b286611937565b11156131005760405162461bcd60e51b815260206004820152601f60248201527f45524332303a2065786365656473206d61782077616c6c6574206c696d6974006044820152606401610cae565b505050505050565b6000806000613115614218565b90925090506131248183614c59565b9250505090565b60008060008060008061313d8761439b565b9050600061314a886143b9565b90506000613157896143cd565b905060006131648a6143e1565b905060006131718b6143f5565b949b939a50919850965091945092505050565b8015806131fe5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156131d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131fc9190614e37565b155b6132695760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610cae565b6040516001600160a01b0383166024820152604481018290526132cc90849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614409565b505050565b6001600160a01b03821660009081526021602052604090205481151560ff9091161515036133675760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610cae565b6001600160a01b0382166000908152602160205260409020805460ff191682158015919091179091556133a25761339d82611500565b6133ab565b6133ab82610e8e565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab9101610dfe565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0383166024820152604481018290526132cc90849063a9059cbb60e01b90606401613295565b6040516001600160a01b03808516602483015283166044820152606481018290526134b99085906323b872dd60e01b90608401613295565b50505050565b6017805460ff191660011790556022546000906134de90600290614c59565b90506000601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613535573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135599190614e1a565b6002546001600160a01b039081169116146135df576002546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156135b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135da9190614e37565b6135e1565b475b9050600080601860149054906101000a900460ff161561390d5760006024546023548661360e9190614cbb565b6136189190614cbb565b9050801561362957613629816144de565b601d54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015613673573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136979190614e1a565b6002546001600160a01b03908116911614613727576002546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa1580156136f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137189190614e37565b6137229190614c7b565b613731565b6137318547614c7b565b9050600082602354836137449190614ca4565b61374e9190614c59565b90508261375b8884614ca4565b6137659190614c59565b9450846137728284614c7b565b61377c9190614c7b565b9350801561390557601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137fb9190614e1a565b6002546001600160a01b039182169116036138ad576018546040516000916001600160a01b03169083908381818185875af1925050503d806000811461385d576040519150601f19603f3d011682016040523d82523d6000602084013e613862565b606091505b5050905080156138a7576040805160008152602081018490527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b50613905565b6018546002546138ca916001600160a01b03918216911683613451565b6040805160008152602081018390527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b505050613ac1565b60006024548561391d9190614cbb565b9050801561392e5761392e816144de565b601d54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015613978573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061399c9190614e1a565b6002546001600160a01b03908116911614613a2c576002546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa1580156139f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a1d9190614e37565b613a279190614c7b565b613a36565b613a368547614c7b565b905081613a438783614ca4565b613a4d9190614c59565b9350613a598482614c7b565b60235490935015613abe57601854602354613a819130916001600160a01b0390911690612d21565b60235460408051918252600060208301527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b50505b600084118015613ad15750600082115b15613b1a57613ae08483614697565b60408051858152602081018490527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f8381486910160405180910390a15b8015613c9357601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b979190614e1a565b6002546001600160a01b03918216911603613c42576019546040516000916001600160a01b03169083908381818185875af1925050503d8060008114613bf9576040519150601f19603f3d011682016040523d82523d6000602084013e613bfe565b606091505b505090508015613c3c576040518281527fe3630e0003fb3e9f9d835bb839022e52ffd576f9f35c395dd17517106f78cb339060200160405180910390a15b50613c93565b601954600254613c5f916001600160a01b03918216911683613451565b6040518181527fe3630e0003fb3e9f9d835bb839022e52ffd576f9f35c395dd17517106f78cb339060200160405180910390a15b6000602381905560248190556022819055613cad30611937565b1115613d08576000546001600160a01b031615613ced57613ce830613cda6000546001600160a01b031690565b613ce330611937565b612d21565b613d08565b601954613d089030906001600160a01b0316613ce382611937565b50506017805460ff191690555050565b6000806000806000613d298661312b565b94509450945094509450600081838587898b613d459190614c7b565b613d4f9190614c7b565b613d599190614c7b565b613d639190614c7b565b613d6d9190614c7b565b90506000613d79613108565b905082600854613d899190614c7b565b600855613d968184614ca4565b600954613da39190614c7b565b6009556040518381526000906001600160a01b038c1690600080516020614fac8339815191529060200160405180910390a385602254613de39190614cbb565b602255602354613df4908690614cbb565b602355602454613e05908590614cbb565b602455600084613e158789614cbb565b613e1f9190614cbb565b9050613e2b8282614ca4565b30600090815260036020526040902054613e459190614cbb565b3060009081526003602090815260408083209390935560069052205460ff1615613e955730600090815260046020526040902054613e84908290614cbb565b306000908152600460205260409020555b60405181815230906001600160a01b038d1690600080516020614fac8339815191529060200160405180910390a3506001600160a01b038a1660009081526006602052604090205460ff168015613f0557506001600160a01b03891660009081526006602052604090205460ff16155b15613fd8576001600160a01b038a16600090815260046020526040902054613f2e908990614c7b565b6001600160a01b038b16600090815260046020526040902055613f518189614ca4565b6001600160a01b038b16600090815260036020526040902054613f749190614c7b565b6001600160a01b038b16600090815260036020526040902055613f978183614ca4565b6001600160a01b038a16600090815260036020526040902054613fba9190614cbb565b6001600160a01b038a166000908152600360205260409020556141be565b6001600160a01b038a1660009081526006602052604090205460ff1615801561401957506001600160a01b03891660009081526006602052604090205460ff165b156140a5576140288189614ca4565b6001600160a01b038b1660009081526003602052604090205461404b9190614c7b565b6001600160a01b03808c16600090815260036020908152604080832094909455918c16815260049091522054614082908390614cbb565b6001600160a01b038a16600090815260046020526040902055613f978183614ca4565b6001600160a01b038a1660009081526006602052604090205460ff1680156140e557506001600160a01b03891660009081526006602052604090205460ff165b15614131576001600160a01b038a1660009081526004602052604090205461410e908990614c7b565b6001600160a01b038b166000908152600460205260409020556140288189614ca4565b61413b8189614ca4565b6001600160a01b038b1660009081526003602052604090205461415e9190614c7b565b6001600160a01b038b166000908152600360205260409020556141818183614ca4565b6001600160a01b038a166000908152600360205260409020546141a49190614cbb565b6001600160a01b038a166000908152600360205260409020555b6141d16141cb8289614ca4565b8861485f565b886001600160a01b03168a6001600160a01b0316600080516020614fac8339815191528460405161420491815260200190565b60405180910390a350505050505050505050565b6009546008546000918291825b60075481101561436a5782600360006007848154811061424757614247614c8e565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806142b2575081600460006007848154811061428b5761428b614c8e565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156142c857600954600854945094505050509091565b60036000600783815481106142df576142df614c8e565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461430e9084614c7b565b9250600460006007838154811061432757614327614c8e565b60009182526020808320909101546001600160a01b031683528201929092526040019020546143569083614c7b565b91508061436281614ce4565b915050614225565b5060085460095461437b9190614c59565b821015614392576009546008549350935050509091565b90939092509050565b6000620f4240600d54836143af9190614ca4565b610c459190614c59565b6000620f4240600f54836143af9190614ca4565b6000620f4240601154836143af9190614ca4565b6000620f4240601354836143af9190614ca4565b6000620f4240601554836143af9190614ca4565b600061445e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166148859092919063ffffffff16565b905080516000148061447f57508080602001905181019061447f9190614f05565b6132cc5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610cae565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061451357614513614c8e565b6001600160a01b03928316602091820292909201015260025482519116908290600190811061454457614544614c8e565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561459d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145c19190614e1a565b6001600160a01b0316816001815181106145dd576145dd614c8e565b60200260200101516001600160a01b03160361465a57601d5460405163791ac94760e01b81526001600160a01b039091169063791ac9479061462c908590600090869030904290600401614ec9565b600060405180830381600087803b15801561464657600080fd5b505af1158015613100573d6000803e3d6000fd5b600154601d54604051637274ca1b60e11b81526001600160a01b039283169263e4e994369261462c92911690869060009087904290600401614f22565b601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156146ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061470e9190614e1a565b6002546001600160a01b039182169116036147bd57601d5460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015614791573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906147b69190614f61565b5050505050565b601d5460025460405162e8e33760e81b81523060048201526001600160a01b039182166024820152604481018590526064810184905260006084820181905260a482015261dead60c48201524260e482015291169063e8e3370090610104016060604051808303816000875af115801561483b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147b69190614f61565b8160095461486d9190614c7b565b600955600a5461487e908290614cbb565b600a555050565b6060614894848460008561489c565b949350505050565b6060824710156148fd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610cae565b600080866001600160a01b031685876040516149199190614f8f565b60006040518083038185875af1925050503d8060008114614956576040519150601f19603f3d011682016040523d82523d6000602084013e61495b565b606091505b509150915061496c87838387614977565b979650505050505050565b606083156149e65782516000036149df576001600160a01b0385163b6149df5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cae565b5081614894565b61489483838151156149fb5781518083602001fd5b8060405162461bcd60e51b8152600401610cae9190614a39565b60005b83811015614a30578181015183820152602001614a18565b50506000910152565b6020815260008251806020840152614a58816040850160208701614a15565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611e8657600080fd5b60008060408385031215614a9457600080fd5b8235614a9f81614a6c565b946020939093013593505050565b600060208284031215614abf57600080fd5b5035919050565b600080600060608486031215614adb57600080fd5b8335614ae681614a6c565b92506020840135614af681614a6c565b929592945050506040919091013590565b8015158114611e8657600080fd5b60008060408385031215614b2857600080fd5b8235614b3381614a6c565b91506020830135614b4381614b07565b809150509250929050565b600060208284031215614b6057600080fd5b8135610e8781614a6c565b803562ffffff81168114614b7e57600080fd5b919050565b60008060408385031215614b9657600080fd5b614b9f83614b6b565b9150614bad60208401614b6b565b90509250929050565b60008060408385031215614bc957600080fd5b823591506020830135614b4381614b07565b60008060408385031215614bee57600080fd5b8235614bf981614a6c565b91506020830135614b4381614a6c565b600181811c90821680614c1d57607f821691505b602082108103614c3d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082614c7657634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610c4557610c45614c43565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610c4557610c45614c43565b80820180821115610c4557610c45614c43565b634e487b7160e01b600052603160045260246000fd5b600060018201614cf657614cf6614c43565b5060010190565b62ffffff8181168382160190808211156113b7576113b7614c43565b60208082526015908201527473656c6c20746f74616c20666565203c3d2033302560581b604082015260600190565b60208082526014908201527362757920746f74616c20666565203c3d2033302560601b604082015260600190565b6020808252600f908201526e73656c6c20666565203c3d2031352560881b604082015260600190565b6020808252600e908201526d62757920666565203c3d2031352560901b604082015260600190565b60208082526033908201527f6d61726b6574696e672077616c6c65742063616e27742062652073616d6520776040820152721a5d1a08151c99585cdd5c9e481dd85b1b195d606a1b606082015260800190565b600060208284031215614e2c57600080fd5b8151610e8781614a6c565b600060208284031215614e4957600080fd5b5051919050565b600081518084526020808501945080840160005b83811015614e895781516001600160a01b031687529582019590820190600101614e64565b509495945050505050565b848152608060208201526000614ead6080830186614e50565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201526000614ee860a0830186614e50565b6001600160a01b0394909416606083015250608001529392505050565b600060208284031215614f1757600080fd5b8151610e8781614b07565b60018060a01b038616815284602082015283604082015260a060608201526000614f4f60a0830185614e50565b90508260808301529695505050505050565b600080600060608486031215614f7657600080fd5b8351925060208401519150604084015190509250925092565b60008251614fa1818460208701614a15565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a0998bef53fc625546c7e09271cfc55bc8067f2d828dc18388682ac836109ce864736f6c63430008130033a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000001f0c586d5dc6dc856000000000000000000000000000000000000000000000001f0c586d5dc6dc856000000000000000000000000000000000000000000000001f0c586d5dc6dc856000000000000000000000000000001fefc2992469b36dc7c436820ebf52b0700652810000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000274c40a14dd597671364e30c8a43c131cc2877c800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0dcc752af9be6a07a67934471d7cd901a6094e60000000000000000000000001ccfe8c40ef259566433716002e379dfffbf5a3e0000000000000000000000000000000000000000000000000000000000000011437279707469512045636f73797374656d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000743727970746951000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f041690d9cbe398d3d51f25c87902c1403affe66

Deployed Bytecode

0x60806040526004361061039b5760003560e01c806382685df5116101dc578063cf188ad011610102578063e71dc3f5116100a0578063f2fde38b1161006f578063f2fde38b14610b33578063f637434214610b53578063f8b45b0514610b76578063fc59d23d14610b8c57600080fd5b8063e71dc3f514610a9e578063e9481eee14610ac1578063ec44adc814610af0578063f11a24d314610b1057600080fd5b8063dd62ed3e116100dc578063dd62ed3e14610a02578063de0aad5314610a48578063df8408fe14610a69578063e086e5ec14610a8957600080fd5b8063cf188ad0146109a2578063d5bf72b7146109c2578063db4091e9146109e257600080fd5b806395d89b411161017a578063aa49802311610149578063aa49802314610919578063adb873bd14610939578063b62496f51461095c578063c8c8ebe41461098c57600080fd5b806395d89b41146108a45780639a7a23d6146108b9578063a457c2d7146108d9578063a9059cbb146108f957600080fd5b806389476069116101b6578063894760691461083b5780638da5cb5b1461085b5780638f0bc16714610879578063921369131461088157600080fd5b806382685df5146107c257806385af30c5146107e257806388f820201461080257600080fd5b80634707c551116102c15780636c516a701161025f57806375f0a8741161022e57806375f0a8741461073f5780637bce5a041461075f5780637c75ad3a14610782578063809d458d146107a257600080fd5b80636c516a70146106ca57806370a08231146106ea578063715018a61461070a57806373b9e82c1461071f57600080fd5b80635342acb41161029b5780635342acb41461063357806357e62b98146106635780635c068a8c146106845780636b2fb124146106a757600080fd5b80634707c551146105d357806348a5317e146105f357806352390c021461061357600080fd5b80632ae2f121116103395780633950935111610308578063395093511461053b5780633fd1c86d1461055b5780634549b0391461057b5780634626402b1461059b57600080fd5b80632ae2f121146104af5780632d838119146104cf578063313ce567146104ef5780633685d4191461051b57600080fd5b806313114a9d1161037557806313114a9d1461043957806318160ddd146104585780631c499ab01461046d57806323b872dd1461048f57600080fd5b806306fdde03146103a7578063095ea7b3146103d25780630cfe2f3f1461040257600080fd5b366103a257005b600080fd5b3480156103b357600080fd5b506103bc610ba2565b6040516103c99190614a39565b60405180910390f35b3480156103de57600080fd5b506103f26103ed366004614a81565b610c34565b60405190151581526020016103c9565b34801561040e57600080fd5b5060175461042590600160201b900462ffffff1681565b60405162ffffff90911681526020016103c9565b34801561044557600080fd5b50600a545b6040519081526020016103c9565b34801561046457600080fd5b5060085461044a565b34801561047957600080fd5b5061048d610488366004614aad565b610c4b565b005b34801561049b57600080fd5b506103f26104aa366004614ac6565b610cf9565b3480156104bb57600080fd5b5061048d6104ca366004614b15565b610d4b565b3480156104db57600080fd5b5061044a6104ea366004614aad565b610e0a565b3480156104fb57600080fd5b50600254600160a01b900460ff1660405160ff90911681526020016103c9565b34801561052757600080fd5b5061048d610536366004614b4e565b610e8e565b34801561054757600080fd5b506103f2610556366004614a81565b6110a4565b34801561056757600080fd5b5061048d610576366004614b83565b6110db565b34801561058757600080fd5b5061044a610596366004614bb6565b6112c9565b3480156105a757600080fd5b506019546105bb906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b3480156105df57600080fd5b5061048d6105ee366004614b15565b6113be565b3480156105ff57600080fd5b506002546105bb906001600160a01b031681565b34801561061f57600080fd5b5061048d61062e366004614b4e565b611500565b34801561063f57600080fd5b506103f261064e366004614b4e565b601f6020526000908152604090205460ff1681565b34801561066f57600080fd5b506018546103f290600160a01b900460ff1681565b34801561069057600080fd5b5060175461042590600160b01b900462ffffff1681565b3480156106b357600080fd5b5060175461042590600160981b900462ffffff1681565b3480156106d657600080fd5b5061048d6106e5366004614bdb565b6116cc565b3480156106f657600080fd5b5061044a610705366004614b4e565b611937565b34801561071657600080fd5b5061048d611996565b34801561072b57600080fd5b5061048d61073a366004614aad565b6119aa565b34801561074b57600080fd5b506018546105bb906001600160a01b031681565b34801561076b57600080fd5b5060175461042590600160801b900462ffffff1681565b34801561078e57600080fd5b506001546105bb906001600160a01b031681565b3480156107ae57600080fd5b5061048d6107bd366004614b4e565b611a3d565b3480156107ce57600080fd5b5061048d6107dd366004614b83565b611bbf565b3480156107ee57600080fd5b50601e546105bb906001600160a01b031681565b34801561080e57600080fd5b506103f261081d366004614b4e565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561084757600080fd5b5061048d610856366004614b4e565b611daa565b34801561086757600080fd5b506000546001600160a01b03166105bb565b61048d611e89565b34801561088d57600080fd5b5060175461042590600160681b900462ffffff1681565b3480156108b057600080fd5b506103bc6122e1565b3480156108c557600080fd5b5061048d6108d4366004614b15565b6122f0565b3480156108e557600080fd5b506103f26108f4366004614a81565b612302565b34801561090557600080fd5b506103f2610914366004614a81565b612339565b34801561092557600080fd5b5061048d610934366004614aad565b612346565b34801561094557600080fd5b5060175461042590600160c81b900462ffffff1681565b34801561096857600080fd5b506103f2610977366004614b4e565b60216020526000908152604090205460ff1681565b34801561099857600080fd5b5061044a601c5481565b3480156109ae57600080fd5b50601d546105bb906001600160a01b031681565b3480156109ce57600080fd5b5061048d6109dd366004614b83565b612403565b3480156109ee57600080fd5b5061048d6109fd366004614b83565b6125f5565b348015610a0e57600080fd5b5061044a610a1d366004614bdb565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610a5457600080fd5b5060175461042590610100900462ffffff1681565b348015610a7557600080fd5b5061048d610a84366004614b15565b6127e3565b348015610a9557600080fd5b5061048d61289d565b348015610aaa57600080fd5b5060175461042590600160e01b900462ffffff1681565b348015610acd57600080fd5b506103f2610adc366004614b4e565b602080526000908152604090205460ff1681565b348015610afc57600080fd5b5061048d610b0b366004614b83565b61293f565b348015610b1c57600080fd5b5060175461042590600160501b900462ffffff1681565b348015610b3f57600080fd5b5061048d610b4e366004614b4e565b612b2d565b348015610b5f57600080fd5b5060175461042590600160381b900462ffffff1681565b348015610b8257600080fd5b5061044a601b5481565b348015610b9857600080fd5b5061044a601a5481565b6060600b8054610bb190614c09565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdd90614c09565b8015610c2a5780601f10610bff57610100808354040283529160200191610c2a565b820191906000526020600020905b815481529060010190602001808311610c0d57829003601f168201915b5050505050905090565b6000610c41338484612ba3565b5060015b92915050565b610c53612cc7565b612710600854610c639190614c59565b811015610cb75760405162461bcd60e51b815260206004820181905260248201527f6d617857616c6c6574203e3d20746f74616c537570706c79202f20313030303060448201526064015b60405180910390fd5b601b546040805183815260208101929092527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a1601b55565b6000610d06848484612d21565b6001600160a01b038416600090815260056020908152604080832033808552925290912054610d41918691610d3c908690614c7b565b612ba3565b5060019392505050565b610d53612cc7565b6001600160a01b038216600090815260208052604090205481151560ff909116151503610dac5760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b6044820152606401610cae565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f82170bbd72c16b30c410014b7382121a699ed119a182e48a0b6cadcc89104ac991015b60405180910390a25050565b6000600954821115610e715760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610cae565b6000610e7b613108565b9050610e878184614c59565b9392505050565b610e96612cc7565b6001600160a01b03811660009081526006602052604090205460ff16610efe5760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610cae565b60005b6007548110156110a057816001600160a01b031660078281548110610f2857610f28614c8e565b6000918252602090912001546001600160a01b03160361108e576001600160a01b038216600090815260036020526040902054610f63613108565b6001600160a01b038416600090815260046020526040902054610f869190614ca4565b6001600160a01b0384166000908152600360205260409020819055600954610faf908390614c7b565b610fb99190614cbb565b6009556001600160a01b0383166000908152600660205260409020805460ff1916905560078054610fec90600190614c7b565b81548110610ffc57610ffc614c8e565b600091825260209091200154600780546001600160a01b03909216918490811061102857611028614c8e565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600780548061106757611067614cce565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b8061109881614ce4565b915050610f01565b5050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c41918590610d3c908690614cbb565b6110e3612cc7565b601754620493e09062ffffff600160c81b82048116916101008104821691600160681b820481169161111e91600160381b9091041687614cfd565b6111289190614cfd565b6111329190614cfd565b61113c9190614cfd565b62ffffff16111561115f5760405162461bcd60e51b8152600401610cae90614d19565b601754620493e09062ffffff600160e01b8204811691600160201b8104821691600160801b820481169161119c91600160501b9091041686614cfd565b6111a69190614cfd565b6111b09190614cfd565b6111ba9190614cfd565b62ffffff1611156111dd5760405162461bcd60e51b8152600401610cae90614d48565b620249f08262ffffff1611156112055760405162461bcd60e51b8152600401610cae90614d76565b620249f08162ffffff16111561122d5760405162461bcd60e51b8152600401610cae90614d9f565b6017546040805162ffffff85811682528481166020830152600160981b8404811682840152600160b01b9093049092166060830152517fc239c020ec275d4a3e59d37954f59c061e7302d35a1b6bad801059aafe9631ee9181900360800190a16017805465ffffffffffff60981b1916600160981b62ffffff9485160262ffffff60b01b191617600160b01b9290931691909102919091179055565b600060085483111561131d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610cae565b6000611327613108565b90508261134457600061133a8286614ca4565b9250610c45915050565b60008060008060006113558961312b565b94509450945094509450600081838587898e6113719190614c7b565b61137b9190614c7b565b6113859190614c7b565b61138f9190614c7b565b6113999190614c7b565b905060006113a78883614ca4565b9850610c45975050505050505050565b5092915050565b6113c6612cc7565b6001600160a01b03821661141c5760405162461bcd60e51b815260206004820152601b60248201527f6d61726b6574696e672077616c6c65742063616e2774206265203000000000006044820152606401610cae565b6019546001600160a01b039081169083160361144a5760405162461bcd60e51b8152600401610cae90614dc7565b601854604080518315158152600160a01b830460ff16151560208201526001600160a01b03928316928516917fc8dfdd9b91ac62ee1bd8be3541ea02d8e584461c794c6e49e94ccf21c71ebcca910160405180910390a360188054911515600160a01b026001600160a81b03199092166001600160a01b039093169283179190911790556000908152601f60209081526040808320805460ff199081166001908117909255928052922080549091169091179055565b611508612cc7565b6001600160a01b03811660009081526006602052604090205460ff16156115715760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610cae565b600754603290611582906001614cbb565b111561160c5760405162461bcd60e51b815260206004820152604d60248201527f43616e6e6f74206578636c756465206d6f7265207468616e203530206163636f60448201527f756e74732e2020496e636c75646520612070726576696f75736c79206578636c60648201526c3ab232b21030b2323932b9b99760991b608482015260a401610cae565b6001600160a01b03811660009081526003602052604090205415611666576001600160a01b03811660009081526003602052604090205461164c90610e0a565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600660205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b6116d4612cc7565b600280546001600160a01b0319166001600160a01b0383811691909117909155601d5483821691161461172a5761170e3083600019612ba3565b601d80546001600160a01b0319166001600160a01b0384161790555b601d60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561177d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a19190614e1a565b6002546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af11580156117f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118169190614e1a565b601e80546001600160a01b0319166001600160a01b03928316179055601d54604080516315ab88c960e31b81529051919092169163ad5c46489160048083019260209291908290030181865afa158015611874573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118989190614e1a565b6002546001600160a01b039081169116146118cc57601d546002546118cc916001600160a01b039182169116600019613184565b601d54601e54600254604080516001600160a01b039485168152928416602084015292168183015290517f113a6e83812f48b2f83795e33cb009afb4ba6e240c9c643c5dc75791e4ce7ab69181900360600190a1601e546110a0906001600160a01b031660016132d1565b6001600160a01b03811660009081526006602052604081205460ff161561197457506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610c4590610e0a565b61199e612cc7565b6119a86000613401565b565b6119b2612cc7565b600081116119fb5760405162461bcd60e51b815260206004820152601660248201527506d696e416d6f756e74546f54616b65466565203e20360541b6044820152606401610cae565b601a546040805183815260208101929092527f772a06bc936eb749842080c472181e970cd4f23bd1ab7d0b84a80aec26910434910160405180910390a1601a55565b611a45612cc7565b6001600160a01b038116611a9b5760405162461bcd60e51b815260206004820152601a60248201527f54726561737572792077616c6c65742063616e277420626520300000000000006044820152606401610cae565b306001600160a01b03821603611b065760405162461bcd60e51b815260206004820152602a60248201527f54726561737572792077616c6c65742063616e2774206265207468652073616d604482015269329030b9903a37b5b2b760b11b6064820152608401610cae565b6018546001600160a01b03808316911603611b335760405162461bcd60e51b8152600401610cae90614dc7565b6019546040516001600160a01b03918216918316907f79a52cbec002ef70283103eb4140713100276944fca2819713130141d04df18390600090a3601980546001600160a01b039092166001600160a01b0319909216821790556000908152601f60209081526040808320805460ff199081166001908117909255928052922080549091169091179055565b611bc7612cc7565b601754620493e09062ffffff600160c81b8204811691600160981b8104821691600160681b8204811691611c0491600160381b9091041687614cfd565b611c0e9190614cfd565b611c189190614cfd565b611c229190614cfd565b62ffffff161115611c455760405162461bcd60e51b8152600401610cae90614d19565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160801b8204811691611c8291600160501b9091041686614cfd565b611c8c9190614cfd565b611c969190614cfd565b611ca09190614cfd565b62ffffff161115611cc35760405162461bcd60e51b8152600401610cae90614d48565b620249f08262ffffff161115611ceb5760405162461bcd60e51b8152600401610cae90614d76565b620249f08162ffffff161115611d135760405162461bcd60e51b8152600401610cae90614d9f565b6017546040805162ffffff858116825284811660208301526101008404811682840152600160201b9093049092166060830152517f2e7d9780ec398c47872eab5651ba43f0fa44ffed738321577e0db663fe8a05a59181900360800190a16017805466ffffffffffff00191661010062ffffff9485160266ffffff00000000191617600160201b9290931691909102919091179055565b611db2612cc7565b6001600160a01b0381163003611df85760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610cae565b611e86611e0d6000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e759190614e37565b6001600160a01b0384169190613451565b50565b604080516002808252606082018352600092602083019080368337505060025482519293506001600160a01b031691839150600090611eca57611eca614c8e565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611efe57611efe614c8e565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611f57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7b9190614e1a565b6001600160a01b031681600081518110611f9757611f97614c8e565b60200260200101516001600160a01b03160361202157601d5460195460405163b6f9de9560e01b81526001600160a01b039283169263b6f9de95923492611fea9260009288929116904290600401614e94565b6000604051808303818588803b15801561200357600080fd5b505af1158015612017573d6000803e3d6000fd5b5050505050612129565b6002546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561207a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209e9190614e37565b90506120b8336002546001600160a01b0316903084613481565b601d54601954604051635c11d79560e01b81526001600160a01b0392831692635c11d795926120f592869260009289929116904290600401614ec9565b600060405180830381600087803b15801561210f57600080fd5b505af1158015612123573d6000803e3d6000fd5b50505050505b6019546001600160a01b031660009081526006602052604090205460ff1615612217576019546001600160a01b03166000908152600460205260409020546008546121749190614c7b565b6008556019546001600160a01b031660009081526003602052604090205460095461219f9190614c7b565b6009556019546001600160a01b03166000818152600460209081526040808320549051908152919291600080516020614fac833981519152910160405180910390a3601980546001600160a01b0390811660009081526003602090815260408083208390559354909216815260049091529081205550565b6019546001600160a01b031660009081526003602052604081205461223b90610e0a565b90508060085461224b9190614c7b565b6008556019546001600160a01b03166000908152600360205260409020546009546122769190614c7b565b6009556019546040518281526000916001600160a01b031690600080516020614fac8339815191529060200160405180910390a350601980546001600160a01b0390811660009081526003602090815260408083208390559354909216815260049091529081205550565b6060600c8054610bb190614c09565b6122f8612cc7565b6110a082826132d1565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c41918590610d3c908690614c7b565b6000610c41338484612d21565b61234e612cc7565b61271060085461235e9190614c59565b8110156123c15760405162461bcd60e51b815260206004820152602b60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c53757060448201526a0706c79202f2031303030360ac1b6064820152608401610cae565b601c546040805183815260208101929092527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1601c55565b61240b612cc7565b601754620493e09062ffffff600160c81b8204811691600160981b8104821691610100820481169161244691600160681b9091041687614cfd565b6124509190614cfd565b61245a9190614cfd565b6124649190614cfd565b62ffffff1611156124875760405162461bcd60e51b8152600401610cae90614d19565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160201b82048116916124c491600160801b9091041686614cfd565b6124ce9190614cfd565b6124d89190614cfd565b6124e29190614cfd565b62ffffff1611156125055760405162461bcd60e51b8152600401610cae90614d48565b620249f08262ffffff16111561252d5760405162461bcd60e51b8152600401610cae90614d76565b620249f08162ffffff1611156125555760405162461bcd60e51b8152600401610cae90614d9f565b6017546040805162ffffff85811682528481166020830152600160381b8404811682840152600160501b9093049092166060830152517fdec183740138e3a28dfd6f973ecd3bf00cd5d9b2544f6763c0a87f721444c5d19181900360800190a1601780546cffffffffffff000000000000001916600160381b62ffffff9485160262ffffff60501b191617600160501b9290931691909102919091179055565b6125fd612cc7565b601754620493e09062ffffff6101008204811691600160981b8104821691600160681b820481169161263891600160381b9091041687614cfd565b6126429190614cfd565b61264c9190614cfd565b6126569190614cfd565b62ffffff1611156126795760405162461bcd60e51b8152600401610cae90614d19565b601754620493e09062ffffff600160201b8204811691600160b01b8104821691600160801b82048116916126b691600160501b9091041686614cfd565b6126c09190614cfd565b6126ca9190614cfd565b6126d49190614cfd565b62ffffff1611156126f75760405162461bcd60e51b8152600401610cae90614d48565b620249f08262ffffff16111561271f5760405162461bcd60e51b8152600401610cae90614d76565b620249f08162ffffff1611156127475760405162461bcd60e51b8152600401610cae90614d9f565b6017546040805162ffffff85811682528481166020830152600160c81b8404811682840152600160e01b9093049092166060830152517fdc717222e8a01249bcfb0a887e700321c9465eda757255fd7895bd39fab714d29181900360800190a16017805465ffffffffffff60c81b1916600160c81b62ffffff9485160262ffffff60e01b191617600160e01b9290931691909102919091179055565b6127eb612cc7565b6001600160a01b0382166000908152601f602052604090205481151560ff9091161515036128455760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b6044820152606401610cae565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f2d43abd87b27cee7b0aa8c6f7e0b4a3247b683262a83cbc2318b0df398a49aa99101610dfe565b6128a5612cc7565b600080546040516001600160a01b039091169047908381818185875af1925050503d80600081146128f2576040519150601f19603f3d011682016040523d82523d6000602084013e6128f7565b606091505b5050905080611e865760405162461bcd60e51b815260206004820152601460248201527311985a5b1959081a5b881dda5d1a191c985dd85b60621b6044820152606401610cae565b612947612cc7565b601754620493e09062ffffff600160c81b8204811691600160981b8104821691610100820481169161298291600160381b9091041687614cfd565b61298c9190614cfd565b6129969190614cfd565b6129a09190614cfd565b62ffffff1611156129c35760405162461bcd60e51b8152600401610cae90614d19565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160201b8204811691612a0091600160501b9091041686614cfd565b612a0a9190614cfd565b612a149190614cfd565b612a1e9190614cfd565b62ffffff161115612a415760405162461bcd60e51b8152600401610cae90614d48565b620249f08262ffffff161115612a695760405162461bcd60e51b8152600401610cae90614d76565b620249f08162ffffff161115612a915760405162461bcd60e51b8152600401610cae90614d9f565b6017546040805162ffffff85811682528481166020830152600160681b8404811682840152600160801b9093049092166060830152517f70748cb9cb3bcb4dfd4fff8f2a6f23f636067b33e0244631f9abd38159c1de859181900360800190a16017805465ffffffffffff60681b1916600160681b62ffffff9485160262ffffff60801b191617600160801b9290931691909102919091179055565b612b35612cc7565b6001600160a01b038116612b9a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cae565b611e8681613401565b6001600160a01b038316612c055760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cae565b6001600160a01b038216612c665760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cae565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000546001600160a01b031633146119a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cae565b6001600160a01b038316612d855760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cae565b6001600160a01b038216612de75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cae565b6000612df230611937565b90506000602354602254612e069190614cbb565b90506000601a548210158015612e1c5750828211155b60175490915060ff16158015612e2f5750805b8015612e505750601e54600090612e4e906001600160a01b0316611937565b115b8015612e7457506001600160a01b03851660009081526021602052604090205460ff165b15612e8157612e816134bf565b612ebc600d8054600e55600f805460105560118054601255601380546014556015805460165560009081905590819055908190559182905555565b60175460ff16158015612ee857506001600160a01b0386166000908152601f602052604090205460ff16155b8015612f0d57506001600160a01b0385166000908152601f602052604090205460ff16155b15612fde576001600160a01b03861660009081526021602052604090205460ff1615612f7b5760175462ffffff600160201b82048116600d55600160501b82048116600f55600160801b82048116601155600160b01b82048116601355600160e01b90910416601555612fde565b6001600160a01b03851660009081526021602052604090205460ff1615612fde5760175462ffffff61010082048116600d55600160381b82048116600f55600160681b82048116601155600160981b82048116601355600160c81b909104166015555b612fe9868686613d18565b61300c601654601555601454601355600e54600d55601054600f55601254601155565b60175460ff16613100576001600160a01b038616600090815260208052604090205460ff1661308757601c548411156130875760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2065786365656473207472616e73666572206c696d69740000006044820152606401610cae565b6001600160a01b038516600090815260208052604090205460ff1661310057601b546130b286611937565b11156131005760405162461bcd60e51b815260206004820152601f60248201527f45524332303a2065786365656473206d61782077616c6c6574206c696d6974006044820152606401610cae565b505050505050565b6000806000613115614218565b90925090506131248183614c59565b9250505090565b60008060008060008061313d8761439b565b9050600061314a886143b9565b90506000613157896143cd565b905060006131648a6143e1565b905060006131718b6143f5565b949b939a50919850965091945092505050565b8015806131fe5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156131d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131fc9190614e37565b155b6132695760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610cae565b6040516001600160a01b0383166024820152604481018290526132cc90849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614409565b505050565b6001600160a01b03821660009081526021602052604090205481151560ff9091161515036133675760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610cae565b6001600160a01b0382166000908152602160205260409020805460ff191682158015919091179091556133a25761339d82611500565b6133ab565b6133ab82610e8e565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab9101610dfe565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0383166024820152604481018290526132cc90849063a9059cbb60e01b90606401613295565b6040516001600160a01b03808516602483015283166044820152606481018290526134b99085906323b872dd60e01b90608401613295565b50505050565b6017805460ff191660011790556022546000906134de90600290614c59565b90506000601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613535573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135599190614e1a565b6002546001600160a01b039081169116146135df576002546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156135b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135da9190614e37565b6135e1565b475b9050600080601860149054906101000a900460ff161561390d5760006024546023548661360e9190614cbb565b6136189190614cbb565b9050801561362957613629816144de565b601d54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015613673573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136979190614e1a565b6002546001600160a01b03908116911614613727576002546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa1580156136f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137189190614e37565b6137229190614c7b565b613731565b6137318547614c7b565b9050600082602354836137449190614ca4565b61374e9190614c59565b90508261375b8884614ca4565b6137659190614c59565b9450846137728284614c7b565b61377c9190614c7b565b9350801561390557601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137fb9190614e1a565b6002546001600160a01b039182169116036138ad576018546040516000916001600160a01b03169083908381818185875af1925050503d806000811461385d576040519150601f19603f3d011682016040523d82523d6000602084013e613862565b606091505b5050905080156138a7576040805160008152602081018490527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b50613905565b6018546002546138ca916001600160a01b03918216911683613451565b6040805160008152602081018390527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b505050613ac1565b60006024548561391d9190614cbb565b9050801561392e5761392e816144de565b601d54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015613978573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061399c9190614e1a565b6002546001600160a01b03908116911614613a2c576002546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa1580156139f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a1d9190614e37565b613a279190614c7b565b613a36565b613a368547614c7b565b905081613a438783614ca4565b613a4d9190614c59565b9350613a598482614c7b565b60235490935015613abe57601854602354613a819130916001600160a01b0390911690612d21565b60235460408051918252600060208301527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b50505b600084118015613ad15750600082115b15613b1a57613ae08483614697565b60408051858152602081018490527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f8381486910160405180910390a15b8015613c9357601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b979190614e1a565b6002546001600160a01b03918216911603613c42576019546040516000916001600160a01b03169083908381818185875af1925050503d8060008114613bf9576040519150601f19603f3d011682016040523d82523d6000602084013e613bfe565b606091505b505090508015613c3c576040518281527fe3630e0003fb3e9f9d835bb839022e52ffd576f9f35c395dd17517106f78cb339060200160405180910390a15b50613c93565b601954600254613c5f916001600160a01b03918216911683613451565b6040518181527fe3630e0003fb3e9f9d835bb839022e52ffd576f9f35c395dd17517106f78cb339060200160405180910390a15b6000602381905560248190556022819055613cad30611937565b1115613d08576000546001600160a01b031615613ced57613ce830613cda6000546001600160a01b031690565b613ce330611937565b612d21565b613d08565b601954613d089030906001600160a01b0316613ce382611937565b50506017805460ff191690555050565b6000806000806000613d298661312b565b94509450945094509450600081838587898b613d459190614c7b565b613d4f9190614c7b565b613d599190614c7b565b613d639190614c7b565b613d6d9190614c7b565b90506000613d79613108565b905082600854613d899190614c7b565b600855613d968184614ca4565b600954613da39190614c7b565b6009556040518381526000906001600160a01b038c1690600080516020614fac8339815191529060200160405180910390a385602254613de39190614cbb565b602255602354613df4908690614cbb565b602355602454613e05908590614cbb565b602455600084613e158789614cbb565b613e1f9190614cbb565b9050613e2b8282614ca4565b30600090815260036020526040902054613e459190614cbb565b3060009081526003602090815260408083209390935560069052205460ff1615613e955730600090815260046020526040902054613e84908290614cbb565b306000908152600460205260409020555b60405181815230906001600160a01b038d1690600080516020614fac8339815191529060200160405180910390a3506001600160a01b038a1660009081526006602052604090205460ff168015613f0557506001600160a01b03891660009081526006602052604090205460ff16155b15613fd8576001600160a01b038a16600090815260046020526040902054613f2e908990614c7b565b6001600160a01b038b16600090815260046020526040902055613f518189614ca4565b6001600160a01b038b16600090815260036020526040902054613f749190614c7b565b6001600160a01b038b16600090815260036020526040902055613f978183614ca4565b6001600160a01b038a16600090815260036020526040902054613fba9190614cbb565b6001600160a01b038a166000908152600360205260409020556141be565b6001600160a01b038a1660009081526006602052604090205460ff1615801561401957506001600160a01b03891660009081526006602052604090205460ff165b156140a5576140288189614ca4565b6001600160a01b038b1660009081526003602052604090205461404b9190614c7b565b6001600160a01b03808c16600090815260036020908152604080832094909455918c16815260049091522054614082908390614cbb565b6001600160a01b038a16600090815260046020526040902055613f978183614ca4565b6001600160a01b038a1660009081526006602052604090205460ff1680156140e557506001600160a01b03891660009081526006602052604090205460ff165b15614131576001600160a01b038a1660009081526004602052604090205461410e908990614c7b565b6001600160a01b038b166000908152600460205260409020556140288189614ca4565b61413b8189614ca4565b6001600160a01b038b1660009081526003602052604090205461415e9190614c7b565b6001600160a01b038b166000908152600360205260409020556141818183614ca4565b6001600160a01b038a166000908152600360205260409020546141a49190614cbb565b6001600160a01b038a166000908152600360205260409020555b6141d16141cb8289614ca4565b8861485f565b886001600160a01b03168a6001600160a01b0316600080516020614fac8339815191528460405161420491815260200190565b60405180910390a350505050505050505050565b6009546008546000918291825b60075481101561436a5782600360006007848154811061424757614247614c8e565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806142b2575081600460006007848154811061428b5761428b614c8e565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156142c857600954600854945094505050509091565b60036000600783815481106142df576142df614c8e565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461430e9084614c7b565b9250600460006007838154811061432757614327614c8e565b60009182526020808320909101546001600160a01b031683528201929092526040019020546143569083614c7b565b91508061436281614ce4565b915050614225565b5060085460095461437b9190614c59565b821015614392576009546008549350935050509091565b90939092509050565b6000620f4240600d54836143af9190614ca4565b610c459190614c59565b6000620f4240600f54836143af9190614ca4565b6000620f4240601154836143af9190614ca4565b6000620f4240601354836143af9190614ca4565b6000620f4240601554836143af9190614ca4565b600061445e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166148859092919063ffffffff16565b905080516000148061447f57508080602001905181019061447f9190614f05565b6132cc5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610cae565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061451357614513614c8e565b6001600160a01b03928316602091820292909201015260025482519116908290600190811061454457614544614c8e565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561459d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145c19190614e1a565b6001600160a01b0316816001815181106145dd576145dd614c8e565b60200260200101516001600160a01b03160361465a57601d5460405163791ac94760e01b81526001600160a01b039091169063791ac9479061462c908590600090869030904290600401614ec9565b600060405180830381600087803b15801561464657600080fd5b505af1158015613100573d6000803e3d6000fd5b600154601d54604051637274ca1b60e11b81526001600160a01b039283169263e4e994369261462c92911690869060009087904290600401614f22565b601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156146ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061470e9190614e1a565b6002546001600160a01b039182169116036147bd57601d5460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015614791573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906147b69190614f61565b5050505050565b601d5460025460405162e8e33760e81b81523060048201526001600160a01b039182166024820152604481018590526064810184905260006084820181905260a482015261dead60c48201524260e482015291169063e8e3370090610104016060604051808303816000875af115801561483b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147b69190614f61565b8160095461486d9190614c7b565b600955600a5461487e908290614cbb565b600a555050565b6060614894848460008561489c565b949350505050565b6060824710156148fd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610cae565b600080866001600160a01b031685876040516149199190614f8f565b60006040518083038185875af1925050503d8060008114614956576040519150601f19603f3d011682016040523d82523d6000602084013e61495b565b606091505b509150915061496c87838387614977565b979650505050505050565b606083156149e65782516000036149df576001600160a01b0385163b6149df5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cae565b5081614894565b61489483838151156149fb5781518083602001fd5b8060405162461bcd60e51b8152600401610cae9190614a39565b60005b83811015614a30578181015183820152602001614a18565b50506000910152565b6020815260008251806020840152614a58816040850160208701614a15565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611e8657600080fd5b60008060408385031215614a9457600080fd5b8235614a9f81614a6c565b946020939093013593505050565b600060208284031215614abf57600080fd5b5035919050565b600080600060608486031215614adb57600080fd5b8335614ae681614a6c565b92506020840135614af681614a6c565b929592945050506040919091013590565b8015158114611e8657600080fd5b60008060408385031215614b2857600080fd5b8235614b3381614a6c565b91506020830135614b4381614b07565b809150509250929050565b600060208284031215614b6057600080fd5b8135610e8781614a6c565b803562ffffff81168114614b7e57600080fd5b919050565b60008060408385031215614b9657600080fd5b614b9f83614b6b565b9150614bad60208401614b6b565b90509250929050565b60008060408385031215614bc957600080fd5b823591506020830135614b4381614b07565b60008060408385031215614bee57600080fd5b8235614bf981614a6c565b91506020830135614b4381614a6c565b600181811c90821680614c1d57607f821691505b602082108103614c3d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082614c7657634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610c4557610c45614c43565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610c4557610c45614c43565b80820180821115610c4557610c45614c43565b634e487b7160e01b600052603160045260246000fd5b600060018201614cf657614cf6614c43565b5060010190565b62ffffff8181168382160190808211156113b7576113b7614c43565b60208082526015908201527473656c6c20746f74616c20666565203c3d2033302560581b604082015260600190565b60208082526014908201527362757920746f74616c20666565203c3d2033302560601b604082015260600190565b6020808252600f908201526e73656c6c20666565203c3d2031352560881b604082015260600190565b6020808252600e908201526d62757920666565203c3d2031352560901b604082015260600190565b60208082526033908201527f6d61726b6574696e672077616c6c65742063616e27742062652073616d6520776040820152721a5d1a08151c99585cdd5c9e481dd85b1b195d606a1b606082015260800190565b600060208284031215614e2c57600080fd5b8151610e8781614a6c565b600060208284031215614e4957600080fd5b5051919050565b600081518084526020808501945080840160005b83811015614e895781516001600160a01b031687529582019590820190600101614e64565b509495945050505050565b848152608060208201526000614ead6080830186614e50565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201526000614ee860a0830186614e50565b6001600160a01b0394909416606083015250608001529392505050565b600060208284031215614f1757600080fd5b8151610e8781614b07565b60018060a01b038616815284602082015283604082015260a060608201526000614f4f60a0830185614e50565b90508260808301529695505050505050565b600080600060608486031215614f7657600080fd5b8351925060208401519150604084015190509250925092565b60008251614fa1818460208701614a15565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a0998bef53fc625546c7e09271cfc55bc8067f2d828dc18388682ac836109ce864736f6c63430008130033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000001f0c586d5dc6dc856000000000000000000000000000000000000000000000001f0c586d5dc6dc856000000000000000000000000000000000000000000000001f0c586d5dc6dc856000000000000000000000000000001fefc2992469b36dc7c436820ebf52b0700652810000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000274c40a14dd597671364e30c8a43c131cc2877c800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0dcc752af9be6a07a67934471d7cd901a6094e60000000000000000000000001ccfe8c40ef259566433716002e379dfffbf5a3e0000000000000000000000000000000000000000000000000000000000000011437279707469512045636f73797374656d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000743727970746951000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f041690d9cbe398d3d51f25c87902c1403affe66

-----Decoded View---------------
Arg [0] : args (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
Arg [1] : autoApproveAddressList (address[]): 0xF041690D9cBE398d3D51F25C87902C1403AffE66
Arg [2] : referrer (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
32 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 00000000000000000000000000000000000000000000000000000000000002e0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000320
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [6] : 0000000000000000000000000000000000000000001f0c586d5dc6dc85600000
Arg [7] : 0000000000000000000000000000000000000000001f0c586d5dc6dc85600000
Arg [8] : 0000000000000000000000000000000000000000001f0c586d5dc6dc85600000
Arg [9] : 0000000000000000000000001fefc2992469b36dc7c436820ebf52b070065281
Arg [10] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [11] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [12] : 000000000000000000000000274c40a14dd597671364e30c8a43c131cc2877c8
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [24] : 000000000000000000000000c0dcc752af9be6a07a67934471d7cd901a6094e6
Arg [25] : 0000000000000000000000001ccfe8c40ef259566433716002e379dfffbf5a3e
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [27] : 437279707469512045636f73797374656d000000000000000000000000000000
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [29] : 4372797074695100000000000000000000000000000000000000000000000000
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [31] : 000000000000000000000000f041690d9cbe398d3d51f25c87902c1403affe66


Deployed Bytecode Sourcemap

20133:40408:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38199:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39196:193;;;;;;;;;;-1:-1:-1;39196:193:0;;;;;:::i;:::-;;:::i;:::-;;;1291:14:1;;1284:22;1266:41;;1254:2;1239:18;39196:193:0;1126:187:1;22012:26:0;;;;;;;;;;-1:-1:-1;22012:26:0;;;;-1:-1:-1;;;22012:26:0;;;;;;;;;1492:8:1;1480:21;;;1462:40;;1450:2;1435:18;22012:26:0;1318:190:1;40573:94:0;;;;;;;;;;-1:-1:-1;40644:15:0;;40573:94;;;1659:25:1;;;1647:2;1632:18;40573:94:0;1513:177:1;38482:97:0;;;;;;;;;;-1:-1:-1;38564:7:0;;38482:97;;34322:242;;;;;;;;;;-1:-1:-1;34322:242:0;;;;;:::i;:::-;;:::i;:::-;;39397:350;;;;;;;;;;-1:-1:-1;39397:350:0;;;;;:::i;:::-;;:::i;50397:323::-;;;;;;;;;;-1:-1:-1;50397:323:0;;;;;:::i;:::-;;:::i;41562:317::-;;;;;;;;;;-1:-1:-1;41562:317:0;;;;;:::i;:::-;;:::i;38389:85::-;;;;;;;;;;-1:-1:-1;38457:9:0;;-1:-1:-1;;;38457:9:0;;;;38389:85;;3023:4:1;3011:17;;;2993:36;;2981:2;2966:18;38389:85:0;2851:184:1;42391:613:0;;;;;;;;;;-1:-1:-1;42391:613:0;;;;;:::i;:::-;;:::i;39755:299::-;;;;;;;;;;-1:-1:-1;39755:299:0;;;;;:::i;:::-;;:::i;46116:862::-;;;;;;;;;;-1:-1:-1;46116:862:0;;;;;:::i;:::-;;:::i;40675:879::-;;;;;;;;;;-1:-1:-1;40675:879:0;;;;;:::i;:::-;;:::i;22412:29::-;;;;;;;;;;-1:-1:-1;22412:29:0;;;;-1:-1:-1;;;;;22412:29:0;;;;;;-1:-1:-1;;;;;4197:32:1;;;4179:51;;4167:2;4152:18;22412:29:0;4033:203:1;47800:701:0;;;;;;;;;;-1:-1:-1;47800:701:0;;;;;:::i;:::-;;:::i;21016:33::-;;;;;;;;;;-1:-1:-1;21016:33:0;;;;-1:-1:-1;;;;;21016:33:0;;;41887:496;;;;;;;;;;-1:-1:-1;41887:496:0;;;;;:::i;:::-;;:::i;22646:49::-;;;;;;;;;;-1:-1:-1;22646:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;22370:35;;;;;;;;;;-1:-1:-1;22370:35:0;;;;-1:-1:-1;;;22370:35:0;;;;;;22231:28;;;;;;;;;;-1:-1:-1;22231:28:0;;;;-1:-1:-1;;;22231:28:0;;;;;;22195:29;;;;;;;;;;-1:-1:-1;22195:29:0;;;;-1:-1:-1;;;22195:29:0;;;;;;30955:799;;;;;;;;;;-1:-1:-1;30955:799:0;;;;;:::i;:::-;;:::i;38587:198::-;;;;;;;;;;-1:-1:-1;38587:198:0;;;;;:::i;:::-;;:::i;5942:103::-;;;;;;;;;;;;;:::i;49160:322::-;;;;;;;;;;-1:-1:-1;49160:322:0;;;;;:::i;:::-;;:::i;22333:30::-;;;;;;;;;;-1:-1:-1;22333:30:0;;;;-1:-1:-1;;;;;22333:30:0;;;22157:29;;;;;;;;;;-1:-1:-1;22157:29:0;;;;-1:-1:-1;;;22157:29:0;;;;;;20970:39;;;;;;;;;;-1:-1:-1;20970:39:0;;;;-1:-1:-1;;;;;20970:39:0;;;48509:643;;;;;;;;;;-1:-1:-1;48509:643:0;;;;;:::i;:::-;;:::i;45274:834::-;;;;;;;;;;-1:-1:-1;45274:834:0;;;;;:::i;:::-;;:::i;22614:23::-;;;;;;;;;;-1:-1:-1;22614:23:0;;;;-1:-1:-1;;;;;22614:23:0;;;40411:154;;;;;;;;;;-1:-1:-1;40411:154:0;;;;;:::i;:::-;-1:-1:-1;;;;;40537:20:0;40508:4;40537:20;;;:11;:20;;;;;;;;;40411:154;60296:207;;;;;;;;;;-1:-1:-1;60296:207:0;;;;;:::i;:::-;;:::i;5711:87::-;;;;;;;;;;-1:-1:-1;5757:7:0;5784:6;-1:-1:-1;;;;;5784:6:0;5711:87;;58362:1738;;;:::i;22120:30::-;;;;;;;;;;-1:-1:-1;22120:30:0;;;;-1:-1:-1;;;22120:30:0;;;;;;38292:89;;;;;;;;;;;;;:::i;49490:163::-;;;;;;;;;;-1:-1:-1;49490:163:0;;;;;:::i;:::-;;:::i;40062:341::-;;;;;;;;;;-1:-1:-1;40062:341:0;;;;;:::i;:::-;;:::i;38793:201::-;;;;;;;;;;-1:-1:-1;38793:201:0;;;;;:::i;:::-;;:::i;34572:366::-;;;;;;;;;;-1:-1:-1;34572:366:0;;;;;:::i;:::-;;:::i;22268:25::-;;;;;;;;;;-1:-1:-1;22268:25:0;;;;-1:-1:-1;;;22268:25:0;;;;;;22775:57;;;;;;;;;;-1:-1:-1;22775:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;22525:35;;;;;;;;;;;;;;;;22571:36;;;;;;;;;;-1:-1:-1;22571:36:0;;;;-1:-1:-1;;;;;22571:36:0;;;43511:874;;;;;;;;;;-1:-1:-1;43511:874:0;;;;;:::i;:::-;;:::i;46986:806::-;;;;;;;;;;-1:-1:-1;46986:806:0;;;;;:::i;:::-;;:::i;39002:186::-;;;;;;;;;;-1:-1:-1;39002:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;39153:18:0;;;39121:7;39153:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;39002:186;21978:27;;;;;;;;;;-1:-1:-1;21978:27:0;;;;;;;;;;;50155:234;;;;;;;;;;-1:-1:-1;50155:234:0;;;;;:::i;:::-;;:::i;60106:184::-;;;;;;;;;;;;;:::i;22300:24::-;;;;;;;;;;-1:-1:-1;22300:24:0;;;;-1:-1:-1;;;22300:24:0;;;;;;22702:66;;;;;;;;;;-1:-1:-1;22702:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;44393:873;;;;;;;;;;-1:-1:-1;44393:873:0;;;;;:::i;:::-;;:::i;22082:29::-;;;;;;;;;;-1:-1:-1;22082:29:0;;;;-1:-1:-1;;;22082:29:0;;;;;;6051:201;;;;;;;;;;-1:-1:-1;6051:201:0;;;;;:::i;:::-;;:::i;22045:30::-;;;;;;;;;;-1:-1:-1;22045:30:0;;;;-1:-1:-1;;;22045:30:0;;;;;;22494:24;;;;;;;;;;;;;;;;22454:33;;;;;;;;;;;;;;;;38199:85;38238:13;38271:5;38264:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38199:85;:::o;39196:193::-;39298:4;39320:39;5270:10;39343:7;39352:6;39320:8;:39::i;:::-;-1:-1:-1;39377:4:0;39196:193;;;;;:::o;34322:242::-;5672:13;:11;:13::i;:::-;34427:5:::1;34417:7;;:15;;;;:::i;:::-;34405:10;:27;;34397:72;;;::::0;-1:-1:-1;;;34397:72:0;;6043:2:1;34397:72:0::1;::::0;::::1;6025:21:1::0;;;6062:18;;;6055:30;6121:34;6101:18;;;6094:62;6173:18;;34397:72:0::1;;;;;;;;;34513:9;::::0;34485:38:::1;::::0;;6376:25:1;;;6432:2;6417:18;;6410:34;;;;34485:38:0::1;::::0;6349:18:1;34485:38:0::1;;;;;;;34534:9;:22:::0;34322:242::o;39397:350::-;39531:4;39548:36;39558:6;39566:9;39577:6;39548:9;:36::i;:::-;-1:-1:-1;;;;;39666:19:0;;;;;;:11;:19;;;;;;;;5270:10;39666:33;;;;;;;;;39595:122;;39618:6;;39666:40;;39700:6;;39666:40;:::i;:::-;39595:8;:122::i;:::-;-1:-1:-1;39735:4:0;39397:350;;;;;:::o;50397:323::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;50527:43:0;::::1;;::::0;;;:34:::1;:43:::0;;;;;;:49;::::1;;:43;::::0;;::::1;:49;;::::0;50519:69:::1;;;::::0;-1:-1:-1;;;50519:69:0;;6790:2:1;50519:69:0::1;::::0;::::1;6772:21:1::0;6829:1;6809:18;;;6802:29;-1:-1:-1;;;6847:18:1;;;6840:37;6894:18;;50519:69:0::1;6588:330:1::0;50519:69:0::1;-1:-1:-1::0;;;;;50599:43:0;::::1;;::::0;;;:34:::1;:43:::0;;;;;;;;:50;;-1:-1:-1;;50599:50:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50665:47;;1266:41:1;;;50665:47:0::1;::::0;1239:18:1;50665:47:0::1;;;;;;;;50397:323:::0;;:::o;41562:317::-;41656:7;41714;;41703;:18;;41681:110;;;;-1:-1:-1;;;41681:110:0;;7125:2:1;41681:110:0;;;7107:21:1;7164:2;7144:18;;;7137:30;7203:34;7183:18;;;7176:62;-1:-1:-1;;;7254:18:1;;;7247:40;7304:19;;41681:110:0;6923:406:1;41681:110:0;41802:19;41824:10;:8;:10::i;:::-;41802:32;-1:-1:-1;41852:19:0;41802:32;41852:7;:19;:::i;:::-;41845:26;41562:317;-1:-1:-1;;;41562:317:0:o;42391:613::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;42469:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;42461:56;;;::::0;-1:-1:-1;;;42461:56:0;;7536:2:1;42461:56:0::1;::::0;::::1;7518:21:1::0;7575:2;7555:18;;;7548:30;7614:25;7594:18;;;7587:53;7657:18;;42461:56:0::1;7334:347:1::0;42461:56:0::1;42533:9;42528:469;42552:9;:16:::0;42548:20;::::1;42528:469;;;42610:7;-1:-1:-1::0;;;;;42594:23:0::1;:9;42604:1;42594:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;42594:12:0::1;:23:::0;42590:396:::1;;-1:-1:-1::0;;;;;42658:16:0;::::1;42638:19;42658:16:::0;;;:7:::1;:16;::::0;;;;;42727:10:::1;:8;:10::i;:::-;-1:-1:-1::0;;;;;42710:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;:27:::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;;;;;42693:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:44;;;42764:7:::1;::::0;:19:::1;::::0;42772:11;;42764:19:::1;:::i;:::-;:36;;;;:::i;:::-;42756:7;:44:::0;-1:-1:-1;;;;;42819:20:0;::::1;42842:5;42819:20:::0;;;:11:::1;:20;::::0;;;;:28;;-1:-1:-1;;42819:28:0::1;::::0;;42881:9:::1;42891:16:::0;;:20:::1;::::0;42819:28;;42891:20:::1;:::i;:::-;42881:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;42866:9:::1;:12:::0;;-1:-1:-1;;;;;42881:31:0;;::::1;::::0;42876:1;;42866:12;::::1;;;;;:::i;:::-;;;;;;;;;:46;;;;;-1:-1:-1::0;;;;;42866:46:0::1;;;;;-1:-1:-1::0;;;;;42866:46:0::1;;;;;;42931:9;:15;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;42931:15:0;;;;;-1:-1:-1;;;;;;42931:15:0::1;::::0;;;;;-1:-1:-1;42528:469:0::1;42391:613:::0;:::o;42590:396::-:1;42570:3:::0;::::1;::::0;::::1;:::i;:::-;;;;42528:469;;;;42391:613:::0;:::o;39755:299::-;5270:10;39872:4;39966:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;39966:34:0;;;;;;;;;;39872:4;;39894:130;;39944:7;;39966:47;;40002:10;;39966:47;:::i;46116:862::-;5672:13;:11;:13::i;:::-;46342:11:::1;::::0;46357:6:::1;::::0;46342:11:::1;-1:-1:-1::0;;;46342:11:0;::::1;::::0;::::1;::::0;::::1;46326:13:::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;46307:16:0;::::1;::::0;::::1;::::0;46269:35:::1;::::0;-1:-1:-1;;;46288:16:0;;::::1;;46269::::0;:35:::1;:::i;:::-;:54;;;;:::i;:::-;:70;;;;:::i;:::-;:84;;;;:::i;:::-;:94;;;;46247:165;;;;-1:-1:-1::0;;;46247:165:0::1;;;;;;;:::i;:::-;46514:10;::::0;46528:6:::1;::::0;46514:10:::1;-1:-1:-1::0;;;46514:10:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;46499:12:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;46481:15:0;::::1;::::0;::::1;::::0;46445:33:::1;::::0;-1:-1:-1;;;46463:15:0;;::::1;;46445::::0;:33:::1;:::i;:::-;:51;;;;:::i;:::-;:66;;;;:::i;:::-;:79;;;;:::i;:::-;:89;;;;46423:159;;;;-1:-1:-1::0;;;46423:159:0::1;;;;;;;:::i;:::-;46620:6;46601:16;:25;;;;46593:53;;;;-1:-1:-1::0;;;46593:53:0::1;;;;;;;:::i;:::-;46683:6;46665:15;:24;;;;46657:51;;;;-1:-1:-1::0;;;46657:51:0::1;;;;;;;:::i;:::-;46818:15;::::0;46724:150:::1;::::0;;46818:15:::1;10222::1::0;;;10204:34;;10274:15;;;10269:2;10254:18;;10247:43;-1:-1:-1;;;46818:15:0;::::1;::::0;::::1;10306:18:1::0;;;10299:43;-1:-1:-1;;;46849:14:0;;::::1;::::0;;::::1;10373:2:1::0;10358:18;;10351:43;46724:150:0;::::1;::::0;;;;10164:3:1;46724:150:0;;::::1;46885:15;:34:::0;;-1:-1:-1;;;;46930:32:0;-1:-1:-1;;;46885:34:0::1;::::0;;::::1;;-1:-1:-1::0;;;;46930:32:0;;-1:-1:-1;;;46930:32:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;46116:862::o;40675:879::-;40795:7;40839;;40828;:18;;40820:62;;;;-1:-1:-1;;;40820:62:0;;10607:2:1;40820:62:0;;;10589:21:1;10646:2;10626:18;;;10619:30;10685:33;10665:18;;;10658:61;10736:18;;40820:62:0;10405:355:1;40820:62:0;40893:19;40915:10;:8;:10::i;:::-;40893:32;;40941:17;40936:611;;40987:15;41005:19;41013:11;41005:7;:19;:::i;:::-;40987:37;-1:-1:-1;41039:14:0;;-1:-1:-1;;41039:14:0;40936:611;41116:17;41152:18;41189;41226:17;41262:13;41302:20;41314:7;41302:11;:20::i;:::-;41086:236;;;;;;;;;;41337:23;41423:5;41411:9;41398:10;41385;41373:9;41363:7;:19;;;;:::i;:::-;:32;;;;:::i;:::-;:45;;;;:::i;:::-;:57;;;;:::i;:::-;:65;;;;:::i;:::-;41337:91;-1:-1:-1;41443:23:0;41469:29;41487:11;41337:91;41469:29;:::i;:::-;41443:55;-1:-1:-1;41513:22:0;;-1:-1:-1;;;;;;;;41513:22:0;40936:611;40809:745;40675:879;;;;:::o;47800:701::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;47951:30:0;::::1;47943:70;;;::::0;-1:-1:-1;;;47943:70:0;;10967:2:1;47943:70:0::1;::::0;::::1;10949:21:1::0;11006:2;10986:18;;;10979:30;11045:29;11025:18;;;11018:57;11092:18;;47943:70:0::1;10765:351:1::0;47943:70:0::1;48052:14;::::0;-1:-1:-1;;;;;48052:14:0;;::::1;48032:34:::0;;::::1;::::0;48024:98:::1;;;;-1:-1:-1::0;;;48024:98:0::1;;;;;;;:::i;:::-;48217:15;::::0;48138:120:::1;::::0;;11728:14:1;;11721:22;11703:41;;-1:-1:-1;;;48234:23:0;::::1;;;11787:14:1::0;11780:22;11775:2;11760:18;;11753:50;-1:-1:-1;;;;;48217:15:0;;::::1;::::0;48138:120;::::1;::::0;::::1;::::0;11676:18:1;48138:120:0::1;;;;;;;48269:15;:34:::0;;48314:50;::::1;;-1:-1:-1::0;;;48314:50:0::1;-1:-1:-1::0;;;;;;48314:50:0;;;-1:-1:-1;;;;;48269:34:0;;::::1;48314:50:::0;;;;;;::::1;::::0;;48269:15:::1;48375:35:::0;;;:17:::1;:35;::::0;;;;;;;:42;;-1:-1:-1;;48375:42:0;;::::1;48269:34:::0;48375:42;;::::1;::::0;;;48432:52;;;;;:57;;;;::::1;::::0;;::::1;::::0;;47800:701::o;41887:496::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;41968:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;41967:21;41959:61;;;::::0;-1:-1:-1;;;41959:61:0;;12016:2:1;41959:61:0::1;::::0;::::1;11998:21:1::0;12055:2;12035:18;;;12028:30;12094:29;12074:18;;;12067:57;12141:18;;41959:61:0::1;11814:351:1::0;41959:61:0::1;42053:9;:16:::0;42077:2:::1;::::0;42053:20:::1;::::0;42072:1:::1;42053:20;:::i;:::-;:26;;42031:153;;;::::0;-1:-1:-1;;;42031:153:0;;12372:2:1;42031:153:0::1;::::0;::::1;12354:21:1::0;12411:2;12391:18;;;12384:30;12450:34;12430:18;;;12423:62;12521:34;12501:18;;;12494:62;-1:-1:-1;;;12572:19:1;;;12565:44;12626:19;;42031:153:0::1;12170:481:1::0;42031:153:0::1;-1:-1:-1::0;;;;;42199:16:0;::::1;42218:1;42199:16:::0;;;:7:::1;:16;::::0;;;;;:20;42195:109:::1;;-1:-1:-1::0;;;;;42275:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;42255:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;42236:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;42195:109:::1;-1:-1:-1::0;;;;;42314:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;42314:27:0::1;42337:4;42314:27:::0;;::::1;::::0;;;42352:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;42352:23:0::1;::::0;;::::1;::::0;;41887:496::o;30955:799::-;5672:13;:11;:13::i;:::-;31089:18:::1;:40:::0;;-1:-1:-1;;;;;;31089:40:0::1;-1:-1:-1::0;;;;;31089:40:0;;::::1;::::0;;;::::1;::::0;;;31151:10:::1;::::0;31143:34;;::::1;31151:10:::0;::::1;31143:34;31140:165;;31193:41;31210:4;31217:11:::0;-1:-1:-1;;31193:8:0::1;:41::i;:::-;31249:10;:44:::0;;-1:-1:-1;;;;;;31249:44:0::1;-1:-1:-1::0;;;;;31249:44:0;::::1;;::::0;;31140:165:::1;31345:10;;;;;;;;;-1:-1:-1::0;;;;;31345:10:0::1;-1:-1:-1::0;;;;;31345:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31420:18;::::0;31327:122:::1;::::0;-1:-1:-1;;;31327:122:0;;31400:4:::1;31327:122;::::0;::::1;13124:34:1::0;-1:-1:-1;;;;;31420:18:0;;::::1;13174::1::0;;;13167:43;31327:50:0;::::1;::::0;::::1;::::0;13059:18:1;;31327:122:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31316:8;:133:::0;;-1:-1:-1;;;;;;31316:133:0::1;-1:-1:-1::0;;;;;31316:133:0;;::::1;;::::0;;31485:10:::1;::::0;:17:::1;::::0;;-1:-1:-1;;;31485:17:0;;;;:10;;;::::1;::::0;:15:::1;::::0;:17:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:17:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31463:18;::::0;-1:-1:-1;;;;;31463:18:0;;::::1;:39:::0;::::1;;31460:146;;31577:10;::::0;31537:18:::1;::::0;31530:64:::1;::::0;-1:-1:-1;;;;;31537:18:0;;::::1;::::0;31577:10:::1;-1:-1:-1::0;;31530:38:0::1;:64::i;:::-;31647:10;::::0;31660:8:::1;::::0;31670:18:::1;::::0;31621:68:::1;::::0;;-1:-1:-1;;;;;31647:10:0;;::::1;13461:34:1::0;;31660:8:0;;::::1;13526:2:1::0;13511:18;;13504:43;31670:18:0;::::1;13563::1::0;;;13556:43;31621:68:0;;::::1;::::0;;;;13411:2:1;31621:68:0;;::::1;31729:8;::::0;31700:44:::1;::::0;-1:-1:-1;;;;;31729:8:0::1;::::0;31700:28:::1;:44::i;38587:198::-:0;-1:-1:-1;;;;;38677:20:0;;38653:7;38677:20;;;:11;:20;;;;;;;;38673:49;;;-1:-1:-1;;;;;;38706:16:0;;;;;:7;:16;;;;;;;38587:198::o;38673:49::-;-1:-1:-1;;;;;38760:16:0;;;;;;:7;:16;;;;;;38740:37;;:19;:37::i;5942:103::-;5672:13;:11;:13::i;:::-;6007:30:::1;6034:1;6007:18;:30::i;:::-;5942:103::o:0;49160:322::-;5672:13;:11;:13::i;:::-;49306:1:::1;49284:19;:23;49276:58;;;::::0;-1:-1:-1;;;49276:58:0;;13812:2:1;49276:58:0::1;::::0;::::1;13794:21:1::0;13851:2;13831:18;;;13824:30;-1:-1:-1;;;13870:18:1;;;13863:52;13932:18;;49276:58:0::1;13610:346:1::0;49276:58:0::1;49396:18;::::0;49350:65:::1;::::0;;6376:25:1;;;6432:2;6417:18;;6410:34;;;;49350:65:0::1;::::0;6349:18:1;49350:65:0::1;;;;;;;49426:18;:40:::0;49160:322::o;48509:643::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;48618:29:0;::::1;48610:68;;;::::0;-1:-1:-1;;;48610:68:0;;14163:2:1;48610:68:0::1;::::0;::::1;14145:21:1::0;14202:2;14182:18;;;14175:30;14241:28;14221:18;;;14214:56;14287:18;;48610:68:0::1;13961:350:1::0;48610:68:0::1;48724:4;-1:-1:-1::0;;;;;48697:32:0;::::1;::::0;48689:87:::1;;;::::0;-1:-1:-1;;;48689:87:0;;14518:2:1;48689:87:0::1;::::0;::::1;14500:21:1::0;14557:2;14537:18;;;14530:30;14596:34;14576:18;;;14569:62;-1:-1:-1;;;14647:18:1;;;14640:40;14697:19;;48689:87:0::1;14316:406:1::0;48689:87:0::1;48795:15;::::0;-1:-1:-1;;;;;48795:34:0;;::::1;:15:::0;::::1;:34:::0;48787:98:::1;;;;-1:-1:-1::0;;;48787:98:0::1;;;;;;;:::i;:::-;48952:14;::::0;48901:66:::1;::::0;-1:-1:-1;;;;;48952:14:0;;::::1;::::0;48901:66;::::1;::::0;::::1;::::0;48952:14:::1;::::0;48901:66:::1;48978:14;:32:::0;;-1:-1:-1;;;;;48978:32:0;;::::1;-1:-1:-1::0;;;;;;48978:32:0;;::::1;::::0;::::1;::::0;;:14:::1;49021:34:::0;;;:17:::1;:34;::::0;;;;;;;:41;;-1:-1:-1;;49021:41:0;;::::1;48978:32:::0;49021:41;;::::1;::::0;;;49077:51;;;;;:56;;;;::::1;::::0;;::::1;::::0;;48509:643::o;45274:834::-;5672:13;:11;:13::i;:::-;45494:11:::1;::::0;45509:6:::1;::::0;45494:11:::1;-1:-1:-1::0;;;45494:11:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;45476:15:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;45457:16:0;::::1;::::0;::::1;::::0;45421:33:::1;::::0;-1:-1:-1;;;45438:16:0;;::::1;;45421:14:::0;:33:::1;:::i;:::-;:52;;;;:::i;:::-;:70;;;;:::i;:::-;:84;;;;:::i;:::-;:94;;;;45399:165;;;;-1:-1:-1::0;;;45399:165:0::1;;;;;;;:::i;:::-;45666:10;::::0;45680:6:::1;::::0;45666:10:::1;-1:-1:-1::0;;;45666:10:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;45649:14:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;45631:15:0;::::1;::::0;::::1;::::0;45597:31:::1;::::0;-1:-1:-1;;;45613:15:0;;::::1;;45597:13:::0;:31:::1;:::i;:::-;:49;;;;:::i;:::-;:66;;;;:::i;:::-;:79;;;;:::i;:::-;:89;;;;45575:159;;;;-1:-1:-1::0;;;45575:159:0::1;;;;;;;:::i;:::-;45770:6;45753:14;:23;;;;45745:51;;;;-1:-1:-1::0;;;45745:51:0::1;;;;;;;:::i;:::-;45831:6;45815:13;:22;;;;45807:49;;;;-1:-1:-1::0;;;45807:49:0::1;;;;;;;:::i;:::-;45960:13;::::0;45872:140:::1;::::0;;45960:13:::1;10222:15:1::0;;;10204:34;;10274:15;;;10269:2;10254:18;;10247:43;45960:13:0::1;::::0;::::1;::::0;::::1;10306:18:1::0;;;10299:43;-1:-1:-1;;;45989:12:0;;::::1;::::0;;::::1;10373:2:1::0;10358:18;;10351:43;45872:140:0;::::1;::::0;;;;10164:3:1;45872:140:0;;::::1;46023:13;:30:::0;;-1:-1:-1;;46064:28:0;46023:30:::1;;::::0;;::::1;;-1:-1:-1::0;;46064:28:0;;-1:-1:-1;;;46064:28:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;45274:834::o;60296:207::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;60371:22:0;::::1;60379:4;60371:22:::0;60363:46:::1;;;::::0;-1:-1:-1;;;60363:46:0;;14929:2:1;60363:46:0::1;::::0;::::1;14911:21:1::0;14968:2;14948:18;;;14941:30;-1:-1:-1;;;14987:18:1;;;14980:41;15038:18;;60363:46:0::1;14727:335:1::0;60363:46:0::1;60420:75;60447:7;5757::::0;5784:6;-1:-1:-1;;;;;5784:6:0;;5711:87;60447:7:::1;60456:38;::::0;-1:-1:-1;;;60456:38:0;;60488:4:::1;60456:38;::::0;::::1;4179:51:1::0;-1:-1:-1;;;;;60456:23:0;::::1;::::0;::::1;::::0;4152:18:1;;60456:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;60420:26:0;::::1;::::0;:75;:26:::1;:75::i;:::-;60296:207:::0;:::o;58362:1738::-;58437:16;;;58451:1;58437:16;;;;;;;;58413:21;;58437:16;;;;;;;;-1:-1:-1;;58474:18:0;;58464:7;;;;-1:-1:-1;;;;;;58474:18:0;;58464:7;;-1:-1:-1;58474:18:0;;58464:7;;;;:::i;:::-;;;;;;:28;-1:-1:-1;;;;;58464:28:0;;;-1:-1:-1;;;;;58464:28:0;;;;;58521:4;58503;58508:1;58503:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;58503:23:0;;;:7;;;;;;;;;;:23;;;;58562:10;;:17;;;-1:-1:-1;;;58562:17:0;;;;:10;;;;;:15;;:17;;;;;58503:7;;58562:17;;;;;:10;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;58551:28:0;:4;58556:1;58551:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;58551:28:0;;58547:753;;58595:10;;58769:14;;58595:237;;-1:-1:-1;;;58595:237:0;;-1:-1:-1;;;;;58595:10:0;;;;:61;;58663:9;;58595:237;;:10;;58746:4;;58769:14;;;58802:15;;58595:237;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58547:753;;;58887:18;;58863:14;;-1:-1:-1;;;;;58887:18:0;58880:36;5270:10;58880:50;;-1:-1:-1;;;;;;58880:50:0;;;;;;;-1:-1:-1;;;;;4197:32:1;;;58880:50:0;;;4179:51:1;4152:18;;58880:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58863:67;-1:-1:-1;58945:80:0;5270:10;58952:18;;-1:-1:-1;;;;;58952:18:0;;59011:4;59018:6;58945:43;:80::i;:::-;59040:10;;59225:14;;59040:248;;-1:-1:-1;;;59040:248:0;;-1:-1:-1;;;;;59040:10:0;;;;:64;;:248;;59123:6;;59040:10;;59202:4;;59225:14;;;59258:15;;59040:248;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58848:452;58547:753;59366:14;;-1:-1:-1;;;;;59366:14:0;59354:27;;;;:11;:27;;;;;;;;59351:723;;;59429:14;;-1:-1:-1;;;;;59429:14:0;59421:23;;;;:7;:23;;;;;;59411:7;;:33;;59421:23;59411:33;:::i;:::-;59401:7;:43;59491:14;;-1:-1:-1;;;;;59491:14:0;59483:23;;;;:7;:23;;;;;;59473:7;;:33;;59483:23;59473:33;:::i;:::-;59463:7;:43;59539:14;;-1:-1:-1;;;;;59539:14:0;59563:1;59567:23;;;:7;:23;;;;;;;;;59530:61;;1659:25:1;;;59563:1:0;;59539:14;-1:-1:-1;;;;;;;;;;;59530:61:0;1632:18:1;59530:61:0;;;;;;;59618:14;;;-1:-1:-1;;;;;59618:14:0;;;59636:1;59610:23;;;:7;:23;;;;;;;;:27;;;59664:14;;;;;59656:23;;:7;:23;;;;;;:27;60296:207;:::o;59351:723::-;59773:14;;-1:-1:-1;;;;;59773:14:0;59728;59765:23;;;:7;:23;;;;;;59745:44;;:19;:44::i;:::-;59728:61;;59828:6;59818:7;;:16;;;;:::i;:::-;59808:7;:26;59881:14;;-1:-1:-1;;;;;59881:14:0;59873:23;;;;:7;:23;;;;;;59863:7;;:33;;59873:23;59863:33;:::i;:::-;59853:7;:43;59929:14;;59920:44;;1659:25:1;;;59953:1:0;;-1:-1:-1;;;;;59929:14:0;;-1:-1:-1;;;;;;;;;;;59920:44:0;1647:2:1;1632:18;59920:44:0;;;;;;;-1:-1:-1;59991:14:0;;;-1:-1:-1;;;;;59991:14:0;;;60009:1;59983:23;;;:7;:23;;;;;;;;:27;;;60037:14;;;;;60029:23;;:7;:23;;;;;;:27;58402:1698;58362:1738::o;38292:89::-;38333:13;38366:7;38359:14;;;;;:::i;49490:163::-;5672:13;:11;:13::i;:::-;49604:41:::1;49633:4;49639:5;49604:28;:41::i;40062:341::-:0;5270:10;40184:4;40278:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;40278:34:0;;;;;;;;;;40184:4;;40206:167;;40256:7;;40278:84;;40332:15;;40278:84;:::i;38793:201::-;38900:4;38922:42;5270:10;38946:9;38957:6;38922:9;:42::i;34572:366::-;5672:13;:11;:13::i;:::-;34733:5:::1;34723:7;;:15;;;;:::i;:::-;34700:21;:38;;34692:94;;;::::0;-1:-1:-1;;;34692:94:0;;17158:2:1;34692:94:0::1;::::0;::::1;17140:21:1::0;17197:2;17177:18;;;17170:30;17236:34;17216:18;;;17209:62;-1:-1:-1;;;17287:18:1;;;17280:41;17338:19;;34692:94:0::1;16956:407:1::0;34692:94:0::1;34854:20;::::0;34804:71:::1;::::0;;6376:25:1;;;6432:2;6417:18;;6410:34;;;;34804:71:0::1;::::0;6349:18:1;34804:71:0::1;;;;;;;34886:20;:44:::0;34572:366::o;43511:874::-;5672:13;:11;:13::i;:::-;43740:11:::1;::::0;43755:6:::1;::::0;43740:11:::1;-1:-1:-1::0;;;43740:11:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;43722:15:0;::::1;::::0;::::1;::::0;43740:11:::1;43706:13:::0;::::1;::::0;::::1;::::0;43667:36:::1;::::0;-1:-1:-1;;;43687:16:0;;::::1;;43667:17:::0;:36:::1;:::i;:::-;:52;;;;:::i;:::-;:70;;;;:::i;:::-;:84;;;;:::i;:::-;:94;;;;43645:165;;;;-1:-1:-1::0;;;43645:165:0::1;;;;;;;:::i;:::-;43912:10;::::0;43926:6:::1;::::0;43912:10:::1;-1:-1:-1::0;;;43912:10:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;43895:14:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;43880:12:0;::::1;::::0;::::1;::::0;43843:34:::1;::::0;-1:-1:-1;;;43862:15:0;;::::1;;43843:16:::0;:34:::1;:::i;:::-;:49;;;;:::i;:::-;:66;;;;:::i;:::-;:79;;;;:::i;:::-;:89;;;;43821:159;;;;-1:-1:-1::0;;;43821:159:0::1;;;;;;;:::i;:::-;44019:6;43999:17;:26;;;;43991:54;;;;-1:-1:-1::0;;;43991:54:0::1;;;;;;;:::i;:::-;44083:6;44064:16;:25;;;;44056:52;;;;-1:-1:-1::0;;;44056:52:0::1;;;;;;;:::i;:::-;44220:16;::::0;44124:153:::1;::::0;;44220:16:::1;10222:15:1::0;;;10204:34;;10274:15;;;10269:2;10254:18;;10247:43;-1:-1:-1;;;44220:16:0;::::1;::::0;::::1;10306:18:1::0;;;10299:43;-1:-1:-1;;;44251:15:0;;::::1;::::0;;::::1;10373:2:1::0;10358:18;;10351:43;44124:153:0;::::1;::::0;;;;10164:3:1;44124:153:0;;::::1;44288:16;:36:::0;;-1:-1:-1;;44335:34:0;-1:-1:-1;;;44288:36:0::1;::::0;;::::1;;-1:-1:-1::0;;;;44335:34:0;;-1:-1:-1;;;44335:34:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;43511:874::o;46986:806::-;5672:13;:11;:13::i;:::-;47198::::1;::::0;47215:6:::1;::::0;47198:13:::1;;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;47180:15:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;47161:16:0;::::1;::::0;::::1;::::0;47127:31:::1;::::0;-1:-1:-1;;;47142:16:0;;::::1;;47127:12:::0;:31:::1;:::i;:::-;:50;;;;:::i;:::-;:68;;;;:::i;:::-;:84;;;;:::i;:::-;:94;;;;47105:165;;;;-1:-1:-1::0;;;47105:165:0::1;;;;;;;:::i;:::-;47370:12;::::0;47386:6:::1;::::0;47370:12:::1;-1:-1:-1::0;;;47370:12:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;47353:14:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;47335:15:0;::::1;::::0;::::1;::::0;47303:29:::1;::::0;-1:-1:-1;;;47317:15:0;;::::1;;47303:11:::0;:29:::1;:::i;:::-;:47;;;;:::i;:::-;:64;;;;:::i;:::-;:79;;;;:::i;:::-;:89;;;;47281:159;;;;-1:-1:-1::0;;;47281:159:0::1;;;;;;;:::i;:::-;47474:6;47459:12;:21;;;;47451:49;;;;-1:-1:-1::0;;;47451:49:0::1;;;;;;;:::i;:::-;47533:6;47519:11;:20;;;;47511:47;;;;-1:-1:-1::0;;;47511:47:0::1;;;;;;;:::i;:::-;47656:11;::::0;47574:130:::1;::::0;;47656:11:::1;10222:15:1::0;;;10204:34;;10274:15;;;10269:2;10254:18;;10247:43;-1:-1:-1;;;47656:11:0;::::1;::::0;::::1;10306:18:1::0;;;10299:43;-1:-1:-1;;;47683:10:0;;::::1;::::0;;::::1;10373:2:1::0;10358:18;;10351:43;47574:130:0;::::1;::::0;;;;10164:3:1;47574:130:0;;::::1;47715:11;:26:::0;;-1:-1:-1;;;;47752:24:0;-1:-1:-1;;;47715:26:0::1;::::0;;::::1;;-1:-1:-1::0;;;;47752:24:0;;-1:-1:-1;;;47752:24:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;46986:806::o;50155:234::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;50245:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;:34;::::1;;:26;::::0;;::::1;:34;;::::0;50237:54:::1;;;::::0;-1:-1:-1;;;50237:54:0;;6790:2:1;50237:54:0::1;::::0;::::1;6772:21:1::0;6829:1;6809:18;;;6802:29;-1:-1:-1;;;6847:18:1;;;6840:37;6894:18;;50237:54:0::1;6588:330:1::0;50237:54:0::1;-1:-1:-1::0;;;;;50302:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;;;;:33;;-1:-1:-1;;50302:33:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50351:30;;1266:41:1;;;50351:30:0::1;::::0;1239:18:1;50351:30:0::1;1126:187:1::0;60106:184:0;5672:13;:11;:13::i;:::-;60160:12:::1;5784:6:::0;;60176:55:::1;::::0;-1:-1:-1;;;;;5784:6:0;;;;60205:21:::1;::::0;60160:12;60176:55;60160:12;60176:55;60205:21;5784:6;60176:55:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60159:72;;;60250:7;60242:40;;;::::0;-1:-1:-1;;;60242:40:0;;17780:2:1;60242:40:0::1;::::0;::::1;17762:21:1::0;17819:2;17799:18;;;17792:30;-1:-1:-1;;;17838:18:1;;;17831:50;17898:18;;60242:40:0::1;17578:344:1::0;44393:873:0;5672:13;:11;:13::i;:::-;44622:11:::1;::::0;44637:6:::1;::::0;44622:11:::1;-1:-1:-1::0;;;44622:11:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;44604:15:0;::::1;::::0;::::1;::::0;44622:11:::1;44588:13:::0;::::1;::::0;::::1;::::0;44549:36:::1;::::0;-1:-1:-1;;;44569:16:0;;::::1;;44549:17:::0;:36:::1;:::i;:::-;:52;;;;:::i;:::-;:70;;;;:::i;:::-;:84;;;;:::i;:::-;:94;;;;44527:165;;;;-1:-1:-1::0;;;44527:165:0::1;;;;;;;:::i;:::-;44793:10;::::0;44807:6:::1;::::0;44793:10:::1;-1:-1:-1::0;;;44793:10:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;44776:14:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;44761:12:0;::::1;::::0;::::1;::::0;44725:34:::1;::::0;-1:-1:-1;;;44744:15:0;;::::1;;44725:16:::0;:34:::1;:::i;:::-;:48;;;;:::i;:::-;:65;;;;:::i;:::-;:78;;;;:::i;:::-;:88;;;;44703:158;;;;-1:-1:-1::0;;;44703:158:0::1;;;;;;;:::i;:::-;44900:6;44880:17;:26;;;;44872:54;;;;-1:-1:-1::0;;;44872:54:0::1;;;;;;;:::i;:::-;44964:6;44945:16;:25;;;;44937:52;;;;-1:-1:-1::0;;;44937:52:0::1;;;;;;;:::i;:::-;45101:16;::::0;45005:153:::1;::::0;;45101:16:::1;10222:15:1::0;;;10204:34;;10274:15;;;10269:2;10254:18;;10247:43;-1:-1:-1;;;45101:16:0;::::1;::::0;::::1;10306:18:1::0;;;10299:43;-1:-1:-1;;;45132:15:0;;::::1;::::0;;::::1;10373:2:1::0;10358:18;;10351:43;45005:153:0;::::1;::::0;;;;10164:3:1;45005:153:0;;::::1;45169:16;:36:::0;;-1:-1:-1;;;;45216:34:0;-1:-1:-1;;;45169:36:0::1;::::0;;::::1;;-1:-1:-1::0;;;;45216:34:0;;-1:-1:-1;;;45216:34:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;44393:873::o;6051:201::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;6140:22:0;::::1;6132:73;;;::::0;-1:-1:-1;;;6132:73:0;;18129:2:1;6132:73:0::1;::::0;::::1;18111:21:1::0;18168:2;18148:18;;;18141:30;18207:34;18187:18;;;18180:62;-1:-1:-1;;;18258:18:1;;;18251:36;18304:19;;6132:73:0::1;17927:402:1::0;6132:73:0::1;6216:28;6235:8;6216:18;:28::i;43012:371::-:0;-1:-1:-1;;;;;43139:19:0;;43131:68;;;;-1:-1:-1;;;43131:68:0;;18536:2:1;43131:68:0;;;18518:21:1;18575:2;18555:18;;;18548:30;18614:34;18594:18;;;18587:62;-1:-1:-1;;;18665:18:1;;;18658:34;18709:19;;43131:68:0;18334:400:1;43131:68:0;-1:-1:-1;;;;;43218:21:0;;43210:68;;;;-1:-1:-1;;;43210:68:0;;18941:2:1;43210:68:0;;;18923:21:1;18980:2;18960:18;;;18953:30;19019:34;18999:18;;;18992:62;-1:-1:-1;;;19070:18:1;;;19063:32;19112:19;;43210:68:0;18739:398:1;43210:68:0;-1:-1:-1;;;;;43291:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;43343:32;;1659:25:1;;;43343:32:0;;1632:18:1;43343:32:0;;;;;;;43012:371;;;:::o;5804:132::-;5757:7;5784:6;-1:-1:-1;;;;;5784:6:0;5270:10;5868:23;5860:68;;;;-1:-1:-1;;;5860:68:0;;19344:2:1;5860:68:0;;;19326:21:1;;;19363:18;;;19356:30;19422:34;19402:18;;;19395:62;19474:18;;5860:68:0;19142:356:1;50728:2282:0;-1:-1:-1;;;;;50850:18:0;;50842:68;;;;-1:-1:-1;;;50842:68:0;;19705:2:1;50842:68:0;;;19687:21:1;19744:2;19724:18;;;19717:30;19783:34;19763:18;;;19756:62;-1:-1:-1;;;19834:18:1;;;19827:35;19879:19;;50842:68:0;19503:401:1;50842:68:0;-1:-1:-1;;;;;50929:16:0;;50921:64;;;;-1:-1:-1;;;50921:64:0;;20111:2:1;50921:64:0;;;20093:21:1;20150:2;20130:18;;;20123:30;20189:34;20169:18;;;20162:62;-1:-1:-1;;;20240:18:1;;;20233:33;20283:19;;50921:64:0;19909:399:1;50921:64:0;51004:28;51035:24;51053:4;51035:9;:24::i;:::-;51004:55;;51080:24;51129:19;;51107;;:41;;;;:::i;:::-;51080:68;;51159:28;51223:18;;51190:16;:51;;:95;;;;;51265:20;51245:16;:40;;51190:95;51338:16;;51159:126;;-1:-1:-1;51338:16:0;;51337:17;:57;;;;;51371:23;51337:57;:97;;;;-1:-1:-1;51421:8:0;;51433:1;;51411:19;;-1:-1:-1;;;;;51421:8:0;51411:9;:19::i;:::-;:23;51337:97;:143;;;;-1:-1:-1;;;;;;51451:29:0;;;;;;:25;:29;;;;;;;;51337:143;51319:209;;;51507:9;:7;:9::i;:::-;51538:14;36650:10;;;36629:18;:31;36695:13;;;36671:21;:37;36743:13;;;36719:21;:37;36790:12;;;36767:20;:35;36832:8;;;36813:16;:27;-1:-1:-1;36853:12:0;;;;36876:16;;;;36903:17;;;;36931:14;;;;36956:17;36586:395;51538:14;51668:16;;;;51667:17;:58;;;;-1:-1:-1;;;;;;51702:23:0;;;;;;:17;:23;;;;;;;;51701:24;51667:58;:97;;;;-1:-1:-1;;;;;;51743:21:0;;;;;;:17;:21;;;;;;;;51742:22;51667:97;51649:786;;;-1:-1:-1;;;;;51815:31:0;;;;;;:25;:31;;;;;;;;51811:613;;;51880:12;;;-1:-1:-1;;;51880:12:0;;;;51867:10;:25;-1:-1:-1;;;51927:15:0;;;;51911:13;:31;-1:-1:-1;;;51977:15:0;;;;51961:13;:31;-1:-1:-1;;;52026:14:0;;;;52011:12;:29;-1:-1:-1;;;52070:10:0;;;;52059:8;:21;51811:613;;;-1:-1:-1;;;;;52140:29:0;;;;;;:25;:29;;;;;;;;52136:288;;;52203:13;;;;;;;;52190:10;:26;-1:-1:-1;;;52251:16:0;;;;52235:13;:32;-1:-1:-1;;;52302:16:0;;;;52286:13;:32;-1:-1:-1;;;52352:15:0;;;;;52337:30;-1:-1:-1;;;52397:11:0;;;;52386:8;:22;52136:288;52445:32;52460:4;52466:2;52470:6;52445:14;:32::i;:::-;52488:15;37044:16;;37033:8;:27;37086:20;;37071:12;:35;37130:18;;37117:10;:31;37175:21;;37159:13;:37;37223:21;;37207:13;:37;36989:263;52488:15;52519:16;;;;52514:489;;-1:-1:-1;;;;;52557:40:0;;;;;;:34;:40;;;;;;;;52552:215;;52658:20;;52648:6;:30;;52618:133;;;;-1:-1:-1;;;52618:133:0;;20515:2:1;52618:133:0;;;20497:21:1;20554:2;20534:18;;;20527:30;20593:31;20573:18;;;20566:59;20642:18;;52618:133:0;20313:353:1;52618:133:0;-1:-1:-1;;;;;52786:38:0;;;;;;:34;:38;;;;;;;;52781:211;;52892:9;;52875:13;52885:2;52875:9;:13::i;:::-;:26;;52845:131;;;;-1:-1:-1;;;52845:131:0;;20873:2:1;52845:131:0;;;20855:21:1;20912:2;20892:18;;;20885:30;20951:33;20931:18;;;20924:61;21002:18;;52845:131:0;20671:355:1;52845:131:0;50831:2179;;;50728:2282;;;:::o;35821:159::-;35863:7;35884:15;35901;35920:19;:17;:19::i;:::-;35883:56;;-1:-1:-1;35883:56:0;-1:-1:-1;35957:15:0;35883:56;;35957:15;:::i;:::-;35950:22;;;;35821:159;:::o;35122:691::-;35223:7;35245;35267;35289;35311;35346:17;35366:27;35385:7;35366:18;:27::i;:::-;35346:47;;35404:18;35425:30;35447:7;35425:21;:30::i;:::-;35404:51;;35466:18;35487:30;35509:7;35487:21;:30::i;:::-;35466:51;;35528:17;35548:29;35569:7;35548:20;:29::i;:::-;35528:49;;35588:13;35604:25;35621:7;35604:16;:25::i;:::-;35753:9;;35764:10;;-1:-1:-1;35776:10:0;;-1:-1:-1;35776:10:0;-1:-1:-1;35753:9:0;;-1:-1:-1;35122:691:0;-1:-1:-1;;;35122:691:0:o;7270:582::-;7600:10;;;7599:62;;-1:-1:-1;7616:39:0;;-1:-1:-1;;;7616:39:0;;7640:4;7616:39;;;13124:34:1;-1:-1:-1;;;;;13194:15:1;;;13174:18;;;13167:43;7616:15:0;;;;;13059:18:1;;7616:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;7599:62;7577:166;;;;-1:-1:-1;;;7577:166:0;;21233:2:1;7577:166:0;;;21215:21:1;21272:2;21252:18;;;21245:30;21311:34;21291:18;;;21284:62;-1:-1:-1;;;21362:18:1;;;21355:52;21424:19;;7577:166:0;21031:418:1;7577:166:0;7781:62;;-1:-1:-1;;;;;21646:32:1;;7781:62:0;;;21628:51:1;21695:18;;;21688:34;;;7754:90:0;;7774:5;;-1:-1:-1;;;7804:22:0;21601:18:1;;7781:62:0;;;;-1:-1:-1;;7781:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;7781:62:0;-1:-1:-1;;;;;;7781:62:0;;;;;;;;;;7754:19;:90::i;:::-;7270:582;;;:::o;49661:484::-;-1:-1:-1;;;;;49766:31:0;;;;;;:25;:31;;;;;;:40;;;:31;;;;:40;;;49744:146;;;;-1:-1:-1;;;49744:146:0;;21935:2:1;49744:146:0;;;21917:21:1;21974:2;21954:18;;;21947:30;22013:34;21993:18;;;21986:62;22084:26;22064:18;;;22057:54;22128:19;;49744:146:0;21733:420:1;49744:146:0;-1:-1:-1;;;;;49901:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;49901:39:0;;;;;;;;;;;;49951:71;;49962:23;49980:4;49962:17;:23::i;:::-;49951:71;;;50001:21;50017:4;50001:15;:21::i;:::-;-1:-1:-1;;;;;50033:40:0;;;;;;:34;:40;;;;;;;;:48;;-1:-1:-1;;50033:48:0;;;;;;;;;;50097:40;;1266:41:1;;;50097:40:0;;1239:18:1;50097:40:0;1126:187:1;6258:191:0;6332:16;6351:6;;-1:-1:-1;;;;;6368:17:0;;;-1:-1:-1;;;;;;6368:17:0;;;;;;6401:40;;6351:6;;;;;;;6401:40;;6332:16;6401:40;6321:128;6258:191;:::o;6876:177::-;6986:58;;-1:-1:-1;;;;;21646:32:1;;6986:58:0;;;21628:51:1;21695:18;;;21688:34;;;6959:86:0;;6979:5;;-1:-1:-1;;;7009:23:0;21601:18:1;;6986:58:0;21454:274:1;7059:205:0;7187:68;;-1:-1:-1;;;;;22416:15:1;;;7187:68:0;;;22398:34:1;22468:15;;22448:18;;;22441:43;22500:18;;;22493:34;;;7160:96:0;;7180:5;;-1:-1:-1;;;7210:27:0;22333:18:1;;7187:68:0;22158:375:1;7160:96:0;7059:205;;;;:::o;53018:3703::-;43425:16;:23;;-1:-1:-1;;43425:23:0;43444:4;43425:23;;;53146:19:::1;::::0;43425:16;;53146:23:::1;::::0;53168:1:::1;::::0;53146:23:::1;:::i;:::-;53117:52;;53180:31;53234:10;;;;;;;;;-1:-1:-1::0;;;;;53234:10:0::1;-1:-1:-1::0;;;;;53234:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53214:18;::::0;-1:-1:-1;;;;;53214:18:0;;::::1;:37:::0;::::1;;:128;;53298:18;::::0;53291:51:::1;::::0;-1:-1:-1;;;53291:51:0;;53336:4:::1;53291:51;::::0;::::1;4179::1::0;-1:-1:-1;;;;;53298:18:0;;::::1;::::0;53291:36:::1;::::0;4152:18:1;;53291:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53214:128;;;53254:21;53214:128;53180:162;;53353:29;53393:28:::0;53436:23:::1;;;;;;;;;;;53432:2143;;;53476:21;53539:18;;53517:19;;53498:18;:38;;;;:::i;:::-;:59;;;;:::i;:::-;53476:81:::0;-1:-1:-1;53575:15:0;;53572:74:::1;;53609:37;53632:13;53609:22;:37::i;:::-;53708:10;::::0;:17:::1;::::0;;-1:-1:-1;;;53708:17:0;;;;53661:24:::1;::::0;-1:-1:-1;;;;;53708:10:0::1;::::0;:15:::1;::::0;:17:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:17:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53688:18;::::0;-1:-1:-1;;;;;53688:18:0;;::::1;:37:::0;::::1;;:180;;53800:18;::::0;53793:51:::1;::::0;-1:-1:-1;;;53793:51:0;;53838:4:::1;53793:51;::::0;::::1;4179::1::0;53845:23:0;;-1:-1:-1;;;;;53800:18:0::1;::::0;53793:36:::1;::::0;4152:18:1;;53793:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;;;;:::i;:::-;53688:180;;;53728:45;53750:23:::0;53728:21:::1;:45;:::i;:::-;53661:207;;53883:29;53952:13;53932:19;;53915:16;:36;;;;:::i;:::-;:50;;;;:::i;:::-;53883:82:::0;-1:-1:-1;54040:13:0;54004:35:::1;54021:18:::0;54004:16;:35:::1;:::i;:::-;:49;;;;:::i;:::-;53980:73:::0;-1:-1:-1;53980:73:0;54091:40:::1;54110:21:::0;54091:16;:40:::1;:::i;:::-;:64;;;;:::i;:::-;54068:87:::0;-1:-1:-1;54173:23:0;;54170:584:::1;;54239:10;;;;;;;;;-1:-1:-1::0;;;;;54239:10:0::1;-1:-1:-1::0;;;;;54239:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54219:18;::::0;-1:-1:-1;;;;;54219:37:0;;::::1;:18:::0;::::1;:37:::0;54216:516:::1;;54305:15;::::0;54297:63:::1;::::0;54281:12:::1;::::0;-1:-1:-1;;;;;54305:15:0::1;::::0;54334:21;;54281:12;54297:63;54281:12;54297:63;54334:21;54305:15;54297:63:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54280:80;;;54386:7;54383:133;;;54449:43;::::0;;54467:1:::1;6376:25:1::0;;6432:2;6417:18;;6410:34;;;54449:43:0::1;::::0;6349:18:1;54449:43:0::1;;;;;;;54383:133;54257:278;54216:516;;;54602:15;::::0;54569:18:::1;::::0;54562:79:::1;::::0;-1:-1:-1;;;;;54569:18:0;;::::1;::::0;54602:15:::1;54619:21:::0;54562:39:::1;:79::i;:::-;54669:43;::::0;;54687:1:::1;6376:25:1::0;;6432:2;6417:18;;6410:34;;;54669:43:0::1;::::0;6349:18:1;54669:43:0::1;;;;;;;54216:516;53461:1316;;;53432:2143;;;54798:21;54841:18;;54820;:39;;;;:::i;:::-;54798:61:::0;-1:-1:-1;54877:15:0;;54874:74:::1;;54911:37;54934:13;54911:22;:37::i;:::-;55010:10;::::0;:17:::1;::::0;;-1:-1:-1;;;55010:17:0;;;;54963:24:::1;::::0;-1:-1:-1;;;;;55010:10:0::1;::::0;:15:::1;::::0;:17:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:17:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54990:18;::::0;-1:-1:-1;;;;;54990:18:0;;::::1;:37:::0;::::1;;:180;;55102:18;::::0;55095:51:::1;::::0;-1:-1:-1;;;55095:51:0;;55140:4:::1;55095:51;::::0;::::1;4179::1::0;55147:23:0;;-1:-1:-1;;;;;55102:18:0::1;::::0;55095:36:::1;::::0;4152:18:1;;55095:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;;;;:::i;:::-;54990:180;;;55030:45;55052:23:::0;55030:21:::1;:45;:::i;:::-;54963:207:::0;-1:-1:-1;55245:13:0;55209:35:::1;55226:18:::0;54963:207;55209:35:::1;:::i;:::-;:49;;;;:::i;:::-;55185:73:::0;-1:-1:-1;55296:40:0::1;55185:73:::0;55296:16;:40:::1;:::i;:::-;55368:19;::::0;55273:63;;-1:-1:-1;55368:21:0;55365:187:::1;;55434:15;::::0;55451:19:::1;::::0;55409:62:::1;::::0;55427:4:::1;::::0;-1:-1:-1;;;;;55434:15:0;;::::1;::::0;55409:9:::1;:62::i;:::-;55513:19;::::0;55495:41:::1;::::0;;6376:25:1;;;55534:1:0::1;6432:2:1::0;6417:18;;6410:34;55495:41:0::1;::::0;6349:18:1;55495:41:0::1;;;;;;;55365:187;54783:792;;53432:2143;55612:1;55591:18;:22;:51;;;;;55641:1;55617:21;:25;55591:51;55587:216;;;55659:55;55672:18;55692:21;55659:12;:55::i;:::-;55734:57;::::0;;6376:25:1;;;6432:2;6417:18;;6410:34;;;55734:57:0::1;::::0;6349:18:1;55734:57:0::1;;;;;;;55587:216;55816:22:::0;;55813:526:::1;;55877:10;;;;;;;;;-1:-1:-1::0;;;;;55877:10:0::1;-1:-1:-1::0;;;;;55877:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55857:18;::::0;-1:-1:-1;;;;;55857:37:0;;::::1;:18:::0;::::1;:37:::0;55854:467:::1;;55939:14;::::0;55931:61:::1;::::0;55915:12:::1;::::0;-1:-1:-1;;;;;55939:14:0::1;::::0;55967:20;;55915:12;55931:61;55915:12;55931:61;55967:20;55939:14;55931:61:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55914:78;;;56014:7;56011:117;;;56070:38;::::0;1659:25:1;;;56070:38:0::1;::::0;1647:2:1;1632:18;56070:38:0::1;;;;;;;56011:117;55895:248;55854:467;;;56206:14;::::0;56173:18:::1;::::0;56166:77:::1;::::0;-1:-1:-1;;;;;56173:18:0;;::::1;::::0;56206:14:::1;56222:20:::0;56166:39:::1;:77::i;:::-;56267:38;::::0;1659:25:1;;;56267:38:0::1;::::0;1647:2:1;1632:18;56267:38:0::1;;;;;;;55854:467;56371:1;56349:19;:23:::0;;;56383:18:::1;:22:::0;;;56416:19:::1;:23:::0;;;56453:24:::1;56471:4;56453:9;:24::i;:::-;:26;56450:264;;;56515:1;5784:6:::0;-1:-1:-1;;;;;5784:6:0;56498:19;56495:205:::1;;56536:59;56554:4;56561:7;5757::::0;5784:6;-1:-1:-1;;;;;5784:6:0;;5711:87;56561:7:::1;56570:24;56588:4;56570:9;:24::i;:::-;56536:9;:59::i;:::-;56495:205;;;56659:14;::::0;56634:66:::1;::::0;56652:4:::1;::::0;-1:-1:-1;;;;;56659:14:0::1;56675:24;56652:4:::0;56675:9:::1;:24::i;56634:66::-;-1:-1:-1::0;;43471:16:0;:24;;-1:-1:-1;;43471:24:0;;;-1:-1:-1;;53018:3703:0:o;31763:2549::-;31958:17;31990:18;32023;32056:17;32088:13;32115:19;32127:6;32115:11;:19::i;:::-;31891:243;;;;;;;;;;32145:23;32230:5;32218:9;32205:10;32192;32180:9;32171:6;:18;;;;:::i;:::-;:31;;;;:::i;:::-;:44;;;;:::i;:::-;:56;;;;:::i;:::-;:64;;;;:::i;:::-;32145:90;;32246:19;32268:10;:8;:10::i;:::-;32246:32;;32344:5;32334:7;;:15;;;;:::i;:::-;32324:7;:25;32384:17;32390:11;32384:5;:17;:::i;:::-;32374:7;;:27;;;;:::i;:::-;32364:7;:37;32421:35;;1659:25:1;;;32446:1:0;;-1:-1:-1;;;;;32421:35:0;;;-1:-1:-1;;;;;;;;;;;32421:35:0;1647:2:1;1632:18;32421:35:0;;;;;;;32624:10;32604:19;;:30;;;;:::i;:::-;32582:19;:52;32671:19;;:30;;32691:10;;32671:30;:::i;:::-;32649:19;:52;32737:18;;:28;;32756:9;;32737:28;:::i;:::-;32716:18;:49;32780:17;32822:9;32800:21;32811:10;32800;:21;:::i;:::-;:31;;;;:::i;:::-;32780:51;-1:-1:-1;32894:23:0;32906:11;32780:51;32894:23;:::i;:::-;32887:4;32871:22;;;;:7;:22;;;;;;:46;;;;:::i;:::-;32862:4;32846:22;;;;:7;:22;;;;;;;;:71;;;;32936:11;:26;;;;;;32932:106;;;33022:4;33006:22;;;;:7;:22;;;;;;:32;;33029:9;;33006:32;:::i;:::-;32997:4;32981:22;;;;:7;:22;;;;;:57;32932:106;33058:42;;1659:25:1;;;33083:4:0;;-1:-1:-1;;;;;33058:42:0;;;-1:-1:-1;;;;;;;;;;;33058:42:0;1647:2:1;1632:18;33058:42:0;;;;;;;-1:-1:-1;;;;;;33126:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;33150:22:0;;;;;;:11;:22;;;;;;;;33149:23;33126:46;33122:1067;;;-1:-1:-1;;;;;33207:15:0;;;;;;:7;:15;;;;;;:22;;33223:6;;33207:22;:::i;:::-;-1:-1:-1;;;;;33189:15:0;;;;;;:7;:15;;;;;:40;33278:18;33285:11;33278:6;:18;:::i;:::-;-1:-1:-1;;;;;33262:15:0;;;;;;:7;:15;;;;;;:34;;;;:::i;:::-;-1:-1:-1;;;;;33244:15:0;;;;;;:7;:15;;;;;:52;33351:27;33367:11;33351:15;:27;:::i;:::-;-1:-1:-1;;;;;33332:18:0;;;;;;:7;:18;;;;;;:46;;;;:::i;:::-;-1:-1:-1;;;;;33311:18:0;;;;;;:7;:18;;;;;:67;33122:1067;;;-1:-1:-1;;;;;33401:19:0;;;;;;:11;:19;;;;;;;;33400:20;:46;;;;-1:-1:-1;;;;;;33424:22:0;;;;;;:11;:22;;;;;;;;33400:46;33396:793;;;33497:18;33504:11;33497:6;:18;:::i;:::-;-1:-1:-1;;;;;33481:15:0;;;;;;:7;:15;;;;;;:34;;;;:::i;:::-;-1:-1:-1;;;;;33463:15:0;;;;;;;:7;:15;;;;;;;;:52;;;;33551:18;;;;;:7;:18;;;;;:34;;33570:15;;33551:34;:::i;:::-;-1:-1:-1;;;;;33530:18:0;;;;;;:7;:18;;;;;:55;33640:27;33656:11;33640:15;:27;:::i;33396:793::-;-1:-1:-1;;;;;33689:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;33712:22:0;;;;;;:11;:22;;;;;;;;33689:45;33685:504;;;-1:-1:-1;;;;;33769:15:0;;;;;;:7;:15;;;;;;:22;;33785:6;;33769:22;:::i;:::-;-1:-1:-1;;;;;33751:15:0;;;;;;:7;:15;;;;;:40;33840:18;33847:11;33840:6;:18;:::i;33685:504::-;34077:18;34084:11;34077:6;:18;:::i;:::-;-1:-1:-1;;;;;34061:15:0;;;;;;:7;:15;;;;;;:34;;;;:::i;:::-;-1:-1:-1;;;;;34043:15:0;;;;;;:7;:15;;;;;:52;34150:27;34166:11;34150:15;:27;:::i;:::-;-1:-1:-1;;;;;34131:18:0;;;;;;:7;:18;;;;;;:46;;;;:::i;:::-;-1:-1:-1;;;;;34110:18:0;;;;;;:7;:18;;;;;:67;33685:504;34199:45;34211:21;34221:11;34211:9;:21;:::i;:::-;34234:9;34199:11;:45::i;:::-;34277:9;-1:-1:-1;;;;;34260:44:0;34269:6;-1:-1:-1;;;;;34260:44:0;-1:-1:-1;;;;;;;;;;;34288:15:0;34260:44;;;;1659:25:1;;1647:2;1632:18;;1513:177;34260:44:0;;;;;;;;31880:2432;;;;;;;31763:2549;;;:::o;35988:590::-;36086:7;;36122;;36039;;;;;36140:328;36164:9;:16;36160:20;;36140:328;;;36248:7;36224;:21;36232:9;36242:1;36232:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36232:12:0;36224:21;;;;;;;;;;;;;:31;;:83;;;36300:7;36276;:21;36284:9;36294:1;36284:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36284:12:0;36276:21;;;;;;;;;;;;;:31;36224:83;36202:146;;;36331:7;;36340;;36323:25;;;;;;;35988:590;;:::o;36202:146::-;36381:7;:21;36389:9;36399:1;36389:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36389:12:0;36381:21;;;;;;;;;;;;;36373:29;;:7;:29;:::i;:::-;36363:39;;36435:7;:21;36443:9;36453:1;36443:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36443:12:0;36435:21;;;;;;;;;;;;;36427:29;;:7;:29;:::i;:::-;36417:39;-1:-1:-1;36182:3:0;;;;:::i;:::-;;;;36140:328;;;;36500:7;;36492;;:15;;;;:::i;:::-;36482:7;:25;36478:56;;;36517:7;;36526;;36509:25;;;;;;35988:590;;:::o;36478:56::-;36553:7;;36562;;-1:-1:-1;35988:590:0;-1:-1:-1;35988:590:0:o;37260:160::-;37354:7;37406:5;37394:10;;37386:7;:18;;;;:::i;:::-;:26;;;;:::i;37428:166::-;37525:7;37580:5;37565:13;;37557:7;:21;;;;:::i;37602:166::-;37699:7;37754:5;37739:13;;37731:7;:21;;;;:::i;37776:164::-;37872:7;37926:5;37912:12;;37904:7;:20;;;;:::i;37948:156::-;38040:7;38090:5;38080:8;;38072:7;:16;;;;:::i;9481:649::-;9905:23;9931:69;9959:4;9931:69;;;;;;;;;;;;;;;;;9939:5;-1:-1:-1;;;;;9931:27:0;;;:69;;;;;:::i;:::-;9905:95;;10019:10;:17;10040:1;10019:22;:56;;;;10056:10;10045:30;;;;;;;;;;;;:::i;:::-;10011:111;;;;-1:-1:-1;;;10011:111:0;;23512:2:1;10011:111:0;;;23494:21:1;23551:2;23531:18;;;23524:30;23590:34;23570:18;;;23563:62;-1:-1:-1;;;23641:18:1;;;23634:40;23691:19;;10011:111:0;23310:406:1;56733:830:0;56829:16;;;56843:1;56829:16;;;;;;;;56805:21;;56829:16;;;;;;;;;;-1:-1:-1;56829:16:0;56805:40;;56874:4;56856;56861:1;56856:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56856:23:0;;;:7;;;;;;;;;:23;56900:18;;56890:7;;56900:18;;;56890:4;;56900:18;;56890:7;;;;;;:::i;:::-;-1:-1:-1;;;;;56890:28:0;;;:7;;;;;;;;;;:28;;;;56944:10;;:17;;;-1:-1:-1;;;56944:17:0;;;;:10;;;;;:15;;:17;;;;;56890:7;;56944:17;;;;;:10;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56933:28:0;:4;56938:1;56933:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;56933:28:0;;56929:627;;56977:10;;:249;;-1:-1:-1;;;56977:249:0;;-1:-1:-1;;;;;56977:10:0;;;;:61;;:249;;57057:11;;56977:10;;57141:4;;57172;;57196:15;;56977:249;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56929:627;57257:15;;57357:10;;57257:287;;-1:-1:-1;;;57257:287:0;;-1:-1:-1;;;;;57257:15:0;;;;:69;;:287;;57357:10;;;57391:11;;57257:15;;57483:4;;57510:15;;57257:287;;;:::i;57571:783::-;57692:10;;;;;;;;;-1:-1:-1;;;;;57692:10:0;-1:-1:-1;;;;;57692:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57670:18;;-1:-1:-1;;;;;57670:39:0;;;:18;;:39;57666:669;;57725:10;;:289;;-1:-1:-1;;;57725:289:0;;57802:4;57725:289;;;24649:34:1;24699:18;;;24692:34;;;57725:10:0;24742:18:1;;;24735:34;;;24785:18;;;24778:34;57958:6:0;24828:19:1;;;24821:44;57984:15:0;24881:19:1;;;24874:35;-1:-1:-1;;;;;57725:10:0;;;;:26;;57759:15;;24583:19:1;;57725:289:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;42528:469:::1;42391:613:::0;:::o;57666:669::-;58044:10;;58118:18;;58044:279;;-1:-1:-1;;;58044:279:0;;58094:4;58044:279;;;25628:34:1;-1:-1:-1;;;;;58118:18:0;;;25678::1;;;25671:43;25730:18;;;25723:34;;;25773:18;;;25766:34;;;58044:10:0;25816:19:1;;;25809:35;;;25860:19;;;25853:35;58267:6:0;25904:19:1;;;25897:44;58293:15:0;25957:19:1;;;25950:35;58044:10:0;;;:23;;25562:19:1;;58044:279:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34947:167::-;35043:9;35035:7;;:17;;;;:::i;:::-;35025:7;:27;35081:15;;:25;;35097:9;;35081:25;:::i;:::-;35063:15;:43;-1:-1:-1;;34947:167:0:o;933:229::-;1070:12;1102:52;1124:6;1132:4;1138:1;1141:12;1102:21;:52::i;:::-;1095:59;933:229;-1:-1:-1;;;;933:229:0:o;1400:455::-;1570:12;1628:5;1603:21;:30;;1595:81;;;;-1:-1:-1;;;1595:81:0;;26198:2:1;1595:81:0;;;26180:21:1;26237:2;26217:18;;;26210:30;26276:34;26256:18;;;26249:62;-1:-1:-1;;;26327:18:1;;;26320:36;26373:19;;1595:81:0;25996:402:1;1595:81:0;1688:12;1702:23;1729:6;-1:-1:-1;;;;;1729:11:0;1748:5;1755:4;1729:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1687:73;;;;1778:69;1805:6;1813:7;1822:10;1834:12;1778:26;:69::i;:::-;1771:76;1400:455;-1:-1:-1;;;;;;;1400:455:0:o;2949:644::-;3134:12;3163:7;3159:427;;;3191:10;:17;3212:1;3191:22;3187:290;;-1:-1:-1;;;;;380:19:0;;;3401:60;;;;-1:-1:-1;;;3401:60:0;;26897:2:1;3401:60:0;;;26879:21:1;26936:2;26916:18;;;26909:30;26975:31;26955:18;;;26948:59;27024:18;;3401:60:0;26695:353:1;3401:60:0;-1:-1:-1;3498:10:0;3491:17;;3159:427;3541:33;3549:10;3561:12;4071:17;;:21;4067:388;;4303:10;4297:17;4360:15;4347:10;4343:2;4339:19;4332:44;4067:388;4430:12;4423:20;;-1:-1:-1;;;4423:20:0;;;;;;;;:::i;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:396::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;649:2;628:15;-1:-1:-1;;624:29:1;609:45;;;;656:2;605:54;;269:396;-1:-1:-1;;269:396:1:o;670:131::-;-1:-1:-1;;;;;745:31:1;;735:42;;725:70;;791:1;788;781:12;806:315;874:6;882;935:2;923:9;914:7;910:23;906:32;903:52;;;951:1;948;941:12;903:52;990:9;977:23;1009:31;1034:5;1009:31;:::i;:::-;1059:5;1111:2;1096:18;;;;1083:32;;-1:-1:-1;;;806:315:1:o;1695:180::-;1754:6;1807:2;1795:9;1786:7;1782:23;1778:32;1775:52;;;1823:1;1820;1813:12;1775:52;-1:-1:-1;1846:23:1;;1695:180;-1:-1:-1;1695:180:1:o;1880:456::-;1957:6;1965;1973;2026:2;2014:9;2005:7;2001:23;1997:32;1994:52;;;2042:1;2039;2032:12;1994:52;2081:9;2068:23;2100:31;2125:5;2100:31;:::i;:::-;2150:5;-1:-1:-1;2207:2:1;2192:18;;2179:32;2220:33;2179:32;2220:33;:::i;:::-;1880:456;;2272:7;;-1:-1:-1;;;2326:2:1;2311:18;;;;2298:32;;1880:456::o;2341:118::-;2427:5;2420:13;2413:21;2406:5;2403:32;2393:60;;2449:1;2446;2439:12;2464:382;2529:6;2537;2590:2;2578:9;2569:7;2565:23;2561:32;2558:52;;;2606:1;2603;2596:12;2558:52;2645:9;2632:23;2664:31;2689:5;2664:31;:::i;:::-;2714:5;-1:-1:-1;2771:2:1;2756:18;;2743:32;2784:30;2743:32;2784:30;:::i;:::-;2833:7;2823:17;;;2464:382;;;;;:::o;3040:247::-;3099:6;3152:2;3140:9;3131:7;3127:23;3123:32;3120:52;;;3168:1;3165;3158:12;3120:52;3207:9;3194:23;3226:31;3251:5;3226:31;:::i;3292:161::-;3359:20;;3419:8;3408:20;;3398:31;;3388:59;;3443:1;3440;3433:12;3388:59;3292:161;;;:::o;3458:256::-;3524:6;3532;3585:2;3573:9;3564:7;3560:23;3556:32;3553:52;;;3601:1;3598;3591:12;3553:52;3624:28;3642:9;3624:28;:::i;:::-;3614:38;;3671:37;3704:2;3693:9;3689:18;3671:37;:::i;:::-;3661:47;;3458:256;;;;;:::o;3719:309::-;3784:6;3792;3845:2;3833:9;3824:7;3820:23;3816:32;3813:52;;;3861:1;3858;3851:12;3813:52;3897:9;3884:23;3874:33;;3957:2;3946:9;3942:18;3929:32;3970:28;3992:5;3970:28;:::i;4241:388::-;4309:6;4317;4370:2;4358:9;4349:7;4345:23;4341:32;4338:52;;;4386:1;4383;4376:12;4338:52;4425:9;4412:23;4444:31;4469:5;4444:31;:::i;:::-;4494:5;-1:-1:-1;4551:2:1;4536:18;;4523:32;4564:33;4523:32;4564:33;:::i;5102:380::-;5181:1;5177:12;;;;5224;;;5245:61;;5299:4;5291:6;5287:17;5277:27;;5245:61;5352:2;5344:6;5341:14;5321:18;5318:38;5315:161;;5398:10;5393:3;5389:20;5386:1;5379:31;5433:4;5430:1;5423:15;5461:4;5458:1;5451:15;5315:161;;5102:380;;;:::o;5487:127::-;5548:10;5543:3;5539:20;5536:1;5529:31;5579:4;5576:1;5569:15;5603:4;5600:1;5593:15;5619:217;5659:1;5685;5675:132;;5729:10;5724:3;5720:20;5717:1;5710:31;5764:4;5761:1;5754:15;5792:4;5789:1;5782:15;5675:132;-1:-1:-1;5821:9:1;;5619:217::o;6455:128::-;6522:9;;;6543:11;;;6540:37;;;6557:18;;:::i;7686:127::-;7747:10;7742:3;7738:20;7735:1;7728:31;7778:4;7775:1;7768:15;7802:4;7799:1;7792:15;7818:168;7891:9;;;7922;;7939:15;;;7933:22;;7919:37;7909:71;;7960:18;;:::i;7991:125::-;8056:9;;;8077:10;;;8074:36;;;8090:18;;:::i;8121:127::-;8182:10;8177:3;8173:20;8170:1;8163:31;8213:4;8210:1;8203:15;8237:4;8234:1;8227:15;8253:135;8292:3;8313:17;;;8310:43;;8333:18;;:::i;:::-;-1:-1:-1;8380:1:1;8369:13;;8253:135::o;8393:170::-;8460:8;8488:10;;;8500;;;8484:27;;8523:11;;;8520:37;;;8537:18;;:::i;8568:345::-;8770:2;8752:21;;;8809:2;8789:18;;;8782:30;-1:-1:-1;;;8843:2:1;8828:18;;8821:51;8904:2;8889:18;;8568:345::o;8918:344::-;9120:2;9102:21;;;9159:2;9139:18;;;9132:30;-1:-1:-1;;;9193:2:1;9178:18;;9171:50;9253:2;9238:18;;8918:344::o;9267:339::-;9469:2;9451:21;;;9508:2;9488:18;;;9481:30;-1:-1:-1;;;9542:2:1;9527:18;;9520:45;9597:2;9582:18;;9267:339::o;9611:338::-;9813:2;9795:21;;;9852:2;9832:18;;;9825:30;-1:-1:-1;;;9886:2:1;9871:18;;9864:44;9940:2;9925:18;;9611:338::o;11121:415::-;11323:2;11305:21;;;11362:2;11342:18;;;11335:30;11401:34;11396:2;11381:18;;11374:62;-1:-1:-1;;;11467:2:1;11452:18;;11445:49;11526:3;11511:19;;11121:415::o;12656:251::-;12726:6;12779:2;12767:9;12758:7;12754:23;12750:32;12747:52;;;12795:1;12792;12785:12;12747:52;12827:9;12821:16;12846:31;12871:5;12846:31;:::i;15067:184::-;15137:6;15190:2;15178:9;15169:7;15165:23;15161:32;15158:52;;;15206:1;15203;15196:12;15158:52;-1:-1:-1;15229:16:1;;15067:184;-1:-1:-1;15067:184:1:o;15388:461::-;15441:3;15479:5;15473:12;15506:6;15501:3;15494:19;15532:4;15561:2;15556:3;15552:12;15545:19;;15598:2;15591:5;15587:14;15619:1;15629:195;15643:6;15640:1;15637:13;15629:195;;;15708:13;;-1:-1:-1;;;;;15704:39:1;15692:52;;15764:12;;;;15799:15;;;;15740:1;15658:9;15629:195;;;-1:-1:-1;15840:3:1;;15388:461;-1:-1:-1;;;;;15388:461:1:o;15854:510::-;16125:6;16114:9;16107:25;16168:3;16163:2;16152:9;16148:18;16141:31;16088:4;16189:57;16241:3;16230:9;16226:19;16218:6;16189:57;:::i;:::-;-1:-1:-1;;;;;16282:32:1;;;;16277:2;16262:18;;16255:60;-1:-1:-1;16346:2:1;16331:18;16324:34;16181:65;15854:510;-1:-1:-1;;15854:510:1:o;16369:582::-;16668:6;16657:9;16650:25;16711:6;16706:2;16695:9;16691:18;16684:34;16754:3;16749:2;16738:9;16734:18;16727:31;16631:4;16775:57;16827:3;16816:9;16812:19;16804:6;16775:57;:::i;:::-;-1:-1:-1;;;;;16868:32:1;;;;16863:2;16848:18;;16841:60;-1:-1:-1;16932:3:1;16917:19;16910:35;16767:65;16369:582;-1:-1:-1;;;16369:582:1:o;23060:245::-;23127:6;23180:2;23168:9;23159:7;23155:23;23151:32;23148:52;;;23196:1;23193;23186:12;23148:52;23228:9;23222:16;23247:28;23269:5;23247:28;:::i;23721:582::-;24049:1;24045;24040:3;24036:11;24032:19;24024:6;24020:32;24009:9;24002:51;24089:6;24084:2;24073:9;24069:18;24062:34;24132:6;24127:2;24116:9;24112:18;24105:34;24175:3;24170:2;24159:9;24155:18;24148:31;23983:4;24196:57;24248:3;24237:9;24233:19;24225:6;24196:57;:::i;:::-;24188:65;;24290:6;24284:3;24273:9;24269:19;24262:35;23721:582;;;;;;;;:::o;24920:306::-;25008:6;25016;25024;25077:2;25065:9;25056:7;25052:23;25048:32;25045:52;;;25093:1;25090;25083:12;25045:52;25122:9;25116:16;25106:26;;25172:2;25161:9;25157:18;25151:25;25141:35;;25216:2;25205:9;25201:18;25195:25;25185:35;;24920:306;;;;;:::o;26403:287::-;26532:3;26570:6;26564:13;26586:66;26645:6;26640:3;26633:4;26625:6;26621:17;26586:66;:::i;:::-;26668:16;;;;;26403:287;-1:-1:-1;;26403:287:1:o

Swarm Source

ipfs://a0998bef53fc625546c7e09271cfc55bc8067f2d828dc18388682ac836109ce8
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.