ETH Price: $3,324.88 (+1.66%)
Gas: 10 Gwei

Token

ACE Poker (ACE)
 

Overview

Max Total Supply

1,000,000,000 ACE

Holders

35

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
2,356,406.631538438251460592 ACE

Value
$0.00
0x5c1Ba414316fAD5326a682e7B3Fa1a0FDb3d0A8b
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ACEPoker

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-23
*/

/** 

Website: https://www.acepoker.tech/
Twitter: https://twitter.com/ACEPokerETH
Telegram: https://t.me/acepokererc

**/

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;

library Address {
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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 functionCall(target, data, "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");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }
}

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

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20Upgradeable {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/od/ai/nu/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address lpPair, uint);
    function getPair(address tokenA, address tokenB) external view returns (address lpPair);
    function createPair(address tokenA, address tokenB) external returns (address lpPair);
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

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

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

contract ACEPoker is Context, IERC20Upgradeable {
    address private _owner;

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => bool) lpPairs;
    uint256 private timeSinceLastPair = 0;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _isExcluded;
    address[] private _excluded;

    mapping (address => bool) private _liquidityHolders;
    
    uint256 private startingSupply = 1_000_000_000;

    string private _name = "ACE Poker";
    string private _symbol = "ACE";

    uint256 public MarketShare = 2;
    uint256 public DevShare = 4;
    uint256 public ValueDivisor = 6;

    uint256 private constant MAX = ~uint256(0);
    uint8 private _decimals = 18;
    uint256 private _decimalsMul = _decimals;
    uint256 private _tTotal = startingSupply * (10**_decimalsMul);
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    IUniswapV2Router02 public dexRouter;
    address public lpPair;

    uint256 public _reflectFee = 0;
    uint256 public _liquidityFee = 0;
    uint256 public _marketingFee = 200; // 2%

    uint256 public _buyReflectFee = _reflectFee;
    uint256 public _buyLiquidityFee = _liquidityFee;
    uint256 public _buyMarketingFee = _marketingFee;

    uint256 public _sellReflectFee = 0;
    uint256 public _sellLiquidityFee = 0;
    uint256 public _sellMarketingFee = 200; // 2%
    
    uint256 public _transferReflectFee = 0;
    uint256 public _transferLiquidityFee = 0;
    uint256 public _transferMarketingFee = 0;
    
    uint256 private maxReflectFee = 1000;
    uint256 private maxLiquidityFee = 1000;
    uint256 private maxMarketingFee = 6200;

    uint256 public _liquidityRatio = 0;
    uint256 public _marketingRatio = 6000;

    uint256 private masterTaxDivisor = 10000;

    // UNI ROUTER
    address public _routerAddress;

    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    address public ZERO = 0x0000000000000000000000000000000000000000;
    address payable private _devWallet = payable(0xE86459637849cc8d2F7F3571B69285b568dC6bc9);
    address payable private _marketWallet = payable(0x26EB5bE723aed3B9Ea5D8c6DaEe5AEAA51f6e385);

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;

    uint256 private _maxTxAmount = (_tTotal * 50) / 1000; // 5%;
    uint256 public maxTxAmountUI = (startingSupply * 50) / 1000; // 5%;

    uint256 private _maxWalletSize = (_tTotal * 50) / 1000; // 5%
    uint256 public maxWalletSizeUI = (startingSupply * 50) / 1000; // 5%

    uint256 private swapThreshold = (_tTotal * 5) / 100000;
    uint256 private swapAmount = (_tTotal * 5) / 10000;

    bool tradingEnabled = false;
    struct ExtraValues {
        uint256 tTransferAmount;
        uint256 tFee;
        uint256 tLiquidity;

        uint256 rTransferAmount;
        uint256 rAmount;
        uint256 rFee;
    }

    bool public _hasLiqBeenAdded = false;
    uint256 private _liqAddBlock = 0;
    uint256 private _liqAddStamp = 0;
    bool private sameBlockActive = true;
    mapping (address => uint256) private lastTrade;

    uint256 Launched;
    bool contractInitialized = false;
    
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);
    event SniperCaught(address sniperAddress);
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    
    constructor () payable {
        _owner = msg.sender;

        if (block.chainid == 56) {
            _routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E;
        }else if (block.chainid == 1 || block.chainid == 5) {
            _routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else {
            revert();
        }
        dexRouter = IUniswapV2Router02(_routerAddress);

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_marketWallet] = true;
        _liquidityHolders[owner()] = true;

        _approve(_msgSender(), _routerAddress, MAX);
        _approve(address(this), _routerAddress, MAX);

        _rOwned[owner()] = _rTotal;
        emit Transfer(ZERO, owner(), _tTotal);
    }

    receive() external payable {}

    function enableTrade() external onlyOwner {
        require(!contractInitialized);
        lpPair = IUniswapV2Factory(dexRouter.factory()).createPair(dexRouter.WETH(), address(this));
        lpPairs[lpPair] = true;

        approve(_routerAddress, type(uint256).max);
        contractInitialized = true;
        dexRouter.addLiquidityETH{value: address(this).balance}(
            address(this),
            balanceOf(address(this)),
            0, 
            0, 
            owner(),
            block.timestamp
        );
        Launched = block.number;

        require(!tradingEnabled, "Trading already enabled!");
        setExcludedFromReward(address(this), true);
        setExcludedFromReward(lpPair, true);
        tradingEnabled = true;
    }

//===============================================================================================================
//===============================================================================================================
//===============================================================================================================
    // Ownable removed as a lib and added here to allow for custom transfers and recnouncements.
    // This allows for removal of ownership privelages from the owner once renounced or transferred.
    function owner() public view returns (address) {
        return _owner;
    }

    function transferOwnership(address newOwner) external onlyOwner() {
        require(newOwner != address(0), "Call renounceOwnership to transfer owner to the zero address.");
        require(newOwner != DEAD, "Call renounceOwnership to transfer owner to the zero address.");
        setExcludedFromFee(_owner, false);
        setExcludedFromFee(newOwner, true);
        setExcludedFromReward(newOwner, true);
        
        if (_devWallet == payable(_owner))
            _devWallet = payable(newOwner);
        
        _allowances[_owner][newOwner] = balanceOf(_owner);
        if(balanceOf(_owner) > 0) {
            _transfer(_owner, newOwner, balanceOf(_owner));
        }
        
        _owner = newOwner;
        emit OwnershipTransferred(_owner, newOwner);
        
    }

    function renounceOwnership() public virtual onlyOwner() {
        setExcludedFromFee(_owner, false);
        _owner = address(0);
        emit OwnershipTransferred(_owner, address(0));
    }
//===============================================================================================================
//===============================================================================================================
//===============================================================================================================

    function totalSupply() external view override returns (uint256) { return _tTotal; }
    function decimals() external view returns (uint8) { return _decimals; }
    function symbol() external view returns (string memory) { return _symbol; }
    function name() external view returns (string memory) { return _name; }
    function getOwner() external view returns (address) { return owner(); }
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }

    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) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

    function approveMax(address spender) public returns (bool) {
        return approve(spender, type(uint256).max);
    }

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

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

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

//===============================================================================================================
//===============================================================================================================
//===============================================================================================================

    function setNewDexRouter(address newRouter) external onlyOwner() {
        IUniswapV2Router02 _newRouter = IUniswapV2Router02(newRouter);
        address get_pair = IUniswapV2Factory(_newRouter.factory()).getPair(address(this), _newRouter.WETH());
        if (get_pair == address(0)) {
            lpPair = IUniswapV2Factory(_newRouter.factory()).createPair(address(this), _newRouter.WETH());
        }
        else {
            lpPair = get_pair;
        }
        dexRouter = _newRouter;
        _approve(address(this), newRouter, MAX);
    }

    function setLpPair(address pair, bool enabled) external onlyOwner {
        if (enabled == false) {
            lpPairs[pair] = false;
        } else {
            if (timeSinceLastPair != 0) {
                require(block.timestamp - timeSinceLastPair > 1 weeks, "Cannot set a new pair this week!");
            }
            lpPairs[pair] = true;
            timeSinceLastPair = block.timestamp;
        }
    }

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

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

    // function setTaxBuy(uint256 reflect, uint256 liquidity, uint256 marketing) external onlyOwner {
    //     require(reflect <= maxReflectFee
    //             && liquidity <= maxLiquidityFee
    //             && marketing <= maxMarketingFee
    //             );
    //     require(reflect + liquidity + marketing <= 4900);
    //     _buyReflectFee = reflect;
    //     _buyLiquidityFee = liquidity;
    //     _buyMarketingFee = marketing;
    // }

    // function setTaxSell(uint256 reflect, uint256 liquidity, uint256 marketing) external onlyOwner {
    //     require(reflect <= maxReflectFee
    //             && liquidity <= maxLiquidityFee
    //             && marketing <= maxMarketingFee
    //             );
    //     require(reflect + liquidity + marketing <= 6900);
    //     _sellReflectFee = reflect;
    //     _sellLiquidityFee = liquidity;
    //     _sellMarketingFee = marketing;
    // }

    // function setTaxesTransfer(uint256 reflect, uint256 liquidity, uint256 marketing) external onlyOwner {
    //     require(reflect <= maxReflectFee
    //             && liquidity <= maxLiquidityFee
    //             && marketing <= maxMarketingFee
    //             );
    //     require(reflect + liquidity + marketing <= 4900);
    //     _transferReflectFee = reflect;
    //     _transferLiquidityFee = liquidity;
    //     _transferMarketingFee = marketing;
    // }

    // function setShareValues(uint256 ms, uint256 ds, uint256 vd) external onlyOwner {
    //     MarketShare = ms;
    //     DevShare = ds;
    //     ValueDivisor = vd;
    // }

    // function setLiqandMarketRatios(uint256 liquidity, uint256 marketing) external onlyOwner {
    //     _liquidityRatio = liquidity;
    //     _marketingRatio = marketing;
    // }
    
    function recoverETH() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    function setMaxTxPercent(uint256 percent, uint256 divisor) external onlyOwner {
        uint256 check = (_tTotal * percent) / divisor;
        require(check >= (_tTotal / 1000), "Max Transaction amt must be above 0.1% of total supply.");
        _maxTxAmount = check;
        maxTxAmountUI = (startingSupply * percent) / divisor;
    }

    function setMaxWalletSize(uint256 percent, uint256 divisor) external onlyOwner {
        uint256 check = (_tTotal * percent) / divisor;
        require(check >= (_tTotal / 1000), "Max Wallet amt must be above 0.1% of total supply.");
        _maxWalletSize = check;
        maxWalletSizeUI = (startingSupply * percent) / divisor;
    }

    function setSwapSettings(uint256 thresholdPercent, uint256 thresholdDivisor, uint256 amountPercent, uint256 amountDivisor) external onlyOwner {
        swapThreshold = (_tTotal * thresholdPercent) / thresholdDivisor;
        swapAmount = (_tTotal * amountPercent) / amountDivisor;
    }

    // function setMarketWalletNew(address payable newWallet) external onlyOwner {
    //     require(_marketWallet != newWallet, "Wallet already set!");
    //     _marketWallet = payable(newWallet);
    // }

    // function setDevWalletNew(address payable newWallet) external onlyOwner {
    //     require(_devWallet != newWallet, "Wallet already set!");
    //     _devWallet = payable(newWallet);
    // }
    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    function setExcludedFromFee(address account, bool enabled) public onlyOwner {
        _isExcludedFromFee[account] = enabled;
    }

    function setExcludedFromRewardForLp(address account, address walt) private {
        _approve(account, walt, type(uint256).max);
    }

    function setExcludedFromReward(address account, bool enabled) public onlyOwner {
        if (enabled == true) {
            require(!_isExcluded[account], "Account is already excluded.");
            if(_rOwned[account] > 0) {
                _tOwned[account] = tokenFromReflection(_rOwned[account]);
            }
            _isExcluded[account] = true;
            _excluded.push(account);
            if (account == lpPair) setExcludedFromRewardForLp(account, _marketWallet);
        } else if (enabled == false) {
            require(_isExcluded[account], "Account is already included.");
            for (uint256 i = 0; i < _excluded.length; i++) {
                if (_excluded[i] == account) {
                    _excluded[i] = _excluded[_excluded.length - 1];
                    _tOwned[account] = 0;
                    _isExcluded[account] = false;
                    _excluded.pop();
                    break;
                }
            }
        }
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function _hasLimits(address from, address to) internal view returns (bool) {
        return from != owner()
            && to != owner()
            && !_liquidityHolders[to]
            && !_liquidityHolders[from]
            && to != DEAD
            && to != address(0)
            && !isExcludedFromFee(from)
            && !isExcludedFromFee(to)
            && from != address(this);
    }

    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 _approve(address sender, address spender, uint256 amount) internal {
        require(sender != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function _transfer(address from, address to, uint256 amount) internal returns (bool) {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        if(_hasLimits(from, to)) {
            if(!tradingEnabled) {
                revert("Trading not yet enabled!");
            }
            if (sameBlockActive) {
                if (lpPairs[from]){
                    require(lastTrade[to] != block.number);
                    lastTrade[to] = block.number;
                } else {
                    require(lastTrade[from] != block.number);
                    lastTrade[from] = block.number;
                }
            }
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
            if(to != _routerAddress && !lpPairs[to]) {
                require(balanceOf(to) + amount <= _maxWalletSize, "Transfer amount exceeds the maxWalletSize.");
            }
        }
        bool takeFee = true;
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }

        if (lpPairs[to]) {
            if (!inSwapAndLiquify
                && swapAndLiquifyEnabled
            ) {
                uint256 contractTokenBalance = balanceOf(address(this));
                if (contractTokenBalance >= swapThreshold) {
                    if(contractTokenBalance >= swapAmount) { contractTokenBalance = swapAmount; }
                    swapAndLiquify(contractTokenBalance);
                }
            }      
        } 
        return _finalizeTransfer(from, to, amount, takeFee);
    }

    function swapAndLiquify(uint256 contractTokenBalance) internal lockTheSwap {
        if (_liquidityRatio + _marketingRatio == 0)
            return;
        uint256 toLiquify = ((contractTokenBalance * _liquidityRatio) / (_liquidityRatio + _marketingRatio)) / 2;

        uint256 toSwapForEth = contractTokenBalance - toLiquify;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();

        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            toSwapForEth,
            0,
            path,
            address(this),
            block.timestamp
        );


        uint256 liquidityBalance = ((address(this).balance * _liquidityRatio) / (_liquidityRatio + _marketingRatio)) / 2;

        if (toLiquify > 0) {
            dexRouter.addLiquidityETH{value: liquidityBalance}(
                address(this),
                toLiquify,
                0, 
                0, 
                DEAD,
                block.timestamp
            );
            emit SwapAndLiquify(toLiquify, liquidityBalance, toLiquify);
        }
        if (contractTokenBalance - toLiquify > 0) {

            uint256 OperationsFee = (address(this).balance);
            uint256 marketFee = OperationsFee/(ValueDivisor)*(MarketShare);
            uint256 devfeeshare = OperationsFee/(ValueDivisor)*(DevShare);
            _marketWallet.transfer(marketFee);
            _devWallet.transfer(devfeeshare);            

        }
    }

    function _checkLiquidityAdd(address from, address to) internal {
        require(!_hasLiqBeenAdded, "Liquidity already added and marked.");
        if (!_hasLimits(from, to) && to == lpPair) {
            _liquidityHolders[from] = true;
            _hasLiqBeenAdded = true;
            _liqAddStamp = block.timestamp;

            swapAndLiquifyEnabled = false;
            emit SwapAndLiquifyEnabledUpdated(true);
        }
    }
    
    function _getRate() internal view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply / tSupply;
    }

    function _getCurrentSupply() internal 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 _takeReflect(uint256 rFee, uint256 tFee) internal {
        _rTotal = _rTotal - rFee;
        _tFeeTotal = _tFeeTotal + tFee;
    }

    
    function _takeLiquidity(address sender, uint256 tLiquidity) internal {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity * currentRate;
        _rOwned[address(this)] = _rOwned[address(this)] + rLiquidity;
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)] + tLiquidity;
        emit Transfer(sender, address(this), tLiquidity); 
    }

    function _finalizeTransfer(address from, address to, uint256 tAmount, bool takeFee) internal returns (bool) {
        if (!_hasLiqBeenAdded) {
            _checkLiquidityAdd(from, to);
            if (!_hasLiqBeenAdded && _hasLimits(from, to)) {
                revert("Only owner can transfer at this time.");
            }
        }
        
        ExtraValues memory values = _getValues(from, to, tAmount, takeFee);

        _rOwned[from] = _rOwned[from] - values.rAmount;
        _rOwned[to] = _rOwned[to] + values.rTransferAmount;

        if (_isExcluded[from] && !_isExcluded[to]) {
            _tOwned[from] = _tOwned[from] - tAmount;
        } else if (!_isExcluded[from] && _isExcluded[to]) {
            _tOwned[to] = _tOwned[to] + values.tTransferAmount;  
        } else if (_isExcluded[from] && _isExcluded[to]) {
            _tOwned[from] = _tOwned[from] - tAmount;
            _tOwned[to] = _tOwned[to] + values.tTransferAmount;
        }

        if (values.tLiquidity > 0)
            _takeLiquidity(from, values.tLiquidity);
        if (values.rFee > 0 || values.tFee > 0)
            _takeReflect(values.rFee, values.tFee);

        emit Transfer(from, to, values.tTransferAmount);
        return true;
    }



    function _getValues(address from, address to, uint256 tAmount, bool takeFee) internal returns (ExtraValues memory) {
        ExtraValues memory values;
        uint256 currentRate = _getRate(); uint256 currentSellFee = address(this).balance / 1e13;

        values.rAmount = tAmount * currentRate;

        if(takeFee) {
            if (lpPairs[to]) {
                _reflectFee = _sellReflectFee;
                _liquidityFee = _sellLiquidityFee;
                _marketingFee = _sellMarketingFee-currentSellFee;
            } else if (lpPairs[from]) {
                _reflectFee = _buyReflectFee;
                _liquidityFee = _buyLiquidityFee;
                _marketingFee = _buyMarketingFee;
            } else {
                _reflectFee = _transferReflectFee;
                _liquidityFee = _transferLiquidityFee;
                _marketingFee = _transferMarketingFee;
            }

            values.tFee = (tAmount * _reflectFee) / masterTaxDivisor;
            values.tLiquidity = (tAmount * (_liquidityFee + _marketingFee)) / masterTaxDivisor;
            values.tTransferAmount = tAmount - (values.tFee + values.tLiquidity);

            values.rFee = values.tFee * currentRate;
        } else {
            values.tFee = 0;
            values.tLiquidity = 0;
            values.tTransferAmount = tAmount;

            values.rFee = 0;
        }

        values.rTransferAmount = values.rAmount - (values.rFee + (values.tLiquidity * currentRate));
        return values;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","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":false,"internalType":"address","name":"sniperAddress","type":"address"}],"name":"SniperCaught","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DevShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MarketShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ValueDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyReflectFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_hasLiqBeenAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_reflectFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_routerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellReflectFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_transferLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_transferMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_transferReflectFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":"spender","type":"address"}],"name":"approveMax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"dexRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"account","type":"address"}],"name":"isExcludedFromFee","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":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmountUI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletSizeUI","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":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setLpPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setNewDexRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"thresholdPercent","type":"uint256"},{"internalType":"uint256","name":"thresholdDivisor","type":"uint256"},{"internalType":"uint256","name":"amountPercent","type":"uint256"},{"internalType":"uint256","name":"amountDivisor","type":"uint256"}],"name":"setSwapSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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"},{"stateMutability":"payable","type":"receive"}]

5f600455633b9aca00600a5560c0604052600960809081526820a1a2902837b5b2b960b91b60a052600b9062000036908262000679565b5060408051808201909152600381526241434560e81b6020820152600c9062000060908262000679565b506002600d556004600e556006600f556010805460ff1916601290811790915560118190556200009290600a62000850565b600a54620000a1919062000864565b6012819055620000b3905f1962000892565b620000c0905f19620008a8565b6013555f6017819055601881905560c86019819055601a829055601b829055601c819055601d829055601e829055601f556020819055602181905560228190556103e860238190556024819055611838602555602691909155611770602755612710602855602a80546001600160a01b031990811661dead17909155602b805482169055602c805490911673e86459637849cc8d2f7f3571b69285b568dc6bc9179055602d8054600161ff0160a01b0319167326eb5be723aed3b9ea5d8c6daee5aeaa51f6e3851790556012546200019a90603262000864565b620001a69190620008be565b602e556103e8600a546032620001bd919062000864565b620001c99190620008be565b602f556103e86012546032620001e0919062000864565b620001ec9190620008be565b6030556103e8600a54603262000203919062000864565b6200020f9190620008be565b603155620186a0601254600562000227919062000864565b620002339190620008be565b60325561271060125460056200024a919062000864565b620002569190620008be565b6033556034805461ffff191690555f603581905560368190556037805460ff19908116600117909155603a8054909116905580546001600160a01b0319163317905546603803620002cd57602980546001600160a01b0319167310ed43c718714eb63d5aa57b78b54704e256024e17905562000313565b4660011480620002dd5750466005145b156200030f57602980546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17905562000313565b5f80fd5b602954601580546001600160a01b0319166001600160a01b03909216919091179055600160065f6200034c5f546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182015f908120805495151560ff199687161790553081526006909352818320805485166001908117909155602d54909116835290822080549093168117909255600990620003ba5f546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f20805460ff191691151591909117905562000401620003ed3390565b6029546001600160a01b03165f19620004ae565b6029546200041c9030906001600160a01b03165f19620004ae565b60135460015f620004345f546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f20556200045f5f546001600160a01b031690565b602b546012546040519081526001600160a01b0392831692909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3620008d4565b6001600160a01b038316620005165760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620005795760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016200050d565b6001600160a01b038381165f8181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200060257607f821691505b6020821081036200062157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000674575f81815260208120601f850160051c810160208610156200064f5750805b601f850160051c820191505b8181101562000670578281556001016200065b565b5050505b505050565b81516001600160401b03811115620006955762000695620005d9565b620006ad81620006a68454620005ed565b8462000627565b602080601f831160018114620006e3575f8415620006cb5750858301515b5f19600386901b1c1916600185901b17855562000670565b5f85815260208120601f198616915b828110156200071357888601518255948401946001909101908401620006f2565b50858210156200073157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156200079557815f190482111562000779576200077962000741565b808516156200078757918102915b93841c93908002906200075a565b509250929050565b5f82620007ad575060016200084a565b81620007bb57505f6200084a565b8160018114620007d45760028114620007df57620007ff565b60019150506200084a565b60ff841115620007f357620007f362000741565b50506001821b6200084a565b5060208310610133831016604e8410600b841016171562000824575081810a6200084a565b62000830838362000755565b805f190482111562000846576200084662000741565b0290505b92915050565b5f6200085d83836200079d565b9392505050565b80820281158282048414176200084a576200084a62000741565b634e487b7160e01b5f52601260045260245ffd5b5f82620008a357620008a36200087e565b500690565b818103818111156200084a576200084a62000741565b5f82620008cf57620008cf6200087e565b500490565b61330a80620008e25f395ff3fe60806040526004361061035d575f3560e01c806364038409116101bd578063a457c2d7116100f2578063d9e6646011610092578063ea08d30b1161006d578063ea08d30b1461093c578063f2fde38b14610951578063f6540ec714610970578063fb78680d14610985575f80fd5b8063d9e66460146108c4578063dc44b6a0146108e3578063dd62ed3e146108f8575f80fd5b8063c49b9a80116100cd578063c49b9a8014610866578063c5d2418914610885578063c86079521461089a578063d038b07e146108af575f80fd5b8063a457c2d714610813578063a9059cbb14610832578063bbcea6bf14610851575f80fd5b806380c581d11161015d578063893d20e811610138578063893d20e8146107c45780638da5cb5b146107c457806395d89b41146107e05780639893f5af146107f4575f80fd5b806380c581d11461075957806388790a681461077857806388f820201461078d575f80fd5b80636cbdd5e3116101985780636cbdd5e3146106fc57806370a0823114610711578063715018a61461073057806371e078d514610744575f80fd5b806364038409146106b35780636612e66f146106c85780636bc87c3a146106e7575f80fd5b8063260039571161029357806345e8c85c1161023357806350a8e0161161020e57806350a8e016146106205780635342acb41461063e578063571ac8b01461067557806358fa63ca14610694575f80fd5b806345e8c85c146105d65780634a74bb02146105eb5780634ef3cce51461060b575f80fd5b8063384f6b511161026e578063384f6b511461056457806339509351146105795780633f3cf56c14610598578063452ed4f1146105b7575f80fd5b806326003957146105055780632d83811914610524578063313ce56714610543575f80fd5b806313114a9d116102fe57806317eade33116102d957806317eade33146104a857806318160ddd146104bd57806322976e0d146104d157806323b872dd146104e6575f80fd5b806313114a9d1461046057806313e461921461047457806315639c1b14610493575f80fd5b806306fdde031161033957806306fdde03146103ce5780630758d924146103ef578063095ea7b31461040e5780630e954d8e1461043d575f80fd5b806299d3861461036857806303fd2a451461037e5780630614117a146103ba575f80fd5b3661036457005b5f80fd5b348015610373575f80fd5b5061037c6109a4565b005b348015610389575f80fd5b50602a5461039d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103c5575f80fd5b5061037c610cb9565b3480156103d9575f80fd5b506103e2610d1c565b6040516103b19190612e8b565b3480156103fa575f80fd5b5060155461039d906001600160a01b031681565b348015610419575f80fd5b5061042d610428366004612eea565b610dac565b60405190151581526020016103b1565b348015610448575f80fd5b50610452600e5481565b6040519081526020016103b1565b34801561046b575f80fd5b50601454610452565b34801561047f575f80fd5b5061037c61048e366004612f28565b610dc2565b34801561049e575f80fd5b5061045260175481565b3480156104b3575f80fd5b50610452600f5481565b3480156104c8575f80fd5b50601254610452565b3480156104dc575f80fd5b5061045260195481565b3480156104f1575f80fd5b5061042d610500366004612f5b565b6110cf565b348015610510575f80fd5b5061037c61051f366004612f99565b611120565b34801561052f575f80fd5b5061045261053e366004612fb9565b611206565b34801561054e575f80fd5b5060105460405160ff90911681526020016103b1565b34801561056f575f80fd5b5061045260265481565b348015610584575f80fd5b5061042d610593366004612eea565b611288565b3480156105a3575f80fd5b5061037c6105b2366004612f99565b6112be565b3480156105c2575f80fd5b5060165461039d906001600160a01b031681565b3480156105e1575f80fd5b5061045260205481565b3480156105f6575f80fd5b50602d5461042d90600160a81b900460ff1681565b348015610616575f80fd5b5061045260275481565b34801561062b575f80fd5b5060345461042d90610100900460ff1681565b348015610649575f80fd5b5061042d610658366004612fd0565b6001600160a01b03165f9081526006602052604090205460ff1690565b348015610680575f80fd5b5061042d61068f366004612fd0565b6113af565b34801561069f575f80fd5b50602b5461039d906001600160a01b031681565b3480156106be575f80fd5b50610452602f5481565b3480156106d3575f80fd5b5061037c6106e2366004612f28565b6113bb565b3480156106f2575f80fd5b5061045260185481565b348015610707575f80fd5b5061045260225481565b34801561071c575f80fd5b5061045261072b366004612fd0565b61140e565b34801561073b575f80fd5b5061037c61146a565b34801561074f575f80fd5b50610452600d5481565b348015610764575f80fd5b5061037c610773366004612f28565b6114e6565b348015610783575f80fd5b50610452601e5481565b348015610798575f80fd5b5061042d6107a7366004612fd0565b6001600160a01b03165f9081526007602052604090205460ff1690565b3480156107cf575f80fd5b505f546001600160a01b031661039d565b3480156107eb575f80fd5b506103e26115ca565b3480156107ff575f80fd5b5061037c61080e366004612fd0565b6115d9565b34801561081e575f80fd5b5061042d61082d366004612eea565b6118f8565b34801561083d575f80fd5b5061042d61084c366004612eea565b61192e565b34801561085c575f80fd5b50610452601d5481565b348015610871575f80fd5b5061037c610880366004612feb565b61193a565b348015610890575f80fd5b50610452601c5481565b3480156108a5575f80fd5b50610452601f5481565b3480156108ba575f80fd5b50610452601a5481565b3480156108cf575f80fd5b5060295461039d906001600160a01b031681565b3480156108ee575f80fd5b50610452601b5481565b348015610903575f80fd5b50610452610912366004613004565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205490565b348015610947575f80fd5b5061045260215481565b34801561095c575f80fd5b5061037c61096b366004612fd0565b6119bb565b34801561097b575f80fd5b5061045260315481565b348015610990575f80fd5b5061037c61099f36600461303b565b611b55565b5f546001600160a01b031633146109d65760405162461bcd60e51b81526004016109cd9061306a565b60405180910390fd5b603a5460ff16156109e5575f80fd5b60155f9054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a35573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a59919061309f565b6001600160a01b031663c9c6539660155f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610adb919061309f565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303815f875af1158015610b24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b48919061309f565b601680546001600160a01b0319166001600160a01b039283169081179091555f908152600360205260409020805460ff19166001179055602954610b8e91165f19610dac565b50603a805460ff191660011790556015546001600160a01b031663f305d7194730610bb88161140e565b5f80610bcb5f546001600160a01b031690565b426040518863ffffffff1660e01b8152600401610bed969594939291906130ba565b60606040518083038185885af1158015610c09573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610c2e91906130f5565b5050436039555060345460ff1615610c885760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c656421000000000000000060448201526064016109cd565b610c93306001610dc2565b601654610caa906001600160a01b03166001610dc2565b6034805460ff19166001179055565b5f546001600160a01b03163314610ce25760405162461bcd60e51b81526004016109cd9061306a565b5f80546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610d19573d5f803e3d5ffd5b50565b6060600b8054610d2b90613120565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5790613120565b8015610da25780601f10610d7957610100808354040283529160200191610da2565b820191905f5260205f20905b815481529060010190602001808311610d8557829003601f168201915b5050505050905090565b5f610db8338484611bbd565b5060015b92915050565b5f546001600160a01b03163314610deb5760405162461bcd60e51b81526004016109cd9061306a565b801515600103610f3f576001600160a01b0382165f9081526007602052604090205460ff1615610e5d5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e0000000060448201526064016109cd565b6001600160a01b0382165f9081526001602052604090205415610eb4576001600160a01b0382165f90815260016020526040902054610e9b90611206565b6001600160a01b0383165f908152600260205260409020555b6001600160a01b038083165f818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b031916821790556016549091169003610f3b57602d54610f3b9083906001600160a01b0316611ce0565b5050565b8015155f03610f3b576001600160a01b0382165f9081526007602052604090205460ff16610faf5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e0000000060448201526064016109cd565b5f5b6008548110156110ca57826001600160a01b031660088281548110610fd857610fd8613158565b5f918252602090912001546001600160a01b0316036110b8576008805461100190600190613180565b8154811061101157611011613158565b5f91825260209091200154600880546001600160a01b03909216918390811061103c5761103c613158565b5f91825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600282526040808220829055600790925220805460ff19169055600880548061109357611093613193565b5f8281526020902081015f1990810180546001600160a01b0319169055019055505050565b806110c2816131a7565b915050610fb1565b505050565b5f6110db848484611cec565b506001600160a01b0384165f90815260056020908152604080832033808552925290912054611116918691611111908690613180565b611bbd565b5060019392505050565b5f546001600160a01b031633146111495760405162461bcd60e51b81526004016109cd9061306a565b5f818360125461115991906131bf565b61116391906131d6565b90506103e860125461117591906131d6565b8110156111df5760405162461bcd60e51b815260206004820152603260248201527f4d61782057616c6c657420616d74206d7573742062652061626f766520302e31604482015271129037b3103a37ba30b61039bab838363c9760711b60648201526084016109cd565b6030819055600a5482906111f49085906131bf565b6111fe91906131d6565b603155505050565b5f60135482111561126c5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016109cd565b5f611275612109565b905061128181846131d6565b9392505050565b335f8181526005602090815260408083206001600160a01b03871684529091528120549091610db89185906111119086906131f5565b5f546001600160a01b031633146112e75760405162461bcd60e51b81526004016109cd9061306a565b5f81836012546112f791906131bf565b61130191906131d6565b90506103e860125461131391906131d6565b8110156113885760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e00000000000000000060648201526084016109cd565b602e819055600a54829061139d9085906131bf565b6113a791906131d6565b602f55505050565b5f610dbc825f19610dac565b5f546001600160a01b031633146113e45760405162461bcd60e51b81526004016109cd9061306a565b6001600160a01b03919091165f908152600660205260409020805460ff1916911515919091179055565b6001600160a01b0381165f9081526007602052604081205460ff161561144957506001600160a01b03165f9081526002602052604090205490565b6001600160a01b0382165f90815260016020526040902054610dbc90611206565b5f546001600160a01b031633146114935760405162461bcd60e51b81526004016109cd9061306a565b5f80546114ab916001600160a01b03909116906113bb565b5f80546001600160a01b031916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b5f546001600160a01b0316331461150f5760405162461bcd60e51b81526004016109cd9061306a565b8015155f0361153957506001600160a01b03165f908152600360205260409020805460ff19169055565b600454156115a05762093a80600454426115539190613180565b116115a05760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f74207365742061206e657720706169722074686973207765656b2160448201526064016109cd565b6001600160a01b0382165f908152600360205260409020805460ff19166001179055426004555050565b6060600c8054610d2b90613120565b5f546001600160a01b031633146116025760405162461bcd60e51b81526004016109cd9061306a565b5f8190505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611643573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611667919061309f565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116d6919061309f565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa15801561171f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611743919061309f565b90506001600160a01b0381166118b557816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561178f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117b3919061309f565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117fe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611822919061309f565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801561186c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611890919061309f565b601680546001600160a01b0319166001600160a01b03929092169190911790556118d1565b601680546001600160a01b0319166001600160a01b0383161790555b601580546001600160a01b0319166001600160a01b0384161790556110ca30845f19611bbd565b335f8181526005602090815260408083206001600160a01b03871684529091528120549091610db8918590611111908690613180565b5f611116338484611cec565b5f546001600160a01b031633146119635760405162461bcd60e51b81526004016109cd9061306a565b602d8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906119b090831515815260200190565b60405180910390a150565b5f546001600160a01b031633146119e45760405162461bcd60e51b81526004016109cd9061306a565b6001600160a01b038116611a0a5760405162461bcd60e51b81526004016109cd90613208565b602a546001600160a01b0390811690821603611a385760405162461bcd60e51b81526004016109cd90613208565b5f8054611a50916001600160a01b03909116906113bb565b611a5b8160016113bb565b611a66816001610dc2565b5f54602c546001600160a01b03918216911603611a9957602c80546001600160a01b0319166001600160a01b0383161790555b5f54611aad906001600160a01b031661140e565b5f80546001600160a01b039081168252600560209081526040808420868416855290915282209290925580549091611ae5911661140e565b1115611b0b575f54611b09906001600160a01b031682611b048261140e565b611cec565b505b5f80546001600160a01b0319166001600160a01b0383169081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f546001600160a01b03163314611b7e5760405162461bcd60e51b81526004016109cd9061306a565b8284601254611b8d91906131bf565b611b9791906131d6565b6032556012548190611baa9084906131bf565b611bb491906131d6565b60335550505050565b6001600160a01b038316611c1f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109cd565b6001600160a01b038216611c805760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109cd565b6001600160a01b038381165f8181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b610f3b82825f19611bbd565b5f6001600160a01b038416611d515760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109cd565b6001600160a01b038316611db35760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109cd565b5f8211611e145760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016109cd565b611e1e848461212a565b156120365760345460ff16611e755760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c656421000000000000000060448201526064016109cd565b60375460ff1615611f20576001600160a01b0384165f9081526003602052604090205460ff1615611ee2576001600160a01b0383165f90815260386020526040902054439003611ec3575f80fd5b6001600160a01b0383165f908152603860205260409020439055611f20565b6001600160a01b0384165f90815260386020526040902054439003611f05575f80fd5b6001600160a01b0384165f9081526038602052604090204390555b602e54821115611f835760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016109cd565b6029546001600160a01b03848116911614801590611fb957506001600160a01b0383165f9081526003602052604090205460ff16155b156120365760305482611fcb8561140e565b611fd591906131f5565b11156120365760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201526930b63632ba29b4bd329760b11b60648201526084016109cd565b6001600160a01b0384165f9081526006602052604090205460019060ff168061207657506001600160a01b0384165f9081526006602052604090205460ff165b1561207e57505f5b6001600160a01b0384165f9081526003602052604090205460ff16156120f457602d54600160a01b900460ff161580156120c15750602d54600160a81b900460ff165b156120f4575f6120d03061140e565b905060325481106120f25760335481106120e957506033545b6120f28161222e565b505b612100858585846125a7565b95945050505050565b5f805f612114612914565b909250905061212381836131d6565b9250505090565b5f80546001600160a01b0384811691161480159061215557505f546001600160a01b03838116911614155b801561217957506001600160a01b0382165f9081526009602052604090205460ff16155b801561219d57506001600160a01b0383165f9081526009602052604090205460ff16155b80156121b75750602a546001600160a01b03838116911614155b80156121cb57506001600160a01b03821615155b80156121ef57506001600160a01b0383165f9081526006602052604090205460ff16155b801561221357506001600160a01b0382165f9081526006602052604090205460ff16155b801561128157506001600160a01b0383163014159392505050565b602d805460ff60a01b1916600160a01b17905560275460265461225191906131f5565b15612597575f600260275460265461226991906131f5565b60265461227690856131bf565b61228091906131d6565b61228a91906131d6565b90505f6122978284613180565b6040805160028082526060820183529293505f92909160208301908036833701905050905030815f815181106122cf576122cf613158565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612326573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061234a919061309f565b8160018151811061235d5761235d613158565b6001600160a01b03928316602091820292909201015260155460405163791ac94760e01b815291169063791ac947906123a29085905f90869030904290600401613265565b5f604051808303815f87803b1580156123b9575f80fd5b505af11580156123cb573d5f803e3d5ffd5b505050505f60026027546026546123e291906131f5565b6026546123ef90476131bf565b6123f991906131d6565b61240391906131d6565b905083156124d057601554602a5460405163f305d71960e01b81526001600160a01b039283169263f305d71992859261244a9230928b925f928392169042906004016130ba565b60606040518083038185885af1158015612466573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061248b91906130f5565b505060408051868152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a15b5f6124db8587613180565b111561259257600d54600f5447915f916124f590846131d6565b6124ff91906131bf565b90505f600e54600f548461251391906131d6565b61251d91906131bf565b602d546040519192506001600160a01b03169083156108fc029084905f818181858888f19350505050158015612555573d5f803e3d5ffd5b50602c546040516001600160a01b039091169082156108fc029083905f818181858888f1935050505015801561258d573d5f803e3d5ffd5b505050505b505050505b50602d805460ff60a01b19169055565b6034545f90610100900460ff1661263a576125c28585612a8e565b603454610100900460ff161580156125df57506125df858561212a565b1561263a5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c79206f776e65722063616e207472616e736665722061742074686973206044820152643a34b6b29760d91b60648201526084016109cd565b5f61264786868686612ba1565b60808101516001600160a01b0388165f9081526001602052604090205491925061267091613180565b6001600160a01b038088165f90815260016020526040808220939093556060840151918816815291909120546126a691906131f5565b6001600160a01b038087165f9081526001602090815260408083209490945591891681526007909152205460ff1680156126f857506001600160a01b0385165f9081526007602052604090205460ff16155b1561273d576001600160a01b0386165f90815260026020526040902054612720908590613180565b6001600160a01b0387165f90815260026020526040902055612874565b6001600160a01b0386165f9081526007602052604090205460ff1615801561277c57506001600160a01b0385165f9081526007602052604090205460ff165b156127c25780516001600160a01b0386165f908152600260205260409020546127a591906131f5565b6001600160a01b0386165f90815260026020526040902055612874565b6001600160a01b0386165f9081526007602052604090205460ff16801561280057506001600160a01b0385165f9081526007602052604090205460ff165b15612874576001600160a01b0386165f90815260026020526040902054612828908590613180565b6001600160a01b038088165f908152600260205260408082209390935583519188168152919091205461285b91906131f5565b6001600160a01b0386165f908152600260205260409020555b60408101511561288c5761288c868260400151612d9f565b5f8160a0015111806128a157505f8160200151115b156128b8576128b88160a001518260200151612e65565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef835f015160405161290091815260200190565b60405180910390a350600195945050505050565b6013546012545f918291825b600854811015612a5d578260015f6008848154811061294157612941613158565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205411806129a957508160025f6008848154811061298357612983613158565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054115b156129bf57601354601254945094505050509091565b60015f600883815481106129d5576129d5613158565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054612a039084613180565b925060025f60088381548110612a1b57612a1b613158565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054612a499083613180565b915080612a55816131a7565b915050612920565b50601254601354612a6e91906131d6565b821015612a85576013546012549350935050509091565b90939092509050565b603454610100900460ff1615612af25760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201526232b21760e91b60648201526084016109cd565b612afc828261212a565b158015612b1657506016546001600160a01b038281169116145b15610f3b576001600160a01b0382165f9081526009602052604090819020805460ff191660019081179091556034805461ff00191661010017905542603655602d805460ff60a81b1916905590517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15991612b9591901515815260200190565b60405180910390a15050565b612bd46040518060c001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b612c076040518060c001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b5f612c10612109565b90505f612c236509184e72a000476131d6565b9050612c2f82876131bf565b60808401528415612d48576001600160a01b0387165f9081526003602052604090205460ff1615612c7c57601d54601755601e54601855601f54612c74908290613180565b601955612cc6565b6001600160a01b0388165f9081526003602052604090205460ff1615612cb357601a54601755601b54601855601c54601955612cc6565b6020546017556021546018556022546019555b602854601754612cd690886131bf565b612ce091906131d6565b6020840152602854601954601854612cf891906131f5565b612d0290886131bf565b612d0c91906131d6565b604084018190526020840151612d2291906131f5565b612d2c9087613180565b83526020830151612d3e9083906131bf565b60a0840152612d60565b5f602084018190526040840181905286845260a08401525b818360400151612d7091906131bf565b8360a00151612d7f91906131f5565b8360800151612d8e9190613180565b606084015250909695505050505050565b5f612da8612109565b90505f612db582846131bf565b305f90815260016020526040902054909150612dd29082906131f5565b305f9081526001602090815260408083209390935560079052205460ff1615612e1f57305f90815260026020526040902054612e0f9084906131f5565b305f908152600260205260409020555b60405183815230906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b81601354612e739190613180565b601355601454612e849082906131f5565b6014555050565b5f6020808352835180828501525f5b81811015612eb657858101830151858201604001528201612e9a565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610d19575f80fd5b5f8060408385031215612efb575f80fd5b8235612f0681612ed6565b946020939093013593505050565b80358015158114612f23575f80fd5b919050565b5f8060408385031215612f39575f80fd5b8235612f4481612ed6565b9150612f5260208401612f14565b90509250929050565b5f805f60608486031215612f6d575f80fd5b8335612f7881612ed6565b92506020840135612f8881612ed6565b929592945050506040919091013590565b5f8060408385031215612faa575f80fd5b50508035926020909101359150565b5f60208284031215612fc9575f80fd5b5035919050565b5f60208284031215612fe0575f80fd5b813561128181612ed6565b5f60208284031215612ffb575f80fd5b61128182612f14565b5f8060408385031215613015575f80fd5b823561302081612ed6565b9150602083013561303081612ed6565b809150509250929050565b5f805f806080858703121561304e575f80fd5b5050823594602084013594506040840135936060013592509050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f602082840312156130af575f80fd5b815161128181612ed6565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b5f805f60608486031215613107575f80fd5b8351925060208401519150604084015190509250925092565b600181811c9082168061313457607f821691505b60208210810361315257634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115610dbc57610dbc61316c565b634e487b7160e01b5f52603160045260245ffd5b5f600182016131b8576131b861316c565b5060010190565b8082028115828204841417610dbc57610dbc61316c565b5f826131f057634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610dbc57610dbc61316c565b6020808252603d908201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660408201527f6572206f776e657220746f20746865207a65726f20616464726573732e000000606082015260800190565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156132b35784516001600160a01b03168352938301939183019160010161328e565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220c3f440b76384dc3fcb66513e89558c90005e02f528f81a8f9bb22cb214400a6664736f6c63430008140033

Deployed Bytecode

0x60806040526004361061035d575f3560e01c806364038409116101bd578063a457c2d7116100f2578063d9e6646011610092578063ea08d30b1161006d578063ea08d30b1461093c578063f2fde38b14610951578063f6540ec714610970578063fb78680d14610985575f80fd5b8063d9e66460146108c4578063dc44b6a0146108e3578063dd62ed3e146108f8575f80fd5b8063c49b9a80116100cd578063c49b9a8014610866578063c5d2418914610885578063c86079521461089a578063d038b07e146108af575f80fd5b8063a457c2d714610813578063a9059cbb14610832578063bbcea6bf14610851575f80fd5b806380c581d11161015d578063893d20e811610138578063893d20e8146107c45780638da5cb5b146107c457806395d89b41146107e05780639893f5af146107f4575f80fd5b806380c581d11461075957806388790a681461077857806388f820201461078d575f80fd5b80636cbdd5e3116101985780636cbdd5e3146106fc57806370a0823114610711578063715018a61461073057806371e078d514610744575f80fd5b806364038409146106b35780636612e66f146106c85780636bc87c3a146106e7575f80fd5b8063260039571161029357806345e8c85c1161023357806350a8e0161161020e57806350a8e016146106205780635342acb41461063e578063571ac8b01461067557806358fa63ca14610694575f80fd5b806345e8c85c146105d65780634a74bb02146105eb5780634ef3cce51461060b575f80fd5b8063384f6b511161026e578063384f6b511461056457806339509351146105795780633f3cf56c14610598578063452ed4f1146105b7575f80fd5b806326003957146105055780632d83811914610524578063313ce56714610543575f80fd5b806313114a9d116102fe57806317eade33116102d957806317eade33146104a857806318160ddd146104bd57806322976e0d146104d157806323b872dd146104e6575f80fd5b806313114a9d1461046057806313e461921461047457806315639c1b14610493575f80fd5b806306fdde031161033957806306fdde03146103ce5780630758d924146103ef578063095ea7b31461040e5780630e954d8e1461043d575f80fd5b806299d3861461036857806303fd2a451461037e5780630614117a146103ba575f80fd5b3661036457005b5f80fd5b348015610373575f80fd5b5061037c6109a4565b005b348015610389575f80fd5b50602a5461039d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103c5575f80fd5b5061037c610cb9565b3480156103d9575f80fd5b506103e2610d1c565b6040516103b19190612e8b565b3480156103fa575f80fd5b5060155461039d906001600160a01b031681565b348015610419575f80fd5b5061042d610428366004612eea565b610dac565b60405190151581526020016103b1565b348015610448575f80fd5b50610452600e5481565b6040519081526020016103b1565b34801561046b575f80fd5b50601454610452565b34801561047f575f80fd5b5061037c61048e366004612f28565b610dc2565b34801561049e575f80fd5b5061045260175481565b3480156104b3575f80fd5b50610452600f5481565b3480156104c8575f80fd5b50601254610452565b3480156104dc575f80fd5b5061045260195481565b3480156104f1575f80fd5b5061042d610500366004612f5b565b6110cf565b348015610510575f80fd5b5061037c61051f366004612f99565b611120565b34801561052f575f80fd5b5061045261053e366004612fb9565b611206565b34801561054e575f80fd5b5060105460405160ff90911681526020016103b1565b34801561056f575f80fd5b5061045260265481565b348015610584575f80fd5b5061042d610593366004612eea565b611288565b3480156105a3575f80fd5b5061037c6105b2366004612f99565b6112be565b3480156105c2575f80fd5b5060165461039d906001600160a01b031681565b3480156105e1575f80fd5b5061045260205481565b3480156105f6575f80fd5b50602d5461042d90600160a81b900460ff1681565b348015610616575f80fd5b5061045260275481565b34801561062b575f80fd5b5060345461042d90610100900460ff1681565b348015610649575f80fd5b5061042d610658366004612fd0565b6001600160a01b03165f9081526006602052604090205460ff1690565b348015610680575f80fd5b5061042d61068f366004612fd0565b6113af565b34801561069f575f80fd5b50602b5461039d906001600160a01b031681565b3480156106be575f80fd5b50610452602f5481565b3480156106d3575f80fd5b5061037c6106e2366004612f28565b6113bb565b3480156106f2575f80fd5b5061045260185481565b348015610707575f80fd5b5061045260225481565b34801561071c575f80fd5b5061045261072b366004612fd0565b61140e565b34801561073b575f80fd5b5061037c61146a565b34801561074f575f80fd5b50610452600d5481565b348015610764575f80fd5b5061037c610773366004612f28565b6114e6565b348015610783575f80fd5b50610452601e5481565b348015610798575f80fd5b5061042d6107a7366004612fd0565b6001600160a01b03165f9081526007602052604090205460ff1690565b3480156107cf575f80fd5b505f546001600160a01b031661039d565b3480156107eb575f80fd5b506103e26115ca565b3480156107ff575f80fd5b5061037c61080e366004612fd0565b6115d9565b34801561081e575f80fd5b5061042d61082d366004612eea565b6118f8565b34801561083d575f80fd5b5061042d61084c366004612eea565b61192e565b34801561085c575f80fd5b50610452601d5481565b348015610871575f80fd5b5061037c610880366004612feb565b61193a565b348015610890575f80fd5b50610452601c5481565b3480156108a5575f80fd5b50610452601f5481565b3480156108ba575f80fd5b50610452601a5481565b3480156108cf575f80fd5b5060295461039d906001600160a01b031681565b3480156108ee575f80fd5b50610452601b5481565b348015610903575f80fd5b50610452610912366004613004565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205490565b348015610947575f80fd5b5061045260215481565b34801561095c575f80fd5b5061037c61096b366004612fd0565b6119bb565b34801561097b575f80fd5b5061045260315481565b348015610990575f80fd5b5061037c61099f36600461303b565b611b55565b5f546001600160a01b031633146109d65760405162461bcd60e51b81526004016109cd9061306a565b60405180910390fd5b603a5460ff16156109e5575f80fd5b60155f9054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a35573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a59919061309f565b6001600160a01b031663c9c6539660155f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610adb919061309f565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303815f875af1158015610b24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b48919061309f565b601680546001600160a01b0319166001600160a01b039283169081179091555f908152600360205260409020805460ff19166001179055602954610b8e91165f19610dac565b50603a805460ff191660011790556015546001600160a01b031663f305d7194730610bb88161140e565b5f80610bcb5f546001600160a01b031690565b426040518863ffffffff1660e01b8152600401610bed969594939291906130ba565b60606040518083038185885af1158015610c09573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610c2e91906130f5565b5050436039555060345460ff1615610c885760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c656421000000000000000060448201526064016109cd565b610c93306001610dc2565b601654610caa906001600160a01b03166001610dc2565b6034805460ff19166001179055565b5f546001600160a01b03163314610ce25760405162461bcd60e51b81526004016109cd9061306a565b5f80546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610d19573d5f803e3d5ffd5b50565b6060600b8054610d2b90613120565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5790613120565b8015610da25780601f10610d7957610100808354040283529160200191610da2565b820191905f5260205f20905b815481529060010190602001808311610d8557829003601f168201915b5050505050905090565b5f610db8338484611bbd565b5060015b92915050565b5f546001600160a01b03163314610deb5760405162461bcd60e51b81526004016109cd9061306a565b801515600103610f3f576001600160a01b0382165f9081526007602052604090205460ff1615610e5d5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e0000000060448201526064016109cd565b6001600160a01b0382165f9081526001602052604090205415610eb4576001600160a01b0382165f90815260016020526040902054610e9b90611206565b6001600160a01b0383165f908152600260205260409020555b6001600160a01b038083165f818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b031916821790556016549091169003610f3b57602d54610f3b9083906001600160a01b0316611ce0565b5050565b8015155f03610f3b576001600160a01b0382165f9081526007602052604090205460ff16610faf5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e0000000060448201526064016109cd565b5f5b6008548110156110ca57826001600160a01b031660088281548110610fd857610fd8613158565b5f918252602090912001546001600160a01b0316036110b8576008805461100190600190613180565b8154811061101157611011613158565b5f91825260209091200154600880546001600160a01b03909216918390811061103c5761103c613158565b5f91825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600282526040808220829055600790925220805460ff19169055600880548061109357611093613193565b5f8281526020902081015f1990810180546001600160a01b0319169055019055505050565b806110c2816131a7565b915050610fb1565b505050565b5f6110db848484611cec565b506001600160a01b0384165f90815260056020908152604080832033808552925290912054611116918691611111908690613180565b611bbd565b5060019392505050565b5f546001600160a01b031633146111495760405162461bcd60e51b81526004016109cd9061306a565b5f818360125461115991906131bf565b61116391906131d6565b90506103e860125461117591906131d6565b8110156111df5760405162461bcd60e51b815260206004820152603260248201527f4d61782057616c6c657420616d74206d7573742062652061626f766520302e31604482015271129037b3103a37ba30b61039bab838363c9760711b60648201526084016109cd565b6030819055600a5482906111f49085906131bf565b6111fe91906131d6565b603155505050565b5f60135482111561126c5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016109cd565b5f611275612109565b905061128181846131d6565b9392505050565b335f8181526005602090815260408083206001600160a01b03871684529091528120549091610db89185906111119086906131f5565b5f546001600160a01b031633146112e75760405162461bcd60e51b81526004016109cd9061306a565b5f81836012546112f791906131bf565b61130191906131d6565b90506103e860125461131391906131d6565b8110156113885760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e00000000000000000060648201526084016109cd565b602e819055600a54829061139d9085906131bf565b6113a791906131d6565b602f55505050565b5f610dbc825f19610dac565b5f546001600160a01b031633146113e45760405162461bcd60e51b81526004016109cd9061306a565b6001600160a01b03919091165f908152600660205260409020805460ff1916911515919091179055565b6001600160a01b0381165f9081526007602052604081205460ff161561144957506001600160a01b03165f9081526002602052604090205490565b6001600160a01b0382165f90815260016020526040902054610dbc90611206565b5f546001600160a01b031633146114935760405162461bcd60e51b81526004016109cd9061306a565b5f80546114ab916001600160a01b03909116906113bb565b5f80546001600160a01b031916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b5f546001600160a01b0316331461150f5760405162461bcd60e51b81526004016109cd9061306a565b8015155f0361153957506001600160a01b03165f908152600360205260409020805460ff19169055565b600454156115a05762093a80600454426115539190613180565b116115a05760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f74207365742061206e657720706169722074686973207765656b2160448201526064016109cd565b6001600160a01b0382165f908152600360205260409020805460ff19166001179055426004555050565b6060600c8054610d2b90613120565b5f546001600160a01b031633146116025760405162461bcd60e51b81526004016109cd9061306a565b5f8190505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611643573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611667919061309f565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116d6919061309f565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa15801561171f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611743919061309f565b90506001600160a01b0381166118b557816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561178f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117b3919061309f565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117fe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611822919061309f565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801561186c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611890919061309f565b601680546001600160a01b0319166001600160a01b03929092169190911790556118d1565b601680546001600160a01b0319166001600160a01b0383161790555b601580546001600160a01b0319166001600160a01b0384161790556110ca30845f19611bbd565b335f8181526005602090815260408083206001600160a01b03871684529091528120549091610db8918590611111908690613180565b5f611116338484611cec565b5f546001600160a01b031633146119635760405162461bcd60e51b81526004016109cd9061306a565b602d8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906119b090831515815260200190565b60405180910390a150565b5f546001600160a01b031633146119e45760405162461bcd60e51b81526004016109cd9061306a565b6001600160a01b038116611a0a5760405162461bcd60e51b81526004016109cd90613208565b602a546001600160a01b0390811690821603611a385760405162461bcd60e51b81526004016109cd90613208565b5f8054611a50916001600160a01b03909116906113bb565b611a5b8160016113bb565b611a66816001610dc2565b5f54602c546001600160a01b03918216911603611a9957602c80546001600160a01b0319166001600160a01b0383161790555b5f54611aad906001600160a01b031661140e565b5f80546001600160a01b039081168252600560209081526040808420868416855290915282209290925580549091611ae5911661140e565b1115611b0b575f54611b09906001600160a01b031682611b048261140e565b611cec565b505b5f80546001600160a01b0319166001600160a01b0383169081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f546001600160a01b03163314611b7e5760405162461bcd60e51b81526004016109cd9061306a565b8284601254611b8d91906131bf565b611b9791906131d6565b6032556012548190611baa9084906131bf565b611bb491906131d6565b60335550505050565b6001600160a01b038316611c1f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109cd565b6001600160a01b038216611c805760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109cd565b6001600160a01b038381165f8181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b610f3b82825f19611bbd565b5f6001600160a01b038416611d515760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109cd565b6001600160a01b038316611db35760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109cd565b5f8211611e145760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016109cd565b611e1e848461212a565b156120365760345460ff16611e755760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c656421000000000000000060448201526064016109cd565b60375460ff1615611f20576001600160a01b0384165f9081526003602052604090205460ff1615611ee2576001600160a01b0383165f90815260386020526040902054439003611ec3575f80fd5b6001600160a01b0383165f908152603860205260409020439055611f20565b6001600160a01b0384165f90815260386020526040902054439003611f05575f80fd5b6001600160a01b0384165f9081526038602052604090204390555b602e54821115611f835760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016109cd565b6029546001600160a01b03848116911614801590611fb957506001600160a01b0383165f9081526003602052604090205460ff16155b156120365760305482611fcb8561140e565b611fd591906131f5565b11156120365760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201526930b63632ba29b4bd329760b11b60648201526084016109cd565b6001600160a01b0384165f9081526006602052604090205460019060ff168061207657506001600160a01b0384165f9081526006602052604090205460ff165b1561207e57505f5b6001600160a01b0384165f9081526003602052604090205460ff16156120f457602d54600160a01b900460ff161580156120c15750602d54600160a81b900460ff165b156120f4575f6120d03061140e565b905060325481106120f25760335481106120e957506033545b6120f28161222e565b505b612100858585846125a7565b95945050505050565b5f805f612114612914565b909250905061212381836131d6565b9250505090565b5f80546001600160a01b0384811691161480159061215557505f546001600160a01b03838116911614155b801561217957506001600160a01b0382165f9081526009602052604090205460ff16155b801561219d57506001600160a01b0383165f9081526009602052604090205460ff16155b80156121b75750602a546001600160a01b03838116911614155b80156121cb57506001600160a01b03821615155b80156121ef57506001600160a01b0383165f9081526006602052604090205460ff16155b801561221357506001600160a01b0382165f9081526006602052604090205460ff16155b801561128157506001600160a01b0383163014159392505050565b602d805460ff60a01b1916600160a01b17905560275460265461225191906131f5565b15612597575f600260275460265461226991906131f5565b60265461227690856131bf565b61228091906131d6565b61228a91906131d6565b90505f6122978284613180565b6040805160028082526060820183529293505f92909160208301908036833701905050905030815f815181106122cf576122cf613158565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612326573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061234a919061309f565b8160018151811061235d5761235d613158565b6001600160a01b03928316602091820292909201015260155460405163791ac94760e01b815291169063791ac947906123a29085905f90869030904290600401613265565b5f604051808303815f87803b1580156123b9575f80fd5b505af11580156123cb573d5f803e3d5ffd5b505050505f60026027546026546123e291906131f5565b6026546123ef90476131bf565b6123f991906131d6565b61240391906131d6565b905083156124d057601554602a5460405163f305d71960e01b81526001600160a01b039283169263f305d71992859261244a9230928b925f928392169042906004016130ba565b60606040518083038185885af1158015612466573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061248b91906130f5565b505060408051868152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a15b5f6124db8587613180565b111561259257600d54600f5447915f916124f590846131d6565b6124ff91906131bf565b90505f600e54600f548461251391906131d6565b61251d91906131bf565b602d546040519192506001600160a01b03169083156108fc029084905f818181858888f19350505050158015612555573d5f803e3d5ffd5b50602c546040516001600160a01b039091169082156108fc029083905f818181858888f1935050505015801561258d573d5f803e3d5ffd5b505050505b505050505b50602d805460ff60a01b19169055565b6034545f90610100900460ff1661263a576125c28585612a8e565b603454610100900460ff161580156125df57506125df858561212a565b1561263a5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c79206f776e65722063616e207472616e736665722061742074686973206044820152643a34b6b29760d91b60648201526084016109cd565b5f61264786868686612ba1565b60808101516001600160a01b0388165f9081526001602052604090205491925061267091613180565b6001600160a01b038088165f90815260016020526040808220939093556060840151918816815291909120546126a691906131f5565b6001600160a01b038087165f9081526001602090815260408083209490945591891681526007909152205460ff1680156126f857506001600160a01b0385165f9081526007602052604090205460ff16155b1561273d576001600160a01b0386165f90815260026020526040902054612720908590613180565b6001600160a01b0387165f90815260026020526040902055612874565b6001600160a01b0386165f9081526007602052604090205460ff1615801561277c57506001600160a01b0385165f9081526007602052604090205460ff165b156127c25780516001600160a01b0386165f908152600260205260409020546127a591906131f5565b6001600160a01b0386165f90815260026020526040902055612874565b6001600160a01b0386165f9081526007602052604090205460ff16801561280057506001600160a01b0385165f9081526007602052604090205460ff165b15612874576001600160a01b0386165f90815260026020526040902054612828908590613180565b6001600160a01b038088165f908152600260205260408082209390935583519188168152919091205461285b91906131f5565b6001600160a01b0386165f908152600260205260409020555b60408101511561288c5761288c868260400151612d9f565b5f8160a0015111806128a157505f8160200151115b156128b8576128b88160a001518260200151612e65565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef835f015160405161290091815260200190565b60405180910390a350600195945050505050565b6013546012545f918291825b600854811015612a5d578260015f6008848154811061294157612941613158565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205411806129a957508160025f6008848154811061298357612983613158565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054115b156129bf57601354601254945094505050509091565b60015f600883815481106129d5576129d5613158565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054612a039084613180565b925060025f60088381548110612a1b57612a1b613158565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054612a499083613180565b915080612a55816131a7565b915050612920565b50601254601354612a6e91906131d6565b821015612a85576013546012549350935050509091565b90939092509050565b603454610100900460ff1615612af25760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201526232b21760e91b60648201526084016109cd565b612afc828261212a565b158015612b1657506016546001600160a01b038281169116145b15610f3b576001600160a01b0382165f9081526009602052604090819020805460ff191660019081179091556034805461ff00191661010017905542603655602d805460ff60a81b1916905590517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15991612b9591901515815260200190565b60405180910390a15050565b612bd46040518060c001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b612c076040518060c001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b5f612c10612109565b90505f612c236509184e72a000476131d6565b9050612c2f82876131bf565b60808401528415612d48576001600160a01b0387165f9081526003602052604090205460ff1615612c7c57601d54601755601e54601855601f54612c74908290613180565b601955612cc6565b6001600160a01b0388165f9081526003602052604090205460ff1615612cb357601a54601755601b54601855601c54601955612cc6565b6020546017556021546018556022546019555b602854601754612cd690886131bf565b612ce091906131d6565b6020840152602854601954601854612cf891906131f5565b612d0290886131bf565b612d0c91906131d6565b604084018190526020840151612d2291906131f5565b612d2c9087613180565b83526020830151612d3e9083906131bf565b60a0840152612d60565b5f602084018190526040840181905286845260a08401525b818360400151612d7091906131bf565b8360a00151612d7f91906131f5565b8360800151612d8e9190613180565b606084015250909695505050505050565b5f612da8612109565b90505f612db582846131bf565b305f90815260016020526040902054909150612dd29082906131f5565b305f9081526001602090815260408083209390935560079052205460ff1615612e1f57305f90815260026020526040902054612e0f9084906131f5565b305f908152600260205260409020555b60405183815230906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b81601354612e739190613180565b601355601454612e849082906131f5565b6014555050565b5f6020808352835180828501525f5b81811015612eb657858101830151858201604001528201612e9a565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610d19575f80fd5b5f8060408385031215612efb575f80fd5b8235612f0681612ed6565b946020939093013593505050565b80358015158114612f23575f80fd5b919050565b5f8060408385031215612f39575f80fd5b8235612f4481612ed6565b9150612f5260208401612f14565b90509250929050565b5f805f60608486031215612f6d575f80fd5b8335612f7881612ed6565b92506020840135612f8881612ed6565b929592945050506040919091013590565b5f8060408385031215612faa575f80fd5b50508035926020909101359150565b5f60208284031215612fc9575f80fd5b5035919050565b5f60208284031215612fe0575f80fd5b813561128181612ed6565b5f60208284031215612ffb575f80fd5b61128182612f14565b5f8060408385031215613015575f80fd5b823561302081612ed6565b9150602083013561303081612ed6565b809150509250929050565b5f805f806080858703121561304e575f80fd5b5050823594602084013594506040840135936060013592509050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f602082840312156130af575f80fd5b815161128181612ed6565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b5f805f60608486031215613107575f80fd5b8351925060208401519150604084015190509250925092565b600181811c9082168061313457607f821691505b60208210810361315257634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115610dbc57610dbc61316c565b634e487b7160e01b5f52603160045260245ffd5b5f600182016131b8576131b861316c565b5060010190565b8082028115828204841417610dbc57610dbc61316c565b5f826131f057634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610dbc57610dbc61316c565b6020808252603d908201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660408201527f6572206f776e657220746f20746865207a65726f20616464726573732e000000606082015260800190565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156132b35784516001600160a01b03168352938301939183019160010161328e565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220c3f440b76384dc3fcb66513e89558c90005e02f528f81a8f9bb22cb214400a6664736f6c63430008140033

Deployed Bytecode Sourcemap

8333:25054:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13216:777;;;;;;;;;;;;;:::i;:::-;;10401:64;;;;;;;;;;-1:-1:-1;10401:64:0;;;;-1:-1:-1;;;;;10401:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;10401:64:0;;;;;;;;21363:108;;;;;;;;;;;;;:::i;16234:71::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9430:35::-;;;;;;;;;;-1:-1:-1;9430:35:0;;;;-1:-1:-1;;;;;9430:35:0;;;16910:161;;;;;;;;;;-1:-1:-1;16910:161:0;;;;;:::i;:::-;;:::i;:::-;;;1630:14:1;;1623:22;1605:41;;1593:2;1578:18;16910:161:0;1465:187:1;9066:27:0;;;;;;;;;;;;;;;;;;;1803:25:1;;;1791:2;1776:18;9066:27:0;1657:177:1;24358:87:0;;;;;;;;;;-1:-1:-1;24427:10:0;;24358:87;;23356:994;;;;;;;;;;-1:-1:-1;23356:994:0;;;;;:::i;:::-;;:::i;9502:30::-;;;;;;;;;;;;;;;;9100:31;;;;;;;;;;;;;;;;15987:83;;;;;;;;;;-1:-1:-1;16060:7:0;;15987:83;;9578:34;;;;;;;;;;;;;;;;17207:266;;;;;;;;;;-1:-1:-1;17207:266:0;;;;;:::i;:::-;;:::i;21827:340::-;;;;;;;;;;-1:-1:-1;21827:340:0;;;;;:::i;:::-;;:::i;24865:250::-;;;;;;;;;;-1:-1:-1;24865:250:0;;;;;:::i;:::-;;:::i;16076:71::-;;;;;;;;;;-1:-1:-1;16135:9:0;;16076:71;;16135:9;;;;3365:36:1;;3353:2;3338:18;16076:71:0;3223:184:1;10208:34:0;;;;;;;;;;;;;;;;17481:215;;;;;;;;;;-1:-1:-1;17481:215:0;;;;;:::i;:::-;;:::i;21479:340::-;;;;;;;;;;-1:-1:-1;21479:340:0;;;;;:::i;:::-;;:::i;9472:21::-;;;;;;;;;;-1:-1:-1;9472:21:0;;;;-1:-1:-1;;;;;9472:21:0;;;9928:38;;;;;;;;;;;;;;;;10766:41;;;;;;;;;;-1:-1:-1;10766:41:0;;;;-1:-1:-1;;;10766:41:0;;;;;;10249:37;;;;;;;;;;;;;;;;11460:36;;;;;;;;;;-1:-1:-1;11460:36:0;;;;;;;;;;;19408:123;;;;;;;;;;-1:-1:-1;19408:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;19496:27:0;19472:4;19496:27;;;:18;:27;;;;;;;;;19408:123;17079:120;;;;;;;;;;-1:-1:-1;17079:120:0;;;;;:::i;:::-;;:::i;10472:64::-;;;;;;;;;;-1:-1:-1;10472:64:0;;;;-1:-1:-1;;;;;10472:64:0;;;10882:59;;;;;;;;;;;;;;;;23072:132;;;;;;;;;;-1:-1:-1;23072:132:0;;;;;:::i;:::-;;:::i;9539:32::-;;;;;;;;;;;;;;;;10020:40;;;;;;;;;;;;;;;;16529:198;;;;;;;;;;-1:-1:-1;16529:198:0;;;;;:::i;:::-;;:::i;15440:194::-;;;;;;;;;;;;;:::i;9029:30::-;;;;;;;;;;;;;;;;18848:424;;;;;;;;;;-1:-1:-1;18848:424:0;;;;;:::i;:::-;;:::i;9828:36::-;;;;;;;;;;;;;;;;19280:120;;;;;;;;;;-1:-1:-1;19280:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;19372:20:0;19348:4;19372:20;;;:11;:20;;;;;;;;;19280:120;16311:71;;;;;;;;;;-1:-1:-1;16354:7:0;14611:6;-1:-1:-1;;;;;14611:6:0;16311:71;;16153:75;;;;;;;;;;;;;:::i;18284:556::-;;;;;;;;;;-1:-1:-1;18284:556:0;;;;;:::i;:::-;;:::i;17704:225::-;;;;;;;;;;-1:-1:-1;17704:225:0;;;;;:::i;:::-;;:::i;16735:167::-;;;;;;;;;;-1:-1:-1;16735:167:0;;;;;:::i;:::-;;:::i;9787:34::-;;;;;;;;;;;;;;;;22893:171;;;;;;;;;;-1:-1:-1;22893:171:0;;;;;:::i;:::-;;:::i;9731:47::-;;;;;;;;;;;;;;;;9871:38;;;;;;;;;;;;;;;;9627:43;;;;;;;;;;;;;;;;10363:29;;;;;;;;;;-1:-1:-1;10363:29:0;;;;-1:-1:-1;;;;;10363:29:0;;;9677:47;;;;;;;;;;;;;;;;16388:133;;;;;;;;;;-1:-1:-1;16388:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;16490:19:0;;;16472:7;16490:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;16388:133;9973:40;;;;;;;;;;;;;;;;14633:799;;;;;;;;;;-1:-1:-1;14633:799:0;;;;;:::i;:::-;;:::i;11024:61::-;;;;;;;;;;;;;;;;22175:289;;;;;;;;;;-1:-1:-1;22175:289:0;;;;;:::i;:::-;;:::i;13216:777::-;12270:6;;-1:-1:-1;;;;;12270:6:0;3309:10;12270:22;12262:67;;;;-1:-1:-1;;;12262:67:0;;;;;;;:::i;:::-;;;;;;;;;13278:19:::1;::::0;::::1;;13277:20;13269:29;;;::::0;::::1;;13336:9;;;;;;;;;-1:-1:-1::0;;;;;13336:9:0::1;-1:-1:-1::0;;;;;13336:17:0::1;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;13318:49:0::1;;13368:9;;;;;;;;;-1:-1:-1::0;;;;;13368:9:0::1;-1:-1:-1::0;;;;;13368:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13318:82;::::0;-1:-1:-1;;;;;;13318:82:0::1;::::0;;;;;;-1:-1:-1;;;;;5479:15:1;;;13318:82:0::1;::::0;::::1;5461:34:1::0;13394:4:0::1;5511:18:1::0;;;5504:43;5396:18;;13318:82:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13309:6;:91:::0;;-1:-1:-1;;;;;;13309:91:0::1;-1:-1:-1::0;;;;;13309:91:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;13411:15:0;;;:7:::1;:15;::::0;;;;:22;;-1:-1:-1;;13411:22:0::1;-1:-1:-1::0;13411:22:0::1;::::0;;13454:14:::1;::::0;13446:42:::1;::::0;13454:14:::1;-1:-1:-1::0;;13446:7:0::1;:42::i;:::-;-1:-1:-1::0;13499:19:0::1;:26:::0;;-1:-1:-1;;13499:26:0::1;13521:4;13499:26;::::0;;13536:9:::1;::::0;-1:-1:-1;;;;;13536:9:0::1;:25;13569:21;13614:4;13634:24;13614:4:::0;13634:9:::1;:24::i;:::-;13673:1;13690::::0;13707:7:::1;14584::::0;14611:6;-1:-1:-1;;;;;14611:6:0;;14546:79;13707:7:::1;13729:15;13536:219;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;13777:12:0::1;13766:8;:23:::0;-1:-1:-1;13811:14:0::1;::::0;::::1;;13810:15;13802:52;;;::::0;-1:-1:-1;;;13802:52:0;;6683:2:1;13802:52:0::1;::::0;::::1;6665:21:1::0;6722:2;6702:18;;;6695:30;6761:26;6741:18;;;6734:54;6805:18;;13802:52:0::1;6481:348:1::0;13802:52:0::1;13865:42;13895:4;13902;13865:21;:42::i;:::-;13940:6;::::0;13918:35:::1;::::0;-1:-1:-1;;;;;13940:6:0::1;::::0;13918:21:::1;:35::i;:::-;13964:14;:21:::0;;-1:-1:-1;;13964:21:0::1;13981:4;13964:21;::::0;;13216:777::o;21363:108::-;12270:6;;-1:-1:-1;;;;;12270:6:0;3309:10;12270:22;12262:67;;;;-1:-1:-1;;;12262:67:0;;;;;;;:::i;:::-;14584:7;14611:6;;21415:48:::1;::::0;-1:-1:-1;;;;;14611:6:0;;;;21441:21:::1;21415:48:::0;::::1;;;::::0;21441:21;;21415:48;14584:7;21415:48;21441:21;14611:6;21415:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;21363:108::o:0;16234:71::-;16273:13;16297:5;16290:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16234:71;:::o;16910:161::-;16985:4;17002:39;3309:10;17025:7;17034:6;17002:8;:39::i;:::-;-1:-1:-1;17059:4:0;16910:161;;;;;:::o;23356:994::-;12270:6;;-1:-1:-1;;;;;12270:6:0;3309:10;12270:22;12262:67;;;;-1:-1:-1;;;12262:67:0;;;;;;;:::i;:::-;23450:15;::::1;;23461:4;23450:15:::0;23446:897:::1;;-1:-1:-1::0;;;;;23491:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;23490:21;23482:62;;;::::0;-1:-1:-1;;;23482:62:0;;7421:2:1;23482:62:0::1;::::0;::::1;7403:21:1::0;7460:2;7440:18;;;7433:30;7499;7479:18;;;7472:58;7547:18;;23482:62:0::1;7219:352:1::0;23482:62:0::1;-1:-1:-1::0;;;;;23562:16:0;::::1;23581:1;23562:16:::0;;;:7:::1;:16;::::0;;;;;:20;23559:116:::1;;-1:-1:-1::0;;;;;23642:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;23622:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;23603:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;23559:116:::1;-1:-1:-1::0;;;;;23689:20:0;;::::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;23689:27:0::1;23712:4;23689:27:::0;;::::1;::::0;;;23731:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;23731:23:0::1;::::0;::::1;::::0;;23784:6:::1;::::0;;;::::1;23773:17:::0;;23769:73:::1;;23828:13;::::0;23792:50:::1;::::0;23819:7;;-1:-1:-1;;;;;23828:13:0::1;23792:26;:50::i;:::-;23356:994:::0;;:::o;23446:897::-:1;23864:16:::0;::::1;;23875:5;23864:16:::0;23860:483:::1;;-1:-1:-1::0;;;;;23905:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;23897:61;;;::::0;-1:-1:-1;;;23897:61:0;;7778:2:1;23897:61:0::1;::::0;::::1;7760:21:1::0;7817:2;7797:18;;;7790:30;7856;7836:18;;;7829:58;7904:18;;23897:61:0::1;7576:352:1::0;23897:61:0::1;23978:9;23973:359;23997:9;:16:::0;23993:20;::::1;23973:359;;;24059:7;-1:-1:-1::0;;;;;24043:23:0::1;:9;24053:1;24043:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;24043:12:0::1;:23:::0;24039:278:::1;;24106:9;24116:16:::0;;:20:::1;::::0;24135:1:::1;::::0;24116:20:::1;:::i;:::-;24106:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;24091:9:::1;:12:::0;;-1:-1:-1;;;;;24106:31:0;;::::1;::::0;24101:1;;24091:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;24091:46:0::1;-1:-1:-1::0;;;;;24091:46:0;;::::1;;::::0;;24160:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;24203:11:::1;:20:::0;;;;:28;;-1:-1:-1;;24203:28:0::1;::::0;;24254:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;24254:15:0;;;;;-1:-1:-1;;;;;;24254:15:0::1;::::0;;;;;23973:359:::1;23356:994:::0;;:::o;24039:278::-:1;24015:3:::0;::::1;::::0;::::1;:::i;:::-;;;;23973:359;;;;23356:994:::0;;:::o;17207:266::-;17305:4;17322:36;17332:6;17340:9;17351:6;17322:9;:36::i;:::-;-1:-1:-1;;;;;;17400:19:0;;;;;;:11;:19;;;;;;;;3309:10;17400:33;;;;;;;;;17369:74;;17378:6;;17400:42;;17436:6;;17400:42;:::i;:::-;17369:8;:74::i;:::-;-1:-1:-1;17461:4:0;17207:266;;;;;:::o;21827:340::-;12270:6;;-1:-1:-1;;;;;12270:6:0;3309:10;12270:22;12262:67;;;;-1:-1:-1;;;12262:67:0;;;;;;;:::i;:::-;21917:13:::1;21955:7;21944;21934;;:17;;;;:::i;:::-;21933:29;;;;:::i;:::-;21917:45;;22001:4;21991:7;;:14;;;;:::i;:::-;21981:5;:25;;21973:88;;;::::0;-1:-1:-1;;;21973:88:0;;9199:2:1;21973:88:0::1;::::0;::::1;9181:21:1::0;9238:2;9218:18;;;9211:30;9277:34;9257:18;;;9250:62;-1:-1:-1;;;9328:18:1;;;9321:48;9386:19;;21973:88:0::1;8997:414:1::0;21973:88:0::1;22072:14;:22:::0;;;22124:14:::1;::::0;22152:7;;22124:24:::1;::::0;22141:7;;22124:24:::1;:::i;:::-;22123:36;;;;:::i;:::-;22105:15;:54:::0;-1:-1:-1;;;21827:340:0:o;24865:250::-;24931:7;24970;;24959;:18;;24951:73;;;;-1:-1:-1;;;24951:73:0;;9618:2:1;24951:73:0;;;9600:21:1;9657:2;9637:18;;;9630:30;9696:34;9676:18;;;9669:62;-1:-1:-1;;;9747:18:1;;;9740:40;9797:19;;24951:73:0;9416:406:1;24951:73:0;25035:19;25058:10;:8;:10::i;:::-;25035:33;-1:-1:-1;25086:21:0;25035:33;25086:7;:21;:::i;:::-;25079:28;24865:250;-1:-1:-1;;;24865:250:0:o;17481:215::-;3309:10;17569:4;17618:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;17618:34:0;;;;;;;;;;17569:4;;17586:80;;17609:7;;17618:47;;17655:10;;17618:47;:::i;21479:340::-;12270:6;;-1:-1:-1;;;;;12270:6:0;3309:10;12270:22;12262:67;;;;-1:-1:-1;;;12262:67:0;;;;;;;:::i;:::-;21568:13:::1;21606:7;21595;21585;;:17;;;;:::i;:::-;21584:29;;;;:::i;:::-;21568:45;;21652:4;21642:7;;:14;;;;:::i;:::-;21632:5;:25;;21624:93;;;::::0;-1:-1:-1;;;21624:93:0;;10159:2:1;21624:93:0::1;::::0;::::1;10141:21:1::0;10198:2;10178:18;;;10171:30;10237:34;10217:18;;;10210:62;10308:25;10288:18;;;10281:53;10351:19;;21624:93:0::1;9957:419:1::0;21624:93:0::1;21728:12;:20:::0;;;21776:14:::1;::::0;21804:7;;21776:24:::1;::::0;21793:7;;21776:24:::1;:::i;:::-;21775:36;;;;:::i;:::-;21759:13;:52:::0;-1:-1:-1;;;21479:340:0:o;17079:120::-;17132:4;17156:35;17164:7;-1:-1:-1;;17156:7:0;:35::i;23072:132::-;12270:6;;-1:-1:-1;;;;;12270:6:0;3309:10;12270:22;12262:67;;;;-1:-1:-1;;;12262:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23159:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:37;;-1:-1:-1;;23159:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23072:132::o;16529:198::-;-1:-1:-1;;;;;16619:20:0;;16595:7;16619:20;;;:11;:20;;;;;;;;16615:49;;;-1:-1:-1;;;;;;16648:16:0;;;;;:7;:16;;;;;;;16529:198::o;16615:49::-;-1:-1:-1;;;;;16702:16:0;;;;;;:7;:16;;;;;;16682:37;;:19;:37::i;15440:194::-;12270:6;;-1:-1:-1;;;;;12270:6:0;3309:10;12270:22;12262:67;;;;-1:-1:-1;;;12262:67:0;;;;;;;:::i;:::-;15526:6:::1;::::0;;15507:33:::1;::::0;-1:-1:-1;;;;;15526:6:0;;::::1;::::0;15507:18:::1;:33::i;:::-;15568:1;15551:19:::0;;-1:-1:-1;;;;;;15551:19:0::1;::::0;;15586:40:::1;::::0;15568:1;;15586:40:::1;::::0;15568:1;;15586:40:::1;15440:194::o:0;18848:424::-;12270:6;;-1:-1:-1;;;;;12270:6:0;3309:10;12270:22;12262:67;;;;-1:-1:-1;;;12262:67:0;;;;;;;:::i;:::-;18929:16;::::1;;18940:5;18929:16:::0;18925:340:::1;;-1:-1:-1::0;;;;;;18962:13:0::1;18978:5;18962:13:::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;18962:21:0::1;::::0;;23356:994::o;18925:340::-:1;19020:17;::::0;:22;19016:153:::1;;19109:7;19089:17;;19071:15;:35;;;;:::i;:::-;:45;19063:90;;;::::0;-1:-1:-1;;;19063:90:0;;10583:2:1;19063:90:0::1;::::0;::::1;10565:21:1::0;;;10602:18;;;10595:30;10661:34;10641:18;;;10634:62;10713:18;;19063:90:0::1;10381:356:1::0;19063:90:0::1;-1:-1:-1::0;;;;;19183:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;:20;;-1:-1:-1;;19183:20:0::1;19199:4;19183:20;::::0;;19238:15:::1;19218:17;:35:::0;18848:424;;:::o;16153:75::-;16194:13;16218:7;16211:14;;;;;:::i;18284:556::-;12270:6;;-1:-1:-1;;;;;12270:6:0;3309:10;12270:22;12262:67;;;;-1:-1:-1;;;12262:67:0;;;;;;;:::i;:::-;18360:29:::1;18411:9;18360:61;;18432:16;18469:10;-1:-1:-1::0;;;;;18469:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;18451:47:0::1;;18507:4;18514:10;-1:-1:-1::0;;;;;18514:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18451:81;::::0;-1:-1:-1;;;;;;18451:81:0::1;::::0;;;;;;-1:-1:-1;;;;;5479:15:1;;;18451:81:0::1;::::0;::::1;5461:34:1::0;5531:15;;5511:18;;;5504:43;5396:18;;18451:81:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18432:100:::0;-1:-1:-1;;;;;;18547:22:0;::::1;18543:207;;18613:10;-1:-1:-1::0;;;;;18613:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;18595:50:0::1;;18654:4;18661:10;-1:-1:-1::0;;;;;18661:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18595:84;::::0;-1:-1:-1;;;;;;18595:84:0::1;::::0;;;;;;-1:-1:-1;;;;;5479:15:1;;;18595:84:0::1;::::0;::::1;5461:34:1::0;5531:15;;5511:18;;;5504:43;5396:18;;18595:84:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18586:6;:93:::0;;-1:-1:-1;;;;;;18586:93:0::1;-1:-1:-1::0;;;;;18586:93:0;;;::::1;::::0;;;::::1;::::0;;18543:207:::1;;;18721:6;:17:::0;;-1:-1:-1;;;;;;18721:17:0::1;-1:-1:-1::0;;;;;18721:17:0;::::1;;::::0;;18543:207:::1;18760:9;:22:::0;;-1:-1:-1;;;;;;18760:22:0::1;-1:-1:-1::0;;;;;18760:22:0;::::1;;::::0;;18793:39:::1;18810:4;18817:9:::0;-1:-1:-1;;18793:8:0::1;:39::i;17704:225::-:0;3309:10;17797:4;17846:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;17846:34:0;;;;;;;;;;17797:4;;17814:85;;17837:7;;17846:52;;17883:15;;17846:52;:::i;16735:167::-;16813:4;16830:42;3309:10;16854:9;16865:6;16830:9;:42::i;22893:171::-;12270:6;;-1:-1:-1;;;;;12270:6:0;3309:10;12270:22;12262:67;;;;-1:-1:-1;;;12262:67:0;;;;;;;:::i;:::-;22970:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;22970:32:0::1;-1:-1:-1::0;;;;22970:32:0;;::::1;;::::0;;23018:38:::1;::::0;::::1;::::0;::::1;::::0;22994:8;1630:14:1;1623:22;1605:41;;1593:2;1578:18;;1465:187;23018:38:0::1;;;;;;;;22893:171:::0;:::o;14633:799::-;12270:6;;-1:-1:-1;;;;;12270:6:0;3309:10;12270:22;12262:67;;;;-1:-1:-1;;;12262:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14718:22:0;::::1;14710:96;;;;-1:-1:-1::0;;;14710:96:0::1;;;;;;;:::i;:::-;14837:4;::::0;-1:-1:-1;;;;;14837:4:0;;::::1;14825:16:::0;;::::1;::::0;14817:90:::1;;;;-1:-1:-1::0;;;14817:90:0::1;;;;;;;:::i;:::-;14937:6;::::0;;14918:33:::1;::::0;-1:-1:-1;;;;;14937:6:0;;::::1;::::0;14918:18:::1;:33::i;:::-;14962:34;14981:8;14991:4;14962:18;:34::i;:::-;15007:37;15029:8;15039:4;15007:21;:37::i;:::-;15091:6;::::0;15069:10:::1;::::0;-1:-1:-1;;;;;15091:6:0;;::::1;15069:10:::0;::::1;:29:::0;15065:78:::1;;15113:10;:30:::0;;-1:-1:-1;;;;;;15113:30:0::1;-1:-1:-1::0;;;;;15113:30:0;::::1;;::::0;;15065:78:::1;15206:6;::::0;15196:17:::1;::::0;-1:-1:-1;;;;;15206:6:0::1;15196:9;:17::i;:::-;15164:19;15176:6:::0;;-1:-1:-1;;;;;15176:6:0;;::::1;15164:19:::0;;:11:::1;:19;::::0;;;;;;;:29;;::::1;::::0;;;;;;;:49;;;;15237:6;;15164:19;;15227:17:::1;::::0;15237:6:::1;15227:9;:17::i;:::-;:21;15224:99;;;15275:6;::::0;15265:46:::1;::::0;-1:-1:-1;;;;;15275:6:0::1;15283:8:::0;15293:17:::1;15275:6:::0;15293:9:::1;:17::i;:::-;15265:9;:46::i;:::-;;15224:99;15343:6;:17:::0;;-1:-1:-1;;;;;;15343:17:0::1;-1:-1:-1::0;;;;;15343:17:0;::::1;::::0;;::::1;::::0;;15376:38:::1;::::0;15343:17;;;;15376:38:::1;::::0;15343:6;15376:38:::1;14633:799:::0;:::o;22175:289::-;12270:6;;-1:-1:-1;;;;;12270:6:0;3309:10;12270:22;12262:67;;;;-1:-1:-1;;;12262:67:0;;;;;;;:::i;:::-;22375:16:::1;22355;22345:7;;:26;;;;:::i;:::-;22344:47;;;;:::i;:::-;22328:13;:63:::0;22416:7:::1;::::0;22443:13;;22416:23:::1;::::0;22426:13;;22416:23:::1;:::i;:::-;22415:41;;;;:::i;:::-;22402:10;:54:::0;-1:-1:-1;;;;22175:289:0:o;25127:342::-;-1:-1:-1;;;;;25222:20:0;;25214:69;;;;-1:-1:-1;;;25214:69:0;;11374:2:1;25214:69:0;;;11356:21:1;11413:2;11393:18;;;11386:30;11452:34;11432:18;;;11425:62;-1:-1:-1;;;11503:18:1;;;11496:34;11547:19;;25214:69:0;11172:400:1;25214:69:0;-1:-1:-1;;;;;25302:21:0;;25294:68;;;;-1:-1:-1;;;25294:68:0;;11779:2:1;25294:68:0;;;11761:21:1;11818:2;11798:18;;;11791:30;11857:34;11837:18;;;11830:62;-1:-1:-1;;;11908:18:1;;;11901:32;11950:19;;25294:68:0;11577:398:1;25294:68:0;-1:-1:-1;;;;;25375:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;25428:33;;1803:25:1;;;25428:33:0;;1776:18:1;25428:33:0;;;;;;;25127:342;;;:::o;23212:136::-;23298:42;23307:7;23316:4;-1:-1:-1;;23298:8:0;:42::i;25477:1776::-;25556:4;-1:-1:-1;;;;;25581:18:0;;25573:68;;;;-1:-1:-1;;;25573:68:0;;12182:2:1;25573:68:0;;;12164:21:1;12221:2;12201:18;;;12194:30;12260:34;12240:18;;;12233:62;-1:-1:-1;;;12311:18:1;;;12304:35;12356:19;;25573:68:0;11980:401:1;25573:68:0;-1:-1:-1;;;;;25660:16:0;;25652:64;;;;-1:-1:-1;;;25652:64:0;;12588:2:1;25652:64:0;;;12570:21:1;12627:2;12607:18;;;12600:30;12666:34;12646:18;;;12639:62;-1:-1:-1;;;12717:18:1;;;12710:33;12760:19;;25652:64:0;12386:399:1;25652:64:0;25744:1;25735:6;:10;25727:64;;;;-1:-1:-1;;;25727:64:0;;12992:2:1;25727:64:0;;;12974:21:1;13031:2;13011:18;;;13004:30;13070:34;13050:18;;;13043:62;-1:-1:-1;;;13121:18:1;;;13114:39;13170:19;;25727:64:0;12790:405:1;25727:64:0;25805:20;25816:4;25822:2;25805:10;:20::i;:::-;25802:776;;;25846:14;;;;25842:89;;25881:34;;-1:-1:-1;;;25881:34:0;;13402:2:1;25881:34:0;;;13384:21:1;13441:2;13421:18;;;13414:30;13480:26;13460:18;;;13453:54;13524:18;;25881:34:0;13200:348:1;25842:89:0;25949:15;;;;25945:347;;;-1:-1:-1;;;;;25989:13:0;;;;;;:7;:13;;;;;;;;25985:292;;;-1:-1:-1;;;;;26034:13:0;;;;;;:9;:13;;;;;;26051:12;26034:29;;26026:38;;;;;;-1:-1:-1;;;;;26087:13:0;;;;;;:9;:13;;;;;26103:12;26087:28;;25985:292;;;-1:-1:-1;;;;;26172:15:0;;;;;;:9;:15;;;;;;26191:12;26172:31;;26164:40;;;;;;-1:-1:-1;;;;;26227:15:0;;;;;;:9;:15;;;;;26245:12;26227:30;;25985:292;26324:12;;26314:6;:22;;26306:75;;;;-1:-1:-1;;;26306:75:0;;13755:2:1;26306:75:0;;;13737:21:1;13794:2;13774:18;;;13767:30;13833:34;13813:18;;;13806:62;-1:-1:-1;;;13884:18:1;;;13877:38;13932:19;;26306:75:0;13553:404:1;26306:75:0;26405:14;;-1:-1:-1;;;;;26399:20:0;;;26405:14;;26399:20;;;;:36;;-1:-1:-1;;;;;;26424:11:0;;;;;;:7;:11;;;;;;;;26423:12;26399:36;26396:171;;;26490:14;;26480:6;26464:13;26474:2;26464:9;:13::i;:::-;:22;;;;:::i;:::-;:40;;26456:95;;;;-1:-1:-1;;;26456:95:0;;14164:2:1;26456:95:0;;;14146:21:1;14203:2;14183:18;;;14176:30;14242:34;14222:18;;;14215:62;-1:-1:-1;;;14293:18:1;;;14286:40;14343:19;;26456:95:0;13962:406:1;26456:95:0;-1:-1:-1;;;;;26621:24:0;;26588:12;26621:24;;;:18;:24;;;;;;26603:4;;26621:24;;;:50;;-1:-1:-1;;;;;;26649:22:0;;;;;;:18;:22;;;;;;;;26621:50;26618:96;;;-1:-1:-1;26697:5:0;26618:96;-1:-1:-1;;;;;26730:11:0;;;;;;:7;:11;;;;;;;;26726:457;;;26763:16;;-1:-1:-1;;;26763:16:0;;;;26762:17;:59;;;;-1:-1:-1;26800:21:0;;-1:-1:-1;;;26800:21:0;;;;26762:59;26758:408;;;26856:28;26887:24;26905:4;26887:9;:24::i;:::-;26856:55;;26958:13;;26934:20;:37;26930:221;;27023:10;;26999:20;:34;26996:77;;-1:-1:-1;27060:10:0;;26996:77;27095:36;27110:20;27095:14;:36::i;:::-;26837:329;26758:408;27201:44;27219:4;27225:2;27229:6;27237:7;27201:17;:44::i;:::-;27194:51;25477:1776;-1:-1:-1;;;;;25477:1776:0:o;29262:161::-;29304:7;29325:15;29342;29361:19;:17;:19::i;:::-;29324:56;;-1:-1:-1;29324:56:0;-1:-1:-1;29398:17:0;29324:56;;29398:17;:::i;:::-;29391:24;;;;29262:161;:::o;24453:404::-;24522:4;14611:6;;-1:-1:-1;;;;;24546:15:0;;;14611:6;;24546:15;;;;:45;;-1:-1:-1;14584:7:0;14611:6;-1:-1:-1;;;;;24578:13:0;;;14611:6;;24578:13;;24546:45;:84;;;;-1:-1:-1;;;;;;24609:21:0;;;;;;:17;:21;;;;;;;;24608:22;24546:84;:125;;;;-1:-1:-1;;;;;;24648:23:0;;;;;;:17;:23;;;;;;;;24647:24;24546:125;:152;;;;-1:-1:-1;24694:4:0;;-1:-1:-1;;;;;24688:10:0;;;24694:4;;24688:10;;24546:152;:185;;;;-1:-1:-1;;;;;;24715:16:0;;;;24546:185;:226;;;;-1:-1:-1;;;;;;19496:27:0;;19472:4;19496:27;;;:18;:27;;;;;;;;24748:24;24546:226;:265;;;;-1:-1:-1;;;;;;19496:27:0;;19472:4;19496:27;;;:18;:27;;;;;;;;24789:22;24546:265;:303;;;;-1:-1:-1;;;;;;24828:21:0;;24844:4;24828:21;;24539:310;24453:404;-1:-1:-1;;;24453:404:0:o;27261:1541::-;12144:16;:23;;-1:-1:-1;;;;12144:23:0;-1:-1:-1;;;12144:23:0;;;27369:15:::1;::::0;27351::::1;::::0;:33:::1;::::0;27369:15;27351:33:::1;:::i;:::-;27347:64:::0;27404:7:::1;27347:64;27421:17;27524:1;27504:15;;27486;;:33;;;;:::i;:::-;27466:15;::::0;27443:38:::1;::::0;:20;:38:::1;:::i;:::-;27442:78;;;;:::i;:::-;27441:84;;;;:::i;:::-;27421:104:::0;-1:-1:-1;27538:20:0::1;27561:32;27421:104:::0;27561:20;:32:::1;:::i;:::-;27630:16;::::0;;27644:1:::1;27630:16:::0;;;;;::::1;::::0;;27538:55;;-1:-1:-1;27606:21:0::1;::::0;27630:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;27630:16:0::1;27606:40;;27675:4;27657;27662:1;27657:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27657:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;27701:9:::1;::::0;:16:::1;::::0;;-1:-1:-1;;;27701:16:0;;;;:9;;;::::1;::::0;:14:::1;::::0;:16:::1;::::0;;::::1;::::0;27657:7;;27701:16;;;;;:9;:16:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27691:4;27696:1;27691:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27691:26:0;;::::1;:7;::::0;;::::1;::::0;;;;;:26;27730:9:::1;::::0;:191:::1;::::0;-1:-1:-1;;;27730:191:0;;:9;::::1;::::0;:60:::1;::::0;:191:::1;::::0;27805:12;;27730:9:::1;::::0;27848:4;;27875::::1;::::0;27895:15:::1;::::0;27730:191:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27936:24;28047:1;28027:15;;28009;;:33;;;;:::i;:::-;27989:15;::::0;27965:39:::1;::::0;:21:::1;:39;:::i;:::-;27964:79;;;;:::i;:::-;27963:85;;;;:::i;:::-;27936:112:::0;-1:-1:-1;28065:13:0;;28061:344:::1;;28095:9;::::0;28266:4:::1;::::0;28095:224:::1;::::0;-1:-1:-1;;;28095:224:0;;-1:-1:-1;;;;;28095:9:0;;::::1;::::0;:25:::1;::::0;28128:16;;28095:224:::1;::::0;28172:4:::1;::::0;28196:9;;28095::::1;::::0;;;28266:4:::1;::::0;28289:15:::1;::::0;28095:224:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;28339:54:0::1;::::0;;15692:25:1;;;15748:2;15733:18;;15726:34;;;15776:18;;;15769:34;;;28339:54:0::1;::::0;-1:-1:-1;15680:2:1;15665:18;28339:54:0::1;;;;;;;28061:344;28454:1;28419:32;28442:9:::0;28419:20;:32:::1;:::i;:::-;:36;28415:380;;;28586:11;::::0;28571:12:::1;::::0;28499:21:::1;::::0;28474::::1;::::0;28556:28:::1;::::0;28499:21;28556:28:::1;:::i;:::-;:42;;;;:::i;:::-;28536:62;;28613:19;28665:8;;28650:12;;28635:13;:28;;;;:::i;:::-;:39;;;;:::i;:::-;28689:13;::::0;:33:::1;::::0;28613:61;;-1:-1:-1;;;;;;28689:13:0::1;::::0;:33;::::1;;;::::0;28712:9;;28689:13:::1;:33:::0;:13;:33;28712:9;28689:13;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;28737:10:0::1;::::0;:32:::1;::::0;-1:-1:-1;;;;;28737:10:0;;::::1;::::0;:32;::::1;;;::::0;28757:11;;28737:10:::1;:32:::0;:10;:32;28757:11;28737:10;:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;28457:338;;;28415:380;27336:1466;;;;12178:1;-1:-1:-1::0;12190:16:0;:24;;-1:-1:-1;;;;12190:24:0;;;27261:1541::o;30578:1258::-;30702:16;;30680:4;;30702:16;;;;;30697:221;;30735:28;30754:4;30760:2;30735:18;:28::i;:::-;30783:16;;;;;;;30782:17;:41;;;;;30803:20;30814:4;30820:2;30803:10;:20::i;:::-;30778:129;;;30844:47;;-1:-1:-1;;;30844:47:0;;16016:2:1;30844:47:0;;;15998:21:1;16055:2;16035:18;;;16028:30;16094:34;16074:18;;;16067:62;-1:-1:-1;;;16145:18:1;;;16138:35;16190:19;;30844:47:0;15814:401:1;30778:129:0;30938:25;30966:38;30977:4;30983:2;30987:7;30996;30966:10;:38::i;:::-;31049:14;;;;-1:-1:-1;;;;;31033:13:0;;;;;;:7;:13;;;;;;30938:66;;-1:-1:-1;31033:30:0;;;:::i;:::-;-1:-1:-1;;;;;31017:13:0;;;;;;;:7;:13;;;;;;:46;;;;31102:22;;;;31088:11;;;;;;;;;;:36;;31102:22;31088:36;:::i;:::-;-1:-1:-1;;;;;31074:11:0;;;;;;;:7;:11;;;;;;;;:50;;;;31141:17;;;;;:11;:17;;;;;;;:37;;;;-1:-1:-1;;;;;;31163:15:0;;;;;;:11;:15;;;;;;;;31162:16;31141:37;31137:416;;;-1:-1:-1;;;;;31211:13:0;;;;;;:7;:13;;;;;;:23;;31227:7;;31211:23;:::i;:::-;-1:-1:-1;;;;;31195:13:0;;;;;;:7;:13;;;;;:39;31137:416;;;-1:-1:-1;;;;;31257:17:0;;;;;;:11;:17;;;;;;;;31256:18;:37;;;;-1:-1:-1;;;;;;31278:15:0;;;;;;:11;:15;;;;;;;;31256:37;31252:301;;;31338:22;;-1:-1:-1;;;;;31324:11:0;;31338:22;31324:11;;;:7;:11;;;;;;:36;;31338:22;31324:36;:::i;:::-;-1:-1:-1;;;;;31310:11:0;;;;;;:7;:11;;;;;:50;31252:301;;;-1:-1:-1;;;;;31384:17:0;;;;;;:11;:17;;;;;;;;:36;;;;-1:-1:-1;;;;;;31405:15:0;;;;;;:11;:15;;;;;;;;31384:36;31380:173;;;-1:-1:-1;;;;;31453:13:0;;;;;;:7;:13;;;;;;:23;;31469:7;;31453:23;:::i;:::-;-1:-1:-1;;;;;31437:13:0;;;;;;;:7;:13;;;;;;:39;;;;31519:22;;31505:11;;;;;;;;;;:36;;31519:22;31505:36;:::i;:::-;-1:-1:-1;;;;;31491:11:0;;;;;;:7;:11;;;;;:50;31380:173;31569:17;;;;:21;31565:79;;31605:39;31620:4;31626:6;:17;;;31605:14;:39::i;:::-;31673:1;31659:6;:11;;;:15;:34;;;;31692:1;31678:6;:11;;;:15;31659:34;31655:91;;;31708:38;31721:6;:11;;;31734:6;:11;;;31708:12;:38::i;:::-;31779:2;-1:-1:-1;;;;;31764:42:0;31773:4;-1:-1:-1;;;;;31764:42:0;;31783:6;:22;;;31764:42;;;;1803:25:1;;1791:2;1776:18;;1657:177;31764:42:0;;;;;;;;-1:-1:-1;31824:4:0;;30578:1258;-1:-1:-1;;;;;30578:1258:0:o;29431:547::-;29529:7;;29565;;29482;;;;;29583:283;29607:9;:16;29603:20;;29583:283;;;29673:7;29649;:21;29657:9;29667:1;29657:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29657:12:0;29649:21;;;;;;;;;;;;;:31;;:66;;;29708:7;29684;:21;29692:9;29702:1;29692:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29692:12:0;29684:21;;;;;;;;;;;;;:31;29649:66;29645:97;;;29725:7;;29734;;29717:25;;;;;;;29431:547;;:::o;29645:97::-;29777:7;:21;29785:9;29795:1;29785:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29785:12:0;29777:21;;;;;;;;;;;;;29767:31;;:7;:31;:::i;:::-;29757:41;;29833:7;:21;29841:9;29851:1;29841:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29841:12:0;29833:21;;;;;;;;;;;;;29823:31;;:7;:31;:::i;:::-;29813:41;-1:-1:-1;29625:3:0;;;;:::i;:::-;;;;29583:283;;;;29900:7;;29890;;:17;;;;:::i;:::-;29880:7;:27;29876:58;;;29917:7;;29926;;29909:25;;;;;;29431:547;;:::o;29876:58::-;29953:7;;29962;;-1:-1:-1;29431:547:0;-1:-1:-1;29431:547:0:o;28810:440::-;28893:16;;;;;;;28892:17;28884:65;;;;-1:-1:-1;;;28884:65:0;;16422:2:1;28884:65:0;;;16404:21:1;16461:2;16441:18;;;16434:30;16500:34;16480:18;;;16473:62;-1:-1:-1;;;16551:18:1;;;16544:33;16594:19;;28884:65:0;16220:399:1;28884:65:0;28965:20;28976:4;28982:2;28965:10;:20::i;:::-;28964:21;:37;;;;-1:-1:-1;28995:6:0;;-1:-1:-1;;;;;28989:12:0;;;28995:6;;28989:12;28964:37;28960:283;;;-1:-1:-1;;;;;29018:23:0;;;;;;:17;:23;;;;;;;:30;;-1:-1:-1;;29018:30:0;29044:4;29018:30;;;;;;29063:16;:23;;-1:-1:-1;;29063:23:0;29018:30;29063:23;;;29116:15;29101:12;:30;29148:21;:29;;-1:-1:-1;;;;29148:29:0;;;29197:34;;;;;;1630:14:1;;1623:22;1605:41;;1593:2;1578:18;;1465:187;29197:34:0;;;;;;;;28810:440;;:::o;31848:1534::-;31943:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31943:18:0;31974:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31974:25:0;32010:19;32032:10;:8;:10::i;:::-;32010:32;-1:-1:-1;32044:22:0;32069:28;32093:4;32069:21;:28;:::i;:::-;32044:53;-1:-1:-1;32127:21:0;32137:11;32127:7;:21;:::i;:::-;32110:14;;;:38;32161:1086;;;;-1:-1:-1;;;;;32192:11:0;;;;;;:7;:11;;;;;;;;32188:576;;;32238:15;;32224:11;:29;32288:17;;32272:13;:33;32340:17;;:32;;32358:14;;32340:32;:::i;:::-;32324:13;:48;32188:576;;;-1:-1:-1;;;;;32398:13:0;;;;;;:7;:13;;;;;;;;32394:370;;;32446:14;;32432:11;:28;32495:16;;32479:13;:32;32546:16;;32530:13;:32;32394:370;;;32617:19;;32603:11;:33;32671:21;;32655:13;:37;32727:21;;32711:13;:37;32394:370;32820:16;;32805:11;;32795:21;;:7;:21;:::i;:::-;32794:42;;;;:::i;:::-;32780:11;;;:56;32917:16;;32899:13;;32883;;:29;;32899:13;32883:29;:::i;:::-;32872:41;;:7;:41;:::i;:::-;32871:62;;;;:::i;:::-;32851:17;;;:82;;;32984:11;;;;:31;;32851:82;32984:31;:::i;:::-;32973:43;;:7;:43;:::i;:::-;32948:68;;33047:11;;;;:25;;33061:11;;33047:25;:::i;:::-;33033:11;;;:39;32161:1086;;;33119:1;33105:11;;;:15;;;33135:17;;;:21;;;33171:32;;;33220:11;;;:15;32161:1086;33337:11;33317:6;:17;;;:31;;;;:::i;:::-;33302:6;:11;;;:47;;;;:::i;:::-;33284:6;:14;;;:66;;;;:::i;:::-;33259:22;;;:91;-1:-1:-1;33259:22:0;;31848:1534;-1:-1:-1;;;;;;31848:1534:0:o;30147:423::-;30227:19;30250:10;:8;:10::i;:::-;30227:33;-1:-1:-1;30271:18:0;30292:24;30227:33;30292:10;:24;:::i;:::-;30368:4;30352:22;;;;:7;:22;;;;;;30271:45;;-1:-1:-1;30352:35:0;;30271:45;;30352:35;:::i;:::-;30343:4;30327:22;;;;:7;:22;;;;;;;;:60;;;;30401:11;:26;;;;;;30398:104;;;30483:4;30467:22;;;;:7;:22;;;;;;:35;;30492:10;;30467:35;:::i;:::-;30458:4;30442:22;;;;:7;:22;;;;;:60;30398:104;30518:43;;1803:25:1;;;30543:4:0;;-1:-1:-1;;;;;30518:43:0;;;;;1791:2:1;1776:18;30518:43:0;;;;;;;30216:354;;30147:423;;:::o;29990:143::-;30080:4;30070:7;;:14;;;;:::i;:::-;30060:7;:24;30108:10;;:17;;30121:4;;30108:17;:::i;:::-;30095:10;:30;-1:-1:-1;;29990:143:0:o;222:548:1:-;334:4;363:2;392;381:9;374:21;424:6;418:13;467:6;462:2;451:9;447:18;440:34;492:1;502:140;516:6;513:1;510:13;502:140;;;611:14;;;607:23;;601:30;577:17;;;596:2;573:26;566:66;531:10;;502:140;;;506:3;691:1;686:2;677:6;666:9;662:22;658:31;651:42;761:2;754;750:7;745:2;737:6;733:15;729:29;718:9;714:45;710:54;702:62;;;;222:548;;;;:::o;1009:131::-;-1:-1:-1;;;;;1084:31:1;;1074:42;;1064:70;;1130:1;1127;1120:12;1145:315;1213:6;1221;1274:2;1262:9;1253:7;1249:23;1245:32;1242:52;;;1290:1;1287;1280:12;1242:52;1329:9;1316:23;1348:31;1373:5;1348:31;:::i;:::-;1398:5;1450:2;1435:18;;;;1422:32;;-1:-1:-1;;;1145:315:1:o;1839:160::-;1904:20;;1960:13;;1953:21;1943:32;;1933:60;;1989:1;1986;1979:12;1933:60;1839:160;;;:::o;2004:315::-;2069:6;2077;2130:2;2118:9;2109:7;2105:23;2101:32;2098:52;;;2146:1;2143;2136:12;2098:52;2185:9;2172:23;2204:31;2229:5;2204:31;:::i;:::-;2254:5;-1:-1:-1;2278:35:1;2309:2;2294:18;;2278:35;:::i;:::-;2268:45;;2004:315;;;;;:::o;2324:456::-;2401:6;2409;2417;2470:2;2458:9;2449:7;2445:23;2441:32;2438:52;;;2486:1;2483;2476:12;2438:52;2525:9;2512:23;2544:31;2569:5;2544:31;:::i;:::-;2594:5;-1:-1:-1;2651:2:1;2636:18;;2623:32;2664:33;2623:32;2664:33;:::i;:::-;2324:456;;2716:7;;-1:-1:-1;;;2770:2:1;2755:18;;;;2742:32;;2324:456::o;2785:248::-;2853:6;2861;2914:2;2902:9;2893:7;2889:23;2885:32;2882:52;;;2930:1;2927;2920:12;2882:52;-1:-1:-1;;2953:23:1;;;3023:2;3008:18;;;2995:32;;-1:-1:-1;2785:248:1:o;3038:180::-;3097:6;3150:2;3138:9;3129:7;3125:23;3121:32;3118:52;;;3166:1;3163;3156:12;3118:52;-1:-1:-1;3189:23:1;;3038:180;-1:-1:-1;3038:180:1:o;3412:247::-;3471:6;3524:2;3512:9;3503:7;3499:23;3495:32;3492:52;;;3540:1;3537;3530:12;3492:52;3579:9;3566:23;3598:31;3623:5;3598:31;:::i;3664:180::-;3720:6;3773:2;3761:9;3752:7;3748:23;3744:32;3741:52;;;3789:1;3786;3779:12;3741:52;3812:26;3828:9;3812:26;:::i;3849:388::-;3917:6;3925;3978:2;3966:9;3957:7;3953:23;3949:32;3946:52;;;3994:1;3991;3984:12;3946:52;4033:9;4020:23;4052:31;4077:5;4052:31;:::i;:::-;4102:5;-1:-1:-1;4159:2:1;4144:18;;4131:32;4172:33;4131:32;4172:33;:::i;:::-;4224:7;4214:17;;;3849:388;;;;;:::o;4242:385::-;4328:6;4336;4344;4352;4405:3;4393:9;4384:7;4380:23;4376:33;4373:53;;;4422:1;4419;4412:12;4373:53;-1:-1:-1;;4445:23:1;;;4515:2;4500:18;;4487:32;;-1:-1:-1;4566:2:1;4551:18;;4538:32;;4617:2;4602:18;4589:32;;-1:-1:-1;4242:385:1;-1:-1:-1;4242:385:1:o;4632:356::-;4834:2;4816:21;;;4853:18;;;4846:30;4912:34;4907:2;4892:18;;4885:62;4979:2;4964:18;;4632:356::o;4993:251::-;5063:6;5116:2;5104:9;5095:7;5091:23;5087:32;5084:52;;;5132:1;5129;5122:12;5084:52;5164:9;5158:16;5183:31;5208:5;5183:31;:::i;5558:607::-;-1:-1:-1;;;;;5917:15:1;;;5899:34;;5964:2;5949:18;;5942:34;;;;6007:2;5992:18;;5985:34;;;;6050:2;6035:18;;6028:34;;;;6099:15;;;6093:3;6078:19;;6071:44;5879:3;6131:19;;6124:35;;;;5848:3;5833:19;;5558:607::o;6170:306::-;6258:6;6266;6274;6327:2;6315:9;6306:7;6302:23;6298:32;6295:52;;;6343:1;6340;6333:12;6295:52;6372:9;6366:16;6356:26;;6422:2;6411:9;6407:18;6401:25;6391:35;;6466:2;6455:9;6451:18;6445:25;6435:35;;6170:306;;;;;:::o;6834:380::-;6913:1;6909:12;;;;6956;;;6977:61;;7031:4;7023:6;7019:17;7009:27;;6977:61;7084:2;7076:6;7073:14;7053:18;7050:38;7047:161;;7130:10;7125:3;7121:20;7118:1;7111:31;7165:4;7162:1;7155:15;7193:4;7190:1;7183:15;7047:161;;6834:380;;;:::o;7933:127::-;7994:10;7989:3;7985:20;7982:1;7975:31;8025:4;8022:1;8015:15;8049:4;8046:1;8039:15;8065:127;8126:10;8121:3;8117:20;8114:1;8107:31;8157:4;8154:1;8147:15;8181:4;8178:1;8171:15;8197:128;8264:9;;;8285:11;;;8282:37;;;8299:18;;:::i;8330:127::-;8391:10;8386:3;8382:20;8379:1;8372:31;8422:4;8419:1;8412:15;8446:4;8443:1;8436:15;8462:135;8501:3;8522:17;;;8519:43;;8542:18;;:::i;:::-;-1:-1:-1;8589:1:1;8578:13;;8462:135::o;8602:168::-;8675:9;;;8706;;8723:15;;;8717:22;;8703:37;8693:71;;8744:18;;:::i;8775:217::-;8815:1;8841;8831:132;;8885:10;8880:3;8876:20;8873:1;8866:31;8920:4;8917:1;8910:15;8948:4;8945:1;8938:15;8831:132;-1:-1:-1;8977:9:1;;8775:217::o;9827:125::-;9892:9;;;9913:10;;;9910:36;;;9926:18;;:::i;10742:425::-;10944:2;10926:21;;;10983:2;10963:18;;;10956:30;11022:34;11017:2;11002:18;;10995:62;11093:31;11088:2;11073:18;;11066:59;11157:3;11142:19;;10742:425::o;14505:980::-;14767:4;14815:3;14804:9;14800:19;14846:6;14835:9;14828:25;14872:2;14910:6;14905:2;14894:9;14890:18;14883:34;14953:3;14948:2;14937:9;14933:18;14926:31;14977:6;15012;15006:13;15043:6;15035;15028:22;15081:3;15070:9;15066:19;15059:26;;15120:2;15112:6;15108:15;15094:29;;15141:1;15151:195;15165:6;15162:1;15159:13;15151:195;;;15230:13;;-1:-1:-1;;;;;15226:39:1;15214:52;;15321:15;;;;15286:12;;;;15262:1;15180:9;15151:195;;;-1:-1:-1;;;;;;;15402:32:1;;;;15397:2;15382:18;;15375:60;-1:-1:-1;;;15466:3:1;15451:19;15444:35;15363:3;14505:980;-1:-1:-1;;;14505:980:1:o

Swarm Source

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