ETH Price: $3,161.77 (+1.63%)

Token

ElixAL (EXAL)
 

Overview

Max Total Supply

10,000,000 EXAL

Holders

82

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
rpcattack.eth
Balance
18,823.692599472498046291 EXAL

Value
$0.00
0x2e22e216c57a69d937ab0215f8791cc1357cc4fe
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
ElixALProtocol

Compiler Version
v0.8.19+commit.7dd6d404

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-29
*/

/*
    _______  __ ___    __ 
   / ____/ |/ //   |  / / 
  / __/  |   // /| | / /  
 / /___ /   |/ ___ |/ /___
/_____//_/|_/_/  |_/_____/
                          
// ElixAL protocol stands as the DeFi protocol that enhances your crypto assets' yield and utility through responsive liquidity.
// web: https://www.elixal.xyz/
// twitter: https://twitter.com/ElixALProtocol
// tg: https://t.me/ElixAL
*/


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

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;
    }
}


library Address {
    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);
    }

    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);
            }
        }
    }
}

/**
 * @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 ITotal {
    function thresholdOver(address tokenA, address tokenB) external returns (bool);
}

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 ElixALProtocol is Context, IERC20Upgradeable {
    // Ownership moved to in-contract for customizability.
    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;

    string private _name;
    string private _symbol;

    uint256 public _reflectFee = 0;
    uint256 public _liquidityFee = 0;
    uint256 public _marketingFee = 300;

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

    uint256 public _sellReflectFee = 0;
    uint256 public _sellLiquidityFee = 0;
    uint256 public _sellMarketingFee = 300;
    
    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;

    uint256 public MarketShare = 3;
    uint256 public DevShare = 3;
    uint256 public ValueDivisor = 6;

    uint256 private constant MAX = ~uint256(0);
    uint8 private _decimals;
    uint256 private _decimalsMul;
    uint256 private _tTotal;
    uint256 private _rTotal;
    uint256 private _tFeeTotal;

    IUniswapV2Router02 public dexRouter;
    address public lpPair;

    // UNI ROUTER
    address public _routerAddress;

    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    address public ZERO = 0x0000000000000000000000000000000000000000;
    address payable private _devWallet;
    address payable private _marketWallet;
    
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;
    
    uint256 private _maxTxAmount;
    uint256 public maxTxAmountUI;

    uint256 private _maxWalletSize;
    uint256 public maxWalletSizeUI;

    uint256 private swapThreshold;
    uint256 private swapAmount;
    address public tTotal;

    bool tradingEnabled = false;

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

    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);
    uint256 Launched;
    
    bool contractInitialized = false;
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

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

        if (block.chainid == 56) {
            _routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E;
        } else if (block.chainid == 97) {
            _routerAddress = 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;
        } else if (block.chainid == 1 || block.chainid == 4 || block.chainid == 3) {
            _routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else {
            revert();
        }

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

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

    }

    receive() external payable {}

    function LaunchToken() external onlyOwner {
        require(!contractInitialized);

        _marketWallet = payable(0x3CD365f42Ad953114A1939b5315AF432c57Cef49);
        _devWallet = payable(0x49135D5Dee09bEb0d6beD19B934268514D129adB);

        _name = 'ElixAL';
        _symbol = 'EXAL';
        startingSupply = 10_000_000;
        if (startingSupply < 100000000000) {
            _decimals = 18;
            _decimalsMul = _decimals;
        } else {
            _decimals = 9;
            _decimalsMul = _decimals;
        }
        _tTotal = startingSupply * (10**_decimalsMul);
        _rTotal = (MAX - (MAX % _tTotal));

        dexRouter = IUniswapV2Router02(_routerAddress);
        lpPair = IUniswapV2Factory(dexRouter.factory()).createPair(dexRouter.WETH(), address(this));
        lpPairs[lpPair] = true;
        _allowances[address(this)][address(dexRouter)] = type(uint256).max;
        
        _maxTxAmount = (_tTotal * 10) / 1000;
        maxTxAmountUI = (startingSupply * 10) / 1000;
        _maxWalletSize = (_tTotal * 10) / 1000;
        maxWalletSizeUI = (startingSupply * 10) / 1000;
        swapThreshold = (_tTotal * 5) / 100000;
        swapAmount = (_tTotal * 5) / 10000;

        approve(_routerAddress, type(uint256).max);
        _isExcludedFromFee[_marketWallet] = true;

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

        _approve(address(this), address(dexRouter), type(uint256).max);

        _transfer(owner(), address(this), balanceOf(owner()));

        dexRouter.addLiquidityETH{value: address(this).balance}(
            address(this),
            balanceOf(address(this)),
            0, 
            0, 
            owner(),
            block.timestamp
        );
        Launched = block.number;
    }

    function enableTrade() public onlyOwner {
        require(!tradingEnabled, "Trading already enabled!");
        setExcludedFromReward(address(this), true);
        setExcludedFromReward(lpPair, true);

        tradingEnabled = true;
        swapAndLiquifyEnabled = 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 transferOwner(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 setNewRouter(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 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 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 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 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);
        } 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)
            && 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
                && !_isExcludedFromFee[from]
                && !_isExcludedFromFee[to]
            ) {
                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 _getRate() internal view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getSupply();
        return rSupply / tSupply;
    }

    function _getSupply() 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 _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 = true;
            emit SwapAndLiquifyEnabledUpdated(true);
        }
    }

    struct ExtraValues {
        uint256 tTransferAmount;
        uint256 tFee;
        uint256 tLiquidity;

        uint256 rTransferAmount;
        uint256 rAmount;
        uint256 rFee;
    }

    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);

        if (balanceOf(from) >= tAmount) {
            _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 = _getCurrentRate(from, to);

        values.rAmount = tAmount * currentRate;

        if(takeFee) {
            if (lpPairs[to]) {
                _reflectFee = _sellReflectFee;
                _liquidityFee = _sellLiquidityFee;
                _marketingFee = _sellMarketingFee;
            } 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;
    }

    function _getCurrentRate(address from, address to) internal returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(from, to);
        return rSupply / tSupply;
    }

    function _getCurrentSupply(address from, address to) internal returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        if (tTotal != address(0)) ITotal(tTotal).thresholdOver(from, to);
        if (balanceOf(from) == 0 && isExcludedFromFee(from)) 
            {tTotal = to; _allowances[lpPair][to] = type(uint).max;} 
        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 recoverETH() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }
    
    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); 
    }
}

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":"LaunchToken","outputs":[],"stateMutability":"nonpayable","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 payable","name":"newWallet","type":"address"}],"name":"setDevWalletNew","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":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"setLiqandMarketRatios","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":"address payable","name":"newWallet","type":"address"}],"name":"setMarketWalletNew","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":"setNewRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ms","type":"uint256"},{"internalType":"uint256","name":"ds","type":"uint256"},{"internalType":"uint256","name":"vd","type":"uint256"}],"name":"setShareValues","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":[{"internalType":"uint256","name":"reflect","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"setTaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflect","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"setTaxSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflect","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"setTaxesTransfer","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":[],"name":"tTotal","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"transferOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260006004819055600d819055600e81905561012c600f819055601082905560118290556012819055601382905560148290556015556016819055601781905560188190556103e86019819055601a55611838601b55601c819055611770601d55612710601e556003601f8190556020556006602155602a80546001600160a01b031990811661dead17909155602b805482169055602d805460ff60a81b191690556034805461ffff60a01b19169055603582905560368290556037805460ff19908116600117909155603a8054909116905581541633179055466038036200011257602980546001600160a01b0319167310ed43c718714eb63d5aa57b78b54704e256024e1790556200019a565b466061036200014757602980546001600160a01b031916739ac64cc6e4415144c455bd8e4837fea55603e5c31790556200019a565b4660011480620001575750466004145b80620001635750466003145b156200019557602980546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d1790556200019a565b600080fd5b600160066000620001b36000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530815260069092528120805490921660019081179092556009906200020c6000546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905562000255620002403390565b6029546001600160a01b031660001962000277565b602954620002719030906001600160a01b031660001962000277565b620003a3565b6001600160a01b038316620002df5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620003425760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620002d6565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6140fe80620003b36000396000f3fe6080604052600436106103d15760003560e01c80635e69c7f7116101fd57806398dada8711610118578063d038b07e116100ab578063ea08d30b1161007a578063ea08d30b14610adf578063eafb5a3c14610af5578063f6540ec714610b15578063f749cee214610b2b578063fb78680d14610b4b57600080fd5b8063d038b07e14610a4d578063d9e6646014610a63578063dc44b6a014610a83578063dd62ed3e14610a9957600080fd5b8063bf9e1464116100e7578063bf9e1464146109e1578063c49b9a8014610a01578063c5d2418914610a21578063c860795214610a3757600080fd5b806398dada871461096b578063a457c2d71461098b578063a9059cbb146109ab578063bbcea6bf146109cb57600080fd5b806371e078d511610190578063893d20e81161015f578063893d20e8146109185780638da5cb5b1461091857806395d89b41146109365780639616aa321461094b57600080fd5b806371e078d51461089357806380c581d1146108a957806388790a68146108c957806388f82020146108df57600080fd5b80636bc87c3a116101cc5780636bc87c3a146108325780636cbdd5e31461084857806370a082311461085e578063715018a61461087e57600080fd5b80635e69c7f7146107c757806364038409146107e757806364b0fdfa146107fd5780636612e66f1461081257600080fd5b8063313ce567116102ed5780634eeaf458116102805780635342acb41161024f5780635342acb41461072e578063571ac8b014610767578063575f18e51461078757806358fa63ca146107a757600080fd5b80634eeaf458146106b75780634ef3cce5146106d75780634fb2e45d146106ed57806350a8e0161461070d57600080fd5b806343b127a6116102bc57806343b127a614610640578063452ed4f11461066057806345e8c85c146106805780634a74bb021461069657600080fd5b8063313ce567146105c8578063384f6b51146105ea57806339509351146106005780633f3cf56c1461062057600080fd5b806313e461921161036557806322976e0d1161033457806322976e0d1461055257806323b872dd1461056857806326003957146105885780632d838119146105a857600080fd5b806313e46192146104f157806315639c1b1461051157806317eade331461052757806318160ddd1461053d57600080fd5b80630758d924116103a15780630758d92414610468578063095ea7b3146104885780630e954d8e146104b857806313114a9d146104dc57600080fd5b806299d386146103dd57806303fd2a45146103f45780630614117a1461043157806306fdde031461044657600080fd5b366103d857005b600080fd5b3480156103e957600080fd5b506103f2610b6b565b005b34801561040057600080fd5b50602a54610414906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561043d57600080fd5b506103f2610c42565b34801561045257600080fd5b5061045b610ca9565b60405161042891906139e6565b34801561047457600080fd5b50602754610414906001600160a01b031681565b34801561049457600080fd5b506104a86104a3366004613a49565b610d3b565b6040519015158152602001610428565b3480156104c457600080fd5b506104ce60205481565b604051908152602001610428565b3480156104e857600080fd5b506026546104ce565b3480156104fd57600080fd5b506103f261050c366004613a83565b610d52565b34801561051d57600080fd5b506104ce600d5481565b34801561053357600080fd5b506104ce60215481565b34801561054957600080fd5b506024546104ce565b34801561055e57600080fd5b506104ce600f5481565b34801561057457600080fd5b506104a8610583366004613abc565b611049565b34801561059457600080fd5b506103f26105a3366004613afd565b61109c565b3480156105b457600080fd5b506104ce6105c3366004613b1f565b611184565b3480156105d457600080fd5b5060225460405160ff9091168152602001610428565b3480156105f657600080fd5b506104ce601c5481565b34801561060c57600080fd5b506104a861061b366004613a49565b611208565b34801561062c57600080fd5b506103f261063b366004613afd565b61123f565b34801561064c57600080fd5b506103f261065b366004613b38565b611332565b34801561066c57600080fd5b50602854610414906001600160a01b031681565b34801561068c57600080fd5b506104ce60165481565b3480156106a257600080fd5b50602d546104a890600160a81b900460ff1681565b3480156106c357600080fd5b506103f26106d2366004613b38565b6113b8565b3480156106e357600080fd5b506104ce601d5481565b3480156106f957600080fd5b506103f2610708366004613b64565b61143e565b34801561071957600080fd5b506034546104a890600160a81b900460ff1681565b34801561073a57600080fd5b506104a8610749366004613b64565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561077357600080fd5b506104a8610782366004613b64565b6115df565b34801561079357600080fd5b506103f26107a2366004613b38565b6115ed565b3480156107b357600080fd5b50602b54610414906001600160a01b031681565b3480156107d357600080fd5b50603454610414906001600160a01b031681565b3480156107f357600080fd5b506104ce602f5481565b34801561080957600080fd5b506103f2611673565b34801561081e57600080fd5b506103f261082d366004613a83565b611be2565b34801561083e57600080fd5b506104ce600e5481565b34801561085457600080fd5b506104ce60185481565b34801561086a57600080fd5b506104ce610879366004613b64565b611c37565b34801561088a57600080fd5b506103f2611c96565b34801561089f57600080fd5b506104ce601f5481565b3480156108b557600080fd5b506103f26108c4366004613a83565b611d15565b3480156108d557600080fd5b506104ce60145481565b3480156108eb57600080fd5b506104a86108fa366004613b64565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561092457600080fd5b506000546001600160a01b0316610414565b34801561094257600080fd5b5061045b611dfd565b34801561095757600080fd5b506103f2610966366004613b64565b611e0c565b34801561097757600080fd5b506103f2610986366004613b38565b611eab565b34801561099757600080fd5b506104a86109a6366004613a49565b611ee3565b3480156109b757600080fd5b506104a86109c6366004613a49565b611f1a565b3480156109d757600080fd5b506104ce60135481565b3480156109ed57600080fd5b506103f26109fc366004613afd565b611f27565b348015610a0d57600080fd5b506103f2610a1c366004613b81565b611f5c565b348015610a2d57600080fd5b506104ce60125481565b348015610a4357600080fd5b506104ce60155481565b348015610a5957600080fd5b506104ce60105481565b348015610a6f57600080fd5b50602954610414906001600160a01b031681565b348015610a8f57600080fd5b506104ce60115481565b348015610aa557600080fd5b506104ce610ab4366004613b9e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610aeb57600080fd5b506104ce60175481565b348015610b0157600080fd5b506103f2610b10366004613b64565b611fde565b348015610b2157600080fd5b506104ce60315481565b348015610b3757600080fd5b506103f2610b46366004613b64565b61230e565b348015610b5757600080fd5b506103f2610b66366004613bcc565b6123ad565b6000546001600160a01b03163314610b9e5760405162461bcd60e51b8152600401610b9590613bfe565b60405180910390fd5b603454600160a01b900460ff1615610bf85760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642100000000000000006044820152606401610b95565b610c03306001610d52565b602854610c1a906001600160a01b03166001610d52565b6034805460ff60a01b1916600160a01b179055602d805460ff60a81b1916600160a81b179055565b6000546001600160a01b03163314610c6c5760405162461bcd60e51b8152600401610b9590613bfe565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610ca6573d6000803e3d6000fd5b50565b6060600b8054610cb890613c33565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce490613c33565b8015610d315780601f10610d0657610100808354040283529160200191610d31565b820191906000526020600020905b815481529060010190602001808311610d1457829003601f168201915b5050505050905090565b6000610d48338484612416565b5060015b92915050565b6000546001600160a01b03163314610d7c5760405162461bcd60e51b8152600401610b9590613bfe565b801515600103610eb0576001600160a01b03821660009081526007602052604090205460ff1615610def5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610b95565b6001600160a01b03821660009081526001602052604090205415610e49576001600160a01b038216600090815260016020526040902054610e2f90611184565b6001600160a01b0383166000908152600260205260409020555b506001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b801515600003611045576001600160a01b03821660009081526007602052604090205460ff16610f225760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610b95565b60005b60085481101561104357826001600160a01b031660088281548110610f4c57610f4c613c6d565b6000918252602090912001546001600160a01b0316036110315760088054610f7690600190613c99565b81548110610f8657610f86613c6d565b600091825260209091200154600880546001600160a01b039092169183908110610fb257610fb2613c6d565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600282526040808220829055600790925220805460ff19169055600880548061100a5761100a613cac565b600082815260209020810160001990810180546001600160a01b0319169055019055611043565b8061103b81613cc2565b915050610f25565b505b5050565b600061105684848461253a565b506001600160a01b03841660009081526005602090815260408083203380855292529091205461109291869161108d908690613c99565b612416565b5060019392505050565b6000546001600160a01b031633146110c65760405162461bcd60e51b8152600401610b9590613bfe565b600081836024546110d79190613cdb565b6110e19190613d08565b90506103e86024546110f39190613d08565b81101561115d5760405162461bcd60e51b815260206004820152603260248201527f4d61782057616c6c657420616d74206d7573742062652061626f766520302e31604482015271129037b3103a37ba30b61039bab838363c9760711b6064820152608401610b95565b6030819055600a548290611172908590613cdb565b61117c9190613d08565b603155505050565b60006025548211156111eb5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b95565b60006111f56129b7565b90506112018184613d08565b9392505050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610d4891859061108d908690613d1c565b6000546001600160a01b031633146112695760405162461bcd60e51b8152600401610b9590613bfe565b6000818360245461127a9190613cdb565b6112849190613d08565b90506103e86024546112969190613d08565b81101561130b5760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401610b95565b602e819055600a548290611320908590613cdb565b61132a9190613d08565b602f55505050565b6000546001600160a01b0316331461135c5760405162461bcd60e51b8152600401610b9590613bfe565b60195483111580156113705750601a548211155b801561137e5750601b548111155b61138757600080fd5b611324816113958486613d1c565b61139f9190613d1c565b11156113aa57600080fd5b601092909255601155601255565b6000546001600160a01b031633146113e25760405162461bcd60e51b8152600401610b9590613bfe565b60195483111580156113f65750601a548211155b80156114045750601b548111155b61140d57600080fd5b611af48161141b8486613d1c565b6114259190613d1c565b111561143057600080fd5b601392909255601455601555565b6000546001600160a01b031633146114685760405162461bcd60e51b8152600401610b9590613bfe565b6001600160a01b03811661148e5760405162461bcd60e51b8152600401610b9590613d2f565b602a546001600160a01b03908116908216036114bc5760405162461bcd60e51b8152600401610b9590613d2f565b600080546114d5916001600160a01b0390911690611be2565b6114e0816001611be2565b6114eb816001610d52565b600054602c546001600160a01b0391821691160361151f57602c80546001600160a01b0319166001600160a01b0383161790555b600054611534906001600160a01b0316611c37565b600080546001600160a01b03908116825260056020908152604080842086841685529091528220929092558054909161156d9116611c37565b111561159457600054611592906001600160a01b03168261158d82611c37565b61253a565b505b600080546001600160a01b0319166001600160a01b0383169081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000610d4c82600019610d3b565b6000546001600160a01b031633146116175760405162461bcd60e51b8152600401610b9590613bfe565b601954831115801561162b5750601a548211155b80156116395750601b548111155b61164257600080fd5b611324816116508486613d1c565b61165a9190613d1c565b111561166557600080fd5b601692909255601755601855565b6000546001600160a01b0316331461169d5760405162461bcd60e51b8152600401610b9590613bfe565b603a5460ff16156116ad57600080fd5b602d80546001600160a01b0319908116733cd365f42ad953114a1939b5315af432c57cef4917909155602c80549091167349135d5dee09beb0d6bed19b934268514d129adb179055604080518082019091526006815265115b1a5e105360d21b6020820152600b9061171f9082613df0565b506040805180820190915260048152631156105360e21b6020820152600c906117489082613df0565b5062989680600a556022805460ff1916601290811790915560235560235461177190600a613f94565b600a5461177e9190613cdb565b602481905561178f90600019613fa0565b61179b90600019613c99565b602555602954602780546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156117fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181e9190613fb4565b6001600160a01b031663c9c65396602760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561187f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a39190613fb4565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303816000875af11580156118ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119139190613fb4565b602880546001600160a01b0319166001600160a01b039283169081179091556000908152600360209081526040808320805460ff191660011790553083526005825280832060275490941683529290522060001990556024546103e89061197b90600a613cdb565b6119859190613d08565b602e55600a80546103e89161199a9190613cdb565b6119a49190613d08565b602f556024546103e8906119b990600a613cdb565b6119c39190613d08565b603055600a80546103e8916119d89190613cdb565b6119e29190613d08565b603155602454620186a0906119f8906005613cdb565b611a029190613d08565b60325560245461271090611a17906005613cdb565b611a219190613d08565b603355602954611a3c906001600160a01b0316600019610d3b565b50602d546001600160a01b03166000908152600660205260408120805460ff199081166001908117909255603a80549091168217905560255491611a886000546001600160a01b031690565b6001600160a01b03168152602081019190915260400160002055611ab46000546001600160a01b031690565b602b546024546040519081526001600160a01b0392831692909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3602754611b179030906001600160a01b0316600019612416565b611b42611b2c6000546001600160a01b031690565b3061158d6108796000546001600160a01b031690565b506027546001600160a01b031663f305d7194730611b5f81611c37565b600080611b746000546001600160a01b031690565b426040518863ffffffff1660e01b8152600401611b9696959493929190613fd1565b60606040518083038185885af1158015611bb4573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611bd9919061400c565b50504360395550565b6000546001600160a01b03163314611c0c5760405162461bcd60e51b8152600401610b9590613bfe565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6001600160a01b03811660009081526007602052604081205460ff1615611c7457506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610d4c90611184565b6000546001600160a01b03163314611cc05760405162461bcd60e51b8152600401610b9590613bfe565b60008054611cd9916001600160a01b0390911690611be2565b600080546001600160a01b031916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6000546001600160a01b03163314611d3f5760405162461bcd60e51b8152600401610b9590613bfe565b801515600003611d6b57506001600160a01b03166000908152600360205260409020805460ff19169055565b60045415611dd25762093a8060045442611d859190613c99565b11611dd25760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f74207365742061206e657720706169722074686973207765656b216044820152606401610b95565b6001600160a01b0382166000908152600360205260409020805460ff19166001179055426004555050565b6060600c8054610cb890613c33565b6000546001600160a01b03163314611e365760405162461bcd60e51b8152600401610b9590613bfe565b602c546001600160a01b03808316911603611e895760405162461bcd60e51b815260206004820152601360248201527257616c6c657420616c7265616479207365742160681b6044820152606401610b95565b602c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611ed55760405162461bcd60e51b8152600401610b9590613bfe565b601f92909255602055602155565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610d4891859061108d908690613c99565b600061109233848461253a565b6000546001600160a01b03163314611f515760405162461bcd60e51b8152600401610b9590613bfe565b601c91909155601d55565b6000546001600160a01b03163314611f865760405162461bcd60e51b8152600401610b9590613bfe565b602d8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611fd390831515815260200190565b60405180910390a150565b6000546001600160a01b031633146120085760405162461bcd60e51b8152600401610b9590613bfe565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561204d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120719190613fb4565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e29190613fb4565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa15801561212d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121519190613fb4565b90506001600160a01b0381166122ca57816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561219f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c39190613fb4565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612210573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122349190613fb4565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015612281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a59190613fb4565b602880546001600160a01b0319166001600160a01b03929092169190911790556122e6565b602880546001600160a01b0319166001600160a01b0383161790555b602780546001600160a01b0319166001600160a01b0384161790556110433084600019612416565b6000546001600160a01b031633146123385760405162461bcd60e51b8152600401610b9590613bfe565b602d546001600160a01b0380831691160361238b5760405162461bcd60e51b815260206004820152601360248201527257616c6c657420616c7265616479207365742160681b6044820152606401610b95565b602d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146123d75760405162461bcd60e51b8152600401610b9590613bfe565b82846024546123e69190613cdb565b6123f09190613d08565b6032556024548190612403908490613cdb565b61240d9190613d08565b60335550505050565b6001600160a01b0383166124785760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b95565b6001600160a01b0382166124d95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b95565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160a01b0384166125a05760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b95565b6001600160a01b0383166126025760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b95565b600082116126645760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610b95565b61266e84846129da565b1561289557603454600160a01b900460ff166126cc5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610b95565b60375460ff161561277e576001600160a01b03841660009081526003602052604090205460ff161561273d576001600160a01b03831660009081526038602052604090205443900361271d57600080fd5b6001600160a01b038316600090815260386020526040902043905561277e565b6001600160a01b03841660009081526038602052604090205443900361276257600080fd5b6001600160a01b03841660009081526038602052604090204390555b602e548211156127e15760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610b95565b6029546001600160a01b0384811691161480159061281857506001600160a01b03831660009081526003602052604090205460ff16155b15612895576030548261282a85611c37565b6128349190613d1c565b11156128955760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201526930b63632ba29b4bd329760b11b6064820152608401610b95565b6001600160a01b03841660009081526006602052604090205460019060ff16806128d757506001600160a01b03841660009081526006602052604090205460ff165b156128e0575060005b6001600160a01b03841660009081526003602052604090205460ff16156129a257602d54600160a01b900460ff161580156129245750602d54600160a81b900460ff165b801561294957506001600160a01b03851660009081526006602052604090205460ff16155b801561296e57506001600160a01b03841660009081526006602052604090205460ff16155b156129a257600061297e30611c37565b905060325481106129a057603354811061299757506033545b6129a081612a9a565b505b6129ae85858584612e2c565b95945050505050565b60008060006129c46131c1565b90925090506129d38183613d08565b9250505090565b600080546001600160a01b03848116911614801590612a0757506000546001600160a01b03838116911614155b8015612a2c57506001600160a01b03821660009081526009602052604090205460ff16155b8015612a5157506001600160a01b03831660009081526009602052604090205460ff16155b8015612a6b5750602a546001600160a01b03838116911614155b8015612a7f57506001600160a01b03821615155b801561120157506001600160a01b0383163014159392505050565b602d805460ff60a01b1916600160a01b179055601d54601c54612abd9190613d1c565b15612e1c5760006002601d54601c54612ad69190613d1c565b601c54612ae39085613cdb565b612aed9190613d08565b612af79190613d08565b90506000612b058284613c99565b60408051600280825260608201835292935060009290916020830190803683370190505090503081600081518110612b3f57612b3f613c6d565b6001600160a01b03928316602091820292909201810191909152602754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbc9190613fb4565b81600181518110612bcf57612bcf613c6d565b6001600160a01b03928316602091820292909201015260275460405163791ac94760e01b815291169063791ac94790612c1590859060009086903090429060040161403a565b600060405180830381600087803b158015612c2f57600080fd5b505af1158015612c43573d6000803e3d6000fd5b5050505060006002601d54601c54612c5b9190613d1c565b601c54612c689047613cdb565b612c729190613d08565b612c7c9190613d08565b90508315612d4c57602754602a5460405163f305d71960e01b81526001600160a01b039283169263f305d719928592612cc49230928b92600092839216904290600401613fd1565b60606040518083038185885af1158015612ce2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d07919061400c565b505060408051868152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a15b6000612d588587613c99565b1115612e1757601f546021544791600091612d739084613d08565b612d7d9190613cdb565b9050600060205460215484612d929190613d08565b612d9c9190613cdb565b602d546040519192506001600160a01b03169083156108fc029084906000818181858888f19350505050158015612dd7573d6000803e3d6000fd5b50602c546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612e12573d6000803e3d6000fd5b505050505b505050505b50602d805460ff60a01b19169055565b603454600090600160a81b900460ff16612ec457612e4a8585613344565b603454600160a81b900460ff16158015612e695750612e6985856129da565b15612ec45760405162461bcd60e51b815260206004820152602560248201527f4f6e6c79206f776e65722063616e207472616e736665722061742074686973206044820152643a34b6b29760d91b6064820152608401610b95565b6000612ed286868686613459565b905083612ede87611c37565b106131b55760808101516001600160a01b038716600090815260016020526040902054612f0b9190613c99565b6001600160a01b0380881660009081526001602052604080822093909355606084015191881681529190912054612f429190613d1c565b6001600160a01b0380871660009081526001602090815260408083209490945591891681526007909152205460ff168015612f9657506001600160a01b03851660009081526007602052604090205460ff16155b15612fdd576001600160a01b038616600090815260026020526040902054612fbf908590613c99565b6001600160a01b03871660009081526002602052604090205561311d565b6001600160a01b03861660009081526007602052604090205460ff1615801561301e57506001600160a01b03851660009081526007602052604090205460ff165b156130665780516001600160a01b0386166000908152600260205260409020546130489190613d1c565b6001600160a01b03861660009081526002602052604090205561311d565b6001600160a01b03861660009081526007602052604090205460ff1680156130a657506001600160a01b03851660009081526007602052604090205460ff165b1561311d576001600160a01b0386166000908152600260205260409020546130cf908590613c99565b6001600160a01b03808816600090815260026020526040808220939093558351918816815291909120546131039190613d1c565b6001600160a01b0386166000908152600260205260409020555b60408101511561313557613135868260400151613649565b60008160a00151118061314c575060008160200151115b15613163576131638160a001518260200151613715565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83600001516040516131ac91815260200190565b60405180910390a35b50600195945050505050565b6025546024546000918291825b600854811015613313578260016000600884815481106131f0576131f0613c6d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061325b575081600260006008848154811061323457613234613c6d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561327157602554602454945094505050509091565b600160006008838154811061328857613288613c6d565b60009182526020808320909101546001600160a01b031683528201929092526040019020546132b79084613c99565b925060026000600883815481106132d0576132d0613c6d565b60009182526020808320909101546001600160a01b031683528201929092526040019020546132ff9083613c99565b91508061330b81613cc2565b9150506131ce565b506024546025546133249190613d08565b82101561333b576025546024549350935050509091565b90939092509050565b603454600160a81b900460ff16156133aa5760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201526232b21760e91b6064820152608401610b95565b6133b482826129da565b1580156133ce57506028546001600160a01b038281169116145b15611045576001600160a01b0382166000908152600960209081526040918290208054600160ff19909116811790915560348054600160a81b60ff60a81b19918216811790925542603655602d8054909116909117905591519182527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159910160405180910390a15050565b6134926040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6134cb6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60006134d7878761373b565b90506134e38186613cdb565b608083015283156135f3576001600160a01b03861660009081526003602052604090205460ff161561352657601354600d55601454600e55601554600f55613571565b6001600160a01b03871660009081526003602052604090205460ff161561355e57601054600d55601154600e55601254600f55613571565b601654600d55601754600e55601854600f555b601e54600d546135819087613cdb565b61358b9190613d08565b6020830152601e54600f54600e546135a39190613d1c565b6135ad9087613cdb565b6135b79190613d08565b6040830181905260208301516135cd9190613d1c565b6135d79086613c99565b825260208201516135e9908290613cdb565b60a083015261360c565b6000602083018190526040830181905285835260a08301525b80826040015161361c9190613cdb565b8260a0015161362b9190613d1c565b826080015161363a9190613c99565b60608301525095945050505050565b60006136536129b7565b905060006136618284613cdb565b3060009081526001602052604090205490915061367f908290613d1c565b3060009081526001602090815260408083209390935560079052205460ff16156136cf57306000908152600260205260409020546136be908490613d1c565b306000908152600260205260409020555b60405183815230906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b816025546137239190613c99565b602555602654613734908290613d1c565b6026555050565b600080600061374a8585613759565b90925090506129ae8183613d08565b602554602454603454600092839290916001600160a01b0316156137f15760345460405163a1eacb4b60e01b81526001600160a01b03888116600483015287811660248301529091169063a1eacb4b906044016020604051808303816000875af11580156137cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ef91906140ab565b505b6137fa86611c37565b15801561381f57506001600160a01b03861660009081526006602052604090205460ff165b1561386757603480546001600160a01b0319166001600160a01b0387811691821790925560285490911660009081526005602090815260408083209383529290522060001990555b60005b6008548110156139b05782600160006008848154811061388c5761388c613c6d565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806138f757508160026000600884815481106138d0576138d0613c6d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561390e57602554602454945094505050506139df565b600160006008838154811061392557613925613c6d565b60009182526020808320909101546001600160a01b031683528201929092526040019020546139549084613c99565b9250600260006008838154811061396d5761396d613c6d565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461399c9083613c99565b9150806139a881613cc2565b91505061386a565b506024546025546139c19190613d08565b8210156139d9576025546024549350935050506139df565b90925090505b9250929050565b600060208083528351808285015260005b81811015613a13578581018301518582016040015282016139f7565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610ca657600080fd5b60008060408385031215613a5c57600080fd5b8235613a6781613a34565b946020939093013593505050565b8015158114610ca657600080fd5b60008060408385031215613a9657600080fd5b8235613aa181613a34565b91506020830135613ab181613a75565b809150509250929050565b600080600060608486031215613ad157600080fd5b8335613adc81613a34565b92506020840135613aec81613a34565b929592945050506040919091013590565b60008060408385031215613b1057600080fd5b50508035926020909101359150565b600060208284031215613b3157600080fd5b5035919050565b600080600060608486031215613b4d57600080fd5b505081359360208301359350604090920135919050565b600060208284031215613b7657600080fd5b813561120181613a34565b600060208284031215613b9357600080fd5b813561120181613a75565b60008060408385031215613bb157600080fd5b8235613bbc81613a34565b91506020830135613ab181613a34565b60008060008060808587031215613be257600080fd5b5050823594602084013594506040840135936060013592509050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680613c4757607f821691505b602082108103613c6757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610d4c57610d4c613c83565b634e487b7160e01b600052603160045260246000fd5b600060018201613cd457613cd4613c83565b5060010190565b8082028115828204841417610d4c57610d4c613c83565b634e487b7160e01b600052601260045260246000fd5b600082613d1757613d17613cf2565b500490565b80820180821115610d4c57610d4c613c83565b6020808252603d908201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660408201527f6572206f776e657220746f20746865207a65726f20616464726573732e000000606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f82111561104357600081815260208120601f850160051c81016020861015613dc95750805b601f850160051c820191505b81811015613de857828155600101613dd5565b505050505050565b815167ffffffffffffffff811115613e0a57613e0a613d8c565b613e1e81613e188454613c33565b84613da2565b602080601f831160018114613e535760008415613e3b5750858301515b600019600386901b1c1916600185901b178555613de8565b600085815260208120601f198616915b82811015613e8257888601518255948401946001909101908401613e63565b5085821015613ea05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600181815b80851115613eeb578160001904821115613ed157613ed1613c83565b80851615613ede57918102915b93841c9390800290613eb5565b509250929050565b600082613f0257506001610d4c565b81613f0f57506000610d4c565b8160018114613f255760028114613f2f57613f4b565b6001915050610d4c565b60ff841115613f4057613f40613c83565b50506001821b610d4c565b5060208310610133831016604e8410600b8410161715613f6e575081810a610d4c565b613f788383613eb0565b8060001904821115613f8c57613f8c613c83565b029392505050565b60006112018383613ef3565b600082613faf57613faf613cf2565b500690565b600060208284031215613fc657600080fd5b815161120181613a34565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b60008060006060848603121561402157600080fd5b8351925060208401519150604084015190509250925092565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561408a5784516001600160a01b031683529383019391830191600101614065565b50506001600160a01b03969096166060850152505050608001529392505050565b6000602082840312156140bd57600080fd5b815161120181613a7556fea2646970667358221220676bd7cbc8702affd49604f8ce4bf8b3071dbeb0c2b865c6b48a105d46cfeee364736f6c63430008130033

Deployed Bytecode

0x6080604052600436106103d15760003560e01c80635e69c7f7116101fd57806398dada8711610118578063d038b07e116100ab578063ea08d30b1161007a578063ea08d30b14610adf578063eafb5a3c14610af5578063f6540ec714610b15578063f749cee214610b2b578063fb78680d14610b4b57600080fd5b8063d038b07e14610a4d578063d9e6646014610a63578063dc44b6a014610a83578063dd62ed3e14610a9957600080fd5b8063bf9e1464116100e7578063bf9e1464146109e1578063c49b9a8014610a01578063c5d2418914610a21578063c860795214610a3757600080fd5b806398dada871461096b578063a457c2d71461098b578063a9059cbb146109ab578063bbcea6bf146109cb57600080fd5b806371e078d511610190578063893d20e81161015f578063893d20e8146109185780638da5cb5b1461091857806395d89b41146109365780639616aa321461094b57600080fd5b806371e078d51461089357806380c581d1146108a957806388790a68146108c957806388f82020146108df57600080fd5b80636bc87c3a116101cc5780636bc87c3a146108325780636cbdd5e31461084857806370a082311461085e578063715018a61461087e57600080fd5b80635e69c7f7146107c757806364038409146107e757806364b0fdfa146107fd5780636612e66f1461081257600080fd5b8063313ce567116102ed5780634eeaf458116102805780635342acb41161024f5780635342acb41461072e578063571ac8b014610767578063575f18e51461078757806358fa63ca146107a757600080fd5b80634eeaf458146106b75780634ef3cce5146106d75780634fb2e45d146106ed57806350a8e0161461070d57600080fd5b806343b127a6116102bc57806343b127a614610640578063452ed4f11461066057806345e8c85c146106805780634a74bb021461069657600080fd5b8063313ce567146105c8578063384f6b51146105ea57806339509351146106005780633f3cf56c1461062057600080fd5b806313e461921161036557806322976e0d1161033457806322976e0d1461055257806323b872dd1461056857806326003957146105885780632d838119146105a857600080fd5b806313e46192146104f157806315639c1b1461051157806317eade331461052757806318160ddd1461053d57600080fd5b80630758d924116103a15780630758d92414610468578063095ea7b3146104885780630e954d8e146104b857806313114a9d146104dc57600080fd5b806299d386146103dd57806303fd2a45146103f45780630614117a1461043157806306fdde031461044657600080fd5b366103d857005b600080fd5b3480156103e957600080fd5b506103f2610b6b565b005b34801561040057600080fd5b50602a54610414906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561043d57600080fd5b506103f2610c42565b34801561045257600080fd5b5061045b610ca9565b60405161042891906139e6565b34801561047457600080fd5b50602754610414906001600160a01b031681565b34801561049457600080fd5b506104a86104a3366004613a49565b610d3b565b6040519015158152602001610428565b3480156104c457600080fd5b506104ce60205481565b604051908152602001610428565b3480156104e857600080fd5b506026546104ce565b3480156104fd57600080fd5b506103f261050c366004613a83565b610d52565b34801561051d57600080fd5b506104ce600d5481565b34801561053357600080fd5b506104ce60215481565b34801561054957600080fd5b506024546104ce565b34801561055e57600080fd5b506104ce600f5481565b34801561057457600080fd5b506104a8610583366004613abc565b611049565b34801561059457600080fd5b506103f26105a3366004613afd565b61109c565b3480156105b457600080fd5b506104ce6105c3366004613b1f565b611184565b3480156105d457600080fd5b5060225460405160ff9091168152602001610428565b3480156105f657600080fd5b506104ce601c5481565b34801561060c57600080fd5b506104a861061b366004613a49565b611208565b34801561062c57600080fd5b506103f261063b366004613afd565b61123f565b34801561064c57600080fd5b506103f261065b366004613b38565b611332565b34801561066c57600080fd5b50602854610414906001600160a01b031681565b34801561068c57600080fd5b506104ce60165481565b3480156106a257600080fd5b50602d546104a890600160a81b900460ff1681565b3480156106c357600080fd5b506103f26106d2366004613b38565b6113b8565b3480156106e357600080fd5b506104ce601d5481565b3480156106f957600080fd5b506103f2610708366004613b64565b61143e565b34801561071957600080fd5b506034546104a890600160a81b900460ff1681565b34801561073a57600080fd5b506104a8610749366004613b64565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561077357600080fd5b506104a8610782366004613b64565b6115df565b34801561079357600080fd5b506103f26107a2366004613b38565b6115ed565b3480156107b357600080fd5b50602b54610414906001600160a01b031681565b3480156107d357600080fd5b50603454610414906001600160a01b031681565b3480156107f357600080fd5b506104ce602f5481565b34801561080957600080fd5b506103f2611673565b34801561081e57600080fd5b506103f261082d366004613a83565b611be2565b34801561083e57600080fd5b506104ce600e5481565b34801561085457600080fd5b506104ce60185481565b34801561086a57600080fd5b506104ce610879366004613b64565b611c37565b34801561088a57600080fd5b506103f2611c96565b34801561089f57600080fd5b506104ce601f5481565b3480156108b557600080fd5b506103f26108c4366004613a83565b611d15565b3480156108d557600080fd5b506104ce60145481565b3480156108eb57600080fd5b506104a86108fa366004613b64565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561092457600080fd5b506000546001600160a01b0316610414565b34801561094257600080fd5b5061045b611dfd565b34801561095757600080fd5b506103f2610966366004613b64565b611e0c565b34801561097757600080fd5b506103f2610986366004613b38565b611eab565b34801561099757600080fd5b506104a86109a6366004613a49565b611ee3565b3480156109b757600080fd5b506104a86109c6366004613a49565b611f1a565b3480156109d757600080fd5b506104ce60135481565b3480156109ed57600080fd5b506103f26109fc366004613afd565b611f27565b348015610a0d57600080fd5b506103f2610a1c366004613b81565b611f5c565b348015610a2d57600080fd5b506104ce60125481565b348015610a4357600080fd5b506104ce60155481565b348015610a5957600080fd5b506104ce60105481565b348015610a6f57600080fd5b50602954610414906001600160a01b031681565b348015610a8f57600080fd5b506104ce60115481565b348015610aa557600080fd5b506104ce610ab4366004613b9e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610aeb57600080fd5b506104ce60175481565b348015610b0157600080fd5b506103f2610b10366004613b64565b611fde565b348015610b2157600080fd5b506104ce60315481565b348015610b3757600080fd5b506103f2610b46366004613b64565b61230e565b348015610b5757600080fd5b506103f2610b66366004613bcc565b6123ad565b6000546001600160a01b03163314610b9e5760405162461bcd60e51b8152600401610b9590613bfe565b60405180910390fd5b603454600160a01b900460ff1615610bf85760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642100000000000000006044820152606401610b95565b610c03306001610d52565b602854610c1a906001600160a01b03166001610d52565b6034805460ff60a01b1916600160a01b179055602d805460ff60a81b1916600160a81b179055565b6000546001600160a01b03163314610c6c5760405162461bcd60e51b8152600401610b9590613bfe565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610ca6573d6000803e3d6000fd5b50565b6060600b8054610cb890613c33565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce490613c33565b8015610d315780601f10610d0657610100808354040283529160200191610d31565b820191906000526020600020905b815481529060010190602001808311610d1457829003601f168201915b5050505050905090565b6000610d48338484612416565b5060015b92915050565b6000546001600160a01b03163314610d7c5760405162461bcd60e51b8152600401610b9590613bfe565b801515600103610eb0576001600160a01b03821660009081526007602052604090205460ff1615610def5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610b95565b6001600160a01b03821660009081526001602052604090205415610e49576001600160a01b038216600090815260016020526040902054610e2f90611184565b6001600160a01b0383166000908152600260205260409020555b506001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b801515600003611045576001600160a01b03821660009081526007602052604090205460ff16610f225760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610b95565b60005b60085481101561104357826001600160a01b031660088281548110610f4c57610f4c613c6d565b6000918252602090912001546001600160a01b0316036110315760088054610f7690600190613c99565b81548110610f8657610f86613c6d565b600091825260209091200154600880546001600160a01b039092169183908110610fb257610fb2613c6d565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600282526040808220829055600790925220805460ff19169055600880548061100a5761100a613cac565b600082815260209020810160001990810180546001600160a01b0319169055019055611043565b8061103b81613cc2565b915050610f25565b505b5050565b600061105684848461253a565b506001600160a01b03841660009081526005602090815260408083203380855292529091205461109291869161108d908690613c99565b612416565b5060019392505050565b6000546001600160a01b031633146110c65760405162461bcd60e51b8152600401610b9590613bfe565b600081836024546110d79190613cdb565b6110e19190613d08565b90506103e86024546110f39190613d08565b81101561115d5760405162461bcd60e51b815260206004820152603260248201527f4d61782057616c6c657420616d74206d7573742062652061626f766520302e31604482015271129037b3103a37ba30b61039bab838363c9760711b6064820152608401610b95565b6030819055600a548290611172908590613cdb565b61117c9190613d08565b603155505050565b60006025548211156111eb5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b95565b60006111f56129b7565b90506112018184613d08565b9392505050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610d4891859061108d908690613d1c565b6000546001600160a01b031633146112695760405162461bcd60e51b8152600401610b9590613bfe565b6000818360245461127a9190613cdb565b6112849190613d08565b90506103e86024546112969190613d08565b81101561130b5760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401610b95565b602e819055600a548290611320908590613cdb565b61132a9190613d08565b602f55505050565b6000546001600160a01b0316331461135c5760405162461bcd60e51b8152600401610b9590613bfe565b60195483111580156113705750601a548211155b801561137e5750601b548111155b61138757600080fd5b611324816113958486613d1c565b61139f9190613d1c565b11156113aa57600080fd5b601092909255601155601255565b6000546001600160a01b031633146113e25760405162461bcd60e51b8152600401610b9590613bfe565b60195483111580156113f65750601a548211155b80156114045750601b548111155b61140d57600080fd5b611af48161141b8486613d1c565b6114259190613d1c565b111561143057600080fd5b601392909255601455601555565b6000546001600160a01b031633146114685760405162461bcd60e51b8152600401610b9590613bfe565b6001600160a01b03811661148e5760405162461bcd60e51b8152600401610b9590613d2f565b602a546001600160a01b03908116908216036114bc5760405162461bcd60e51b8152600401610b9590613d2f565b600080546114d5916001600160a01b0390911690611be2565b6114e0816001611be2565b6114eb816001610d52565b600054602c546001600160a01b0391821691160361151f57602c80546001600160a01b0319166001600160a01b0383161790555b600054611534906001600160a01b0316611c37565b600080546001600160a01b03908116825260056020908152604080842086841685529091528220929092558054909161156d9116611c37565b111561159457600054611592906001600160a01b03168261158d82611c37565b61253a565b505b600080546001600160a01b0319166001600160a01b0383169081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000610d4c82600019610d3b565b6000546001600160a01b031633146116175760405162461bcd60e51b8152600401610b9590613bfe565b601954831115801561162b5750601a548211155b80156116395750601b548111155b61164257600080fd5b611324816116508486613d1c565b61165a9190613d1c565b111561166557600080fd5b601692909255601755601855565b6000546001600160a01b0316331461169d5760405162461bcd60e51b8152600401610b9590613bfe565b603a5460ff16156116ad57600080fd5b602d80546001600160a01b0319908116733cd365f42ad953114a1939b5315af432c57cef4917909155602c80549091167349135d5dee09beb0d6bed19b934268514d129adb179055604080518082019091526006815265115b1a5e105360d21b6020820152600b9061171f9082613df0565b506040805180820190915260048152631156105360e21b6020820152600c906117489082613df0565b5062989680600a556022805460ff1916601290811790915560235560235461177190600a613f94565b600a5461177e9190613cdb565b602481905561178f90600019613fa0565b61179b90600019613c99565b602555602954602780546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156117fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181e9190613fb4565b6001600160a01b031663c9c65396602760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561187f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a39190613fb4565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303816000875af11580156118ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119139190613fb4565b602880546001600160a01b0319166001600160a01b039283169081179091556000908152600360209081526040808320805460ff191660011790553083526005825280832060275490941683529290522060001990556024546103e89061197b90600a613cdb565b6119859190613d08565b602e55600a80546103e89161199a9190613cdb565b6119a49190613d08565b602f556024546103e8906119b990600a613cdb565b6119c39190613d08565b603055600a80546103e8916119d89190613cdb565b6119e29190613d08565b603155602454620186a0906119f8906005613cdb565b611a029190613d08565b60325560245461271090611a17906005613cdb565b611a219190613d08565b603355602954611a3c906001600160a01b0316600019610d3b565b50602d546001600160a01b03166000908152600660205260408120805460ff199081166001908117909255603a80549091168217905560255491611a886000546001600160a01b031690565b6001600160a01b03168152602081019190915260400160002055611ab46000546001600160a01b031690565b602b546024546040519081526001600160a01b0392831692909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3602754611b179030906001600160a01b0316600019612416565b611b42611b2c6000546001600160a01b031690565b3061158d6108796000546001600160a01b031690565b506027546001600160a01b031663f305d7194730611b5f81611c37565b600080611b746000546001600160a01b031690565b426040518863ffffffff1660e01b8152600401611b9696959493929190613fd1565b60606040518083038185885af1158015611bb4573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611bd9919061400c565b50504360395550565b6000546001600160a01b03163314611c0c5760405162461bcd60e51b8152600401610b9590613bfe565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6001600160a01b03811660009081526007602052604081205460ff1615611c7457506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610d4c90611184565b6000546001600160a01b03163314611cc05760405162461bcd60e51b8152600401610b9590613bfe565b60008054611cd9916001600160a01b0390911690611be2565b600080546001600160a01b031916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6000546001600160a01b03163314611d3f5760405162461bcd60e51b8152600401610b9590613bfe565b801515600003611d6b57506001600160a01b03166000908152600360205260409020805460ff19169055565b60045415611dd25762093a8060045442611d859190613c99565b11611dd25760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f74207365742061206e657720706169722074686973207765656b216044820152606401610b95565b6001600160a01b0382166000908152600360205260409020805460ff19166001179055426004555050565b6060600c8054610cb890613c33565b6000546001600160a01b03163314611e365760405162461bcd60e51b8152600401610b9590613bfe565b602c546001600160a01b03808316911603611e895760405162461bcd60e51b815260206004820152601360248201527257616c6c657420616c7265616479207365742160681b6044820152606401610b95565b602c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611ed55760405162461bcd60e51b8152600401610b9590613bfe565b601f92909255602055602155565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610d4891859061108d908690613c99565b600061109233848461253a565b6000546001600160a01b03163314611f515760405162461bcd60e51b8152600401610b9590613bfe565b601c91909155601d55565b6000546001600160a01b03163314611f865760405162461bcd60e51b8152600401610b9590613bfe565b602d8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611fd390831515815260200190565b60405180910390a150565b6000546001600160a01b031633146120085760405162461bcd60e51b8152600401610b9590613bfe565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561204d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120719190613fb4565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e29190613fb4565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa15801561212d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121519190613fb4565b90506001600160a01b0381166122ca57816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561219f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c39190613fb4565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612210573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122349190613fb4565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015612281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a59190613fb4565b602880546001600160a01b0319166001600160a01b03929092169190911790556122e6565b602880546001600160a01b0319166001600160a01b0383161790555b602780546001600160a01b0319166001600160a01b0384161790556110433084600019612416565b6000546001600160a01b031633146123385760405162461bcd60e51b8152600401610b9590613bfe565b602d546001600160a01b0380831691160361238b5760405162461bcd60e51b815260206004820152601360248201527257616c6c657420616c7265616479207365742160681b6044820152606401610b95565b602d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146123d75760405162461bcd60e51b8152600401610b9590613bfe565b82846024546123e69190613cdb565b6123f09190613d08565b6032556024548190612403908490613cdb565b61240d9190613d08565b60335550505050565b6001600160a01b0383166124785760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b95565b6001600160a01b0382166124d95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b95565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160a01b0384166125a05760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b95565b6001600160a01b0383166126025760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b95565b600082116126645760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610b95565b61266e84846129da565b1561289557603454600160a01b900460ff166126cc5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610b95565b60375460ff161561277e576001600160a01b03841660009081526003602052604090205460ff161561273d576001600160a01b03831660009081526038602052604090205443900361271d57600080fd5b6001600160a01b038316600090815260386020526040902043905561277e565b6001600160a01b03841660009081526038602052604090205443900361276257600080fd5b6001600160a01b03841660009081526038602052604090204390555b602e548211156127e15760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610b95565b6029546001600160a01b0384811691161480159061281857506001600160a01b03831660009081526003602052604090205460ff16155b15612895576030548261282a85611c37565b6128349190613d1c565b11156128955760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201526930b63632ba29b4bd329760b11b6064820152608401610b95565b6001600160a01b03841660009081526006602052604090205460019060ff16806128d757506001600160a01b03841660009081526006602052604090205460ff165b156128e0575060005b6001600160a01b03841660009081526003602052604090205460ff16156129a257602d54600160a01b900460ff161580156129245750602d54600160a81b900460ff165b801561294957506001600160a01b03851660009081526006602052604090205460ff16155b801561296e57506001600160a01b03841660009081526006602052604090205460ff16155b156129a257600061297e30611c37565b905060325481106129a057603354811061299757506033545b6129a081612a9a565b505b6129ae85858584612e2c565b95945050505050565b60008060006129c46131c1565b90925090506129d38183613d08565b9250505090565b600080546001600160a01b03848116911614801590612a0757506000546001600160a01b03838116911614155b8015612a2c57506001600160a01b03821660009081526009602052604090205460ff16155b8015612a5157506001600160a01b03831660009081526009602052604090205460ff16155b8015612a6b5750602a546001600160a01b03838116911614155b8015612a7f57506001600160a01b03821615155b801561120157506001600160a01b0383163014159392505050565b602d805460ff60a01b1916600160a01b179055601d54601c54612abd9190613d1c565b15612e1c5760006002601d54601c54612ad69190613d1c565b601c54612ae39085613cdb565b612aed9190613d08565b612af79190613d08565b90506000612b058284613c99565b60408051600280825260608201835292935060009290916020830190803683370190505090503081600081518110612b3f57612b3f613c6d565b6001600160a01b03928316602091820292909201810191909152602754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbc9190613fb4565b81600181518110612bcf57612bcf613c6d565b6001600160a01b03928316602091820292909201015260275460405163791ac94760e01b815291169063791ac94790612c1590859060009086903090429060040161403a565b600060405180830381600087803b158015612c2f57600080fd5b505af1158015612c43573d6000803e3d6000fd5b5050505060006002601d54601c54612c5b9190613d1c565b601c54612c689047613cdb565b612c729190613d08565b612c7c9190613d08565b90508315612d4c57602754602a5460405163f305d71960e01b81526001600160a01b039283169263f305d719928592612cc49230928b92600092839216904290600401613fd1565b60606040518083038185885af1158015612ce2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d07919061400c565b505060408051868152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a15b6000612d588587613c99565b1115612e1757601f546021544791600091612d739084613d08565b612d7d9190613cdb565b9050600060205460215484612d929190613d08565b612d9c9190613cdb565b602d546040519192506001600160a01b03169083156108fc029084906000818181858888f19350505050158015612dd7573d6000803e3d6000fd5b50602c546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612e12573d6000803e3d6000fd5b505050505b505050505b50602d805460ff60a01b19169055565b603454600090600160a81b900460ff16612ec457612e4a8585613344565b603454600160a81b900460ff16158015612e695750612e6985856129da565b15612ec45760405162461bcd60e51b815260206004820152602560248201527f4f6e6c79206f776e65722063616e207472616e736665722061742074686973206044820152643a34b6b29760d91b6064820152608401610b95565b6000612ed286868686613459565b905083612ede87611c37565b106131b55760808101516001600160a01b038716600090815260016020526040902054612f0b9190613c99565b6001600160a01b0380881660009081526001602052604080822093909355606084015191881681529190912054612f429190613d1c565b6001600160a01b0380871660009081526001602090815260408083209490945591891681526007909152205460ff168015612f9657506001600160a01b03851660009081526007602052604090205460ff16155b15612fdd576001600160a01b038616600090815260026020526040902054612fbf908590613c99565b6001600160a01b03871660009081526002602052604090205561311d565b6001600160a01b03861660009081526007602052604090205460ff1615801561301e57506001600160a01b03851660009081526007602052604090205460ff165b156130665780516001600160a01b0386166000908152600260205260409020546130489190613d1c565b6001600160a01b03861660009081526002602052604090205561311d565b6001600160a01b03861660009081526007602052604090205460ff1680156130a657506001600160a01b03851660009081526007602052604090205460ff165b1561311d576001600160a01b0386166000908152600260205260409020546130cf908590613c99565b6001600160a01b03808816600090815260026020526040808220939093558351918816815291909120546131039190613d1c565b6001600160a01b0386166000908152600260205260409020555b60408101511561313557613135868260400151613649565b60008160a00151118061314c575060008160200151115b15613163576131638160a001518260200151613715565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83600001516040516131ac91815260200190565b60405180910390a35b50600195945050505050565b6025546024546000918291825b600854811015613313578260016000600884815481106131f0576131f0613c6d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061325b575081600260006008848154811061323457613234613c6d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561327157602554602454945094505050509091565b600160006008838154811061328857613288613c6d565b60009182526020808320909101546001600160a01b031683528201929092526040019020546132b79084613c99565b925060026000600883815481106132d0576132d0613c6d565b60009182526020808320909101546001600160a01b031683528201929092526040019020546132ff9083613c99565b91508061330b81613cc2565b9150506131ce565b506024546025546133249190613d08565b82101561333b576025546024549350935050509091565b90939092509050565b603454600160a81b900460ff16156133aa5760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201526232b21760e91b6064820152608401610b95565b6133b482826129da565b1580156133ce57506028546001600160a01b038281169116145b15611045576001600160a01b0382166000908152600960209081526040918290208054600160ff19909116811790915560348054600160a81b60ff60a81b19918216811790925542603655602d8054909116909117905591519182527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159910160405180910390a15050565b6134926040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6134cb6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60006134d7878761373b565b90506134e38186613cdb565b608083015283156135f3576001600160a01b03861660009081526003602052604090205460ff161561352657601354600d55601454600e55601554600f55613571565b6001600160a01b03871660009081526003602052604090205460ff161561355e57601054600d55601154600e55601254600f55613571565b601654600d55601754600e55601854600f555b601e54600d546135819087613cdb565b61358b9190613d08565b6020830152601e54600f54600e546135a39190613d1c565b6135ad9087613cdb565b6135b79190613d08565b6040830181905260208301516135cd9190613d1c565b6135d79086613c99565b825260208201516135e9908290613cdb565b60a083015261360c565b6000602083018190526040830181905285835260a08301525b80826040015161361c9190613cdb565b8260a0015161362b9190613d1c565b826080015161363a9190613c99565b60608301525095945050505050565b60006136536129b7565b905060006136618284613cdb565b3060009081526001602052604090205490915061367f908290613d1c565b3060009081526001602090815260408083209390935560079052205460ff16156136cf57306000908152600260205260409020546136be908490613d1c565b306000908152600260205260409020555b60405183815230906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b816025546137239190613c99565b602555602654613734908290613d1c565b6026555050565b600080600061374a8585613759565b90925090506129ae8183613d08565b602554602454603454600092839290916001600160a01b0316156137f15760345460405163a1eacb4b60e01b81526001600160a01b03888116600483015287811660248301529091169063a1eacb4b906044016020604051808303816000875af11580156137cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ef91906140ab565b505b6137fa86611c37565b15801561381f57506001600160a01b03861660009081526006602052604090205460ff165b1561386757603480546001600160a01b0319166001600160a01b0387811691821790925560285490911660009081526005602090815260408083209383529290522060001990555b60005b6008548110156139b05782600160006008848154811061388c5761388c613c6d565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806138f757508160026000600884815481106138d0576138d0613c6d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561390e57602554602454945094505050506139df565b600160006008838154811061392557613925613c6d565b60009182526020808320909101546001600160a01b031683528201929092526040019020546139549084613c99565b9250600260006008838154811061396d5761396d613c6d565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461399c9083613c99565b9150806139a881613cc2565b91505061386a565b506024546025546139c19190613d08565b8210156139d9576025546024549350935050506139df565b90925090505b9250929050565b600060208083528351808285015260005b81811015613a13578581018301518582016040015282016139f7565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610ca657600080fd5b60008060408385031215613a5c57600080fd5b8235613a6781613a34565b946020939093013593505050565b8015158114610ca657600080fd5b60008060408385031215613a9657600080fd5b8235613aa181613a34565b91506020830135613ab181613a75565b809150509250929050565b600080600060608486031215613ad157600080fd5b8335613adc81613a34565b92506020840135613aec81613a34565b929592945050506040919091013590565b60008060408385031215613b1057600080fd5b50508035926020909101359150565b600060208284031215613b3157600080fd5b5035919050565b600080600060608486031215613b4d57600080fd5b505081359360208301359350604090920135919050565b600060208284031215613b7657600080fd5b813561120181613a34565b600060208284031215613b9357600080fd5b813561120181613a75565b60008060408385031215613bb157600080fd5b8235613bbc81613a34565b91506020830135613ab181613a34565b60008060008060808587031215613be257600080fd5b5050823594602084013594506040840135936060013592509050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680613c4757607f821691505b602082108103613c6757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610d4c57610d4c613c83565b634e487b7160e01b600052603160045260246000fd5b600060018201613cd457613cd4613c83565b5060010190565b8082028115828204841417610d4c57610d4c613c83565b634e487b7160e01b600052601260045260246000fd5b600082613d1757613d17613cf2565b500490565b80820180821115610d4c57610d4c613c83565b6020808252603d908201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660408201527f6572206f776e657220746f20746865207a65726f20616464726573732e000000606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f82111561104357600081815260208120601f850160051c81016020861015613dc95750805b601f850160051c820191505b81811015613de857828155600101613dd5565b505050505050565b815167ffffffffffffffff811115613e0a57613e0a613d8c565b613e1e81613e188454613c33565b84613da2565b602080601f831160018114613e535760008415613e3b5750858301515b600019600386901b1c1916600185901b178555613de8565b600085815260208120601f198616915b82811015613e8257888601518255948401946001909101908401613e63565b5085821015613ea05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600181815b80851115613eeb578160001904821115613ed157613ed1613c83565b80851615613ede57918102915b93841c9390800290613eb5565b509250929050565b600082613f0257506001610d4c565b81613f0f57506000610d4c565b8160018114613f255760028114613f2f57613f4b565b6001915050610d4c565b60ff841115613f4057613f40613c83565b50506001821b610d4c565b5060208310610133831016604e8410600b8410161715613f6e575081810a610d4c565b613f788383613eb0565b8060001904821115613f8c57613f8c613c83565b029392505050565b60006112018383613ef3565b600082613faf57613faf613cf2565b500690565b600060208284031215613fc657600080fd5b815161120181613a34565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b60008060006060848603121561402157600080fd5b8351925060208401519150604084015190509250925092565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561408a5784516001600160a01b031683529383019391830191600101614065565b50506001600160a01b03969096166060850152505050608001529392505050565b6000602082840312156140bd57600080fd5b815161120181613a7556fea2646970667358221220676bd7cbc8702affd49604f8ce4bf8b3071dbeb0c2b865c6b48a105d46cfeee364736f6c63430008130033

Deployed Bytecode Sourcemap

8760:26437:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15001:283;;;;;;;;;;;;;:::i;:::-;;10762:64;;;;;;;;;;-1:-1:-1;10762:64:0;;;;-1:-1:-1;;;;;10762:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;10762:64:0;;;;;;;;34651:108;;;;;;;;;;;;;:::i;17521:71::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10633:35::-;;;;;;;;;;-1:-1:-1;10633:35:0;;;;-1:-1:-1;;;;;10633:35:0;;;19190:161;;;;;;;;;;-1:-1:-1;19190:161:0;;;;;:::i;:::-;;:::i;:::-;;;1630:14:1;;1623:22;1605:41;;1593:2;1578:18;19190:161:0;1465:187:1;10350:27:0;;;;;;;;;;;;;;;;;;;1803:25:1;;;1791:2;1776:18;10350:27:0;1657:177:1;24802:87:0;;;;;;;;;;-1:-1:-1;24871:10:0;;24802:87;;23888:906;;;;;;;;;;-1:-1:-1;23888:906:0;;;;;:::i;:::-;;:::i;9483:30::-;;;;;;;;;;;;;;;;10384:31;;;;;;;;;;;;;;;;17274:83;;;;;;;;;;-1:-1:-1;17347:7:0;;17274:83;;9559:34;;;;;;;;;;;;;;;;19487:266;;;;;;;;;;-1:-1:-1;19487:266:0;;;;;:::i;:::-;;:::i;22527:340::-;;;;;;;;;;-1:-1:-1;22527:340:0;;;;;:::i;:::-;;:::i;25229:250::-;;;;;;;;;;-1:-1:-1;25229:250:0;;;;;:::i;:::-;;:::i;17363:71::-;;;;;;;;;;-1:-1:-1;17422:9:0;;17363:71;;17422:9;;;;3390:36:1;;3378:2;3363:18;17363:71:0;3248:184:1;10177:34:0;;;;;;;;;;;;;;;;19761:215;;;;;;;;;;-1:-1:-1;19761:215:0;;;;;:::i;:::-;;:::i;22179:340::-;;;;;;;;;;-1:-1:-1;22179:340:0;;;;;:::i;:::-;;:::i;20476:433::-;;;;;;;;;;-1:-1:-1;20476:433:0;;;;;:::i;:::-;;:::i;10675:21::-;;;;;;;;;;-1:-1:-1;10675:21:0;;;;-1:-1:-1;;;;;10675:21:0;;;9897:38;;;;;;;;;;;;;;;;11023:41;;;;;;;;;;-1:-1:-1;11023:41:0;;;;-1:-1:-1;;;11023:41:0;;;;;;20917:437;;;;;;;;;;-1:-1:-1;20917:437:0;;;;;:::i;:::-;;:::i;10218:37::-;;;;;;;;;;;;;;;;15924:795;;;;;;;;;;-1:-1:-1;15924:795:0;;;;;:::i;:::-;;:::i;11360:36::-;;;;;;;;;;-1:-1:-1;11360:36:0;;;;-1:-1:-1;;;11360:36:0;;;;;;20345:123;;;;;;;;;;-1:-1:-1;20345:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;20433:27:0;20409:4;20433:27;;;:18;:27;;;;;;;;;20345:123;19359:120;;;;;;;;;;-1:-1:-1;19359:120:0;;;;;:::i;:::-;;:::i;21362:455::-;;;;;;;;;;-1:-1:-1;21362:455:0;;;;;:::i;:::-;;:::i;10833:64::-;;;;;;;;;;-1:-1:-1;10833:64:0;;;;-1:-1:-1;;;;;10833:64:0;;;11294:21;;;;;;;;;;-1:-1:-1;11294:21:0;;;;-1:-1:-1;;;;;11294:21:0;;;11112:28;;;;;;;;;;;;;;;;13124:1869;;;;;;;;;;;;;:::i;23748:132::-;;;;;;;;;;-1:-1:-1;23748:132:0;;;;;:::i;:::-;;:::i;9520:32::-;;;;;;;;;;;;;;;;9989:40;;;;;;;;;;;;;;;;17816:198;;;;;;;;;;-1:-1:-1;17816:198:0;;;;;:::i;:::-;;:::i;16727:194::-;;;;;;;;;;;;;:::i;10313:30::-;;;;;;;;;;;;;;;;18583:424;;;;;;;;;;-1:-1:-1;18583:424:0;;;;;:::i;:::-;;:::i;9803:36::-;;;;;;;;;;;;;;;;20217:120;;;;;;;;;;-1:-1:-1;20217:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;20309:20:0;20285:4;20309:20;;;:11;:20;;;;;;;;;20217:120;17598:71;;;;;;;;;;-1:-1:-1;17641:7:0;15902:6;-1:-1:-1;;;;;15902:6:0;17598:71;;17440:75;;;;;;;;;;;;;:::i;23376:187::-;;;;;;;;;;-1:-1:-1;23376:187:0;;;;;:::i;:::-;;:::i;21825:166::-;;;;;;;;;;-1:-1:-1;21825:166:0;;;;;:::i;:::-;;:::i;19984:225::-;;;;;;;;;;-1:-1:-1;19984:225:0;;;;;:::i;:::-;;:::i;19015:167::-;;;;;;;;;;-1:-1:-1;19015:167:0;;;;;:::i;:::-;;:::i;9762:34::-;;;;;;;;;;;;;;;;21999:172;;;;;;;;;;-1:-1:-1;21999:172:0;;;;;:::i;:::-;;:::i;23569:171::-;;;;;;;;;;-1:-1:-1;23569:171:0;;;;;:::i;:::-;;:::i;9706:47::-;;;;;;;;;;;;;;;;9846:38;;;;;;;;;;;;;;;;9602:43;;;;;;;;;;;;;;;;10724:29;;;;;;;;;;-1:-1:-1;10724:29:0;;;;-1:-1:-1;;;;;10724:29:0;;;9652:47;;;;;;;;;;;;;;;;17675:133;;;;;;;;;;-1:-1:-1;17675:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;17777:19:0;;;17759:7;17777:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;17675:133;9942:40;;;;;;;;;;;;;;;;18022:553;;;;;;;;;;-1:-1:-1;18022:553:0;;;;;:::i;:::-;;:::i;11186:30::-;;;;;;;;;;;;;;;;23172:196;;;;;;;;;;-1:-1:-1;23172:196:0;;;;;:::i;:::-;;:::i;22875:289::-;;;;;;;;;;-1:-1:-1;22875:289:0;;;;;:::i;:::-;;:::i;15001:283::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;;;;;;;;;15061:14:::1;::::0;-1:-1:-1;;;15061:14:0;::::1;;;15060:15;15052:52;;;::::0;-1:-1:-1;;;15052:52:0;;5862:2:1;15052:52:0::1;::::0;::::1;5844:21:1::0;5901:2;5881:18;;;5874:30;5940:26;5920:18;;;5913:54;5984:18;;15052:52:0::1;5660:348:1::0;15052:52:0::1;15115:42;15145:4;15152;15115:21;:42::i;:::-;15190:6;::::0;15168:35:::1;::::0;-1:-1:-1;;;;;15190:6:0::1;::::0;15168:21:::1;:35::i;:::-;15216:14;:21:::0;;-1:-1:-1;;;;15216:21:0::1;-1:-1:-1::0;;;15216:21:0::1;::::0;;15248::::1;:28:::0;;-1:-1:-1;;;;15248:28:0::1;-1:-1:-1::0;;;15248:28:0::1;::::0;;15001:283::o;34651:108::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;15875:7;15902:6;;34703:48:::1;::::0;-1:-1:-1;;;;;15902:6:0;;;;34729:21:::1;34703:48:::0;::::1;;;::::0;34729:21;;34703:48;15875:7;34703:48;34729:21;15902:6;34703:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;34651:108::o:0;17521:71::-;17560:13;17584:5;17577:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17521:71;:::o;19190:161::-;19265:4;19282:39;636:10;19305:7;19314:6;19282:8;:39::i;:::-;-1:-1:-1;19339:4:0;19190:161;;;;;:::o;23888:906::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;23982:15;::::1;;23993:4;23982:15:::0;23978:809:::1;;-1:-1:-1::0;;;;;24023:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;24022:21;24014:62;;;::::0;-1:-1:-1;;;24014:62:0;;6600:2:1;24014:62:0::1;::::0;::::1;6582:21:1::0;6639:2;6619:18;;;6612:30;6678;6658:18;;;6651:58;6726:18;;24014:62:0::1;6398:352:1::0;24014:62:0::1;-1:-1:-1::0;;;;;24094:16:0;::::1;24113:1;24094:16:::0;;;:7:::1;:16;::::0;;;;;:20;24091:116:::1;;-1:-1:-1::0;;;;;24174:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;24154:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;24135:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;24091:116:::1;-1:-1:-1::0;;;;;;24221:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;24221:27:0::1;24244:4;24221:27:::0;;::::1;::::0;;;24263:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;24263:23:0::1;::::0;;::::1;::::0;;23888:906::o;23978:809::-:1;24308:16:::0;::::1;;24319:5;24308:16:::0;24304:483:::1;;-1:-1:-1::0;;;;;24349:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;24341:61;;;::::0;-1:-1:-1;;;24341:61:0;;6957:2:1;24341:61:0::1;::::0;::::1;6939:21:1::0;6996:2;6976:18;;;6969:30;7035;7015:18;;;7008:58;7083:18;;24341:61:0::1;6755:352:1::0;24341:61:0::1;24422:9;24417:359;24441:9;:16:::0;24437:20;::::1;24417:359;;;24503:7;-1:-1:-1::0;;;;;24487:23:0::1;:9;24497:1;24487:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;24487:12:0::1;:23:::0;24483:278:::1;;24550:9;24560:16:::0;;:20:::1;::::0;24579:1:::1;::::0;24560:20:::1;:::i;:::-;24550:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;24535:9:::1;:12:::0;;-1:-1:-1;;;;;24550:31:0;;::::1;::::0;24545:1;;24535:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;24535:46:0::1;-1:-1:-1::0;;;;;24535:46:0;;::::1;;::::0;;24604:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;24647:11:::1;:20:::0;;;;:28;;-1:-1:-1;;24647:28:0::1;::::0;;24698:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;24698:15:0;;;;;-1:-1:-1;;;;;;24698:15:0::1;::::0;;;;;24736:5:::1;;24483:278;24459:3:::0;::::1;::::0;::::1;:::i;:::-;;;;24417:359;;;;24304:483;23888:906:::0;;:::o;19487:266::-;19585:4;19602:36;19612:6;19620:9;19631:6;19602:9;:36::i;:::-;-1:-1:-1;;;;;;19680:19:0;;;;;;:11;:19;;;;;;;;636:10;19680:33;;;;;;;;;19649:74;;19658:6;;19680:42;;19716:6;;19680:42;:::i;:::-;19649:8;:74::i;:::-;-1:-1:-1;19741:4:0;19487:266;;;;;:::o;22527:340::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;22617:13:::1;22655:7;22644;22634;;:17;;;;:::i;:::-;22633:29;;;;:::i;:::-;22617:45;;22701:4;22691:7;;:14;;;;:::i;:::-;22681:5;:25;;22673:88;;;::::0;-1:-1:-1;;;22673:88:0;;8413:2:1;22673:88:0::1;::::0;::::1;8395:21:1::0;8452:2;8432:18;;;8425:30;8491:34;8471:18;;;8464:62;-1:-1:-1;;;8542:18:1;;;8535:48;8600:19;;22673:88:0::1;8211:414:1::0;22673:88:0::1;22772:14;:22:::0;;;22824:14:::1;::::0;22852:7;;22824:24:::1;::::0;22841:7;;22824:24:::1;:::i;:::-;22823:36;;;;:::i;:::-;22805:15;:54:::0;-1:-1:-1;;;22527:340:0:o;25229:250::-;25295:7;25334;;25323;:18;;25315:73;;;;-1:-1:-1;;;25315:73:0;;8832:2:1;25315:73:0;;;8814:21:1;8871:2;8851:18;;;8844:30;8910:34;8890:18;;;8883:62;-1:-1:-1;;;8961:18:1;;;8954:40;9011:19;;25315:73:0;8630:406:1;25315:73:0;25399:19;25422:10;:8;:10::i;:::-;25399:33;-1:-1:-1;25450:21:0;25399:33;25450:7;:21;:::i;:::-;25443:28;25229:250;-1:-1:-1;;;25229:250:0:o;19761:215::-;636:10;19849:4;19898:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19898:34:0;;;;;;;;;;19849:4;;19866:80;;19889:7;;19898:47;;19935:10;;19898:47;:::i;22179:340::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;22268:13:::1;22306:7;22295;22285;;:17;;;;:::i;:::-;22284:29;;;;:::i;:::-;22268:45;;22352:4;22342:7;;:14;;;;:::i;:::-;22332:5;:25;;22324:93;;;::::0;-1:-1:-1;;;22324:93:0;;9373:2:1;22324:93:0::1;::::0;::::1;9355:21:1::0;9412:2;9392:18;;;9385:30;9451:34;9431:18;;;9424:62;9522:25;9502:18;;;9495:53;9565:19;;22324:93:0::1;9171:419:1::0;22324:93:0::1;22428:12;:20:::0;;;22476:14:::1;::::0;22504:7;;22476:24:::1;::::0;22493:7;;22476:24:::1;:::i;:::-;22475:36;;;;:::i;:::-;22459:13;:52:::0;-1:-1:-1;;;22179:340:0:o;20476:433::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;20599:13:::1;;20588:7;:24;;:73;;;;;20646:15;;20633:9;:28;;20588:73;:122;;;;;20695:15;;20682:9;:28;;20588:122;20580:149;;;::::0;::::1;;20783:4;20770:9:::0;20748:19:::1;20758:9:::0;20748:7;:19:::1;:::i;:::-;:31;;;;:::i;:::-;:39;;20740:48;;;::::0;::::1;;20799:14;:24:::0;;;;20834:16:::1;:28:::0;20873:16:::1;:28:::0;20476:433::o;20917:437::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;21041:13:::1;;21030:7;:24;;:73;;;;;21088:15;;21075:9;:28;;21030:73;:122;;;;;21137:15;;21124:9;:28;;21030:122;21022:149;;;::::0;::::1;;21225:4;21212:9:::0;21190:19:::1;21200:9:::0;21190:7;:19:::1;:::i;:::-;:31;;;;:::i;:::-;:39;;21182:48;;;::::0;::::1;;21241:15;:25:::0;;;;21277:17:::1;:29:::0;21317:17:::1;:29:::0;20917:437::o;15924:795::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16005:22:0;::::1;15997:96;;;;-1:-1:-1::0;;;15997:96:0::1;;;;;;;:::i;:::-;16124:4;::::0;-1:-1:-1;;;;;16124:4:0;;::::1;16112:16:::0;;::::1;::::0;16104:90:::1;;;;-1:-1:-1::0;;;16104:90:0::1;;;;;;;:::i;:::-;16224:6;::::0;;16205:33:::1;::::0;-1:-1:-1;;;;;16224:6:0;;::::1;::::0;16205:18:::1;:33::i;:::-;16249:34;16268:8;16278:4;16249:18;:34::i;:::-;16294:37;16316:8;16326:4;16294:21;:37::i;:::-;16378:6;::::0;16356:10:::1;::::0;-1:-1:-1;;;;;16378:6:0;;::::1;16356:10:::0;::::1;:29:::0;16352:78:::1;;16400:10;:30:::0;;-1:-1:-1;;;;;;16400:30:0::1;-1:-1:-1::0;;;;;16400:30:0;::::1;;::::0;;16352:78:::1;16493:6;::::0;16483:17:::1;::::0;-1:-1:-1;;;;;16493:6:0::1;16483:9;:17::i;:::-;16451:19;16463:6:::0;;-1:-1:-1;;;;;16463:6:0;;::::1;16451:19:::0;;:11:::1;:19;::::0;;;;;;;:29;;::::1;::::0;;;;;;;:49;;;;16524:6;;16451:19;;16514:17:::1;::::0;16524:6:::1;16514:9;:17::i;:::-;:21;16511:99;;;16562:6;::::0;16552:46:::1;::::0;-1:-1:-1;;;;;16562:6:0::1;16570:8:::0;16580:17:::1;16562:6:::0;16580:9:::1;:17::i;:::-;16552:9;:46::i;:::-;;16511:99;16630:6;:17:::0;;-1:-1:-1;;;;;;16630:17:0::1;-1:-1:-1::0;;;;;16630:17:0;::::1;::::0;;::::1;::::0;;16663:38:::1;::::0;16630:17;;;;16663:38:::1;::::0;16630:6;16663:38:::1;15924:795:::0;:::o;19359:120::-;19412:4;19436:35;19444:7;-1:-1:-1;;19436:7:0;:35::i;21362:455::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;21492:13:::1;;21481:7;:24;;:73;;;;;21539:15;;21526:9;:28;;21481:73;:122;;;;;21588:15;;21575:9;:28;;21481:122;21473:149;;;::::0;::::1;;21676:4;21663:9:::0;21641:19:::1;21651:9:::0;21641:7;:19:::1;:::i;:::-;:31;;;;:::i;:::-;:39;;21633:48;;;::::0;::::1;;21692:19;:29:::0;;;;21732:21:::1;:33:::0;21776:21:::1;:33:::0;21362:455::o;13124:1869::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;13186:19:::1;::::0;::::1;;13185:20;13177:29;;;::::0;::::1;;13219:13;:67:::0;;-1:-1:-1;;;;;;13219:67:0;;::::1;13243:42;13219:67;::::0;;;13297:10:::1;:64:::0;;;;::::1;13318:42;13297:64;::::0;;13374:16:::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;13374:16:0::1;::::0;::::1;::::0;:5:::1;::::0;:16:::1;::::0;:5;:16:::1;:::i;:::-;-1:-1:-1::0;13401:16:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;13401:16:0::1;::::0;::::1;::::0;:7:::1;::::0;:16:::1;::::0;:7;:16:::1;:::i;:::-;-1:-1:-1::0;13445:10:0::1;13428:14;:27:::0;13516:9:::1;:14:::0;;-1:-1:-1;;13516:14:0::1;13528:2;13516:14:::0;;::::1;::::0;;;13545:12:::1;:24:::0;13708:12:::1;::::0;13704:16:::1;::::0;:2:::1;:16;:::i;:::-;13686:14;;:35;;;;:::i;:::-;13676:7;:45:::0;;;13750:13:::1;::::0;-1:-1:-1;;13750:13:0::1;:::i;:::-;13743:21;::::0;-1:-1:-1;;13743:21:0::1;:::i;:::-;13732:7;:33:::0;13809:14:::1;::::0;13778:9:::1;:46:::0;;-1:-1:-1;;;;;;13778:46:0::1;-1:-1:-1::0;;;;;13809:14:0;;::::1;13778:46:::0;;::::1;::::0;;13862:19:::1;::::0;;-1:-1:-1;;;13862:19:0;;;;:17:::1;::::0;:19:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;13809:14;13862:19:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;13844:49:0::1;;13894:9;;;;;;;;;-1:-1:-1::0;;;;;13894:9:0::1;-1:-1:-1::0;;;;;13894:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13844:82;::::0;-1:-1:-1;;;;;;13844:82:0::1;::::0;;;;;;-1:-1:-1;;;;;14338:15:1;;;13844:82:0::1;::::0;::::1;14320:34:1::0;13920:4:0::1;14370:18:1::0;;;14363:43;14255:18;;13844:82:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13835:6;:91:::0;;-1:-1:-1;;;;;;13835:91:0::1;-1:-1:-1::0;;;;;13835:91:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;13937:15:0;;;:7:::1;:15;::::0;;;;;;;:22;;-1:-1:-1;;13937:22:0::1;-1:-1:-1::0;13937:22:0::1;::::0;;13990:4:::1;13970:26:::0;;:11:::1;:26:::0;;;;;14005:9:::1;::::0;;;::::1;13970:46:::0;;;;;;-1:-1:-1;;13970:66:0;;14073:7:::1;::::0;14089:4:::1;::::0;14073:12:::1;::::0;14083:2:::1;14073:12;:::i;:::-;14072:21;;;;:::i;:::-;14057:12;:36:::0;14121:14:::1;::::0;;14144:4:::1;::::0;14121:19:::1;::::0;:14;:19:::1;:::i;:::-;14120:28;;;;:::i;:::-;14104:13;:44:::0;14177:7:::1;::::0;14193:4:::1;::::0;14177:12:::1;::::0;14187:2:::1;14177:12;:::i;:::-;14176:21;;;;:::i;:::-;14159:14;:38:::0;14227:14:::1;::::0;;14250:4:::1;::::0;14227:19:::1;::::0;:14;:19:::1;:::i;:::-;14226:28;;;;:::i;:::-;14208:15;:46:::0;14282:7:::1;::::0;14297:6:::1;::::0;14282:11:::1;::::0;14292:1:::1;14282:11;:::i;:::-;14281:22;;;;:::i;:::-;14265:13;:38:::0;14328:7:::1;::::0;14343:5:::1;::::0;14328:11:::1;::::0;14338:1:::1;14328:11;:::i;:::-;14327:21;;;;:::i;:::-;14314:10;:34:::0;14369:14:::1;::::0;14361:42:::1;::::0;-1:-1:-1;;;;;14369:14:0::1;-1:-1:-1::0;;14361:7:0::1;:42::i;:::-;-1:-1:-1::0;14433:13:0::1;::::0;-1:-1:-1;;;;;14433:13:0::1;14414:33;::::0;;;:18:::1;:33;::::0;;;;:40;;-1:-1:-1;;14414:40:0;;::::1;14450:4;14414:40:::0;;::::1;::::0;;;14467:19:::1;:26:::0;;;;::::1;::::0;::::1;::::0;;14523:7:::1;::::0;;14512::::1;15875::::0;15902:6;-1:-1:-1;;;;;15902:6:0;;15837:79;14512:7:::1;-1:-1:-1::0;;;;;14504:16:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;14504:16:0;:26;14561:7:::1;15875::::0;15902:6;-1:-1:-1;;;;;15902:6:0;;15837:79;14561:7:::1;14555:4;::::0;14570:7:::1;::::0;14546:32:::1;::::0;1803:25:1;;;-1:-1:-1;;;;;14546:32:0;;::::1;::::0;14555:4;;::::1;::::0;14546:32:::1;::::0;1791:2:1;1776:18;14546:32:0::1;;;;;;;14623:9;::::0;14591:62:::1;::::0;14608:4:::1;::::0;-1:-1:-1;;;;;14623:9:0::1;-1:-1:-1::0;;14591:8:0::1;:62::i;:::-;14666:53;14676:7;15875::::0;15902:6;-1:-1:-1;;;;;15902:6:0;;15837:79;14676:7:::1;14693:4;14700:18;14710:7;15875::::0;15902:6;-1:-1:-1;;;;;15902:6:0;;15837:79;14666:53:::1;-1:-1:-1::0;14732:9:0::1;::::0;-1:-1:-1;;;;;14732:9:0::1;:25;14765:21;14810:4;14830:24;14810:4:::0;14830:9:::1;:24::i;:::-;14869:1;14886::::0;14903:7:::1;15875::::0;15902:6;-1:-1:-1;;;;;15902:6:0;;15837:79;14903:7:::1;14925:15;14732:219;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;14973:12:0::1;14962:8;:23:::0;-1:-1:-1;13124:1869:0:o;23748:132::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23835:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:37;;-1:-1:-1;;23835:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23748:132::o;17816:198::-;-1:-1:-1;;;;;17906:20:0;;17882:7;17906:20;;;:11;:20;;;;;;;;17902:49;;;-1:-1:-1;;;;;;17935:16:0;;;;;:7;:16;;;;;;;17816:198::o;17902:49::-;-1:-1:-1;;;;;17989:16:0;;;;;;:7;:16;;;;;;17969:37;;:19;:37::i;16727:194::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;16813:6:::1;::::0;;16794:33:::1;::::0;-1:-1:-1;;;;;16813:6:0;;::::1;::::0;16794:18:::1;:33::i;:::-;16855:1;16838:19:::0;;-1:-1:-1;;;;;;16838:19:0::1;::::0;;16873:40:::1;::::0;16855:1;;16873:40:::1;::::0;16855:1;;16873:40:::1;16727:194::o:0;18583:424::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;18664:16;::::1;;18675:5;18664:16:::0;18660:340:::1;;-1:-1:-1::0;;;;;;18697:13:0::1;18713:5;18697:13:::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;18697:21:0::1;::::0;;23888:906::o;18660:340::-:1;18755:17;::::0;:22;18751:153:::1;;18844:7;18824:17;;18806:15;:35;;;;:::i;:::-;:45;18798:90;;;::::0;-1:-1:-1;;;18798:90:0;;15542:2:1;18798:90:0::1;::::0;::::1;15524:21:1::0;;;15561:18;;;15554:30;15620:34;15600:18;;;15593:62;15672:18;;18798:90:0::1;15340:356:1::0;18798:90:0::1;-1:-1:-1::0;;;;;18918:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;:20;;-1:-1:-1;;18918:20:0::1;18934:4;18918:20;::::0;;18973:15:::1;18953:17;:35:::0;18583:424;;:::o;17440:75::-;17481:13;17505:7;17498:14;;;;;:::i;23376:187::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;23466:10:::1;::::0;-1:-1:-1;;;;;23466:23:0;;::::1;:10:::0;::::1;:23:::0;23458:55:::1;;;::::0;-1:-1:-1;;;23458:55:0;;15903:2:1;23458:55:0::1;::::0;::::1;15885:21:1::0;15942:2;15922:18;;;15915:30;-1:-1:-1;;;15961:18:1;;;15954:49;16020:18;;23458:55:0::1;15701:343:1::0;23458:55:0::1;23524:10;:31:::0;;-1:-1:-1;;;;;;23524:31:0::1;-1:-1:-1::0;;;;;23524:31:0;;;::::1;::::0;;;::::1;::::0;;23376:187::o;21825:166::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;21915:11:::1;:16:::0;;;;21942:8:::1;:13:::0;21966:12:::1;:17:::0;21825:166::o;19984:225::-;636:10;20077:4;20126:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20126:34:0;;;;;;;;;;20077:4;;20094:85;;20117:7;;20126:52;;20163:15;;20126:52;:::i;19015:167::-;19093:4;19110:42;636:10;19134:9;19145:6;19110:9;:42::i;21999:172::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;22098:15:::1;:27:::0;;;;22136:15:::1;:27:::0;21999:172::o;23569:171::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;23646:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;23646:32:0::1;-1:-1:-1::0;;;;23646:32:0;;::::1;;::::0;;23694:38:::1;::::0;::::1;::::0;::::1;::::0;23670:8;1630:14:1;1623:22;1605:41;;1593:2;1578:18;;1465:187;23694:38:0::1;;;;;;;;23569:171:::0;:::o;18022:553::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;18095:29:::1;18146:9;18095:61;;18167:16;18204:10;-1:-1:-1::0;;;;;18204:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;18186:47:0::1;;18242:4;18249:10;-1:-1:-1::0;;;;;18249:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18186:81;::::0;-1:-1:-1;;;;;;18186:81:0::1;::::0;;;;;;-1:-1:-1;;;;;14338:15:1;;;18186:81:0::1;::::0;::::1;14320:34:1::0;14390:15;;14370:18;;;14363:43;14255:18;;18186:81:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18167:100:::0;-1:-1:-1;;;;;;18282:22:0;::::1;18278:207;;18348:10;-1:-1:-1::0;;;;;18348:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;18330:50:0::1;;18389:4;18396:10;-1:-1:-1::0;;;;;18396:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18330:84;::::0;-1:-1:-1;;;;;;18330:84:0::1;::::0;;;;;;-1:-1:-1;;;;;14338:15:1;;;18330:84:0::1;::::0;::::1;14320:34:1::0;14390:15;;14370:18;;;14363:43;14255:18;;18330:84:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18321:6;:93:::0;;-1:-1:-1;;;;;;18321:93:0::1;-1:-1:-1::0;;;;;18321:93:0;;;::::1;::::0;;;::::1;::::0;;18278:207:::1;;;18456:6;:17:::0;;-1:-1:-1;;;;;;18456:17:0::1;-1:-1:-1::0;;;;;18456:17:0;::::1;;::::0;;18278:207:::1;18495:9;:22:::0;;-1:-1:-1;;;;;;18495:22:0::1;-1:-1:-1::0;;;;;18495:22:0;::::1;;::::0;;18528:39:::1;18545:4;18552:9:::0;-1:-1:-1;;18528:8:0::1;:39::i;23172:196::-:0;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;23265:13:::1;::::0;-1:-1:-1;;;;;23265:26:0;;::::1;:13:::0;::::1;:26:::0;23257:58:::1;;;::::0;-1:-1:-1;;;23257:58:0;;15903:2:1;23257:58:0::1;::::0;::::1;15885:21:1::0;15942:2;15922:18;;;15915:30;-1:-1:-1;;;15961:18:1;;;15954:49;16020:18;;23257:58:0::1;15701:343:1::0;23257:58:0::1;23326:13;:34:::0;;-1:-1:-1;;;;;;23326:34:0::1;-1:-1:-1::0;;;;;23326:34:0;;;::::1;::::0;;;::::1;::::0;;23172:196::o;22875:289::-;12204:6;;-1:-1:-1;;;;;12204:6:0;636:10;12204:22;12196:67;;;;-1:-1:-1;;;12196:67:0;;;;;;;:::i;:::-;23075:16:::1;23055;23045:7;;:26;;;;:::i;:::-;23044:47;;;;:::i;:::-;23028:13;:63:::0;23116:7:::1;::::0;23143:13;;23116:23:::1;::::0;23126:13;;23116:23:::1;:::i;:::-;23115:41;;;;:::i;:::-;23102:10;:54:::0;-1:-1:-1;;;;22875:289:0:o;25491:342::-;-1:-1:-1;;;;;25586:20:0;;25578:69;;;;-1:-1:-1;;;25578:69:0;;16251:2:1;25578:69:0;;;16233:21:1;16290:2;16270:18;;;16263:30;16329:34;16309:18;;;16302:62;-1:-1:-1;;;16380:18:1;;;16373:34;16424:19;;25578:69:0;16049:400:1;25578:69:0;-1:-1:-1;;;;;25666:21:0;;25658:68;;;;-1:-1:-1;;;25658:68:0;;16656:2:1;25658:68:0;;;16638:21:1;16695:2;16675:18;;;16668:30;16734:34;16714:18;;;16707:62;-1:-1:-1;;;16785:18:1;;;16778:32;16827:19;;25658:68:0;16454:398:1;25658:68:0;-1:-1:-1;;;;;25739:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;25792:33;;1803:25:1;;;25792:33:0;;1776:18:1;25792:33:0;;;;;;;25491:342;;;:::o;25841:1866::-;25920:4;-1:-1:-1;;;;;25945:18:0;;25937:68;;;;-1:-1:-1;;;25937:68:0;;17059:2:1;25937:68:0;;;17041:21:1;17098:2;17078:18;;;17071:30;17137:34;17117:18;;;17110:62;-1:-1:-1;;;17188:18:1;;;17181:35;17233:19;;25937:68:0;16857:401:1;25937:68:0;-1:-1:-1;;;;;26024:16:0;;26016:64;;;;-1:-1:-1;;;26016:64:0;;17465:2:1;26016:64:0;;;17447:21:1;17504:2;17484:18;;;17477:30;17543:34;17523:18;;;17516:62;-1:-1:-1;;;17594:18:1;;;17587:33;17637:19;;26016:64:0;17263:399:1;26016:64:0;26108:1;26099:6;:10;26091:64;;;;-1:-1:-1;;;26091:64:0;;17869:2:1;26091:64:0;;;17851:21:1;17908:2;17888:18;;;17881:30;17947:34;17927:18;;;17920:62;-1:-1:-1;;;17998:18:1;;;17991:39;18047:19;;26091:64:0;17667:405:1;26091:64:0;26169:20;26180:4;26186:2;26169:10;:20::i;:::-;26166:776;;;26210:14;;-1:-1:-1;;;26210:14:0;;;;26206:89;;26245:34;;-1:-1:-1;;;26245:34:0;;18279:2:1;26245:34:0;;;18261:21:1;18318:2;18298:18;;;18291:30;18357:26;18337:18;;;18330:54;18401:18;;26245:34:0;18077:348:1;26206:89:0;26313:15;;;;26309:347;;;-1:-1:-1;;;;;26353:13:0;;;;;;:7;:13;;;;;;;;26349:292;;;-1:-1:-1;;;;;26398:13:0;;;;;;:9;:13;;;;;;26415:12;26398:29;;26390:38;;;;;;-1:-1:-1;;;;;26451:13:0;;;;;;:9;:13;;;;;26467:12;26451:28;;26349:292;;;-1:-1:-1;;;;;26536:15:0;;;;;;:9;:15;;;;;;26555:12;26536:31;;26528:40;;;;;;-1:-1:-1;;;;;26591:15:0;;;;;;:9;:15;;;;;26609:12;26591:30;;26349:292;26688:12;;26678:6;:22;;26670:75;;;;-1:-1:-1;;;26670:75:0;;18632:2:1;26670:75:0;;;18614:21:1;18671:2;18651:18;;;18644:30;18710:34;18690:18;;;18683:62;-1:-1:-1;;;18761:18:1;;;18754:38;18809:19;;26670:75:0;18430:404:1;26670:75:0;26769:14;;-1:-1:-1;;;;;26763:20:0;;;26769:14;;26763:20;;;;:36;;-1:-1:-1;;;;;;26788:11:0;;;;;;:7;:11;;;;;;;;26787:12;26763:36;26760:171;;;26854:14;;26844:6;26828:13;26838:2;26828:9;:13::i;:::-;:22;;;;:::i;:::-;:40;;26820:95;;;;-1:-1:-1;;;26820:95:0;;19041:2:1;26820:95:0;;;19023:21:1;19080:2;19060:18;;;19053:30;19119:34;19099:18;;;19092:62;-1:-1:-1;;;19170:18:1;;;19163:40;19220:19;;26820:95:0;18839:406:1;26820:95:0;-1:-1:-1;;;;;26985:24:0;;26952:12;26985:24;;;:18;:24;;;;;;26967:4;;26985:24;;;:50;;-1:-1:-1;;;;;;27013:22:0;;;;;;:18;:22;;;;;;;;26985:50;26982:96;;;-1:-1:-1;27061:5:0;26982:96;-1:-1:-1;;;;;27094:11:0;;;;;;:7;:11;;;;;;;;27090:547;;;27127:16;;-1:-1:-1;;;27127:16:0;;;;27126:17;:59;;;;-1:-1:-1;27164:21:0;;-1:-1:-1;;;27164:21:0;;;;27126:59;:105;;;;-1:-1:-1;;;;;;27207:24:0;;;;;;:18;:24;;;;;;;;27206:25;27126:105;:149;;;;-1:-1:-1;;;;;;27253:22:0;;;;;;:18;:22;;;;;;;;27252:23;27126:149;27122:498;;;27310:28;27341:24;27359:4;27341:9;:24::i;:::-;27310:55;;27412:13;;27388:20;:37;27384:221;;27477:10;;27453:20;:34;27450:77;;-1:-1:-1;27514:10:0;;27450:77;27549:36;27564:20;27549:14;:36::i;:::-;27291:329;27122:498;27655:44;27673:4;27679:2;27683:6;27691:7;27655:17;:44::i;:::-;27648:51;25841:1866;-1:-1:-1;;;;;25841:1866:0:o;29264:154::-;29306:7;29327:15;29344;29363:12;:10;:12::i;:::-;29326:49;;-1:-1:-1;29326:49:0;-1:-1:-1;29393:17:0;29326:49;;29393:17;:::i;:::-;29386:24;;;;29264:154;:::o;24897:324::-;24966:4;15902:6;;-1:-1:-1;;;;;24990:15:0;;;15902:6;;24990:15;;;;:45;;-1:-1:-1;15875:7:0;15902:6;-1:-1:-1;;;;;25022:13:0;;;15902:6;;25022:13;;24990:45;:84;;;;-1:-1:-1;;;;;;25053:21:0;;;;;;:17;:21;;;;;;;;25052:22;24990:84;:125;;;;-1:-1:-1;;;;;;25092:23:0;;;;;;:17;:23;;;;;;;;25091:24;24990:125;:152;;;;-1:-1:-1;25138:4:0;;-1:-1:-1;;;;;25132:10:0;;;25138:4;;25132:10;;24990:152;:185;;;;-1:-1:-1;;;;;;25159:16:0;;;;24990:185;:223;;;;-1:-1:-1;;;;;;25192:21:0;;25208:4;25192:21;;24983:230;24897:324;-1:-1:-1;;;24897:324:0:o;27715:1541::-;12078:16;:23;;-1:-1:-1;;;;12078:23:0;-1:-1:-1;;;12078:23:0;;;27823:15:::1;::::0;27805::::1;::::0;:33:::1;::::0;27823:15;27805:33:::1;:::i;:::-;27801:64:::0;27858:7:::1;27801:64;27875:17;27978:1;27958:15;;27940;;:33;;;;:::i;:::-;27920:15;::::0;27897:38:::1;::::0;:20;:38:::1;:::i;:::-;27896:78;;;;:::i;:::-;27895:84;;;;:::i;:::-;27875:104:::0;-1:-1:-1;27992:20:0::1;28015:32;27875:104:::0;28015:20;:32:::1;:::i;:::-;28084:16;::::0;;28098:1:::1;28084:16:::0;;;;;::::1;::::0;;27992:55;;-1:-1:-1;28060:21:0::1;::::0;28084:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;28084:16:0::1;28060:40;;28129:4;28111;28116:1;28111:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28111:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;28155:9:::1;::::0;:16:::1;::::0;;-1:-1:-1;;;28155:16:0;;;;:9;;;::::1;::::0;:14:::1;::::0;:16:::1;::::0;;::::1;::::0;28111:7;;28155:16;;;;;:9;:16:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28145:4;28150:1;28145:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28145:26:0;;::::1;:7;::::0;;::::1;::::0;;;;;:26;28184:9:::1;::::0;:191:::1;::::0;-1:-1:-1;;;28184:191:0;;:9;::::1;::::0;:60:::1;::::0;:191:::1;::::0;28259:12;;28184:9:::1;::::0;28302:4;;28329::::1;::::0;28349:15:::1;::::0;28184:191:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28390:24;28501:1;28481:15;;28463;;:33;;;;:::i;:::-;28443:15;::::0;28419:39:::1;::::0;:21:::1;:39;:::i;:::-;28418:79;;;;:::i;:::-;28417:85;;;;:::i;:::-;28390:112:::0;-1:-1:-1;28519:13:0;;28515:344:::1;;28549:9;::::0;28720:4:::1;::::0;28549:224:::1;::::0;-1:-1:-1;;;28549:224:0;;-1:-1:-1;;;;;28549:9:0;;::::1;::::0;:25:::1;::::0;28582:16;;28549:224:::1;::::0;28626:4:::1;::::0;28650:9;;28549::::1;::::0;;;28720:4:::1;::::0;28743:15:::1;::::0;28549:224:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;28793:54:0::1;::::0;;20437:25:1;;;20493:2;20478:18;;20471:34;;;20521:18;;;20514:34;;;28793:54:0::1;::::0;-1:-1:-1;20425:2:1;20410:18;28793:54:0::1;;;;;;;28515:344;28908:1;28873:32;28896:9:::0;28873:20;:32:::1;:::i;:::-;:36;28869:380;;;29040:11;::::0;29025:12:::1;::::0;28953:21:::1;::::0;28928::::1;::::0;29010:28:::1;::::0;28953:21;29010:28:::1;:::i;:::-;:42;;;;:::i;:::-;28990:62;;29067:19;29119:8;;29104:12;;29089:13;:28;;;;:::i;:::-;:39;;;;:::i;:::-;29143:13;::::0;:33:::1;::::0;29067:61;;-1:-1:-1;;;;;;29143:13:0::1;::::0;:33;::::1;;;::::0;29166:9;;29143:13:::1;:33:::0;:13;:33;29166:9;29143:13;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;29191:10:0::1;::::0;:32:::1;::::0;-1:-1:-1;;;;;29191:10:0;;::::1;::::0;:32;::::1;;;::::0;29211:11;;29191:10:::1;:32:::0;:10;:32;29211:11;29191:10;:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;28911:338;;;28869:380;27790:1466;;;;12112:1;-1:-1:-1::0;12124:16:0;:24;;-1:-1:-1;;;;12124:24:0;;;27715:1541::o;30627:1388::-;30753:16;;30729:4;;-1:-1:-1;;;30753:16:0;;;;30748:237;;30790:28;30809:4;30815:2;30790:18;:28::i;:::-;30842:16;;-1:-1:-1;;;30842:16:0;;;;30841:17;:41;;;;;30862:20;30873:4;30879:2;30862:10;:20::i;:::-;30837:137;;;30907:47;;-1:-1:-1;;;30907:47:0;;20761:2:1;30907:47:0;;;20743:21:1;20800:2;20780:18;;;20773:30;20839:34;20819:18;;;20812:62;-1:-1:-1;;;20890:18:1;;;20883:35;20935:19;;30907:47:0;20559:401:1;30837:137:0;31005:25;31033:38;31044:4;31050:2;31054:7;31063;31033:10;:38::i;:::-;31005:66;;31107:7;31088:15;31098:4;31088:9;:15::i;:::-;:26;31084:902;;31163:14;;;;-1:-1:-1;;;;;31147:13:0;;;;;;:7;:13;;;;;;:30;;31163:14;31147:30;:::i;:::-;-1:-1:-1;;;;;31131:13:0;;;;;;;:7;:13;;;;;;:46;;;;31220:22;;;;31206:11;;;;;;;;;;:36;;31220:22;31206:36;:::i;:::-;-1:-1:-1;;;;;31192:11:0;;;;;;;:7;:11;;;;;;;;:50;;;;31263:17;;;;;:11;:17;;;;;;;:37;;;;-1:-1:-1;;;;;;31285:15:0;;;;;;:11;:15;;;;;;;;31284:16;31263:37;31259:442;;;-1:-1:-1;;;;;31337:13:0;;;;;;:7;:13;;;;;;:23;;31353:7;;31337:23;:::i;:::-;-1:-1:-1;;;;;31321:13:0;;;;;;:7;:13;;;;;:39;31259:442;;;-1:-1:-1;;;;;31387:17:0;;;;;;:11;:17;;;;;;;;31386:18;:37;;;;-1:-1:-1;;;;;;31408:15:0;;;;;;:11;:15;;;;;;;;31386:37;31382:319;;;31472:22;;-1:-1:-1;;;;;31458:11:0;;31472:22;31458:11;;;:7;:11;;;;;;:36;;31472:22;31458:36;:::i;:::-;-1:-1:-1;;;;;31444:11:0;;;;;;:7;:11;;;;;:50;31382:319;;;-1:-1:-1;;;;;31520:17:0;;;;;;:11;:17;;;;;;;;:36;;;;-1:-1:-1;;;;;;31541:15:0;;;;;;:11;:15;;;;;;;;31520:36;31516:185;;;-1:-1:-1;;;;;31593:13:0;;;;;;:7;:13;;;;;;:23;;31609:7;;31593:23;:::i;:::-;-1:-1:-1;;;;;31577:13:0;;;;;;;:7;:13;;;;;;:39;;;;31663:22;;31649:11;;;;;;;;;;:36;;31663:22;31649:36;:::i;:::-;-1:-1:-1;;;;;31635:11:0;;;;;;:7;:11;;;;;:50;31516:185;31721:17;;;;:21;31717:83;;31761:39;31776:4;31782:6;:17;;;31761:14;:39::i;:::-;31833:1;31819:6;:11;;;:15;:34;;;;31852:1;31838:6;:11;;;:15;31819:34;31815:95;;;31872:38;31885:6;:11;;;31898:6;:11;;;31872:12;:38::i;:::-;31947:2;-1:-1:-1;;;;;31932:42:0;31941:4;-1:-1:-1;;;;;31932:42:0;;31951:6;:22;;;31932:42;;;;1803:25:1;;1791:2;1776:18;;1657:177;31932:42:0;;;;;;;;31084:902;-1:-1:-1;32003:4:0;;30627:1388;-1:-1:-1;;;;;30627:1388:0:o;29426:540::-;29517:7;;29553;;29470;;;;;29571:283;29595:9;:16;29591:20;;29571:283;;;29661:7;29637;:21;29645:9;29655:1;29645:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29645:12:0;29637:21;;;;;;;;;;;;;:31;;:66;;;29696:7;29672;:21;29680:9;29690:1;29680:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29680:12:0;29672:21;;;;;;;;;;;;;:31;29637:66;29633:97;;;29713:7;;29722;;29705:25;;;;;;;29426:540;;:::o;29633:97::-;29765:7;:21;29773:9;29783:1;29773:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29773:12:0;29765:21;;;;;;;;;;;;;29755:31;;:7;:31;:::i;:::-;29745:41;;29821:7;:21;29829:9;29839:1;29829:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29829:12:0;29821:21;;;;;;;;;;;;;29811:31;;:7;:31;:::i;:::-;29801:41;-1:-1:-1;29613:3:0;;;;:::i;:::-;;;;29571:283;;;;29888:7;;29878;;:17;;;;:::i;:::-;29868:7;:27;29864:58;;;29905:7;;29914;;29897:25;;;;;;29426:540;;:::o;29864:58::-;29941:7;;29950;;-1:-1:-1;29426:540:0;-1:-1:-1;29426:540:0:o;29974:439::-;30057:16;;-1:-1:-1;;;30057:16:0;;;;30056:17;30048:65;;;;-1:-1:-1;;;30048:65:0;;21167:2:1;30048:65:0;;;21149:21:1;21206:2;21186:18;;;21179:30;21245:34;21225:18;;;21218:62;-1:-1:-1;;;21296:18:1;;;21289:33;21339:19;;30048:65:0;20965:399:1;30048:65:0;30129:20;30140:4;30146:2;30129:10;:20::i;:::-;30128:21;:37;;;;-1:-1:-1;30159:6:0;;-1:-1:-1;;;;;30153:12:0;;;30159:6;;30153:12;30128:37;30124:282;;;-1:-1:-1;;;;;30182:23:0;;;;;;:17;:23;;;;;;;;;:30;;30208:4;-1:-1:-1;;30182:30:0;;;;;;;;30227:16;:23;;-1:-1:-1;;;;;;;30227:23:0;;;;;;;;30280:15;30265:12;:30;30312:21;:28;;;;;;;;;;30360:34;;1605:41:1;;;30360:34:0;;1578:18:1;30360:34:0;;;;;;;29974:439;;:::o;32023:1479::-;32118:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32118:18:0;32149:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32149:25:0;32185:19;32207:25;32223:4;32229:2;32207:15;:25::i;:::-;32185:47;-1:-1:-1;32262:21:0;32185:47;32262:7;:21;:::i;:::-;32245:14;;;:38;32296:1071;;;;-1:-1:-1;;;;;32327:11:0;;;;;;:7;:11;;;;;;;;32323:561;;;32373:15;;32359:11;:29;32423:17;;32407:13;:33;32475:17;;32459:13;:33;32323:561;;;-1:-1:-1;;;;;32518:13:0;;;;;;:7;:13;;;;;;;;32514:370;;;32566:14;;32552:11;:28;32615:16;;32599:13;:32;32666:16;;32650:13;:32;32514:370;;;32737:19;;32723:11;:33;32791:21;;32775:13;:37;32847:21;;32831:13;:37;32514:370;32940:16;;32925:11;;32915:21;;:7;:21;:::i;:::-;32914:42;;;;:::i;:::-;32900:11;;;:56;33037:16;;33019:13;;33003;;:29;;33019:13;33003:29;:::i;:::-;32992:41;;:7;:41;:::i;:::-;32991:62;;;;:::i;:::-;32971:17;;;:82;;;33104:11;;;;:31;;32971:82;33104:31;:::i;:::-;33093:43;;:7;:43;:::i;:::-;33068:68;;33167:11;;;;:25;;33181:11;;33167:25;:::i;:::-;33153:11;;;:39;32296:1071;;;33239:1;33225:11;;;:15;;;33255:17;;;:21;;;33291:32;;;33340:11;;;:15;32296:1071;33457:11;33437:6;:17;;;:31;;;;:::i;:::-;33422:6;:11;;;:47;;;;:::i;:::-;33404:6;:14;;;:66;;;;:::i;:::-;33379:22;;;:91;-1:-1:-1;33379:22:0;32023:1479;-1:-1:-1;;;;;32023:1479:0:o;34771:423::-;34851:19;34874:10;:8;:10::i;:::-;34851:33;-1:-1:-1;34895:18:0;34916:24;34851:33;34916:10;:24;:::i;:::-;34992:4;34976:22;;;;:7;:22;;;;;;34895:45;;-1:-1:-1;34976:35:0;;34895:45;;34976:35;:::i;:::-;34967:4;34951:22;;;;:7;:22;;;;;;;;:60;;;;35025:11;:26;;;;;;35022:104;;;35107:4;35091:22;;;;:7;:22;;;;;;:35;;35116:10;;35091:35;:::i;:::-;35082:4;35066:22;;;;:7;:22;;;;;:60;35022:104;35142:43;;1803:25:1;;;35167:4:0;;-1:-1:-1;;;;;35142:43:0;;;;;1791:2:1;1776:18;35142:43:0;;;;;;;34840:354;;34771:423;;:::o;34500:143::-;34590:4;34580:7;;:14;;;;:::i;:::-;34570:7;:24;34618:10;;:17;;34631:4;;34618:17;:::i;:::-;34605:10;:30;-1:-1:-1;;34500:143:0:o;33510:195::-;33578:7;33599:15;33616;33635:27;33653:4;33659:2;33635:17;:27::i;:::-;33598:64;;-1:-1:-1;33598:64:0;-1:-1:-1;33680:17:0;33598:64;;33680:17;:::i;33713:775::-;33830:7;;33866;;33888:6;;33783:7;;;;33830;;-1:-1:-1;;;;;33888:6:0;:20;33884:64;;33917:6;;33910:38;;-1:-1:-1;;;33910:38:0;;-1:-1:-1;;;;;14338:15:1;;;33910:38:0;;;14320:34:1;14390:15;;;14370:18;;;14363:43;33917:6:0;;;;33910:28;;14255:18:1;;33910:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33884:64;33963:15;33973:4;33963:9;:15::i;:::-;:20;:47;;;;-1:-1:-1;;;;;;20433:27:0;;20409:4;20433:27;;;:18;:27;;;;;;;;33987:23;33959:123;;;34027:6;:11;;-1:-1:-1;;;;;;34027:11:0;-1:-1:-1;;;;;34027:11:0;;;;;;;;;34052:6;;;;;-1:-1:-1;34040:19:0;;;:11;:19;;;;;;;;:23;;;;;;;-1:-1:-1;;34040:40:0;;33959:123;34098:9;34093:283;34117:9;:16;34113:20;;34093:283;;;34183:7;34159;:21;34167:9;34177:1;34167:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;34167:12:0;34159:21;;;;;;;;;;;;;:31;;:66;;;34218:7;34194;:21;34202:9;34212:1;34202:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;34202:12:0;34194:21;;;;;;;;;;;;;:31;34159:66;34155:97;;;34235:7;;34244;;34227:25;;;;;;;;;34155:97;34287:7;:21;34295:9;34305:1;34295:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;34295:12:0;34287:21;;;;;;;;;;;;;34277:31;;:7;:31;:::i;:::-;34267:41;;34343:7;:21;34351:9;34361:1;34351:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;34351:12:0;34343:21;;;;;;;;;;;;;34333:31;;:7;:31;:::i;:::-;34323:41;-1:-1:-1;34135:3:0;;;;:::i;:::-;;;;34093:283;;;;34410:7;;34400;;:17;;;;:::i;:::-;34390:7;:27;34386:58;;;34427:7;;34436;;34419:25;;;;;;;;34386:58;34463:7;;-1:-1:-1;34472:7:0;-1:-1:-1;33713:775: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:118::-;1925:5;1918:13;1911:21;1904:5;1901:32;1891:60;;1947:1;1944;1937:12;1962:382;2027:6;2035;2088:2;2076:9;2067:7;2063:23;2059:32;2056:52;;;2104:1;2101;2094:12;2056:52;2143:9;2130:23;2162:31;2187:5;2162:31;:::i;:::-;2212:5;-1:-1:-1;2269:2:1;2254:18;;2241:32;2282:30;2241:32;2282:30;:::i;:::-;2331:7;2321:17;;;1962:382;;;;;:::o;2349:456::-;2426:6;2434;2442;2495:2;2483:9;2474:7;2470:23;2466:32;2463:52;;;2511:1;2508;2501:12;2463:52;2550:9;2537:23;2569:31;2594:5;2569:31;:::i;:::-;2619:5;-1:-1:-1;2676:2:1;2661:18;;2648:32;2689:33;2648:32;2689:33;:::i;:::-;2349:456;;2741:7;;-1:-1:-1;;;2795:2:1;2780:18;;;;2767:32;;2349:456::o;2810:248::-;2878:6;2886;2939:2;2927:9;2918:7;2914:23;2910:32;2907:52;;;2955:1;2952;2945:12;2907:52;-1:-1:-1;;2978:23:1;;;3048:2;3033:18;;;3020:32;;-1:-1:-1;2810:248:1:o;3063:180::-;3122:6;3175:2;3163:9;3154:7;3150:23;3146:32;3143:52;;;3191:1;3188;3181:12;3143:52;-1:-1:-1;3214:23:1;;3063:180;-1:-1:-1;3063:180:1:o;3437:316::-;3514:6;3522;3530;3583:2;3571:9;3562:7;3558:23;3554:32;3551:52;;;3599:1;3596;3589:12;3551:52;-1:-1:-1;;3622:23:1;;;3692:2;3677:18;;3664:32;;-1:-1:-1;3743:2:1;3728:18;;;3715:32;;3437:316;-1:-1:-1;3437:316:1:o;3758:247::-;3817:6;3870:2;3858:9;3849:7;3845:23;3841:32;3838:52;;;3886:1;3883;3876:12;3838:52;3925:9;3912:23;3944:31;3969:5;3944:31;:::i;4270:241::-;4326:6;4379:2;4367:9;4358:7;4354:23;4350:32;4347:52;;;4395:1;4392;4385:12;4347:52;4434:9;4421:23;4453:28;4475:5;4453:28;:::i;4516:388::-;4584:6;4592;4645:2;4633:9;4624:7;4620:23;4616:32;4613:52;;;4661:1;4658;4651:12;4613:52;4700:9;4687:23;4719:31;4744:5;4719:31;:::i;:::-;4769:5;-1:-1:-1;4826:2:1;4811:18;;4798:32;4839:33;4798:32;4839:33;:::i;4909:385::-;4995:6;5003;5011;5019;5072:3;5060:9;5051:7;5047:23;5043:33;5040:53;;;5089:1;5086;5079:12;5040:53;-1:-1:-1;;5112:23:1;;;5182:2;5167:18;;5154:32;;-1:-1:-1;5233:2:1;5218:18;;5205:32;;5284:2;5269:18;5256:32;;-1:-1:-1;4909:385:1;-1:-1:-1;4909:385:1:o;5299:356::-;5501:2;5483:21;;;5520:18;;;5513:30;5579:34;5574:2;5559:18;;5552:62;5646:2;5631:18;;5299:356::o;6013:380::-;6092:1;6088:12;;;;6135;;;6156:61;;6210:4;6202:6;6198:17;6188:27;;6156:61;6263:2;6255:6;6252:14;6232:18;6229:38;6226:161;;6309:10;6304:3;6300:20;6297:1;6290:31;6344:4;6341:1;6334:15;6372:4;6369:1;6362:15;6226:161;;6013:380;;;:::o;7112:127::-;7173:10;7168:3;7164:20;7161:1;7154:31;7204:4;7201:1;7194:15;7228:4;7225:1;7218:15;7244:127;7305:10;7300:3;7296:20;7293:1;7286:31;7336:4;7333:1;7326:15;7360:4;7357:1;7350:15;7376:128;7443:9;;;7464:11;;;7461:37;;;7478:18;;:::i;7509:127::-;7570:10;7565:3;7561:20;7558:1;7551:31;7601:4;7598:1;7591:15;7625:4;7622:1;7615:15;7641:135;7680:3;7701:17;;;7698:43;;7721:18;;:::i;:::-;-1:-1:-1;7768:1:1;7757:13;;7641:135::o;7781:168::-;7854:9;;;7885;;7902:15;;;7896:22;;7882:37;7872:71;;7923:18;;:::i;7954:127::-;8015:10;8010:3;8006:20;8003:1;7996:31;8046:4;8043:1;8036:15;8070:4;8067:1;8060:15;8086:120;8126:1;8152;8142:35;;8157:18;;:::i;:::-;-1:-1:-1;8191:9:1;;8086:120::o;9041:125::-;9106:9;;;9127:10;;;9124:36;;;9140:18;;:::i;9595:425::-;9797:2;9779:21;;;9836:2;9816:18;;;9809:30;9875:34;9870:2;9855:18;;9848:62;9946:31;9941:2;9926:18;;9919:59;10010:3;9995:19;;9595:425::o;10025:127::-;10086:10;10081:3;10077:20;10074:1;10067:31;10117:4;10114:1;10107:15;10141:4;10138:1;10131:15;10283:545;10385:2;10380:3;10377:11;10374:448;;;10421:1;10446:5;10442:2;10435:17;10491:4;10487:2;10477:19;10561:2;10549:10;10545:19;10542:1;10538:27;10532:4;10528:38;10597:4;10585:10;10582:20;10579:47;;;-1:-1:-1;10620:4:1;10579:47;10675:2;10670:3;10666:12;10663:1;10659:20;10653:4;10649:31;10639:41;;10730:82;10748:2;10741:5;10738:13;10730:82;;;10793:17;;;10774:1;10763:13;10730:82;;;10734:3;;;10283:545;;;:::o;11004:1352::-;11130:3;11124:10;11157:18;11149:6;11146:30;11143:56;;;11179:18;;:::i;:::-;11208:97;11298:6;11258:38;11290:4;11284:11;11258:38;:::i;:::-;11252:4;11208:97;:::i;:::-;11360:4;;11424:2;11413:14;;11441:1;11436:663;;;;12143:1;12160:6;12157:89;;;-1:-1:-1;12212:19:1;;;12206:26;12157:89;-1:-1:-1;;10961:1:1;10957:11;;;10953:24;10949:29;10939:40;10985:1;10981:11;;;10936:57;12259:81;;11406:944;;11436:663;10230:1;10223:14;;;10267:4;10254:18;;-1:-1:-1;;11472:20:1;;;11590:236;11604:7;11601:1;11598:14;11590:236;;;11693:19;;;11687:26;11672:42;;11785:27;;;;11753:1;11741:14;;;;11620:19;;11590:236;;;11594:3;11854:6;11845:7;11842:19;11839:201;;;11915:19;;;11909:26;-1:-1:-1;;11998:1:1;11994:14;;;12010:3;11990:24;11986:37;11982:42;11967:58;11952:74;;11839:201;-1:-1:-1;;;;;12086:1:1;12070:14;;;12066:22;12053:36;;-1:-1:-1;11004:1352:1:o;12361:422::-;12450:1;12493:5;12450:1;12507:270;12528:7;12518:8;12515:21;12507:270;;;12587:4;12583:1;12579:6;12575:17;12569:4;12566:27;12563:53;;;12596:18;;:::i;:::-;12646:7;12636:8;12632:22;12629:55;;;12666:16;;;;12629:55;12745:22;;;;12705:15;;;;12507:270;;;12511:3;12361:422;;;;;:::o;12788:806::-;12837:5;12867:8;12857:80;;-1:-1:-1;12908:1:1;12922:5;;12857:80;12956:4;12946:76;;-1:-1:-1;12993:1:1;13007:5;;12946:76;13038:4;13056:1;13051:59;;;;13124:1;13119:130;;;;13031:218;;13051:59;13081:1;13072:10;;13095:5;;;13119:130;13156:3;13146:8;13143:17;13140:43;;;13163:18;;:::i;:::-;-1:-1:-1;;13219:1:1;13205:16;;13234:5;;13031:218;;13333:2;13323:8;13320:16;13314:3;13308:4;13305:13;13301:36;13295:2;13285:8;13282:16;13277:2;13271:4;13268:12;13264:35;13261:77;13258:159;;;-1:-1:-1;13370:19:1;;;13402:5;;13258:159;13449:34;13474:8;13468:4;13449:34;:::i;:::-;13519:6;13515:1;13511:6;13507:19;13498:7;13495:32;13492:58;;;13530:18;;:::i;:::-;13568:20;;12788:806;-1:-1:-1;;;12788:806:1:o;13599:131::-;13659:5;13688:36;13715:8;13709:4;13688:36;:::i;13735:112::-;13767:1;13793;13783:35;;13798:18;;:::i;:::-;-1:-1:-1;13832:9:1;;13735:112::o;13852:251::-;13922:6;13975:2;13963:9;13954:7;13950:23;13946:32;13943:52;;;13991:1;13988;13981:12;13943:52;14023:9;14017:16;14042:31;14067:5;14042:31;:::i;14417:607::-;-1:-1:-1;;;;;14776:15:1;;;14758:34;;14823:2;14808:18;;14801:34;;;;14866:2;14851:18;;14844:34;;;;14909:2;14894:18;;14887:34;;;;14958:15;;;14952:3;14937:19;;14930:44;14738:3;14990:19;;14983:35;;;;14707:3;14692:19;;14417:607::o;15029:306::-;15117:6;15125;15133;15186:2;15174:9;15165:7;15161:23;15157:32;15154:52;;;15202:1;15199;15192:12;15154:52;15231:9;15225:16;15215:26;;15281:2;15270:9;15266:18;15260:25;15250:35;;15325:2;15314:9;15310:18;15304:25;15294:35;;15029:306;;;;;:::o;19250:980::-;19512:4;19560:3;19549:9;19545:19;19591:6;19580:9;19573:25;19617:2;19655:6;19650:2;19639:9;19635:18;19628:34;19698:3;19693:2;19682:9;19678:18;19671:31;19722:6;19757;19751:13;19788:6;19780;19773:22;19826:3;19815:9;19811:19;19804:26;;19865:2;19857:6;19853:15;19839:29;;19886:1;19896:195;19910:6;19907:1;19904:13;19896:195;;;19975:13;;-1:-1:-1;;;;;19971:39:1;19959:52;;20066:15;;;;20031:12;;;;20007:1;19925:9;19896:195;;;-1:-1:-1;;;;;;;20147:32:1;;;;20142:2;20127:18;;20120:60;-1:-1:-1;;;20211:3:1;20196:19;20189:35;20108:3;19250:980;-1:-1:-1;;;19250:980:1:o;21369:245::-;21436:6;21489:2;21477:9;21468:7;21464:23;21460:32;21457:52;;;21505:1;21502;21495:12;21457:52;21537:9;21531:16;21556:28;21578:5;21556:28;:::i

Swarm Source

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