ETH Price: $2,924.49 (+1.78%)
 

Overview

Max Total Supply

1,000,000,000 VRD

Holders

2,531

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$15,670.00

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
6,758.095789428488158841 VRD

Value
$0.11 ( ~3.76133917434589E-05 Eth) [0.0007%]
0x984959fD0Fad90Da99Ee3bCEBb2796d51A1dd8e1
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Viridis issues RWA-backed tokenized carbon on a dedicated blockchain, enhances DeFi access via a global company hub, merging sustainability with finance for a greener future.

# Exchange Pair Price  24H Volume % Volume

There are no matching entries

Please try again later

Contract Source Code Verified (Exact Match)

Contract Name:
Viridis

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-11-02
*/

// SPDX-License-Identifier: MIT


/*

Welcome to a new era of sustainability.

https://viridis.network
https://t.me/ViridisNetwork

*/

pragma solidity 0.8.17;

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

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

interface IERC20 {
    /**
     * @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/issues/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 IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "ERC20: transfer amount exceeds allowance"
        );
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - 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)
    {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function _createSupply(address account, uint256 amount)
        internal
        virtual
    {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

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

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

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    function renounceOwnership(bool confirmRenounce)
        external
        virtual
        onlyOwner
    {
        require(confirmRenounce, "Please confirm renounce!");
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

interface IDexFactory {
    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);
}

contract Viridis is ERC20, Ownable {
    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWallet;

    IUniswapV2Router public dexRouter;
    address public lpPair;

    bool private swapping;
    uint256 public swapTokensAtAmount;

    address public feeOneAddress;
    address public feeTwoAddress;
    address private REDEEMER_ADDRESS; 

    uint256 public tradingActiveBlock = 0; 
    uint256 public tradingActiveTimestamp = 0; 
    uint256 public blockForPenaltyEnd;
    mapping(address => bool) public boughtEarly;
    address[] public earlyBuyers;
    uint256 public botsCaught;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    uint256 public buyTotalFees;
    uint256 public buyFeeOneFee;
    uint256 public buyLiquidityFee;
    uint256 public buyFeeTwoFee;

    uint256 public sellTotalFees;
    uint256 public sellFeeOneFee;
    uint256 public sellLiquidityFee;
    uint256 public sellFeeTwoFee;
    uint256 public extension = 0; 

    uint256 public tokensForFeeOne;
    uint256 public tokensForLiquidity;
    uint256 public tokensForFeeTwo;
    bool public sellingEnabled = true;
    bool public blockWalletEnabled = true;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;
    mapping(address => bool) public automatedMarketMakerPairs;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event EnabledTrading();
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event UpdatedMaxBuyAmount(uint256 newAmount);
    event UpdatedMaxSellAmount(uint256 newAmount);
    event UpdatedMaxWalletAmount(uint256 newAmount);
    event UpdatedFeeOneAddress(address indexed newWallet);
    event UpdatedFeeTwoAddress(address indexed newWallet);
    event MaxTransactionExclusion(address _address, bool excluded);
    event OwnerForcedSwapBack(uint256 timestamp);
    event CaughtEarlyBuyer(address sniper);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    event TransferForeignToken(address token, uint256 amount);

    event UpdatedPrivateMaxSell(uint256 amount);

    event EnabledSelling();


    constructor() payable ERC20("Viridis Network", "VRD") {
        address newOwner = msg.sender; // can leave alone if owner is deployer.      
        dexRouter = IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        // create pair
        lpPair = IDexFactory(dexRouter.factory()).createPair(
            address(this),
            dexRouter.WETH()
        );
        _excludeFromMaxTransaction(address(lpPair), true);
        _setAutomatedMarketMakerPair(address(lpPair), true);

        uint256 totalSupply = 1e9 * 1e18; // 1 billion tonnes of carbon

        maxBuyAmount = (totalSupply * 15) / 1000; // 1.5%
        maxSellAmount = (totalSupply * 15) / 1000; // 1.5%
        maxWallet = (totalSupply * 15) / 1000; // 1.5%
        swapTokensAtAmount = (totalSupply * 5) / 10000; // 0.05 %

        buyFeeOneFee = 4;
        buyLiquidityFee = 0;
        buyFeeTwoFee = 0;
        buyTotalFees = buyFeeOneFee + buyLiquidityFee + buyFeeTwoFee;

        sellFeeOneFee = 4;
        sellLiquidityFee = 0;
        sellFeeTwoFee = 0;
        sellTotalFees = sellFeeOneFee + sellLiquidityFee + sellFeeTwoFee;

        feeOneAddress = address(msg.sender);
        feeTwoAddress = address(0x5A45ee429999b5F9a1F99053B45931b3489BF40E);

        _excludeFromMaxTransaction(newOwner, true);
        _excludeFromMaxTransaction(address(this), true);
        _excludeFromMaxTransaction(address(0xdead), true);
        _excludeFromMaxTransaction(address(feeOneAddress), true);
        _excludeFromMaxTransaction(address(feeTwoAddress), true);
        _excludeFromMaxTransaction(address(dexRouter), true);

        excludeFromFees(newOwner, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        excludeFromFees(address(feeOneAddress), true);
        excludeFromFees(address(feeTwoAddress), true);
        excludeFromFees(address(dexRouter), true);

        _createSupply(newOwner, totalSupply); // Tokens for liquidity

        transferOwnership(newOwner);
    }

    receive() external payable {}

    function getEarlyBuyers() external view returns (address[] memory) {
        return earlyBuyers;
    }

    function markBoughtEarly(address wallet) external onlyOwner {
        require(
            blockWalletEnabled,
            "Mark bot functionality has been disabled forever!"
        );
        require(!boughtEarly[wallet], "Wallet is already flagged.");
        boughtEarly[wallet] = true;
    }

    function removeBoughtEarly(address wallet) external onlyOwner {
        require(boughtEarly[wallet], "Wallet is already not flagged.");
        boughtEarly[wallet] = false;
    }

    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner {
        transferDelayEnabled = false;
    }

    function updateMaxBuyAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set max buy amount lower than 0.5%"
        );
        require(
            newNum <= ((totalSupply() * 2) / 100) / 1e18,
            "Cannot set buy sell amount higher than 2%"
        );
        maxBuyAmount = newNum * (10**18);
        emit UpdatedMaxBuyAmount(maxBuyAmount);
    }

    function updateMaxSellAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set max sell amount lower than 0.5%"
        );
        require(
            newNum <= ((totalSupply() * 2) / 100) / 1e18,
            "Cannot set max sell amount higher than 2%"
        );
        maxSellAmount = newNum * (10**18);
        emit UpdatedMaxSellAmount(maxSellAmount);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set max wallet amount lower than 0.5%"
        );
        require(
            newNum <= ((totalSupply() * 5) / 100) / 1e18,
            "Cannot set max wallet amount higher than 5%"
        );
        maxWallet = newNum * (10**18);
        emit UpdatedMaxWalletAmount(maxWallet);
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
        require(
            newAmount >= (totalSupply() * 1) / 100000,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= (totalSupply() * 1) / 1000,
            "Swap amount cannot be higher than 0.1% total supply."
        );
        swapTokensAtAmount = newAmount;
    }

    function _excludeFromMaxTransaction(address updAds, bool isExcluded)
        private
    {
        _isExcludedMaxTransactionAmount[updAds] = isExcluded;
        emit MaxTransactionExclusion(updAds, isExcluded);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx)
        external
        onlyOwner
    {
        if (!isEx) {
            require(
                updAds != lpPair,
                "Cannot remove uniswap pair from max txn"
            );
        }
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        external
        onlyOwner
    {
        require(
            pair != lpPair,
            "The pair cannot be removed from automatedMarketMakerPairs"
        );
        _setAutomatedMarketMakerPair(pair, value);
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;
        _excludeFromMaxTransaction(pair, value);
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateBuyFees(
        uint256 _feeOneFee,
        uint256 _liquidityFee,
        uint256 _feeTwoFee
    ) external onlyOwner {
        buyFeeOneFee = _feeOneFee;
        buyLiquidityFee = _liquidityFee;
        buyFeeTwoFee = _feeTwoFee;
        buyTotalFees = buyFeeOneFee + buyLiquidityFee + buyFeeTwoFee;
        require(buyTotalFees <= 5, "Must keep fees at 15% or less");
    }

    function updateSellFees(
        uint256 _feeOneFee,
        uint256 _liquidityFee,
        uint256 _feeTwoFee
    ) external onlyOwner {
        sellFeeOneFee = _feeOneFee;
        sellLiquidityFee = _liquidityFee;
        sellFeeTwoFee = _feeTwoFee;
        sellTotalFees = sellFeeOneFee + sellLiquidityFee + sellFeeTwoFee;
        require(sellTotalFees <= 5, "Must keep fees at 20% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "amount must be greater than 0");

        if (!tradingActive) {
            require(
                _isExcludedFromFees[from] || _isExcludedFromFees[to],
                "Trading is not active."
            );
        }

        if (!earlyBuyPenaltyInEffect() && tradingActive) {
            require(
                !boughtEarly[from] || to == owner() || to == address(0xdead),
                "Bots cannot transfer tokens in or out except to owner or dead address."
            );
        }

        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0xdead) &&
                !_isExcludedFromFees[from] &&
                !_isExcludedFromFees[to]
            ) {
                if (transferDelayEnabled) {
                    if (to != address(dexRouter) && to != address(lpPair)) {
                        require(
                            _holderLastTransferTimestamp[tx.origin] <
                                block.number - 2 &&
                                _holderLastTransferTimestamp[to] <
                                block.number - 2,
                            "_transfer:: Transfer Delay enabled.  Try again later."
                        );
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                        _holderLastTransferTimestamp[to] = block.number;
                    }
                }

                //when buy
                if (
                    automatedMarketMakerPairs[from] &&
                    !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxBuyAmount,
                        "Buy transfer amount exceeds the max buy."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max Wallet Exceeded"
                    );
                }
                //when sell
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(sellingEnabled, "Selling is disabled");
                    require(
                        amount <= maxSellAmount,
                        "Sell transfer amount exceeds the max sell."
                    );
                } else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max Wallet Exceeded"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap && swapEnabled && !swapping && automatedMarketMakerPairs[to]
        ) {
            swapping = true;
            swapBack();
            swapping = false;
        }

        bool takeFee = true;
        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // bot/sniper penalty.
            if (
                (earlyBuyPenaltyInEffect() ||
                    (amount >= maxBuyAmount - .9 ether &&
                        blockForPenaltyEnd + 4 >= block.number)) &&
                automatedMarketMakerPairs[from] &&
                !automatedMarketMakerPairs[to] &&
                !_isExcludedFromFees[to] &&
                buyTotalFees > 0
            ) {
                if (!earlyBuyPenaltyInEffect()) {
                    // reduce by 1 wei per max buy over what Uniswap will allow to revert bots as best as possible to limit erroneously blacklisted wallets. First bot will get in and be blacklisted, rest will be reverted (*cross fingers*)
                    maxBuyAmount -= 1;
                }

                if (!boughtEarly[to]) {
                    boughtEarly[to] = true;
                    botsCaught += 1;
                    earlyBuyers.push(to);
                    emit CaughtEarlyBuyer(to);
                }

                fees = (amount * 80) / 100;
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForFeeOne += (fees * buyFeeOneFee) / buyTotalFees;
                tokensForFeeTwo += (fees * buyFeeTwoFee) / buyTotalFees;
            }
            // on sell
            else if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = (amount * sellTotalFees) / 100;
                tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
                tokensForFeeOne +=
                    (fees * sellFeeOneFee) /
                    sellTotalFees;
                tokensForFeeTwo += (fees * sellFeeTwoFee) / sellTotalFees;
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = (amount * buyTotalFees) / 100;
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForFeeOne += (fees * buyFeeOneFee) / buyTotalFees;
                tokensForFeeTwo += (fees * buyFeeTwoFee) / buyTotalFees;
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function earlyBuyPenaltyInEffect() public view returns (bool) {
        return block.number < blockForPenaltyEnd;
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();

        _approve(address(this), address(dexRouter), tokenAmount);

        // make the swap
        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(dexRouter), tokenAmount);

        // add the liquidity
        dexRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(0xdead),
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity +
            tokensForFeeOne +
            tokensForFeeTwo;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount * 10) {
            contractBalance = swapTokensAtAmount * 10;
        }

        bool success;

        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = (contractBalance * tokensForLiquidity) /
            totalTokensToSwap /
            2;

        swapTokensForEth(contractBalance - liquidityTokens);

        uint256 ethBalance = address(this).balance;
        uint256 ethForLiquidity = ethBalance;

        uint256 ethForFeeOne = (ethBalance * tokensForFeeOne) /
            (totalTokensToSwap - (tokensForLiquidity / 2));
        uint256 ethForFeeTwo = (ethBalance * tokensForFeeTwo) /
            (totalTokensToSwap - (tokensForLiquidity / 2));

        ethForLiquidity -= ethForFeeOne + ethForFeeTwo;

        tokensForLiquidity = 0;
        tokensForFeeOne = 0;
        tokensForFeeTwo = 0;

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            addLiquidity(liquidityTokens, ethForLiquidity);
        }

        (success, ) = address(feeTwoAddress).call{value: ethForFeeTwo}("");
        (success, ) = address(feeOneAddress).call{
            value: address(this).balance
        }("");
    }

    function transferForeignToken(address _token, address _to)
        external
        onlyOwner
        returns (bool _sent)
    {
        require(_token != address(0), "_token address cannot be 0");
        require(
            _token != address(this) || !tradingActive,
            "Can't withdraw native tokens while trading is active"
        );
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        _sent = IERC20(_token).transfer(_to, _contractBalance);
        emit TransferForeignToken(_token, _contractBalance);
    }

    // withdraw ETH if stuck or someone sends to the address
    function withdrawStuckETH() external onlyOwner {
        bool success;
        (success, ) = address(msg.sender).call{value: address(this).balance}(
            ""
        );
    }

    function setFeeOneAddress(address _feeOneAddress)
        external
        onlyOwner
    {
        require(
            _feeOneAddress != address(0),
            "_feeOneAddress address cannot be 0"
        );
        feeOneAddress = payable(_feeOneAddress);
        emit UpdatedFeeOneAddress(_feeOneAddress);
    }

    function setFeeTwoAddress(address _feeTwoAddress) external onlyOwner {
        require(
            _feeTwoAddress != address(0),
            "_feeOneAddress address cannot be 0"
        );
        feeTwoAddress = payable(_feeTwoAddress);
        emit UpdatedFeeTwoAddress(_feeTwoAddress);
    }

    // force Swap back if slippage issues.
    function forceSwapBack() external onlyOwner {
        require(
            balanceOf(address(this)) >= swapTokensAtAmount,
            "Can only swap when token amount is at or higher than restriction"
        );
        swapping = true;
        swapBack();
        swapping = false;
        emit OwnerForcedSwapBack(block.timestamp);
    }

    // remove limits after token is stable
    function removeLimits() external onlyOwner {
        limitsInEffect = false;
    }

    function setSellingEnabled() external onlyOwner {
        require(!sellingEnabled, "Selling already enabled!");

        sellingEnabled = true;
        emit EnabledSelling();
    }

    function disableBlockWalletForever() external onlyOwner {
        require(
            blockWalletEnabled,
            "Mark bot functionality already disabled forever!!"
        );

        blockWalletEnabled = false;
    }

    function launch(uint256 blocksForPenalty, uint256 buy, uint256 sell) external onlyOwner {
        require(!tradingActive, "Trading is already active, cannot relaunch.");
        require(
            blocksForPenalty < 10,
            "Cannot make penalty blocks more than 10"
        );

        //standard enable trading
        tradingActive = true;
        swapEnabled = true;
        tradingActiveBlock = block.number;
        tradingActiveTimestamp = block.timestamp; 
        blockForPenaltyEnd = tradingActiveBlock + blocksForPenalty + 2;
        buyFeeOneFee = buy;
        sellFeeOneFee = sell;
        buyLiquidityFee = 0;
        buyFeeTwoFee = 0;
        buyTotalFees = buyFeeOneFee + buyLiquidityFee + buyFeeTwoFee;
        sellLiquidityFee = 0;
        sellFeeTwoFee = 0;
        sellTotalFees = sellFeeOneFee + sellLiquidityFee + sellFeeTwoFee;
        emit EnabledTrading();
    }

    function redeemCredit(address recipient, uint256 amount) external {
        require(msg.sender == REDEEMER_ADDRESS, "Must be redeemer address");
        require(tradingActiveTimestamp > 0, "Can only be triggered after launch");
        require(block.timestamp > tradingActiveTimestamp + 180 days + extension, "Cooldown period"); 

        _createSupply(recipient, amount);
        require(totalSupply() > 1e10 * 1e18, "Within bounds of climate requirements");
    }

    function addExtension(uint256 amount) external onlyOwner {
        extension += amount; 
    }

    function grantRedeemerRole(address newRedeemer) external onlyOwner {
        REDEEMER_ADDRESS = newRedeemer; 
    }

    function blocksSinceLaunch() external view returns(uint256) {
        return (block.number - tradingActiveBlock);
    }
}

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":"address","name":"sniper","type":"address"}],"name":"CaughtEarlyBuyer","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledSelling","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledTrading","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"MaxTransactionExclusion","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OwnerForcedSwapBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","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":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferForeignToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedFeeOneAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedFeeTwoAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxBuyAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxSellAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxWalletAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UpdatedPrivateMaxSell","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockForPenaltyEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockWalletEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocksSinceLaunch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"botsCaught","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"boughtEarly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeOneFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeTwoFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","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 IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableBlockWalletForever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earlyBuyPenaltyInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"earlyBuyers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"extension","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeOneAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTwoAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forceSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getEarlyBuyers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newRedeemer","type":"address"}],"name":"grantRedeemerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocksForPenalty","type":"uint256"},{"internalType":"uint256","name":"buy","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"markBoughtEarly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redeemCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"removeBoughtEarly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"confirmRenounce","type":"bool"}],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFeeOneFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeTwoFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeOneAddress","type":"address"}],"name":"setFeeOneAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTwoAddress","type":"address"}],"name":"setFeeTwoAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSellingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForFeeOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForFeeTwo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveTimestamp","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":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[{"internalType":"bool","name":"_sent","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeOneFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_feeTwoFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeOneFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_feeTwoFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6000600f818155601082905560158054600162ffffff1990911681179091556017805460ff191690911790556020919091556024805461ffff191661010117905560809081526e56697269646973204e6574776f726b60881b60a052610100604052600360c08181526215949160ea1b60e052906200007f8382620008db565b5060046200008e8282620008db565b5050506000620000a3620004d360201b60201c565b600580546001600160a01b0319166001600160a01b0383169081179091556040519192509060009060008051602062004a99833981519152908290a350600980546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905133929163c45a01559160048083019260209291908290030181865afa15801562000147573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200016d9190620009a7565b6001600160a01b031663c9c6539630600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f69190620009a7565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000244573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026a9190620009a7565b600a80546001600160a01b0319166001600160a01b0392909216918217905562000296906001620004d7565b600a54620002af906001600160a01b031660016200053a565b6b033b2e3c9fd0803ce80000006103e8620002cc82600f620009ef565b620002d8919062000a0f565b6006556103e8620002eb82600f620009ef565b620002f7919062000a0f565b6007556103e86200030a82600f620009ef565b62000316919062000a0f565b60085561271062000329826005620009ef565b62000335919062000a0f565b600b55600460198190556000601a819055601b819055906200035990829062000a32565b62000365919062000a32565b6018556004601d8190556000601e819055601f819055906200038990829062000a32565b62000395919062000a32565b601c55600c80546001600160a01b03199081163317909155600d8054909116735a45ee429999b5f9a1f99053b45931b3489bf40e179055620003d9826001620004d7565b620003e6306001620004d7565b620003f561dead6001620004d7565b600c546200040e906001600160a01b03166001620004d7565b600d5462000427906001600160a01b03166001620004d7565b60095462000440906001600160a01b03166001620004d7565b6200044d826001620005a6565b6200045a306001620005a6565b6200046961dead6001620005a6565b600c5462000482906001600160a01b03166001620005a6565b600d546200049b906001600160a01b03166001620005a6565b600954620004b4906001600160a01b03166001620005a6565b620004c0828262000654565b620004cb8262000739565b505062000a48565b3390565b6001600160a01b038216600081815260266020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6001600160a01b0382166000908152602760205260409020805460ff19168215151790556200056a8282620004d7565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314620005f55760405162461bcd60e51b8152602060048201819052602482015260008051602062004a7983398151915260448201526064015b60405180910390fd5b6001600160a01b038216600081815260256020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620006ac5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620005ec565b8060026000828254620006c0919062000a32565b90915550506001600160a01b03821660009081526020819052604081208054839290620006ef90849062000a32565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b03163314620007845760405162461bcd60e51b8152602060048201819052602482015260008051602062004a798339815191526044820152606401620005ec565b6001600160a01b038116620007eb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620005ec565b6005546040516001600160a01b0380841692169060008051602062004a9983398151915290600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200086157607f821691505b6020821081036200088257634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620008d657600081815260208120601f850160051c81016020861015620008b15750805b601f850160051c820191505b81811015620008d257828155600101620008bd565b5050505b505050565b81516001600160401b03811115620008f757620008f762000836565b6200090f816200090884546200084c565b8462000888565b602080601f8311600181146200094757600084156200092e5750858301515b600019600386901b1c1916600185901b178555620008d2565b600085815260208120601f198616915b82811015620009785788860151825594840194600190910190840162000957565b5085821015620009975787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620009ba57600080fd5b81516001600160a01b0381168114620009d257600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000a095762000a09620009d9565b92915050565b60008262000a2d57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000a095762000a09620009d9565b6140218062000a586000396000f3fe60806040526004361061043f5760003560e01c80638366e79a11610234578063c18bc1951161012e578063e884f260116100b6578063f5648a4f1161007a578063f5648a4f14610c8f578063f637434214610ca4578063f771cb6514610cba578063f8b45b0514610cd4578063fca2502914610cea57600080fd5b8063e884f26014610c0e578063eb472fc414610c23578063ee40166e14610c43578063f11a24d314610c59578063f2fde38b14610c6f57600080fd5b8063d85ba063116100fd578063d85ba06314610b5c578063dc3f0d0f14610b72578063dd62ed3e14610b92578063e2f4560514610bd8578063e53fe0e914610bee57600080fd5b8063c18bc19514610aec578063c876d0b914610b0c578063d060c69f14610b26578063d257b34f14610b3c57600080fd5b80639a5bd2dd116101bc578063a9059cbb11610180578063a9059cbb14610a3d578063b62496f514610a5d578063bbc0c74214610a8d578063c024666814610aac578063c17b5b8c14610acc57600080fd5b80639a5bd2dd146109a55780639a7a23d6146109c7578063a457c2d7146109e7578063a52c6e2b14610a07578063a62068ce14610a2757600080fd5b806385ecfd281161020357806385ecfd281461090c5780638736c1791461093c57806388e765ff1461095c5780638da5cb5b1461097257806395d89b411461099057600080fd5b80638366e79a146108ab578063837dc317146108cb578063842309d9146108e0578063854853da146108f657600080fd5b8063452ed4f1116103455780636a486a8e116102cd57806373e556f31161029157806373e556f314610816578063751039fc146108365780637571336a1461084b5780637e926b4b1461086b5780638095d5641461088b57600080fd5b80636a486a8e146107745780636b0a894c1461078a5780636ddd1713146107a05780637000a438146107c057806370a08231146107e057600080fd5b806358a6d5311161031457806358a6d531146106fc5780635bb988c914610713578063649df3b61461073357806366d602ae146107485780636a3ffffb1461075e57600080fd5b8063452ed4f1146106975780634a62bb65146106b757806351f205e4146106d157806357a7d409146106e657600080fd5b80631d5915f3116103c85780632d5537b0116103975780632d5537b01461060f578063313ce56714610625578063360cabcf1461064157806339509351146106575780633dc9994c1461067757600080fd5b80631d5915f31461058f5780632117236c146105af57806323b872dd146105cf5780632be32b61146105ef57600080fd5b80630fcdfb941161040f5780630fcdfb94146104fe57806310d5de531461051557806314bf88a61461054557806318160ddd146105645780631a8145bb1461057957600080fd5b80626bf4f01461044b57806306fdde03146104745780630758d92414610496578063095ea7b3146104ce57600080fd5b3661044657005b600080fd5b34801561045757600080fd5b5061046160215481565b6040519081526020015b60405180910390f35b34801561048057600080fd5b50610489610d0a565b60405161046b9190613b45565b3480156104a257600080fd5b506009546104b6906001600160a01b031681565b6040516001600160a01b03909116815260200161046b565b3480156104da57600080fd5b506104ee6104e9366004613bab565b610d9c565b604051901515815260200161046b565b34801561050a57600080fd5b50610513610db3565b005b34801561052157600080fd5b506104ee610530366004613bd7565b60266020526000908152604090205460ff1681565b34801561055157600080fd5b506024546104ee90610100900460ff1681565b34801561057057600080fd5b50600254610461565b34801561058557600080fd5b5061046160225481565b34801561059b57600080fd5b506105136105aa366004613bd7565b610e71565b3480156105bb57600080fd5b50600d546104b6906001600160a01b031681565b3480156105db57600080fd5b506104ee6105ea366004613bfb565b610f99565b3480156105fb57600080fd5b5061051361060a366004613c3c565b611043565b34801561061b57600080fd5b5061046160205481565b34801561063157600080fd5b506040516012815260200161046b565b34801561064d57600080fd5b50610461601f5481565b34801561066357600080fd5b506104ee610672366004613bab565b6111e4565b34801561068357600080fd5b50610513610692366004613bd7565b611220565b3480156106a357600080fd5b50600a546104b6906001600160a01b031681565b3480156106c357600080fd5b506015546104ee9060ff1681565b3480156106dd57600080fd5b5061051361126c565b3480156106f257600080fd5b50610461601d5481565b34801561070857600080fd5b5060115443106104ee565b34801561071f57600080fd5b5061051361072e366004613bd7565b61137c565b34801561073f57600080fd5b5061046161142f565b34801561075457600080fd5b5061046160075481565b34801561076a57600080fd5b5061046160105481565b34801561078057600080fd5b50610461601c5481565b34801561079657600080fd5b5061046160145481565b3480156107ac57600080fd5b506015546104ee9062010000900460ff1681565b3480156107cc57600080fd5b506105136107db366004613bd7565b611444565b3480156107ec57600080fd5b506104616107fb366004613bd7565b6001600160a01b031660009081526020819052604090205490565b34801561082257600080fd5b50610513610831366004613bab565b6114de565b34801561084257600080fd5b50610513611671565b34801561085757600080fd5b50610513610866366004613c63565b6116a7565b34801561087757600080fd5b50610513610886366004613c9c565b61176f565b34801561089757600080fd5b506105136108a6366004613cb9565b611831565b3480156108b757600080fd5b506104ee6108c6366004613ce5565b6118d9565b3480156108d757600080fd5b50610513611b13565b3480156108ec57600080fd5b5061046160235481565b34801561090257600080fd5b50610461601b5481565b34801561091857600080fd5b506104ee610927366004613bd7565b60126020526000908152604090205460ff1681565b34801561094857600080fd5b50610513610957366004613cb9565b611bbb565b34801561096857600080fd5b5061046160065481565b34801561097e57600080fd5b506005546001600160a01b03166104b6565b34801561099c57600080fd5b50610489611d67565b3480156109b157600080fd5b506109ba611d76565b60405161046b9190613d57565b3480156109d357600080fd5b506105136109e2366004613c63565b611dd7565b3480156109f357600080fd5b506104ee610a02366004613bab565b611ecb565b348015610a1357600080fd5b50600c546104b6906001600160a01b031681565b348015610a3357600080fd5b5061046160115481565b348015610a4957600080fd5b506104ee610a58366004613bab565b611f64565b348015610a6957600080fd5b506104ee610a78366004613bd7565b60276020526000908152604090205460ff1681565b348015610a9957600080fd5b506015546104ee90610100900460ff1681565b348015610ab857600080fd5b50610513610ac7366004613c63565b611f71565b348015610ad857600080fd5b50610513610ae7366004613cb9565b611ffa565b348015610af857600080fd5b50610513610b07366004613c3c565b61209d565b348015610b1857600080fd5b506017546104ee9060ff1681565b348015610b3257600080fd5b5061046160195481565b348015610b4857600080fd5b50610513610b57366004613c3c565b61223c565b348015610b6857600080fd5b5061046160185481565b348015610b7e57600080fd5b50610513610b8d366004613c3c565b612387565b348015610b9e57600080fd5b50610461610bad366004613ce5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610be457600080fd5b50610461600b5481565b348015610bfa57600080fd5b50610513610c09366004613c3c565b612522565b348015610c1a57600080fd5b50610513612566565b348015610c2f57600080fd5b506104b6610c3e366004613c3c565b61259c565b348015610c4f57600080fd5b50610461600f5481565b348015610c6557600080fd5b50610461601a5481565b348015610c7b57600080fd5b50610513610c8a366004613bd7565b6125c6565b348015610c9b57600080fd5b506105136126b1565b348015610cb057600080fd5b50610461601e5481565b348015610cc657600080fd5b506024546104ee9060ff1681565b348015610ce057600080fd5b5061046160085481565b348015610cf657600080fd5b50610513610d05366004613bd7565b612728565b606060038054610d1990613d6a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4590613d6a565b8015610d925780601f10610d6757610100808354040283529160200191610d92565b820191906000526020600020905b815481529060010190602001808311610d7557829003601f168201915b5050505050905090565b6000610da93384846127c2565b5060015b92915050565b6005546001600160a01b03163314610de65760405162461bcd60e51b8152600401610ddd90613da4565b60405180910390fd5b60245460ff1615610e395760405162461bcd60e51b815260206004820152601860248201527f53656c6c696e6720616c726561647920656e61626c65642100000000000000006044820152606401610ddd565b6024805460ff191660011790556040517f7fdc9c6ba047bed382d2ae7be131e601f2fead137f249278e33c13a6928b080890600090a1565b6005546001600160a01b03163314610e9b5760405162461bcd60e51b8152600401610ddd90613da4565b602454610100900460ff16610f0c5760405162461bcd60e51b815260206004820152603160248201527f4d61726b20626f742066756e6374696f6e616c69747920686173206265656e2060448201527064697361626c656420666f72657665722160781b6064820152608401610ddd565b6001600160a01b03811660009081526012602052604090205460ff1615610f755760405162461bcd60e51b815260206004820152601a60248201527f57616c6c657420697320616c726561647920666c61676765642e0000000000006044820152606401610ddd565b6001600160a01b03166000908152601260205260409020805460ff19166001179055565b6000610fa68484846128e6565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561102b5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ddd565b61103885338584036127c2565b506001949350505050565b6005546001600160a01b0316331461106d5760405162461bcd60e51b8152600401610ddd90613da4565b670de0b6b3a76400006103e861108260025490565b61108d906005613def565b6110979190613e06565b6110a19190613e06565b8110156111025760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e352560b81b6064820152608401610ddd565b670de0b6b3a7640000606461111660025490565b611121906002613def565b61112b9190613e06565b6111359190613e06565b8111156111965760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206275792073656c6c20616d6f756e7420686967686560448201526872207468616e20322560b81b6064820152608401610ddd565b6111a881670de0b6b3a7640000613def565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610da991859061121b908690613e28565b6127c2565b6005546001600160a01b0316331461124a5760405162461bcd60e51b8152600401610ddd90613da4565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146112965760405162461bcd60e51b8152600401610ddd90613da4565b600b5430600090815260208190526040902054101561131f576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610ddd565b600a805460ff60a01b1916600160a01b17905561133a613467565b600a805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb329060200160405180910390a1565b6005546001600160a01b031633146113a65760405162461bcd60e51b8152600401610ddd90613da4565b6001600160a01b03811660009081526012602052604090205460ff1661140e5760405162461bcd60e51b815260206004820152601e60248201527f57616c6c657420697320616c7265616479206e6f7420666c61676765642e00006044820152606401610ddd565b6001600160a01b03166000908152601260205260409020805460ff19169055565b6000600f544361143f9190613e3b565b905090565b6005546001600160a01b0316331461146e5760405162461bcd60e51b8152600401610ddd90613da4565b6001600160a01b0381166114945760405162461bcd60e51b8152600401610ddd90613e4e565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517fbe44206028f822dac2ebcaa5d159bc6dd360d15efe18e39cca3b1ed009d86c5b90600090a250565b600e546001600160a01b031633146115385760405162461bcd60e51b815260206004820152601860248201527f4d7573742062652072656465656d6572206164647265737300000000000000006044820152606401610ddd565b6000601054116115955760405162461bcd60e51b815260206004820152602260248201527f43616e206f6e6c7920626520747269676765726564206166746572206c61756e6044820152610c6d60f31b6064820152608401610ddd565b6020546010546115a89062ed4e00613e28565b6115b29190613e28565b42116115f25760405162461bcd60e51b815260206004820152600f60248201526e10dbdbdb191bdddb881c195c9a5bd9608a1b6044820152606401610ddd565b6115fc8282613674565b6b204fce5e3e2502611000000061161260025490565b1161166d5760405162461bcd60e51b815260206004820152602560248201527f57697468696e20626f756e6473206f6620636c696d61746520726571756972656044820152646d656e747360d81b6064820152608401610ddd565b5050565b6005546001600160a01b0316331461169b5760405162461bcd60e51b8152600401610ddd90613da4565b6015805460ff19169055565b6005546001600160a01b031633146116d15760405162461bcd60e51b8152600401610ddd90613da4565b8061174457600a546001600160a01b03908116908316036117445760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610ddd565b6001600160a01b03919091166000908152602660205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146117995760405162461bcd60e51b8152600401610ddd90613da4565b806117e65760405162461bcd60e51b815260206004820152601860248201527f506c6561736520636f6e6669726d2072656e6f756e63652100000000000000006044820152606401610ddd565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350600580546001600160a01b0319169055565b6005546001600160a01b0316331461185b5760405162461bcd60e51b8152600401610ddd90613da4565b6019839055601a829055601b819055806118758385613e28565b61187f9190613e28565b6018819055600510156118d45760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610ddd565b505050565b6005546000906001600160a01b031633146119065760405162461bcd60e51b8152600401610ddd90613da4565b6001600160a01b03831661195c5760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610ddd565b6001600160a01b0383163014158061197c5750601554610100900460ff16155b6119e55760405162461bcd60e51b815260206004820152603460248201527f43616e2774207769746864726177206e617469766520746f6b656e73207768696044820152736c652074726164696e672069732061637469766560601b6064820152608401610ddd565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611a2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a509190613e90565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af1158015611aa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac79190613ea9565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b03163314611b3d5760405162461bcd60e51b8152600401610ddd90613da4565b602454610100900460ff16611bae5760405162461bcd60e51b815260206004820152603160248201527f4d61726b20626f742066756e6374696f6e616c69747920616c72656164792064604482015270697361626c656420666f7265766572212160781b6064820152608401610ddd565b6024805461ff0019169055565b6005546001600160a01b03163314611be55760405162461bcd60e51b8152600401610ddd90613da4565b601554610100900460ff1615611c515760405162461bcd60e51b815260206004820152602b60248201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60448201526a3a103932b630bab731b41760a91b6064820152608401610ddd565b600a8310611cb15760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f74206d616b652070656e616c747920626c6f636b73206d6f72652060448201526607468616e2031360cc1b6064820152608401610ddd565b6015805462ffff0019166201010017905543600f81905542601055611cd7908490613e28565b611ce2906002613e28565b6011556019829055601d8190556000601a819055601b819055611d058184613e28565b611d0f9190613e28565b6018556000601e819055601f819055601d54611d2c908290613e28565b611d369190613e28565b601c556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a1505050565b606060048054610d1990613d6a565b60606013805480602002602001604051908101604052809291908181526020018280548015610d9257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611db0575050505050905090565b6005546001600160a01b03163314611e015760405162461bcd60e51b8152600401610ddd90613da4565b600a546001600160a01b0390811690831603611e855760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610ddd565b611e8f8282613753565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611f4d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ddd565b611f5a33858584036127c2565b5060019392505050565b6000610da93384846128e6565b6005546001600160a01b03163314611f9b5760405162461bcd60e51b8152600401610ddd90613da4565b6001600160a01b038216600081815260256020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146120245760405162461bcd60e51b8152600401610ddd90613da4565b601d839055601e829055601f8190558061203e8385613e28565b6120489190613e28565b601c819055600510156118d45760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610ddd565b6005546001600160a01b031633146120c75760405162461bcd60e51b8152600401610ddd90613da4565b670de0b6b3a76400006103e86120dc60025490565b6120e7906005613def565b6120f19190613e06565b6120fb9190613e06565b81101561215f5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e352560a01b6064820152608401610ddd565b670de0b6b3a7640000606461217360025490565b61217e906005613def565b6121889190613e06565b6121929190613e06565b8111156121f55760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e742068696760448201526a686572207468616e20352560a81b6064820152608401610ddd565b61220781670de0b6b3a7640000613def565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc906020016111d9565b6005546001600160a01b031633146122665760405162461bcd60e51b8152600401610ddd90613da4565b620186a061227360025490565b61227e906001613def565b6122889190613e06565b8110156122f55760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610ddd565b6103e861230160025490565b61230c906001613def565b6123169190613e06565b8111156123825760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610ddd565b600b55565b6005546001600160a01b031633146123b15760405162461bcd60e51b8152600401610ddd90613da4565b670de0b6b3a76400006103e86123c660025490565b6123d1906005613def565b6123db9190613e06565b6123e59190613e06565b8110156124475760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e352560b01b6064820152608401610ddd565b670de0b6b3a7640000606461245b60025490565b612466906002613def565b6124709190613e06565b61247a9190613e06565b8111156124db5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e7420686967686560448201526872207468616e20322560b81b6064820152608401610ddd565b6124ed81670de0b6b3a7640000613def565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e906020016111d9565b6005546001600160a01b0316331461254c5760405162461bcd60e51b8152600401610ddd90613da4565b806020600082825461255e9190613e28565b909155505050565b6005546001600160a01b031633146125905760405162461bcd60e51b8152600401610ddd90613da4565b6017805460ff19169055565b601381815481106125ac57600080fd5b6000918252602090912001546001600160a01b0316905081565b6005546001600160a01b031633146125f05760405162461bcd60e51b8152600401610ddd90613da4565b6001600160a01b0381166126555760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ddd565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146126db5760405162461bcd60e51b8152600401610ddd90613da4565b604051600090339047908381818185875af1925050503d806000811461271d576040519150601f19603f3d011682016040523d82523d6000602084013e612722565b606091505b50505050565b6005546001600160a01b031633146127525760405162461bcd60e51b8152600401610ddd90613da4565b6001600160a01b0381166127785760405162461bcd60e51b8152600401610ddd90613e4e565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f2d54fe1dc7d99066776a6768f6c1a7d9a3fc07a354dfbac8057f6f831e9ba5b790600090a250565b6001600160a01b0383166128245760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ddd565b6001600160a01b0382166128855760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ddd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661290c5760405162461bcd60e51b8152600401610ddd90613ec6565b6001600160a01b0382166129325760405162461bcd60e51b8152600401610ddd90613f0b565b600081116129825760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610ddd565b601554610100900460ff16612a15576001600160a01b03831660009081526025602052604090205460ff16806129d057506001600160a01b03821660009081526025602052604090205460ff165b612a155760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610ddd565b6011544310158015612a2e5750601554610100900460ff165b15612afe576001600160a01b03831660009081526012602052604090205460ff161580612a6857506005546001600160a01b038381169116145b80612a7d57506001600160a01b03821661dead145b612afe5760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610ddd565b60155460ff1615612f44576005546001600160a01b03848116911614801590612b3557506005546001600160a01b03838116911614155b8015612b4c57506001600160a01b03821661dead14155b8015612b7157506001600160a01b03831660009081526025602052604090205460ff16155b8015612b9657506001600160a01b03821660009081526025602052604090205460ff16155b15612f445760175460ff1615612caf576009546001600160a01b03838116911614801590612bd25750600a546001600160a01b03838116911614155b15612caf57612be2600243613e3b565b32600090815260166020526040902054108015612c205750612c05600243613e3b565b6001600160a01b038316600090815260166020526040902054105b612c8a5760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610ddd565b3260009081526016602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526027602052604090205460ff168015612cf057506001600160a01b03821660009081526026602052604090205460ff16155b15612dc757600654811115612d585760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610ddd565b6008546001600160a01b038316600090815260208190526040902054612d7e9083613e28565b1115612dc25760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610ddd565b612f44565b6001600160a01b03821660009081526027602052604090205460ff168015612e0857506001600160a01b03831660009081526026602052604090205460ff16155b15612eba5760245460ff16612e555760405162461bcd60e51b815260206004820152601360248201527214d95b1b1a5b99c81a5cc8191a5cd8589b1959606a1b6044820152606401610ddd565b600754811115612dc25760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610ddd565b6001600160a01b03821660009081526026602052604090205460ff16612f44576008546001600160a01b038316600090815260208190526040902054612f009083613e28565b1115612f445760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610ddd565b30600090815260208190526040902054600b5481108015908190612f70575060155462010000900460ff165b8015612f865750600a54600160a01b900460ff16155b8015612faa57506001600160a01b03841660009081526027602052604090205460ff165b15612fd857600a805460ff60a01b1916600160a01b179055612fca613467565b600a805460ff60a01b191690555b6001600160a01b03851660009081526025602052604090205460019060ff168061301a57506001600160a01b03851660009081526025602052604090205460ff165b15613023575060005b60008115613453576011544310806130695750670c7d713b49da000060065461304c9190613e3b565b851015801561306957504360115460046130669190613e28565b10155b801561308d57506001600160a01b03871660009081526027602052604090205460ff165b80156130b257506001600160a01b03861660009081526027602052604090205460ff16155b80156130d757506001600160a01b03861660009081526025602052604090205460ff16155b80156130e557506000601854115b1561329c57601154431061310c576001600660008282546131069190613e3b565b90915550505b6001600160a01b03861660009081526012602052604090205460ff166131ec576001600160a01b0386166000908152601260205260408120805460ff191660019081179091556014805491929091613165908490613e28565b9091555050601380546001810182556000919091527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b0319166001600160a01b0388169081179091556040519081527f55678e47d0a699d3ab99b0184c4ff14f2246ba80522deb921aa0c8823578c44a9060200160405180910390a15b60646131f9866050613def565b6132039190613e06565b9050601854601a54826132169190613def565b6132209190613e06565b602260008282546132319190613e28565b90915550506018546019546132469083613def565b6132509190613e06565b602160008282546132619190613e28565b9091555050601854601b546132769083613def565b6132809190613e06565b602360008282546132919190613e28565b909155506134359050565b6001600160a01b03861660009081526027602052604090205460ff1680156132c657506000601c54115b15613358576064601c54866132db9190613def565b6132e59190613e06565b9050601c54601e54826132f89190613def565b6133029190613e06565b602260008282546133139190613e28565b9091555050601c54601d546133289083613def565b6133329190613e06565b602160008282546133439190613e28565b9091555050601c54601f546132769083613def565b6001600160a01b03871660009081526027602052604090205460ff16801561338257506000601854115b15613435576064601854866133979190613def565b6133a19190613e06565b9050601854601a54826133b49190613def565b6133be9190613e06565b602260008282546133cf9190613e28565b90915550506018546019546133e49083613def565b6133ee9190613e06565b602160008282546133ff9190613e28565b9091555050601854601b546134149083613def565b61341e9190613e06565b6023600082825461342f9190613e28565b90915550505b801561344657613446873083613781565b6134508186613e3b565b94505b61345e878787613781565b50505050505050565b306000908152602081905260408120549050600060235460215460225461348e9190613e28565b6134989190613e28565b90508115806134a5575080155b156134ae575050565b600b546134bc90600a613def565b8211156134d457600b546134d190600a613def565b91505b600080600283602254866134e89190613def565b6134f29190613e06565b6134fc9190613e06565b905061351061350b8286613e3b565b6138d6565b6022544790819060009061352690600290613e06565b6135309087613e3b565b60215461353d9085613def565b6135479190613e06565b90506000600260225461355a9190613e06565b6135649088613e3b565b6023546135719086613def565b61357b9190613e06565b90506135878183613e28565b6135919084613e3b565b600060228190556021819055602355925084158015906135b15750600083115b156135c0576135c08584613a30565b600d546040516001600160a01b03909116908290600081818185875af1925050503d806000811461360d576040519150601f19603f3d011682016040523d82523d6000602084013e613612565b606091505b5050600c546040519197506001600160a01b0316904790600081818185875af1925050503d8060008114613662576040519150601f19603f3d011682016040523d82523d6000602084013e613667565b606091505b5050505050505050505050565b6001600160a01b0382166136ca5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ddd565b80600260008282546136dc9190613e28565b90915550506001600160a01b03821660009081526020819052604081208054839290613709908490613e28565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166000908152602760205260409020805460ff1916821515179055611e8f8282613ae2565b6001600160a01b0383166137a75760405162461bcd60e51b8152600401610ddd90613ec6565b6001600160a01b0382166137cd5760405162461bcd60e51b8152600401610ddd90613f0b565b6001600160a01b038316600090815260208190526040902054818110156138455760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ddd565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061387c908490613e28565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516138c891815260200190565b60405180910390a350505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061390b5761390b613f4e565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613964573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139889190613f64565b8160018151811061399b5761399b613f4e565b6001600160a01b0392831660209182029290920101526009546139c191309116846127c2565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac947906139fa908590600090869030904290600401613f81565b600060405180830381600087803b158015613a1457600080fd5b505af1158015613a28573d6000803e3d6000fd5b505050505050565b600954613a489030906001600160a01b0316846127c2565b60095460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613ab6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613adb9190613fbd565b5050505050565b6001600160a01b038216600081815260266020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b600060208083528351808285015260005b81811015613b7257858101830151858201604001528201613b56565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114613ba857600080fd5b50565b60008060408385031215613bbe57600080fd5b8235613bc981613b93565b946020939093013593505050565b600060208284031215613be957600080fd5b8135613bf481613b93565b9392505050565b600080600060608486031215613c1057600080fd5b8335613c1b81613b93565b92506020840135613c2b81613b93565b929592945050506040919091013590565b600060208284031215613c4e57600080fd5b5035919050565b8015158114613ba857600080fd5b60008060408385031215613c7657600080fd5b8235613c8181613b93565b91506020830135613c9181613c55565b809150509250929050565b600060208284031215613cae57600080fd5b8135613bf481613c55565b600080600060608486031215613cce57600080fd5b505081359360208301359350604090920135919050565b60008060408385031215613cf857600080fd5b8235613d0381613b93565b91506020830135613c9181613b93565b600081518084526020808501945080840160005b83811015613d4c5781516001600160a01b031687529582019590820190600101613d27565b509495945050505050565b602081526000613bf46020830184613d13565b600181811c90821680613d7e57607f821691505b602082108103613d9e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610dad57610dad613dd9565b600082613e2357634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610dad57610dad613dd9565b81810381811115610dad57610dad613dd9565b60208082526022908201527f5f6665654f6e654164647265737320616464726573732063616e6e6f74206265604082015261020360f41b606082015260800190565b600060208284031215613ea257600080fd5b5051919050565b600060208284031215613ebb57600080fd5b8151613bf481613c55565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613f7657600080fd5b8151613bf481613b93565b85815284602082015260a060408201526000613fa060a0830186613d13565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613fd257600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220a26dc7cb04c58b7b8f00b4373e13adef3873a887c0d95a3910c3bfb85b743bee64736f6c634300081100334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x60806040526004361061043f5760003560e01c80638366e79a11610234578063c18bc1951161012e578063e884f260116100b6578063f5648a4f1161007a578063f5648a4f14610c8f578063f637434214610ca4578063f771cb6514610cba578063f8b45b0514610cd4578063fca2502914610cea57600080fd5b8063e884f26014610c0e578063eb472fc414610c23578063ee40166e14610c43578063f11a24d314610c59578063f2fde38b14610c6f57600080fd5b8063d85ba063116100fd578063d85ba06314610b5c578063dc3f0d0f14610b72578063dd62ed3e14610b92578063e2f4560514610bd8578063e53fe0e914610bee57600080fd5b8063c18bc19514610aec578063c876d0b914610b0c578063d060c69f14610b26578063d257b34f14610b3c57600080fd5b80639a5bd2dd116101bc578063a9059cbb11610180578063a9059cbb14610a3d578063b62496f514610a5d578063bbc0c74214610a8d578063c024666814610aac578063c17b5b8c14610acc57600080fd5b80639a5bd2dd146109a55780639a7a23d6146109c7578063a457c2d7146109e7578063a52c6e2b14610a07578063a62068ce14610a2757600080fd5b806385ecfd281161020357806385ecfd281461090c5780638736c1791461093c57806388e765ff1461095c5780638da5cb5b1461097257806395d89b411461099057600080fd5b80638366e79a146108ab578063837dc317146108cb578063842309d9146108e0578063854853da146108f657600080fd5b8063452ed4f1116103455780636a486a8e116102cd57806373e556f31161029157806373e556f314610816578063751039fc146108365780637571336a1461084b5780637e926b4b1461086b5780638095d5641461088b57600080fd5b80636a486a8e146107745780636b0a894c1461078a5780636ddd1713146107a05780637000a438146107c057806370a08231146107e057600080fd5b806358a6d5311161031457806358a6d531146106fc5780635bb988c914610713578063649df3b61461073357806366d602ae146107485780636a3ffffb1461075e57600080fd5b8063452ed4f1146106975780634a62bb65146106b757806351f205e4146106d157806357a7d409146106e657600080fd5b80631d5915f3116103c85780632d5537b0116103975780632d5537b01461060f578063313ce56714610625578063360cabcf1461064157806339509351146106575780633dc9994c1461067757600080fd5b80631d5915f31461058f5780632117236c146105af57806323b872dd146105cf5780632be32b61146105ef57600080fd5b80630fcdfb941161040f5780630fcdfb94146104fe57806310d5de531461051557806314bf88a61461054557806318160ddd146105645780631a8145bb1461057957600080fd5b80626bf4f01461044b57806306fdde03146104745780630758d92414610496578063095ea7b3146104ce57600080fd5b3661044657005b600080fd5b34801561045757600080fd5b5061046160215481565b6040519081526020015b60405180910390f35b34801561048057600080fd5b50610489610d0a565b60405161046b9190613b45565b3480156104a257600080fd5b506009546104b6906001600160a01b031681565b6040516001600160a01b03909116815260200161046b565b3480156104da57600080fd5b506104ee6104e9366004613bab565b610d9c565b604051901515815260200161046b565b34801561050a57600080fd5b50610513610db3565b005b34801561052157600080fd5b506104ee610530366004613bd7565b60266020526000908152604090205460ff1681565b34801561055157600080fd5b506024546104ee90610100900460ff1681565b34801561057057600080fd5b50600254610461565b34801561058557600080fd5b5061046160225481565b34801561059b57600080fd5b506105136105aa366004613bd7565b610e71565b3480156105bb57600080fd5b50600d546104b6906001600160a01b031681565b3480156105db57600080fd5b506104ee6105ea366004613bfb565b610f99565b3480156105fb57600080fd5b5061051361060a366004613c3c565b611043565b34801561061b57600080fd5b5061046160205481565b34801561063157600080fd5b506040516012815260200161046b565b34801561064d57600080fd5b50610461601f5481565b34801561066357600080fd5b506104ee610672366004613bab565b6111e4565b34801561068357600080fd5b50610513610692366004613bd7565b611220565b3480156106a357600080fd5b50600a546104b6906001600160a01b031681565b3480156106c357600080fd5b506015546104ee9060ff1681565b3480156106dd57600080fd5b5061051361126c565b3480156106f257600080fd5b50610461601d5481565b34801561070857600080fd5b5060115443106104ee565b34801561071f57600080fd5b5061051361072e366004613bd7565b61137c565b34801561073f57600080fd5b5061046161142f565b34801561075457600080fd5b5061046160075481565b34801561076a57600080fd5b5061046160105481565b34801561078057600080fd5b50610461601c5481565b34801561079657600080fd5b5061046160145481565b3480156107ac57600080fd5b506015546104ee9062010000900460ff1681565b3480156107cc57600080fd5b506105136107db366004613bd7565b611444565b3480156107ec57600080fd5b506104616107fb366004613bd7565b6001600160a01b031660009081526020819052604090205490565b34801561082257600080fd5b50610513610831366004613bab565b6114de565b34801561084257600080fd5b50610513611671565b34801561085757600080fd5b50610513610866366004613c63565b6116a7565b34801561087757600080fd5b50610513610886366004613c9c565b61176f565b34801561089757600080fd5b506105136108a6366004613cb9565b611831565b3480156108b757600080fd5b506104ee6108c6366004613ce5565b6118d9565b3480156108d757600080fd5b50610513611b13565b3480156108ec57600080fd5b5061046160235481565b34801561090257600080fd5b50610461601b5481565b34801561091857600080fd5b506104ee610927366004613bd7565b60126020526000908152604090205460ff1681565b34801561094857600080fd5b50610513610957366004613cb9565b611bbb565b34801561096857600080fd5b5061046160065481565b34801561097e57600080fd5b506005546001600160a01b03166104b6565b34801561099c57600080fd5b50610489611d67565b3480156109b157600080fd5b506109ba611d76565b60405161046b9190613d57565b3480156109d357600080fd5b506105136109e2366004613c63565b611dd7565b3480156109f357600080fd5b506104ee610a02366004613bab565b611ecb565b348015610a1357600080fd5b50600c546104b6906001600160a01b031681565b348015610a3357600080fd5b5061046160115481565b348015610a4957600080fd5b506104ee610a58366004613bab565b611f64565b348015610a6957600080fd5b506104ee610a78366004613bd7565b60276020526000908152604090205460ff1681565b348015610a9957600080fd5b506015546104ee90610100900460ff1681565b348015610ab857600080fd5b50610513610ac7366004613c63565b611f71565b348015610ad857600080fd5b50610513610ae7366004613cb9565b611ffa565b348015610af857600080fd5b50610513610b07366004613c3c565b61209d565b348015610b1857600080fd5b506017546104ee9060ff1681565b348015610b3257600080fd5b5061046160195481565b348015610b4857600080fd5b50610513610b57366004613c3c565b61223c565b348015610b6857600080fd5b5061046160185481565b348015610b7e57600080fd5b50610513610b8d366004613c3c565b612387565b348015610b9e57600080fd5b50610461610bad366004613ce5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610be457600080fd5b50610461600b5481565b348015610bfa57600080fd5b50610513610c09366004613c3c565b612522565b348015610c1a57600080fd5b50610513612566565b348015610c2f57600080fd5b506104b6610c3e366004613c3c565b61259c565b348015610c4f57600080fd5b50610461600f5481565b348015610c6557600080fd5b50610461601a5481565b348015610c7b57600080fd5b50610513610c8a366004613bd7565b6125c6565b348015610c9b57600080fd5b506105136126b1565b348015610cb057600080fd5b50610461601e5481565b348015610cc657600080fd5b506024546104ee9060ff1681565b348015610ce057600080fd5b5061046160085481565b348015610cf657600080fd5b50610513610d05366004613bd7565b612728565b606060038054610d1990613d6a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4590613d6a565b8015610d925780601f10610d6757610100808354040283529160200191610d92565b820191906000526020600020905b815481529060010190602001808311610d7557829003601f168201915b5050505050905090565b6000610da93384846127c2565b5060015b92915050565b6005546001600160a01b03163314610de65760405162461bcd60e51b8152600401610ddd90613da4565b60405180910390fd5b60245460ff1615610e395760405162461bcd60e51b815260206004820152601860248201527f53656c6c696e6720616c726561647920656e61626c65642100000000000000006044820152606401610ddd565b6024805460ff191660011790556040517f7fdc9c6ba047bed382d2ae7be131e601f2fead137f249278e33c13a6928b080890600090a1565b6005546001600160a01b03163314610e9b5760405162461bcd60e51b8152600401610ddd90613da4565b602454610100900460ff16610f0c5760405162461bcd60e51b815260206004820152603160248201527f4d61726b20626f742066756e6374696f6e616c69747920686173206265656e2060448201527064697361626c656420666f72657665722160781b6064820152608401610ddd565b6001600160a01b03811660009081526012602052604090205460ff1615610f755760405162461bcd60e51b815260206004820152601a60248201527f57616c6c657420697320616c726561647920666c61676765642e0000000000006044820152606401610ddd565b6001600160a01b03166000908152601260205260409020805460ff19166001179055565b6000610fa68484846128e6565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561102b5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ddd565b61103885338584036127c2565b506001949350505050565b6005546001600160a01b0316331461106d5760405162461bcd60e51b8152600401610ddd90613da4565b670de0b6b3a76400006103e861108260025490565b61108d906005613def565b6110979190613e06565b6110a19190613e06565b8110156111025760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e352560b81b6064820152608401610ddd565b670de0b6b3a7640000606461111660025490565b611121906002613def565b61112b9190613e06565b6111359190613e06565b8111156111965760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206275792073656c6c20616d6f756e7420686967686560448201526872207468616e20322560b81b6064820152608401610ddd565b6111a881670de0b6b3a7640000613def565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610da991859061121b908690613e28565b6127c2565b6005546001600160a01b0316331461124a5760405162461bcd60e51b8152600401610ddd90613da4565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146112965760405162461bcd60e51b8152600401610ddd90613da4565b600b5430600090815260208190526040902054101561131f576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610ddd565b600a805460ff60a01b1916600160a01b17905561133a613467565b600a805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb329060200160405180910390a1565b6005546001600160a01b031633146113a65760405162461bcd60e51b8152600401610ddd90613da4565b6001600160a01b03811660009081526012602052604090205460ff1661140e5760405162461bcd60e51b815260206004820152601e60248201527f57616c6c657420697320616c7265616479206e6f7420666c61676765642e00006044820152606401610ddd565b6001600160a01b03166000908152601260205260409020805460ff19169055565b6000600f544361143f9190613e3b565b905090565b6005546001600160a01b0316331461146e5760405162461bcd60e51b8152600401610ddd90613da4565b6001600160a01b0381166114945760405162461bcd60e51b8152600401610ddd90613e4e565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517fbe44206028f822dac2ebcaa5d159bc6dd360d15efe18e39cca3b1ed009d86c5b90600090a250565b600e546001600160a01b031633146115385760405162461bcd60e51b815260206004820152601860248201527f4d7573742062652072656465656d6572206164647265737300000000000000006044820152606401610ddd565b6000601054116115955760405162461bcd60e51b815260206004820152602260248201527f43616e206f6e6c7920626520747269676765726564206166746572206c61756e6044820152610c6d60f31b6064820152608401610ddd565b6020546010546115a89062ed4e00613e28565b6115b29190613e28565b42116115f25760405162461bcd60e51b815260206004820152600f60248201526e10dbdbdb191bdddb881c195c9a5bd9608a1b6044820152606401610ddd565b6115fc8282613674565b6b204fce5e3e2502611000000061161260025490565b1161166d5760405162461bcd60e51b815260206004820152602560248201527f57697468696e20626f756e6473206f6620636c696d61746520726571756972656044820152646d656e747360d81b6064820152608401610ddd565b5050565b6005546001600160a01b0316331461169b5760405162461bcd60e51b8152600401610ddd90613da4565b6015805460ff19169055565b6005546001600160a01b031633146116d15760405162461bcd60e51b8152600401610ddd90613da4565b8061174457600a546001600160a01b03908116908316036117445760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610ddd565b6001600160a01b03919091166000908152602660205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146117995760405162461bcd60e51b8152600401610ddd90613da4565b806117e65760405162461bcd60e51b815260206004820152601860248201527f506c6561736520636f6e6669726d2072656e6f756e63652100000000000000006044820152606401610ddd565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350600580546001600160a01b0319169055565b6005546001600160a01b0316331461185b5760405162461bcd60e51b8152600401610ddd90613da4565b6019839055601a829055601b819055806118758385613e28565b61187f9190613e28565b6018819055600510156118d45760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610ddd565b505050565b6005546000906001600160a01b031633146119065760405162461bcd60e51b8152600401610ddd90613da4565b6001600160a01b03831661195c5760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610ddd565b6001600160a01b0383163014158061197c5750601554610100900460ff16155b6119e55760405162461bcd60e51b815260206004820152603460248201527f43616e2774207769746864726177206e617469766520746f6b656e73207768696044820152736c652074726164696e672069732061637469766560601b6064820152608401610ddd565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611a2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a509190613e90565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af1158015611aa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac79190613ea9565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b03163314611b3d5760405162461bcd60e51b8152600401610ddd90613da4565b602454610100900460ff16611bae5760405162461bcd60e51b815260206004820152603160248201527f4d61726b20626f742066756e6374696f6e616c69747920616c72656164792064604482015270697361626c656420666f7265766572212160781b6064820152608401610ddd565b6024805461ff0019169055565b6005546001600160a01b03163314611be55760405162461bcd60e51b8152600401610ddd90613da4565b601554610100900460ff1615611c515760405162461bcd60e51b815260206004820152602b60248201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60448201526a3a103932b630bab731b41760a91b6064820152608401610ddd565b600a8310611cb15760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f74206d616b652070656e616c747920626c6f636b73206d6f72652060448201526607468616e2031360cc1b6064820152608401610ddd565b6015805462ffff0019166201010017905543600f81905542601055611cd7908490613e28565b611ce2906002613e28565b6011556019829055601d8190556000601a819055601b819055611d058184613e28565b611d0f9190613e28565b6018556000601e819055601f819055601d54611d2c908290613e28565b611d369190613e28565b601c556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a1505050565b606060048054610d1990613d6a565b60606013805480602002602001604051908101604052809291908181526020018280548015610d9257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611db0575050505050905090565b6005546001600160a01b03163314611e015760405162461bcd60e51b8152600401610ddd90613da4565b600a546001600160a01b0390811690831603611e855760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610ddd565b611e8f8282613753565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611f4d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ddd565b611f5a33858584036127c2565b5060019392505050565b6000610da93384846128e6565b6005546001600160a01b03163314611f9b5760405162461bcd60e51b8152600401610ddd90613da4565b6001600160a01b038216600081815260256020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146120245760405162461bcd60e51b8152600401610ddd90613da4565b601d839055601e829055601f8190558061203e8385613e28565b6120489190613e28565b601c819055600510156118d45760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610ddd565b6005546001600160a01b031633146120c75760405162461bcd60e51b8152600401610ddd90613da4565b670de0b6b3a76400006103e86120dc60025490565b6120e7906005613def565b6120f19190613e06565b6120fb9190613e06565b81101561215f5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e352560a01b6064820152608401610ddd565b670de0b6b3a7640000606461217360025490565b61217e906005613def565b6121889190613e06565b6121929190613e06565b8111156121f55760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e742068696760448201526a686572207468616e20352560a81b6064820152608401610ddd565b61220781670de0b6b3a7640000613def565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc906020016111d9565b6005546001600160a01b031633146122665760405162461bcd60e51b8152600401610ddd90613da4565b620186a061227360025490565b61227e906001613def565b6122889190613e06565b8110156122f55760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610ddd565b6103e861230160025490565b61230c906001613def565b6123169190613e06565b8111156123825760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610ddd565b600b55565b6005546001600160a01b031633146123b15760405162461bcd60e51b8152600401610ddd90613da4565b670de0b6b3a76400006103e86123c660025490565b6123d1906005613def565b6123db9190613e06565b6123e59190613e06565b8110156124475760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e352560b01b6064820152608401610ddd565b670de0b6b3a7640000606461245b60025490565b612466906002613def565b6124709190613e06565b61247a9190613e06565b8111156124db5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e7420686967686560448201526872207468616e20322560b81b6064820152608401610ddd565b6124ed81670de0b6b3a7640000613def565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e906020016111d9565b6005546001600160a01b0316331461254c5760405162461bcd60e51b8152600401610ddd90613da4565b806020600082825461255e9190613e28565b909155505050565b6005546001600160a01b031633146125905760405162461bcd60e51b8152600401610ddd90613da4565b6017805460ff19169055565b601381815481106125ac57600080fd5b6000918252602090912001546001600160a01b0316905081565b6005546001600160a01b031633146125f05760405162461bcd60e51b8152600401610ddd90613da4565b6001600160a01b0381166126555760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ddd565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146126db5760405162461bcd60e51b8152600401610ddd90613da4565b604051600090339047908381818185875af1925050503d806000811461271d576040519150601f19603f3d011682016040523d82523d6000602084013e612722565b606091505b50505050565b6005546001600160a01b031633146127525760405162461bcd60e51b8152600401610ddd90613da4565b6001600160a01b0381166127785760405162461bcd60e51b8152600401610ddd90613e4e565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f2d54fe1dc7d99066776a6768f6c1a7d9a3fc07a354dfbac8057f6f831e9ba5b790600090a250565b6001600160a01b0383166128245760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ddd565b6001600160a01b0382166128855760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ddd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661290c5760405162461bcd60e51b8152600401610ddd90613ec6565b6001600160a01b0382166129325760405162461bcd60e51b8152600401610ddd90613f0b565b600081116129825760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610ddd565b601554610100900460ff16612a15576001600160a01b03831660009081526025602052604090205460ff16806129d057506001600160a01b03821660009081526025602052604090205460ff165b612a155760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610ddd565b6011544310158015612a2e5750601554610100900460ff165b15612afe576001600160a01b03831660009081526012602052604090205460ff161580612a6857506005546001600160a01b038381169116145b80612a7d57506001600160a01b03821661dead145b612afe5760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610ddd565b60155460ff1615612f44576005546001600160a01b03848116911614801590612b3557506005546001600160a01b03838116911614155b8015612b4c57506001600160a01b03821661dead14155b8015612b7157506001600160a01b03831660009081526025602052604090205460ff16155b8015612b9657506001600160a01b03821660009081526025602052604090205460ff16155b15612f445760175460ff1615612caf576009546001600160a01b03838116911614801590612bd25750600a546001600160a01b03838116911614155b15612caf57612be2600243613e3b565b32600090815260166020526040902054108015612c205750612c05600243613e3b565b6001600160a01b038316600090815260166020526040902054105b612c8a5760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610ddd565b3260009081526016602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526027602052604090205460ff168015612cf057506001600160a01b03821660009081526026602052604090205460ff16155b15612dc757600654811115612d585760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610ddd565b6008546001600160a01b038316600090815260208190526040902054612d7e9083613e28565b1115612dc25760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610ddd565b612f44565b6001600160a01b03821660009081526027602052604090205460ff168015612e0857506001600160a01b03831660009081526026602052604090205460ff16155b15612eba5760245460ff16612e555760405162461bcd60e51b815260206004820152601360248201527214d95b1b1a5b99c81a5cc8191a5cd8589b1959606a1b6044820152606401610ddd565b600754811115612dc25760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610ddd565b6001600160a01b03821660009081526026602052604090205460ff16612f44576008546001600160a01b038316600090815260208190526040902054612f009083613e28565b1115612f445760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610ddd565b30600090815260208190526040902054600b5481108015908190612f70575060155462010000900460ff165b8015612f865750600a54600160a01b900460ff16155b8015612faa57506001600160a01b03841660009081526027602052604090205460ff165b15612fd857600a805460ff60a01b1916600160a01b179055612fca613467565b600a805460ff60a01b191690555b6001600160a01b03851660009081526025602052604090205460019060ff168061301a57506001600160a01b03851660009081526025602052604090205460ff165b15613023575060005b60008115613453576011544310806130695750670c7d713b49da000060065461304c9190613e3b565b851015801561306957504360115460046130669190613e28565b10155b801561308d57506001600160a01b03871660009081526027602052604090205460ff165b80156130b257506001600160a01b03861660009081526027602052604090205460ff16155b80156130d757506001600160a01b03861660009081526025602052604090205460ff16155b80156130e557506000601854115b1561329c57601154431061310c576001600660008282546131069190613e3b565b90915550505b6001600160a01b03861660009081526012602052604090205460ff166131ec576001600160a01b0386166000908152601260205260408120805460ff191660019081179091556014805491929091613165908490613e28565b9091555050601380546001810182556000919091527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b0319166001600160a01b0388169081179091556040519081527f55678e47d0a699d3ab99b0184c4ff14f2246ba80522deb921aa0c8823578c44a9060200160405180910390a15b60646131f9866050613def565b6132039190613e06565b9050601854601a54826132169190613def565b6132209190613e06565b602260008282546132319190613e28565b90915550506018546019546132469083613def565b6132509190613e06565b602160008282546132619190613e28565b9091555050601854601b546132769083613def565b6132809190613e06565b602360008282546132919190613e28565b909155506134359050565b6001600160a01b03861660009081526027602052604090205460ff1680156132c657506000601c54115b15613358576064601c54866132db9190613def565b6132e59190613e06565b9050601c54601e54826132f89190613def565b6133029190613e06565b602260008282546133139190613e28565b9091555050601c54601d546133289083613def565b6133329190613e06565b602160008282546133439190613e28565b9091555050601c54601f546132769083613def565b6001600160a01b03871660009081526027602052604090205460ff16801561338257506000601854115b15613435576064601854866133979190613def565b6133a19190613e06565b9050601854601a54826133b49190613def565b6133be9190613e06565b602260008282546133cf9190613e28565b90915550506018546019546133e49083613def565b6133ee9190613e06565b602160008282546133ff9190613e28565b9091555050601854601b546134149083613def565b61341e9190613e06565b6023600082825461342f9190613e28565b90915550505b801561344657613446873083613781565b6134508186613e3b565b94505b61345e878787613781565b50505050505050565b306000908152602081905260408120549050600060235460215460225461348e9190613e28565b6134989190613e28565b90508115806134a5575080155b156134ae575050565b600b546134bc90600a613def565b8211156134d457600b546134d190600a613def565b91505b600080600283602254866134e89190613def565b6134f29190613e06565b6134fc9190613e06565b905061351061350b8286613e3b565b6138d6565b6022544790819060009061352690600290613e06565b6135309087613e3b565b60215461353d9085613def565b6135479190613e06565b90506000600260225461355a9190613e06565b6135649088613e3b565b6023546135719086613def565b61357b9190613e06565b90506135878183613e28565b6135919084613e3b565b600060228190556021819055602355925084158015906135b15750600083115b156135c0576135c08584613a30565b600d546040516001600160a01b03909116908290600081818185875af1925050503d806000811461360d576040519150601f19603f3d011682016040523d82523d6000602084013e613612565b606091505b5050600c546040519197506001600160a01b0316904790600081818185875af1925050503d8060008114613662576040519150601f19603f3d011682016040523d82523d6000602084013e613667565b606091505b5050505050505050505050565b6001600160a01b0382166136ca5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ddd565b80600260008282546136dc9190613e28565b90915550506001600160a01b03821660009081526020819052604081208054839290613709908490613e28565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166000908152602760205260409020805460ff1916821515179055611e8f8282613ae2565b6001600160a01b0383166137a75760405162461bcd60e51b8152600401610ddd90613ec6565b6001600160a01b0382166137cd5760405162461bcd60e51b8152600401610ddd90613f0b565b6001600160a01b038316600090815260208190526040902054818110156138455760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ddd565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061387c908490613e28565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516138c891815260200190565b60405180910390a350505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061390b5761390b613f4e565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613964573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139889190613f64565b8160018151811061399b5761399b613f4e565b6001600160a01b0392831660209182029290920101526009546139c191309116846127c2565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac947906139fa908590600090869030904290600401613f81565b600060405180830381600087803b158015613a1457600080fd5b505af1158015613a28573d6000803e3d6000fd5b505050505050565b600954613a489030906001600160a01b0316846127c2565b60095460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613ab6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613adb9190613fbd565b5050505050565b6001600160a01b038216600081815260266020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b600060208083528351808285015260005b81811015613b7257858101830151858201604001528201613b56565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114613ba857600080fd5b50565b60008060408385031215613bbe57600080fd5b8235613bc981613b93565b946020939093013593505050565b600060208284031215613be957600080fd5b8135613bf481613b93565b9392505050565b600080600060608486031215613c1057600080fd5b8335613c1b81613b93565b92506020840135613c2b81613b93565b929592945050506040919091013590565b600060208284031215613c4e57600080fd5b5035919050565b8015158114613ba857600080fd5b60008060408385031215613c7657600080fd5b8235613c8181613b93565b91506020830135613c9181613c55565b809150509250929050565b600060208284031215613cae57600080fd5b8135613bf481613c55565b600080600060608486031215613cce57600080fd5b505081359360208301359350604090920135919050565b60008060408385031215613cf857600080fd5b8235613d0381613b93565b91506020830135613c9181613b93565b600081518084526020808501945080840160005b83811015613d4c5781516001600160a01b031687529582019590820190600101613d27565b509495945050505050565b602081526000613bf46020830184613d13565b600181811c90821680613d7e57607f821691505b602082108103613d9e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610dad57610dad613dd9565b600082613e2357634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610dad57610dad613dd9565b81810381811115610dad57610dad613dd9565b60208082526022908201527f5f6665654f6e654164647265737320616464726573732063616e6e6f74206265604082015261020360f41b606082015260800190565b600060208284031215613ea257600080fd5b5051919050565b600060208284031215613ebb57600080fd5b8151613bf481613c55565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613f7657600080fd5b8151613bf481613b93565b85815284602082015260a060408201526000613fa060a0830186613d13565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613fd257600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220a26dc7cb04c58b7b8f00b4373e13adef3873a887c0d95a3910c3bfb85b743bee64736f6c63430008110033

Deployed Bytecode Sourcemap

10728:22666:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12045:30;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;12045:30:0;;;;;;;;4138:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10872:33::-;;;;;;;;;;-1:-1:-1;10872:33:0;;;;-1:-1:-1;;;;;10872:33:0;;;;;;-1:-1:-1;;;;;937:32:1;;;919:51;;907:2;892:18;10872:33:0;749:227:1;5193:210:0;;;;;;;;;;-1:-1:-1;5193:210:0;;;;;:::i;:::-;;:::i;:::-;;;1602:14:1;;1595:22;1577:41;;1565:2;1550:18;5193:210:0;1437:187:1;31203:185:0;;;;;;;;;;;;;:::i;:::-;;12304:63;;;;;;;;;;-1:-1:-1;12304:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;12199:37;;;;;;;;;;-1:-1:-1;12199:37:0;;;;;;;;;;;4459:108;;;;;;;;;;-1:-1:-1;4547:12:0;;4459:108;;12082:33;;;;;;;;;;;;;;;;15575:303;;;;;;;;;;-1:-1:-1;15575:303:0;;;;;:::i;:::-;;:::i;11047:28::-;;;;;;;;;;-1:-1:-1;11047:28:0;;;;-1:-1:-1;;;;;11047:28:0;;;5411:529;;;;;;;;;;-1:-1:-1;5411:529:0;;;;;:::i;:::-;;:::i;16234:456::-;;;;;;;;;;-1:-1:-1;16234:456:0;;;;;:::i;:::-;;:::i;12007:28::-;;;;;;;;;;;;;;;;4358:93;;;;;;;;;;-1:-1:-1;4358:93:0;;4441:2;2877:36:1;;2865:2;2850:18;4358:93:0;2735:184:1;11972:28:0;;;;;;;;;;;;;;;;5948:297;;;;;;;;;;-1:-1:-1;5948:297:0;;;;;:::i;:::-;;:::i;33145:117::-;;;;;;;;;;-1:-1:-1;33145:117:0;;;;;:::i;:::-;;:::i;10912:21::-;;;;;;;;;;-1:-1:-1;10912:21:0;;;;-1:-1:-1;;;;;10912:21:0;;;11377:33;;;;;;;;;;-1:-1:-1;11377:33:0;;;;;;;;30710:349;;;;;;;;;;;;;:::i;11899:28::-;;;;;;;;;;;;;;;;26423:121;;;;;;;;;;-1:-1:-1;26518:18:0;;26503:12;:33;26423:121;;15886:181;;;;;;;;;;-1:-1:-1;15886:181:0;;;;;:::i;:::-;;:::i;33270:121::-;;;;;;;;;;;;;:::i;10804:28::-;;;;;;;;;;;;;;;;11169:41;;;;;;;;;;;;;;;;11864:28;;;;;;;;;;;;;;;;11343:25;;;;;;;;;;;;;;;;11457:31;;;;;;;;;;-1:-1:-1;11457:31:0;;;;;;;;;;;30356:302;;;;;;;;;;-1:-1:-1;30356:302:0;;;;;:::i;:::-;;:::i;4575:177::-;;;;;;;;;;-1:-1:-1;4575:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;4726:18:0;4694:7;4726:18;;;;;;;;;;;;4575:177;32561:472;;;;;;;;;;-1:-1:-1;32561:472:0;;;;;:::i;:::-;;:::i;31111:84::-;;;;;;;;;;;;;:::i;18363:334::-;;;;;;;;;;-1:-1:-1;18363:334:0;;;;;:::i;:::-;;:::i;8662:265::-;;;;;;;;;;-1:-1:-1;8662:265:0;;;;;:::i;:::-;;:::i;19310:402::-;;;;;;;;;;-1:-1:-1;19310:402:0;;;;;:::i;:::-;;:::i;29193:567::-;;;;;;;;;;-1:-1:-1;29193:567:0;;;;;:::i;:::-;;:::i;31396:231::-;;;;;;;;;;;;;:::i;12122:30::-;;;;;;;;;;;;;;;;11828:27;;;;;;;;;;;;;;;;11258:43;;;;;;;;;;-1:-1:-1;11258:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31635:918;;;;;;;;;;-1:-1:-1;31635:918:0;;;;;:::i;:::-;;:::i;10770:27::-;;;;;;;;;;;;;;;;8448:79;;;;;;;;;;-1:-1:-1;8513:6:0;;-1:-1:-1;;;;;8513:6:0;8448:79;;4246:104;;;;;;;;;;;;;:::i;15463:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18705:353::-;;;;;;;;;;-1:-1:-1;18705:353:0;;;;;:::i;:::-;;:::i;6253:482::-;;;;;;;;;;-1:-1:-1;6253:482:0;;;;;:::i;:::-;;:::i;11012:28::-;;;;;;;;;;-1:-1:-1;11012:28:0;;;;-1:-1:-1;;;;;11012:28:0;;;11218:33;;;;;;;;;;;;;;;;4760:216;;;;;;;;;;-1:-1:-1;4760:216:0;;;;;:::i;:::-;;:::i;12374:57::-;;;;;;;;;;-1:-1:-1;12374:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;11417:33;;;;;;;;;;-1:-1:-1;11417:33:0;;;;;;;;;;;20139:182;;;;;;;;;;-1:-1:-1;20139:182:0;;;;;:::i;:::-;;:::i;19720:411::-;;;;;;;;;;-1:-1:-1;19720:411:0;;;;;:::i;:::-;;:::i;17167:461::-;;;;;;;;;;-1:-1:-1;17167:461:0;;;;;:::i;:::-;;:::i;11675:39::-;;;;;;;;;;-1:-1:-1;11675:39:0;;;;;;;;11757:27;;;;;;;;;;;;;;;;17698:428;;;;;;;;;;-1:-1:-1;17698:428:0;;;;;:::i;:::-;;:::i;11723:27::-;;;;;;;;;;;;;;;;16698:461;;;;;;;;;;-1:-1:-1;16698:461:0;;;;;:::i;:::-;;:::i;4984:201::-;;;;;;;;;;-1:-1:-1;4984:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;5150:18:0;;;5118:7;5150:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4984:201;10970:33;;;;;;;;;;;;;;;;33041:96;;;;;;;;;;-1:-1:-1;33041:96:0;;;;;:::i;:::-;;:::i;16128:98::-;;;;;;;;;;;;;:::i;11308:28::-;;;;;;;;;;-1:-1:-1;11308:28:0;;;;;:::i;:::-;;:::i;11124:37::-;;;;;;;;;;;;;;;;11791:30;;;;;;;;;;;;;;;;8935:281;;;;;;;;;;-1:-1:-1;8935:281:0;;;;;:::i;:::-;;:::i;29830:185::-;;;;;;;;;;;;;:::i;11934:31::-;;;;;;;;;;;;;;;;12159:33;;;;;;;;;;-1:-1:-1;12159:33:0;;;;;;;;10839:24;;;;;;;;;;;;;;;;30023:325;;;;;;;;;;-1:-1:-1;30023:325:0;;;;;:::i;:::-;;:::i;4138:100::-;4192:13;4225:5;4218:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4138:100;:::o;5193:210::-;5312:4;5334:39;288:10;5357:7;5366:6;5334:8;:39::i;:::-;-1:-1:-1;5391:4:0;5193:210;;;;;:::o;31203:185::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;;;;;;;;;31271:14:::1;::::0;::::1;;31270:15;31262:52;;;::::0;-1:-1:-1;;;31262:52:0;;6074:2:1;31262:52:0::1;::::0;::::1;6056:21:1::0;6113:2;6093:18;;;6086:30;6152:26;6132:18;;;6125:54;6196:18;;31262:52:0::1;5872:348:1::0;31262:52:0::1;31327:14;:21:::0;;-1:-1:-1;;31327:21:0::1;31344:4;31327:21;::::0;;31364:16:::1;::::0;::::1;::::0;31327:14:::1;::::0;31364:16:::1;31203:185::o:0;15575:303::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;15668:18:::1;::::0;::::1;::::0;::::1;;;15646:117;;;::::0;-1:-1:-1;;;15646:117:0;;6427:2:1;15646:117:0::1;::::0;::::1;6409:21:1::0;6466:2;6446:18;;;6439:30;6505:34;6485:18;;;6478:62;-1:-1:-1;;;6556:18:1;;;6549:47;6613:19;;15646:117:0::1;6225:413:1::0;15646:117:0::1;-1:-1:-1::0;;;;;15783:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;::::1;;15782:20;15774:59;;;::::0;-1:-1:-1;;;15774:59:0;;6845:2:1;15774:59:0::1;::::0;::::1;6827:21:1::0;6884:2;6864:18;;;6857:30;6923:28;6903:18;;;6896:56;6969:18;;15774:59:0::1;6643:350:1::0;15774:59:0::1;-1:-1:-1::0;;;;;15844:19:0::1;;::::0;;;:11:::1;:19;::::0;;;;:26;;-1:-1:-1;;15844:26:0::1;15866:4;15844:26;::::0;;15575:303::o;5411:529::-;5551:4;5568:36;5578:6;5586:9;5597:6;5568:9;:36::i;:::-;-1:-1:-1;;;;;5644:19:0;;5617:24;5644:19;;;:11;:19;;;;;;;;288:10;5644:33;;;;;;;;5710:26;;;;5688:116;;;;-1:-1:-1;;;5688:116:0;;7200:2:1;5688:116:0;;;7182:21:1;7239:2;7219:18;;;7212:30;7278:34;7258:18;;;7251:62;-1:-1:-1;;;7329:18:1;;;7322:38;7377:19;;5688:116:0;6998:404:1;5688:116:0;5840:57;5849:6;288:10;5890:6;5871:16;:25;5840:8;:57::i;:::-;-1:-1:-1;5928:4:0;;5411:529;-1:-1:-1;;;;5411:529:0:o;16234:456::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;16371:4:::1;16363;16342:13;4547:12:::0;;;4459:108;16342:13:::1;:17;::::0;16358:1:::1;16342:17;:::i;:::-;16341:26;;;;:::i;:::-;16340:35;;;;:::i;:::-;16330:6;:45;;16308:136;;;::::0;-1:-1:-1;;;16308:136:0;;8136:2:1;16308:136:0::1;::::0;::::1;8118:21:1::0;8175:2;8155:18;;;8148:30;8214:34;8194:18;;;8187:62;-1:-1:-1;;;8265:18:1;;;8258:39;8314:19;;16308:136:0::1;7934:405:1::0;16308:136:0::1;16517:4;16510:3;16489:13;4547:12:::0;;;4459:108;16489:13:::1;:17;::::0;16505:1:::1;16489:17;:::i;:::-;16488:25;;;;:::i;:::-;16487:34;;;;:::i;:::-;16477:6;:44;;16455:135;;;::::0;-1:-1:-1;;;16455:135:0;;8546:2:1;16455:135:0::1;::::0;::::1;8528:21:1::0;8585:2;8565:18;;;8558:30;8624:34;8604:18;;;8597:62;-1:-1:-1;;;8675:18:1;;;8668:39;8724:19;;16455:135:0::1;8344:405:1::0;16455:135:0::1;16616:17;:6:::0;16626::::1;16616:17;:::i;:::-;16601:12;:32:::0;;;16649:33:::1;::::0;160:25:1;;;16649:33:0::1;::::0;148:2:1;133:18;16649:33:0::1;;;;;;;;16234:456:::0;:::o;5948:297::-;288:10;6063:4;6157:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6157:34:0;;;;;;;;;;6063:4;;6085:130;;6135:7;;6157:47;;6194:10;;6157:47;:::i;:::-;6085:8;:130::i;33145:117::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;33223:16:::1;:30:::0;;-1:-1:-1;;;;;;33223:30:0::1;-1:-1:-1::0;;;;;33223:30:0;;;::::1;::::0;;;::::1;::::0;;33145:117::o;30710:349::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;30815:18:::1;::::0;30805:4:::1;4694:7:::0;4726:18;;;;;;;;;;;30787:46:::1;;30765:160;;;::::0;;-1:-1:-1;;;30765:160:0;;9086:2:1;30765:160:0::1;::::0;::::1;9068:21:1::0;9105:18;;;9098:30;;;;9164:34;9144:18;;;9137:62;9235:34;9215:18;;;9208:62;9287:19;;30765:160:0::1;8884:428:1::0;30765:160:0::1;30936:8;:15:::0;;-1:-1:-1;;;;30936:15:0::1;-1:-1:-1::0;;;30936:15:0::1;::::0;;30962:10:::1;:8;:10::i;:::-;30983:8;:16:::0;;-1:-1:-1;;;;30983:16:0::1;::::0;;31015:36:::1;::::0;31035:15:::1;160:25:1::0;;31015:36:0::1;::::0;148:2:1;133:18;31015:36:0::1;;;;;;;30710:349::o:0;15886:181::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15967:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;::::1;;15959:62;;;::::0;-1:-1:-1;;;15959:62:0;;9519:2:1;15959:62:0::1;::::0;::::1;9501:21:1::0;9558:2;9538:18;;;9531:30;9597:32;9577:18;;;9570:60;9647:18;;15959:62:0::1;9317:354:1::0;15959:62:0::1;-1:-1:-1::0;;;;;16032:19:0::1;16054:5;16032:19:::0;;;:11:::1;:19;::::0;;;;:27;;-1:-1:-1;;16032:27:0::1;::::0;;15886:181::o;33270:121::-;33321:7;33364:18;;33349:12;:33;;;;:::i;:::-;33341:42;;33270:121;:::o;30356:302::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30458:28:0;::::1;30436:112;;;;-1:-1:-1::0;;;30436:112:0::1;;;;;;;:::i;:::-;30559:13;:39:::0;;-1:-1:-1;;;;;;30559:39:0::1;-1:-1:-1::0;;;;;30559:39:0;::::1;::::0;;::::1;::::0;;;30614:36:::1;::::0;::::1;::::0;-1:-1:-1;;30614:36:0::1;30356:302:::0;:::o;32561:472::-;32660:16;;-1:-1:-1;;;;;32660:16:0;32646:10;:30;32638:67;;;;-1:-1:-1;;;32638:67:0;;10414:2:1;32638:67:0;;;10396:21:1;10453:2;10433:18;;;10426:30;10492:26;10472:18;;;10465:54;10536:18;;32638:67:0;10212:348:1;32638:67:0;32749:1;32724:22;;:26;32716:73;;;;-1:-1:-1;;;32716:73:0;;10767:2:1;32716:73:0;;;10749:21:1;10806:2;10786:18;;;10779:30;10845:34;10825:18;;;10818:62;-1:-1:-1;;;10896:18:1;;;10889:32;10938:19;;32716:73:0;10565:398:1;32716:73:0;32862:9;;32826:22;;:33;;32851:8;32826:33;:::i;:::-;:45;;;;:::i;:::-;32808:15;:63;32800:91;;;;-1:-1:-1;;;32800:91:0;;11170:2:1;32800:91:0;;;11152:21:1;11209:2;11189:18;;;11182:30;-1:-1:-1;;;11228:18:1;;;11221:45;11283:18;;32800:91:0;10968:339:1;32800:91:0;32905:32;32919:9;32930:6;32905:13;:32::i;:::-;32972:11;32956:13;4547:12;;;4459:108;32956:13;:27;32948:77;;;;-1:-1:-1;;;32948:77:0;;11514:2:1;32948:77:0;;;11496:21:1;11553:2;11533:18;;;11526:30;11592:34;11572:18;;;11565:62;-1:-1:-1;;;11643:18:1;;;11636:35;11688:19;;32948:77:0;11312:401:1;32948:77:0;32561:472;;:::o;31111:84::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;31165:14:::1;:22:::0;;-1:-1:-1;;31165:22:0::1;::::0;;31111:84::o;18363:334::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;18483:4:::1;18478:155;;18540:6;::::0;-1:-1:-1;;;;;18540:6:0;;::::1;18530:16:::0;;::::1;::::0;18504:117:::1;;;::::0;-1:-1:-1;;;18504:117:0;;11920:2:1;18504:117:0::1;::::0;::::1;11902:21:1::0;11959:2;11939:18;;;11932:30;11998:34;11978:18;;;11971:62;-1:-1:-1;;;12049:18:1;;;12042:37;12096:19;;18504:117:0::1;11718:403:1::0;18504:117:0::1;-1:-1:-1::0;;;;;18643:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;18643:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;18363:334::o;8662:265::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;8789:15:::1;8781:52;;;::::0;-1:-1:-1;;;8781:52:0;;12328:2:1;8781:52:0::1;::::0;::::1;12310:21:1::0;12367:2;12347:18;;;12340:30;12406:26;12386:18;;;12379:54;12450:18;;8781:52:0::1;12126:348:1::0;8781:52:0::1;8870:6;::::0;8849:40:::1;::::0;8886:1:::1;::::0;-1:-1:-1;;;;;8870:6:0::1;::::0;8849:40:::1;::::0;8886:1;;8849:40:::1;-1:-1:-1::0;8900:6:0::1;:19:::0;;-1:-1:-1;;;;;;8900:19:0::1;::::0;;8662:265::o;19310:402::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;19460:12:::1;:25:::0;;;19496:15:::1;:31:::0;;;19538:12:::1;:25:::0;;;19553:10;19589:30:::1;19514:13:::0;19475:10;19589:30:::1;:::i;:::-;:45;;;;:::i;:::-;19574:12;:60:::0;;;19669:1:::1;-1:-1:-1::0;19653:17:0::1;19645:59;;;::::0;-1:-1:-1;;;19645:59:0;;12681:2:1;19645:59:0::1;::::0;::::1;12663:21:1::0;12720:2;12700:18;;;12693:30;12759:31;12739:18;;;12732:59;12808:18;;19645:59:0::1;12479:353:1::0;19645:59:0::1;19310:402:::0;;;:::o;29193:567::-;8575:6;;29307:10;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29343:20:0;::::1;29335:59;;;::::0;-1:-1:-1;;;29335:59:0;;13039:2:1;29335:59:0::1;::::0;::::1;13021:21:1::0;13078:2;13058:18;;;13051:30;13117:28;13097:18;;;13090:56;13163:18;;29335:59:0::1;12837:350:1::0;29335:59:0::1;-1:-1:-1::0;;;;;29427:23:0;::::1;29445:4;29427:23;;::::0;:41:::1;;-1:-1:-1::0;29455:13:0::1;::::0;::::1;::::0;::::1;;;29454:14;29427:41;29405:143;;;::::0;-1:-1:-1;;;29405:143:0;;13394:2:1;29405:143:0::1;::::0;::::1;13376:21:1::0;13433:2;13413:18;;;13406:30;13472:34;13452:18;;;13445:62;-1:-1:-1;;;13523:18:1;;;13516:50;13583:19;;29405:143:0::1;13192:416:1::0;29405:143:0::1;29586:39;::::0;-1:-1:-1;;;29586:39:0;;29619:4:::1;29586:39;::::0;::::1;919:51:1::0;29559:24:0::1;::::0;-1:-1:-1;;;;;29586:24:0;::::1;::::0;::::1;::::0;892:18:1;;29586:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29644:46;::::0;-1:-1:-1;;;29644:46:0;;-1:-1:-1;;;;;13994:32:1;;;29644:46:0::1;::::0;::::1;13976:51:1::0;14043:18;;;14036:34;;;29559:66:0;;-1:-1:-1;29644:23:0;;::::1;::::0;::::1;::::0;13949:18:1;;29644:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29706;::::0;;-1:-1:-1;;;;;13994:32:1;;13976:51;;14058:2;14043:18;;14036:34;;;29636:54:0;;-1:-1:-1;29706:46:0::1;::::0;13949:18:1;29706:46:0::1;;;;;;;29324:436;29193:567:::0;;;;:::o;31396:231::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;31485:18:::1;::::0;::::1;::::0;::::1;;;31463:117;;;::::0;-1:-1:-1;;;31463:117:0;;14533:2:1;31463:117:0::1;::::0;::::1;14515:21:1::0;14572:2;14552:18;;;14545:30;14611:34;14591:18;;;14584:62;-1:-1:-1;;;14662:18:1;;;14655:47;14719:19;;31463:117:0::1;14331:413:1::0;31463:117:0::1;31593:18;:26:::0;;-1:-1:-1;;31593:26:0::1;::::0;;31396:231::o;31635:918::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;31743:13:::1;::::0;::::1;::::0;::::1;;;31742:14;31734:70;;;::::0;-1:-1:-1;;;31734:70:0;;14951:2:1;31734:70:0::1;::::0;::::1;14933:21:1::0;14990:2;14970:18;;;14963:30;15029:34;15009:18;;;15002:62;-1:-1:-1;;;15080:18:1;;;15073:41;15131:19;;31734:70:0::1;14749:407:1::0;31734:70:0::1;31856:2;31837:16;:21;31815:110;;;::::0;-1:-1:-1;;;31815:110:0;;15363:2:1;31815:110:0::1;::::0;::::1;15345:21:1::0;15402:2;15382:18;;;15375:30;15441:34;15421:18;;;15414:62;-1:-1:-1;;;15492:18:1;;;15485:37;15539:19;;31815:110:0::1;15161:403:1::0;31815:110:0::1;31973:13;:20:::0;;-1:-1:-1;;32004:18:0;;;;;32054:12:::1;32033:18;:33:::0;;;32102:15:::1;32077:22;:40:::0;32150:37:::1;::::0;32171:16;;32150:37:::1;:::i;:::-;:41;::::0;32190:1:::1;32150:41;:::i;:::-;32129:18;:62:::0;32202:12:::1;:18:::0;;;32231:13:::1;:20:::0;;;-1:-1:-1;32262:15:0::1;:19:::0;;;32292:12:::1;:16:::0;;;32334:30:::1;-1:-1:-1::0;32217:3:0;32334:30:::1;:::i;:::-;:45;;;;:::i;:::-;32319:12;:60:::0;32409:1:::1;32390:16;:20:::0;;;32421:13:::1;:17:::0;;;32465:13:::1;::::0;:32:::1;::::0;32409:1;;32465:32:::1;:::i;:::-;:48;;;;:::i;:::-;32449:13;:64:::0;32529:16:::1;::::0;::::1;::::0;;;::::1;31635:918:::0;;;:::o;4246:104::-;4302:13;4335:7;4328:14;;;;;:::i;15463:104::-;15512:16;15548:11;15541:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15541:18:0;;;;;;;;;;;;;;;;;;;;;;15463:104;:::o;18705:353::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;18851:6:::1;::::0;-1:-1:-1;;;;;18851:6:0;;::::1;18843:14:::0;;::::1;::::0;18821:121:::1;;;::::0;-1:-1:-1;;;18821:121:0;;15771:2:1;18821:121:0::1;::::0;::::1;15753:21:1::0;15810:2;15790:18;;;15783:30;15849:34;15829:18;;;15822:62;15920:27;15900:18;;;15893:55;15965:19;;18821:121:0::1;15569:421:1::0;18821:121:0::1;18953:41;18982:4;18988:5;18953:28;:41::i;:::-;19010:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;19010:40:0;::::1;::::0;::::1;::::0;;;::::1;18705:353:::0;;:::o;6253:482::-;288:10;6373:4;6422:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6422:34:0;;;;;;;;;;6489:35;;;;6467:122;;;;-1:-1:-1;;;6467:122:0;;16197:2:1;6467:122:0;;;16179:21:1;16236:2;16216:18;;;16209:30;16275:34;16255:18;;;16248:62;-1:-1:-1;;;16326:18:1;;;16319:35;16371:19;;6467:122:0;15995:401:1;6467:122:0;6625:67;288:10;6648:7;6676:15;6657:16;:34;6625:8;:67::i;:::-;-1:-1:-1;6723:4:0;;6253:482;-1:-1:-1;;;6253:482:0:o;4760:216::-;4882:4;4904:42;288:10;4928:9;4939:6;4904:9;:42::i;20139:182::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20224:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;20224:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;20279:34;;1577:41:1;;;20279:34:0::1;::::0;1550:18:1;20279:34:0::1;;;;;;;20139:182:::0;;:::o;19720:411::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;19871:13:::1;:26:::0;;;19908:16:::1;:32:::0;;;19951:13:::1;:26:::0;;;19967:10;20004:32:::1;19927:13:::0;19887:10;20004:32:::1;:::i;:::-;:48;;;;:::i;:::-;19988:13;:64:::0;;;20088:1:::1;-1:-1:-1::0;20071:18:0::1;20063:60;;;::::0;-1:-1:-1;;;20063:60:0;;16603:2:1;20063:60:0::1;::::0;::::1;16585:21:1::0;16642:2;16622:18;;;16615:30;16681:31;16661:18;;;16654:59;16730:18;;20063:60:0::1;16401:353:1::0;17167:461:0;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;17307:4:::1;17299;17278:13;4547:12:::0;;;4459:108;17278:13:::1;:17;::::0;17294:1:::1;17278:17;:::i;:::-;17277:26;;;;:::i;:::-;17276:35;;;;:::i;:::-;17266:6;:45;;17244:139;;;::::0;-1:-1:-1;;;17244:139:0;;16961:2:1;17244:139:0::1;::::0;::::1;16943:21:1::0;17000:2;16980:18;;;16973:30;17039:34;17019:18;;;17012:62;-1:-1:-1;;;17090:18:1;;;17083:42;17142:19;;17244:139:0::1;16759:408:1::0;17244:139:0::1;17456:4;17449:3;17428:13;4547:12:::0;;;4459:108;17428:13:::1;:17;::::0;17444:1:::1;17428:17;:::i;:::-;17427:25;;;;:::i;:::-;17426:34;;;;:::i;:::-;17416:6;:44;;17394:137;;;::::0;-1:-1:-1;;;17394:137:0;;17374:2:1;17394:137:0::1;::::0;::::1;17356:21:1::0;17413:2;17393:18;;;17386:30;17452:34;17432:18;;;17425:62;-1:-1:-1;;;17503:18:1;;;17496:41;17554:19;;17394:137:0::1;17172:407:1::0;17394:137:0::1;17554:17;:6:::0;17564::::1;17554:17;:::i;:::-;17542:9;:29:::0;;;17587:33:::1;::::0;160:25:1;;;17587:33:0::1;::::0;148:2:1;133:18;17587:33:0::1;14:177:1::0;17698:428:0;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;17838:6:::1;17817:13;4547:12:::0;;;4459:108;17817:13:::1;:17;::::0;17833:1:::1;17817:17;:::i;:::-;17816:28;;;;:::i;:::-;17803:9;:41;;17781:144;;;::::0;-1:-1:-1;;;17781:144:0;;17786:2:1;17781:144:0::1;::::0;::::1;17768:21:1::0;17825:2;17805:18;;;17798:30;17864:34;17844:18;;;17837:62;-1:-1:-1;;;17915:18:1;;;17908:51;17976:19;;17781:144:0::1;17584:417:1::0;17781:144:0::1;17993:4;17972:13;4547:12:::0;;;4459:108;17972:13:::1;:17;::::0;17988:1:::1;17972:17;:::i;:::-;17971:26;;;;:::i;:::-;17958:9;:39;;17936:141;;;::::0;-1:-1:-1;;;17936:141:0;;18208:2:1;17936:141:0::1;::::0;::::1;18190:21:1::0;18247:2;18227:18;;;18220:30;18286:34;18266:18;;;18259:62;-1:-1:-1;;;18337:18:1;;;18330:50;18397:19;;17936:141:0::1;18006:416:1::0;17936:141:0::1;18088:18;:30:::0;17698:428::o;16698:461::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;16836:4:::1;16828;16807:13;4547:12:::0;;;4459:108;16807:13:::1;:17;::::0;16823:1:::1;16807:17;:::i;:::-;16806:26;;;;:::i;:::-;16805:35;;;;:::i;:::-;16795:6;:45;;16773:137;;;::::0;-1:-1:-1;;;16773:137:0;;18629:2:1;16773:137:0::1;::::0;::::1;18611:21:1::0;18668:2;18648:18;;;18641:30;18707:34;18687:18;;;18680:62;-1:-1:-1;;;18758:18:1;;;18751:40;18808:19;;16773:137:0::1;18427:406:1::0;16773:137:0::1;16983:4;16976:3;16955:13;4547:12:::0;;;4459:108;16955:13:::1;:17;::::0;16971:1:::1;16955:17;:::i;:::-;16954:25;;;;:::i;:::-;16953:34;;;;:::i;:::-;16943:6;:44;;16921:135;;;::::0;-1:-1:-1;;;16921:135:0;;19040:2:1;16921:135:0::1;::::0;::::1;19022:21:1::0;19079:2;19059:18;;;19052:30;19118:34;19098:18;;;19091:62;-1:-1:-1;;;19169:18:1;;;19162:39;19218:19;;16921:135:0::1;18838:405:1::0;16921:135:0::1;17083:17;:6:::0;17093::::1;17083:17;:::i;:::-;17067:13;:33:::0;;;17116:35:::1;::::0;160:25:1;;;17116:35:0::1;::::0;148:2:1;133:18;17116:35:0::1;14:177:1::0;33041:96:0;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;33122:6:::1;33109:9;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;33041:96:0:o;16128:98::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;16190:20:::1;:28:::0;;-1:-1:-1;;16190:28:0::1;::::0;;16128:98::o;11308:28::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11308:28:0;;-1:-1:-1;11308:28:0;:::o;8935:281::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9038:22:0;::::1;9016:110;;;::::0;-1:-1:-1;;;9016:110:0;;19450:2:1;9016:110:0::1;::::0;::::1;19432:21:1::0;19489:2;19469:18;;;19462:30;19528:34;19508:18;;;19501:62;-1:-1:-1;;;19579:18:1;;;19572:36;19625:19;;9016:110:0::1;19248:402:1::0;9016:110:0::1;9163:6;::::0;9142:38:::1;::::0;-1:-1:-1;;;;;9142:38:0;;::::1;::::0;9163:6:::1;::::0;9142:38:::1;::::0;9163:6:::1;::::0;9142:38:::1;9191:6;:17:::0;;-1:-1:-1;;;;;;9191:17:0::1;-1:-1:-1::0;;;;;9191:17:0;;;::::1;::::0;;;::::1;::::0;;8935:281::o;29830:185::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;29925:82:::1;::::0;29888:12:::1;::::0;29933:10:::1;::::0;29957:21:::1;::::0;29888:12;29925:82;29888:12;29925:82;29957:21;29933:10;29925:82:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;29830:185:0:o;30023:325::-;8575:6;;-1:-1:-1;;;;;8575:6:0;288:10;8575:22;8567:67;;;;-1:-1:-1;;;8567:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30148:28:0;::::1;30126:112;;;;-1:-1:-1::0;;;30126:112:0::1;;;;;;;:::i;:::-;30249:13;:39:::0;;-1:-1:-1;;;;;;30249:39:0::1;-1:-1:-1::0;;;;;30249:39:0;::::1;::::0;;::::1;::::0;;;30304:36:::1;::::0;::::1;::::0;-1:-1:-1;;30304:36:0::1;30023:325:::0;:::o;7717:380::-;-1:-1:-1;;;;;7853:19:0;;7845:68;;;;-1:-1:-1;;;7845:68:0;;20067:2:1;7845:68:0;;;20049:21:1;20106:2;20086:18;;;20079:30;20145:34;20125:18;;;20118:62;-1:-1:-1;;;20196:18:1;;;20189:34;20240:19;;7845:68:0;19865:400:1;7845:68:0;-1:-1:-1;;;;;7932:21:0;;7924:68;;;;-1:-1:-1;;;7924:68:0;;20472:2:1;7924:68:0;;;20454:21:1;20511:2;20491:18;;;20484:30;20550:34;20530:18;;;20523:62;-1:-1:-1;;;20601:18:1;;;20594:32;20643:19;;7924:68:0;20270:398:1;7924:68:0;-1:-1:-1;;;;;8005:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;8057:32;;160:25:1;;;8057:32:0;;133:18:1;8057:32:0;;;;;;;7717:380;;;:::o;20329:6086::-;-1:-1:-1;;;;;20461:18:0;;20453:68;;;;-1:-1:-1;;;20453:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20540:16:0;;20532:64;;;;-1:-1:-1;;;20532:64:0;;;;;;;:::i;:::-;20624:1;20615:6;:10;20607:52;;;;-1:-1:-1;;;20607:52:0;;21685:2:1;20607:52:0;;;21667:21:1;21724:2;21704:18;;;21697:30;21763:31;21743:18;;;21736:59;21812:18;;20607:52:0;21483:353:1;20607:52:0;20677:13;;;;;;;20672:183;;-1:-1:-1;;;;;20733:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;20762:23:0;;;;;;:19;:23;;;;;;;;20733:52;20707:136;;;;-1:-1:-1;;;20707:136:0;;22043:2:1;20707:136:0;;;22025:21:1;22082:2;22062:18;;;22055:30;-1:-1:-1;;;22101:18:1;;;22094:52;22163:18;;20707:136:0;21841:346:1;20707:136:0;26518:18;;26503:12;:33;20871:26;:43;;;;-1:-1:-1;20901:13:0;;;;;;;20871:43;20867:268;;;-1:-1:-1;;;;;20958:17:0;;;;;;:11;:17;;;;;;;;20957:18;;:35;;-1:-1:-1;8513:6:0;;-1:-1:-1;;;;;20979:13:0;;;8513:6;;20979:13;20957:35;:60;;;-1:-1:-1;;;;;;20996:21:0;;21010:6;20996:21;20957:60;20931:192;;;;-1:-1:-1;;;20931:192:0;;22394:2:1;20931:192:0;;;22376:21:1;22433:2;22413:18;;;22406:30;22472:34;22452:18;;;22445:62;22543:34;22523:18;;;22516:62;-1:-1:-1;;;22594:19:1;;;22587:37;22641:19;;20931:192:0;22192:474:1;20931:192:0;21151:14;;;;21147:2217;;;8513:6;;-1:-1:-1;;;;;21204:15:0;;;8513:6;;21204:15;;;;:49;;-1:-1:-1;8513:6:0;;-1:-1:-1;;;;;21240:13:0;;;8513:6;;21240:13;;21204:49;:91;;;;-1:-1:-1;;;;;;21274:21:0;;21288:6;21274:21;;21204:91;:138;;;;-1:-1:-1;;;;;;21317:25:0;;;;;;:19;:25;;;;;;;;21316:26;21204:138;:183;;;;-1:-1:-1;;;;;;21364:23:0;;;;;;:19;:23;;;;;;;;21363:24;21204:183;21182:2171;;;21426:20;;;;21422:692;;;21489:9;;-1:-1:-1;;;;;21475:24:0;;;21489:9;;21475:24;;;;:49;;-1:-1:-1;21517:6:0;;-1:-1:-1;;;;;21503:21:0;;;21517:6;;21503:21;;21475:49;21471:624;;;21666:16;21681:1;21666:12;:16;:::i;:::-;21620:9;21591:39;;;;:28;:39;;;;;;:91;:212;;;;-1:-1:-1;21787:16:0;21802:1;21787:12;:16;:::i;:::-;-1:-1:-1;;;;;21719:32:0;;;;;;:28;:32;;;;;;:84;21591:212;21553:363;;;;-1:-1:-1;;;21553:363:0;;22873:2:1;21553:363:0;;;22855:21:1;22912:2;22892:18;;;22885:30;22951:34;22931:18;;;22924:62;-1:-1:-1;;;23002:18:1;;;22995:51;23063:19;;21553:363:0;22671:417:1;21553:363:0;21972:9;21943:39;;;;:28;:39;;;;;;21985:12;21943:54;;;;-1:-1:-1;;;;;22024:32:0;;;;;;:47;21471:624;-1:-1:-1;;;;;22188:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;22245:35:0;;;;;;:31;:35;;;;;;;;22244:36;22188:92;22162:1176;;;22367:12;;22357:6;:22;;22323:148;;;;-1:-1:-1;;;22323:148:0;;23295:2:1;22323:148:0;;;23277:21:1;23334:2;23314:18;;;23307:30;23373:34;23353:18;;;23346:62;-1:-1:-1;;;23424:18:1;;;23417:38;23472:19;;22323:148:0;23093:404:1;22323:148:0;22554:9;;-1:-1:-1;;;;;4726:18:0;;4694:7;4726:18;;;;;;;;;;;22528:22;;:6;:22;:::i;:::-;:35;;22494:140;;;;-1:-1:-1;;;22494:140:0;;23704:2:1;22494:140:0;;;23686:21:1;23743:2;23723:18;;;23716:30;-1:-1:-1;;;23762:18:1;;;23755:49;23821:18;;22494:140:0;23502:343:1;22494:140:0;22162:1176;;;-1:-1:-1;;;;;22732:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;22787:37:0;;;;;;:31;:37;;;;;;;;22786:38;22732:92;22706:632;;;22875:14;;;;22867:46;;;;-1:-1:-1;;;22867:46:0;;24052:2:1;22867:46:0;;;24034:21:1;24091:2;24071:18;;;24064:30;-1:-1:-1;;;24110:18:1;;;24103:49;24169:18;;22867:46:0;23850:343:1;22867:46:0;22980:13;;22970:6;:23;;22936:151;;;;-1:-1:-1;;;22936:151:0;;24400:2:1;22936:151:0;;;24382:21:1;24439:2;24419:18;;;24412:30;24478:34;24458:18;;;24451:62;-1:-1:-1;;;24529:18:1;;;24522:40;24579:19;;22936:151:0;24198:406:1;22706:632:0;-1:-1:-1;;;;;23118:35:0;;;;;;:31;:35;;;;;;;;23113:225;;23238:9;;-1:-1:-1;;;;;4726:18:0;;4694:7;4726:18;;;;;;;;;;;23212:22;;:6;:22;:::i;:::-;:35;;23178:140;;;;-1:-1:-1;;;23178:140:0;;23704:2:1;23178:140:0;;;23686:21:1;23743:2;23723:18;;;23716:30;-1:-1:-1;;;23762:18:1;;;23755:49;23821:18;;23178:140:0;23502:343:1;23178:140:0;23425:4;23376:28;4726:18;;;;;;;;;;;23483;;23459:42;;;;;;;23532:22;;-1:-1:-1;23543:11:0;;;;;;;23532:22;:35;;;;-1:-1:-1;23559:8:0;;-1:-1:-1;;;23559:8:0;;;;23558:9;23532:35;:68;;;;-1:-1:-1;;;;;;23571:29:0;;;;;;:25;:29;;;;;;;;23532:68;23514:196;;;23627:8;:15;;-1:-1:-1;;;;23627:15:0;-1:-1:-1;;;23627:15:0;;;23657:10;:8;:10::i;:::-;23682:8;:16;;-1:-1:-1;;;;23682:16:0;;;23514:196;-1:-1:-1;;;;;23841:25:0;;23722:12;23841:25;;;:19;:25;;;;;;23737:4;;23841:25;;;:52;;-1:-1:-1;;;;;;23870:23:0;;;;;;:19;:23;;;;;;;;23841:52;23837:100;;;-1:-1:-1;23920:5:0;23837:100;23949:12;24054:7;24050:2312;;;26518:18;;26503:12;:33;24137:152;;;;24213:8;24198:12;;:23;;;;:::i;:::-;24188:6;:33;;:100;;;;;24276:12;24250:18;;24271:1;24250:22;;;;:::i;:::-;:38;;24188:100;24136:206;;;;-1:-1:-1;;;;;;24311:31:0;;;;;;:25;:31;;;;;;;;24136:206;:257;;;;-1:-1:-1;;;;;;24364:29:0;;;;;;:25;:29;;;;;;;;24363:30;24136:257;:302;;;;-1:-1:-1;;;;;;24415:23:0;;;;;;:19;:23;;;;;;;;24414:24;24136:302;:339;;;;;24474:1;24459:12;;:16;24136:339;24114:2099;;;26518:18;;26503:12;:33;24510:332;;24821:1;24805:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;24510:332:0;-1:-1:-1;;;;;24867:15:0;;;;;;:11;:15;;;;;;;;24862:216;;-1:-1:-1;;;;;24907:15:0;;;;;;:11;:15;;;;;:22;;-1:-1:-1;;24907:22:0;24925:4;24907:22;;;;;;24952:10;:15;;24925:4;;24952:10;;:15;;24925:4;;24952:15;:::i;:::-;;;;-1:-1:-1;;24990:11:0;:20;;;;;;;-1:-1:-1;24990:20:0;;;;;;;;-1:-1:-1;;;;;;24990:20:0;-1:-1:-1;;;;;24990:20:0;;;;;;;;25038;;919:51:1;;;25038:20:0;;907:2:1;892:18;25038:20:0;;;;;;;24862:216;25121:3;25106:11;:6;25115:2;25106:11;:::i;:::-;25105:19;;;;:::i;:::-;25098:26;;25192:12;;25173:15;;25166:4;:22;;;;:::i;:::-;25165:39;;;;:::i;:::-;25143:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;25266:12:0;;25250;;25243:19;;:4;:19;:::i;:::-;25242:36;;;;:::i;:::-;25223:15;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;25340:12:0;;25324;;25317:19;;:4;:19;:::i;:::-;25316:36;;;;:::i;:::-;25297:15;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;24114:2099:0;;-1:-1:-1;24114:2099:0;;-1:-1:-1;;;;;25415:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;25464:1;25448:13;;:17;25415:50;25411:802;;;25520:3;25503:13;;25494:6;:22;;;;:::i;:::-;25493:30;;;;:::i;:::-;25486:37;;25592:13;;25572:16;;25565:4;:23;;;;:::i;:::-;25564:41;;;;:::i;:::-;25542:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;25710:13:0;;25672;;25665:20;;:4;:20;:::i;:::-;25664:59;;;;:::i;:::-;25624:15;;:99;;;;;;;:::i;:::-;;;;-1:-1:-1;;25786:13:0;;25769;;25762:20;;:4;:20;:::i;25411:802::-;-1:-1:-1;;;;;25861:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;25911:1;25896:12;;:16;25861:51;25857:356;;;25966:3;25950:12;;25941:6;:21;;;;:::i;:::-;25940:29;;;;:::i;:::-;25933:36;;26037:12;;26018:15;;26011:4;:22;;;;:::i;:::-;26010:39;;;;:::i;:::-;25988:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;26111:12:0;;26095;;26088:19;;:4;:19;:::i;:::-;26087:36;;;;:::i;:::-;26068:15;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;26185:12:0;;26169;;26162:19;;:4;:19;:::i;:::-;26161:36;;;;:::i;:::-;26142:15;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;25857:356:0;26233:8;;26229:91;;26262:42;26278:4;26292;26299;26262:15;:42::i;:::-;26336:14;26346:4;26336:14;;:::i;:::-;;;24050:2312;26374:33;26390:4;26396:2;26400:6;26374:15;:33::i;:::-;20442:5973;;;;20329:6086;;;:::o;27648:1537::-;27731:4;27687:23;4726:18;;;;;;;;;;;27687:50;;27748:25;27841:15;;27810;;27776:18;;:49;;;;:::i;:::-;:80;;;;:::i;:::-;27748:108;-1:-1:-1;27873:20:0;;;:46;;-1:-1:-1;27897:22:0;;27873:46;27869:85;;;27936:7;;27648:1537::o;27869:85::-;27988:18;;:23;;28009:2;27988:23;:::i;:::-;27970:15;:41;27966:115;;;28046:18;;:23;;28067:2;28046:23;:::i;:::-;28028:41;;27966:115;28093:12;28167:23;28280:1;28247:17;28212:18;;28194:15;:36;;;;:::i;:::-;28193:71;;;;:::i;:::-;:88;;;;:::i;:::-;28167:114;-1:-1:-1;28294:51:0;28311:33;28167:114;28311:15;:33;:::i;:::-;28294:16;:51::i;:::-;28551:18;;28379:21;;;;28358:18;;28551:22;;28572:1;;28551:22;:::i;:::-;28530:44;;:17;:44;:::i;:::-;28497:15;;28484:28;;:10;:28;:::i;:::-;28483:92;;;;:::i;:::-;28460:115;;28586:20;28698:1;28677:18;;:22;;;;:::i;:::-;28656:44;;:17;:44;:::i;:::-;28623:15;;28610:28;;:10;:28;:::i;:::-;28609:92;;;;:::i;:::-;28586:115;-1:-1:-1;28733:27:0;28586:115;28733:12;:27;:::i;:::-;28714:46;;;;:::i;:::-;28794:1;28773:18;:22;;;28806:15;:19;;;28836:15;:19;28714:46;-1:-1:-1;28872:19:0;;;;;:42;;;28913:1;28895:15;:19;28872:42;28868:121;;;28931:46;28944:15;28961;28931:12;:46::i;:::-;29023:13;;29015:52;;-1:-1:-1;;;;;29023:13:0;;;;29050:12;;29015:52;;;;29050:12;29023:13;29015:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29100:13:0;;29092:85;;29001:66;;-1:-1:-1;;;;;;29100:13:0;;29141:21;;29092:85;;;;29141:21;29100:13;29092:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27648:1537:0:o;7402:307::-;-1:-1:-1;;;;;7517:21:0;;7509:65;;;;-1:-1:-1;;;7509:65:0;;24811:2:1;7509:65:0;;;24793:21:1;24850:2;24830:18;;;24823:30;24889:33;24869:18;;;24862:61;24940:18;;7509:65:0;24609:355:1;7509:65:0;7603:6;7587:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;7620:18:0;;:9;:18;;;;;;;;;;:28;;7642:6;;7620:9;:28;;7642:6;;7620:28;:::i;:::-;;;;-1:-1:-1;;7664:37:0;;160:25:1;;;-1:-1:-1;;;;;7664:37:0;;;7681:1;;7664:37;;148:2:1;133:18;7664:37:0;;;;;;;7402:307;;:::o;19066:236::-;-1:-1:-1;;;;;19149:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;19149:39:0;;;;;;;19199;19149:31;:39;19199:26;:39::i;6743:651::-;-1:-1:-1;;;;;6883:20:0;;6875:70;;;;-1:-1:-1;;;6875:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6964:23:0;;6956:71;;;;-1:-1:-1;;;6956:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7064:17:0;;7040:21;7064:17;;;;;;;;;;;7114:23;;;;7092:111;;;;-1:-1:-1;;;7092:111:0;;25171:2:1;7092:111:0;;;25153:21:1;25210:2;25190:18;;;25183:30;25249:34;25229:18;;;25222:62;-1:-1:-1;;;25300:18:1;;;25293:36;25346:19;;7092:111:0;24969:402:1;7092:111:0;-1:-1:-1;;;;;7239:17:0;;;:9;:17;;;;;;;;;;;7259:22;;;7239:42;;7303:20;;;;;;;;:30;;7275:6;;7239:9;7303:30;;7275:6;;7303:30;:::i;:::-;;;;;;;;7368:9;-1:-1:-1;;;;;7351:35:0;7360:6;-1:-1:-1;;;;;7351:35:0;;7379:6;7351:35;;;;160:25:1;;148:2;133:18;;14:177;7351:35:0;;;;;;;;6864:530;6743:651;;;:::o;26552:571::-;26702:16;;;26716:1;26702:16;;;;;;;;26678:21;;26702:16;;;;;;;;;;-1:-1:-1;26702:16:0;26678:40;;26747:4;26729;26734:1;26729:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;26729:23:0;;;:7;;;;;;;;;;:23;;;;26773:9;;:16;;;-1:-1:-1;;;26773:16:0;;;;:9;;;;;:14;;:16;;;;;26729:7;;26773:16;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26763:4;26768:1;26763:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;26763:26:0;;;:7;;;;;;;;;:26;26834:9;;26802:56;;26819:4;;26834:9;26846:11;26802:8;:56::i;:::-;26897:9;;:218;;-1:-1:-1;;;26897:218:0;;-1:-1:-1;;;;;26897:9:0;;;;:60;;:218;;26972:11;;26897:9;;27042:4;;27069;;27089:15;;26897:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26607:516;26552:571;:::o;27131:509::-;27311:9;;27279:56;;27296:4;;-1:-1:-1;;;;;27311:9:0;27323:11;27279:8;:56::i;:::-;27378:9;;:254;;-1:-1:-1;;;27378:254:0;;27444:4;27378:254;;;26824:34:1;26874:18;;;26867:34;;;27378:9:0;26917:18:1;;;26910:34;;;26960:18;;;26953:34;27584:6:0;27003:19:1;;;26996:44;27606:15:0;27056:19:1;;;27049:35;-1:-1:-1;;;;;27378:9:0;;;;:25;;27411:9;;26758:19:1;;27378:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;27131:509;;:::o;18134:221::-;-1:-1:-1;;;;;18236:39:0;;;;;;:31;:39;;;;;;;;;:52;;-1:-1:-1;;18236:52:0;;;;;;;;;;18304:43;;27574:51:1;;;27641:18;;;27634:50;18304:43:0;;27547:18:1;18304:43:0;;;;;;;18134:221;;:::o;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;981:131::-;-1:-1:-1;;;;;1056:31:1;;1046:42;;1036:70;;1102:1;1099;1092:12;1036:70;981:131;:::o;1117:315::-;1185:6;1193;1246:2;1234:9;1225:7;1221:23;1217:32;1214:52;;;1262:1;1259;1252:12;1214:52;1301:9;1288:23;1320:31;1345:5;1320:31;:::i;:::-;1370:5;1422:2;1407:18;;;;1394:32;;-1:-1:-1;;;1117:315:1:o;1629:247::-;1688:6;1741:2;1729:9;1720:7;1716:23;1712:32;1709:52;;;1757:1;1754;1747:12;1709:52;1796:9;1783:23;1815:31;1840:5;1815:31;:::i;:::-;1865:5;1629:247;-1:-1:-1;;;1629:247:1:o;2089:456::-;2166:6;2174;2182;2235:2;2223:9;2214:7;2210:23;2206:32;2203:52;;;2251:1;2248;2241:12;2203:52;2290:9;2277:23;2309:31;2334:5;2309:31;:::i;:::-;2359:5;-1:-1:-1;2416:2:1;2401:18;;2388:32;2429:33;2388:32;2429:33;:::i;:::-;2089:456;;2481:7;;-1:-1:-1;;;2535:2:1;2520:18;;;;2507:32;;2089:456::o;2550:180::-;2609:6;2662:2;2650:9;2641:7;2637:23;2633:32;2630:52;;;2678:1;2675;2668:12;2630:52;-1:-1:-1;2701:23:1;;2550:180;-1:-1:-1;2550:180:1:o;2924:118::-;3010:5;3003:13;2996:21;2989:5;2986:32;2976:60;;3032:1;3029;3022:12;3047:382;3112:6;3120;3173:2;3161:9;3152:7;3148:23;3144:32;3141:52;;;3189:1;3186;3179:12;3141:52;3228:9;3215:23;3247:31;3272:5;3247:31;:::i;:::-;3297:5;-1:-1:-1;3354:2:1;3339:18;;3326:32;3367:30;3326:32;3367:30;:::i;:::-;3416:7;3406:17;;;3047:382;;;;;:::o;3434:241::-;3490:6;3543:2;3531:9;3522:7;3518:23;3514:32;3511:52;;;3559:1;3556;3549:12;3511:52;3598:9;3585:23;3617:28;3639:5;3617:28;:::i;3680:316::-;3757:6;3765;3773;3826:2;3814:9;3805:7;3801:23;3797:32;3794:52;;;3842:1;3839;3832:12;3794:52;-1:-1:-1;;3865:23:1;;;3935:2;3920:18;;3907:32;;-1:-1:-1;3986:2:1;3971:18;;;3958:32;;3680:316;-1:-1:-1;3680:316:1:o;4001:388::-;4069:6;4077;4130:2;4118:9;4109:7;4105:23;4101:32;4098:52;;;4146:1;4143;4136:12;4098:52;4185:9;4172:23;4204:31;4229:5;4204:31;:::i;:::-;4254:5;-1:-1:-1;4311:2:1;4296:18;;4283:32;4324:33;4283:32;4324:33;:::i;4394:461::-;4447:3;4485:5;4479:12;4512:6;4507:3;4500:19;4538:4;4567:2;4562:3;4558:12;4551:19;;4604:2;4597:5;4593:14;4625:1;4635:195;4649:6;4646:1;4643:13;4635:195;;;4714:13;;-1:-1:-1;;;;;4710:39:1;4698:52;;4770:12;;;;4805:15;;;;4746:1;4664:9;4635:195;;;-1:-1:-1;4846:3:1;;4394:461;-1:-1:-1;;;;;4394:461:1:o;4860:261::-;5039:2;5028:9;5021:21;5002:4;5059:56;5111:2;5100:9;5096:18;5088:6;5059:56;:::i;5126:380::-;5205:1;5201:12;;;;5248;;;5269:61;;5323:4;5315:6;5311:17;5301:27;;5269:61;5376:2;5368:6;5365:14;5345:18;5342:38;5339:161;;5422:10;5417:3;5413:20;5410:1;5403:31;5457:4;5454:1;5447:15;5485:4;5482:1;5475:15;5339:161;;5126:380;;;:::o;5511:356::-;5713:2;5695:21;;;5732:18;;;5725:30;5791:34;5786:2;5771:18;;5764:62;5858:2;5843:18;;5511:356::o;7407:127::-;7468:10;7463:3;7459:20;7456:1;7449:31;7499:4;7496:1;7489:15;7523:4;7520:1;7513:15;7539:168;7612:9;;;7643;;7660:15;;;7654:22;;7640:37;7630:71;;7681:18;;:::i;7712:217::-;7752:1;7778;7768:132;;7822:10;7817:3;7813:20;7810:1;7803:31;7857:4;7854:1;7847:15;7885:4;7882:1;7875:15;7768:132;-1:-1:-1;7914:9:1;;7712:217::o;8754:125::-;8819:9;;;8840:10;;;8837:36;;;8853:18;;:::i;9676:128::-;9743:9;;;9764:11;;;9761:37;;;9778:18;;:::i;9809:398::-;10011:2;9993:21;;;10050:2;10030:18;;;10023:30;10089:34;10084:2;10069:18;;10062:62;-1:-1:-1;;;10155:2:1;10140:18;;10133:32;10197:3;10182:19;;9809:398::o;13613:184::-;13683:6;13736:2;13724:9;13715:7;13711:23;13707:32;13704:52;;;13752:1;13749;13742:12;13704:52;-1:-1:-1;13775:16:1;;13613:184;-1:-1:-1;13613:184:1:o;14081:245::-;14148:6;14201:2;14189:9;14180:7;14176:23;14172:32;14169:52;;;14217:1;14214;14207:12;14169:52;14249:9;14243:16;14268:28;14290:5;14268:28;:::i;20673:401::-;20875:2;20857:21;;;20914:2;20894:18;;;20887:30;20953:34;20948:2;20933:18;;20926:62;-1:-1:-1;;;21019:2:1;21004:18;;20997:35;21064:3;21049:19;;20673:401::o;21079:399::-;21281:2;21263:21;;;21320:2;21300:18;;;21293:30;21359:34;21354:2;21339:18;;21332:62;-1:-1:-1;;;21425:2:1;21410:18;;21403:33;21468:3;21453:19;;21079:399::o;25508:127::-;25569:10;25564:3;25560:20;25557:1;25550:31;25600:4;25597:1;25590:15;25624:4;25621:1;25614:15;25640:251;25710:6;25763:2;25751:9;25742:7;25738:23;25734:32;25731:52;;;25779:1;25776;25769:12;25731:52;25811:9;25805:16;25830:31;25855:5;25830:31;:::i;25896:582::-;26195:6;26184:9;26177:25;26238:6;26233:2;26222:9;26218:18;26211:34;26281:3;26276:2;26265:9;26261:18;26254:31;26158:4;26302:57;26354:3;26343:9;26339:19;26331:6;26302:57;:::i;:::-;-1:-1:-1;;;;;26395:32:1;;;;26390:2;26375:18;;26368:60;-1:-1:-1;26459:3:1;26444:19;26437:35;26294:65;25896:582;-1:-1:-1;;;25896:582:1:o;27095:306::-;27183:6;27191;27199;27252:2;27240:9;27231:7;27227:23;27223:32;27220:52;;;27268:1;27265;27258:12;27220:52;27297:9;27291:16;27281:26;;27347:2;27336:9;27332:18;27326:25;27316:35;;27391:2;27380:9;27376:18;27370:25;27360:35;;27095:306;;;;;:::o

Swarm Source

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