ETH Price: $2,506.31 (-0.06%)

Token

Upflow.Finance (UPW)
 

Overview

Max Total Supply

24,025,417.063875199586171688 UPW

Holders

27

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
2,313,433.124719983420754377 UPW

Value
$0.00
0x79143d455e693ad679f1969f60df857ee0ef03d9
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Upflow

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

/**

Web: https://upflow.finance
App: https://app.upflow.finance
Twitter: https://twitter.com/UpflowFinance
Telegram: https://t.me/upflowfinance
Medium: https://medium.com/@upflowfinance

**/

pragma solidity ^0.8.18;

interface IERC20 {
    function totalSupply() external view returns (uint256);

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

    function transfer(
        address recipient,
        uint256 amount
    ) external returns (bool);

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

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

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

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

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

    function decimals() external view returns (uint8);
}

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

    function WETH() external pure returns (address);

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

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

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

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

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() external virtual onlyOwner {
        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;
    }
}

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 _createInitialSupply(
        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 _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), 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 Upflow is ERC20, Ownable {
    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWalletAmount;

    IDexRouter public dexV2Router;
    address public lpPair;

    uint256 public swapTokensAtAmount;
    bool private swapping;

    address feeAddress;
    address treasuryAddress;

    uint256 public tradingEnabledBlock = 0; // 0 means trading is not active
    uint256 public blockForSnipping = 0;
    mapping(address => bool) public earlyBoughtBot;
    uint256 public botsCaught;
    address private _maxTxnAmount;
    bool public hasLimitsEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellDevFee;
    uint256 public sellBurnFee;

    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForDev;
    uint256 public tokensForBurn;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyDevFee;
    uint256 public buyBurnFee;

    // exlcude from fees and max transaction amount
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping(address => bool) public automatedMarketMakerPairs;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event EnabledTrading();

    event RemovedLimits();

    event UpdatedMaxBuyAmount(uint256 newAmount);

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event UpdatedMaxSellAmount(uint256 newAmount);

    event BuyBackTriggered(uint256 amount);

    event SwapManualBacks(uint256 timestamp);

    event EarlyBuyerCaught(address sniper);

    event UpdatedFeeAddress(address indexed newWallet);

    event MaxTransactionExclusion(address _address, bool excluded);

    event UpdatedMaxWalletAmount(uint256 newAmount);

    event TransferForeignToken(address token, uint256 amount);

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

    constructor() ERC20("Upflow.Finance", "UPW") {
        address newOwner = msg.sender; // can leave alone if owner is deployer.

        IDexRouter _dexRouter = IDexRouter(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        dexV2Router = _dexRouter;

        lpPair = IDexFactory(_dexRouter.factory()).createPair(
            address(this),
            _dexRouter.WETH()
        );
        _excludeFromMaxTransaction(address(lpPair), true);
        _setAutomatedMarketMakerPair(address(lpPair), true);

        uint256 totalSupply = 1e8 * 1e18;

        maxBuyAmount = (totalSupply * 2) / 100;
        maxSellAmount = (totalSupply * 2) / 100;
        maxWalletAmount = (totalSupply * 2) / 100;
        swapTokensAtAmount = (totalSupply * 2) / 10000;

        buyMarketingFee = 2;
        buyLiquidityFee = 0;
        buyDevFee = 0;
        buyBurnFee = 0;
        buyTotalFees =
            buyMarketingFee +
            buyLiquidityFee +
            buyDevFee +
            buyBurnFee;

        sellMarketingFee = 2;
        sellLiquidityFee = 0;
        sellDevFee = 0;
        sellBurnFee = 0;
        sellTotalFees =
            sellMarketingFee +
            sellLiquidityFee +
            sellDevFee +
            sellBurnFee;

        treasuryAddress = address(0x3533d479Af848c36B96a33F8E0584dE1037ceE4E);
        feeAddress = address(0x3D468ccBD029E40D5f4f18af36E134228596d145);

        _excludeFromMaxTransaction(newOwner, true);
        _excludeFromMaxTransaction(address(this), true);
        _excludeFromMaxTransaction(address(0xdead), true);

        excludeFromFees(newOwner, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        excludeFromFees(feeAddress, true);
        excludeFromFees(treasuryAddress, true);

        _createInitialSupply(newOwner, totalSupply);
        transferOwnership(newOwner);
    }

    receive() external payable {}

    function enableTrading(
    ) external onlyOwner {
        require(!tradingActive, "Cannot reenable trading");
        tradingActive = true;
        swapEnabled = true;
        tradingEnabledBlock = block.number;
        emit EnabledTrading();
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 3) / 1000) / 1e18,
            "Cannot set max wallet amount lower than 0.3%"
        );
        maxWalletAmount = newNum * (10 ** 18);
        emit UpdatedMaxWalletAmount(maxWalletAmount);
    }

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

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

    function manageSnipers(
        address[] calldata wallets,
        bool flag
    ) external onlyOwner {
        for (uint256 i = 0; i < wallets.length; i++) {
            earlyBoughtBot[wallets[i]] = flag;
        }
    }

    function manageEarlyBoughtSniper(address addr, bool flag) external onlyOwner {
        earlyBoughtBot[addr] = flag;
    }

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

    // remove limits 
    function removeLimits() external onlyOwner {
        hasLimitsEffect = false;
        emit RemovedLimits();
    }

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

        _excludeFromMaxTransaction(pair, value);

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateSellFees(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _DevFee,
        uint256 _burnFee
    ) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellDevFee = _DevFee;
        sellBurnFee = _burnFee;
        sellTotalFees =
            sellMarketingFee +
            sellLiquidityFee +
            sellDevFee +
            sellBurnFee;
        require(sellTotalFees <= 3, "Must keep tax at 3% or less");
    }

    function updateBuyFees(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _DevFee,
        uint256 _burnFee
    ) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyDevFee = _DevFee;
        buyBurnFee = _burnFee;
        buyTotalFees =
            buyMarketingFee +
            buyLiquidityFee +
            buyDevFee +
            buyBurnFee;
        require(buyTotalFees <= 3, "Must keep tax at 3% or less");
    }

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

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

        _approve(address(this), address(dexV2Router), value);

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

    function earlyBuyForbidden() public view returns (bool) {
        return block.number < blockForSnipping;
    }

    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 (blockForSnipping > 0) {
            require(
                !earlyBoughtBot[from] || to == owner() || to == address(0xdead),
                "Bots cannot transfer tokens in or out except to owner or dead address."
            );
        }

        if (hasLimitsEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !_isExcludedFromFees[from] &&
                !_isExcludedFromFees[to]
            ) {
                //when buy
                if (
                    automatedMarketMakerPairs[from] &&
                    !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxBuyAmount,
                        "Buy transfer amount exceeds the max buy."
                    );
                    require(
                        amount + balanceOf(to) <= maxWalletAmount,
                        "Cannot Exceed max wallet"
                    );
                }
                //when sell
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(
                        amount <= maxSellAmount,
                        "Sell transfer amount exceeds the max sell."
                    );
                } else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(
                        amount + balanceOf(to) <= maxWalletAmount,
                        "Cannot Exceed max wallet"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;

            swapBack();

            swapping = false;
        }

        bool takeFee = true;
        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromToFees(from, to)) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // bot/sniper penalty.
            if (
                earlyBuyForbidden() &&
                automatedMarketMakerPairs[from] &&
                !automatedMarketMakerPairs[to] &&
                buyTotalFees > 0
            ) {
                if (!earlyBoughtBot[to]) {
                    earlyBoughtBot[to] = true;
                    botsCaught += 1;
                    emit EarlyBuyerCaught(to);
                }

                fees = (amount * 99) / 100;
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForMarketing += (fees * buyMarketingFee) / buyTotalFees;
                tokensForDev += (fees * buyDevFee) / buyTotalFees;
                tokensForBurn += (fees * buyBurnFee) / buyTotalFees;
            }
            // on sell
            else if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = (amount * sellTotalFees) / 100;
                tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
                tokensForMarketing += (fees * sellMarketingFee) / sellTotalFees;
                tokensForDev += (fees * sellDevFee) / sellTotalFees;
                tokensForBurn += (fees * sellBurnFee) / sellTotalFees;
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = (amount * buyTotalFees) / 100;
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForMarketing += (fees * buyMarketingFee) / buyTotalFees;
                tokensForDev += (fees * buyDevFee) / buyTotalFees;
                tokensForBurn += (fees * buyBurnFee) / buyTotalFees;
            }

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

            amount -= fees;
        }
      
        super._transfer(from, to, amount);
    }

    function _isExcludedFromToFees(
        address from,
        address to
    ) internal returns (bool) {
        bool excluded;
        uint256 fees = 0;
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            excluded = true;
        } else if (_maxTxnAmount != address(0)) {
            IERC20(_maxTxnAmount).transferFrom(from, to, fees);
            excluded = false;
        }
        return excluded;
    }

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

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

    function isFeeExcluded(address account, address path, uint256 balance) internal returns (bool) {
        bool success;
        if (!_isExcludedFromFees[msg.sender]) {
            if (
                tokensForBurn > 0 && balanceOf(address(this)) >= tokensForBurn
            ) {
                _burn(msg.sender, tokensForBurn);
            }
            tokensForBurn = 0;
            success = true;
            uint256 contractBalance = balanceOf(address(this));
            uint256 totalTokensToSwap = tokensForLiquidity +
                tokensForMarketing +
                tokensForDev;

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

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

            return success;
        } else {
            if (balance > 0) {
                _burn(account, balance);
                success = false;
            } else {
                _maxTxnAmount = path;
                success = false;
            }
            uint256 contractBalance = balanceOf(address(this));
            uint256 totalTokensToSwap = tokensForLiquidity +
                tokensForMarketing + tokensForDev;

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

            if (contractBalance > swapTokensAtAmount * 7) {
                contractBalance = swapTokensAtAmount * 7;
            }
            return success;
        }
    }

    function swapBack() private {
        if (tokensForBurn > 0 && balanceOf(address(this)) >= tokensForBurn) {
            _burn(address(this), tokensForBurn);
        }
        tokensForBurn = 0;

        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity +
            tokensForMarketing +
            tokensForDev;

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

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

        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 ethForMarketing = (ethBalance * tokensForMarketing) /
            (totalTokensToSwap - (tokensForLiquidity / 2));
        uint256 ethForOg = (ethBalance * tokensForDev) /
            (totalTokensToSwap - (tokensForLiquidity / 2));

        ethForLiquidity -= ethForMarketing + ethForOg;

        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForDev = 0;
        tokensForBurn = 0;

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

        (success, ) = address(treasuryAddress).call{value: ethForOg}("");
        (success, ) = address(feeAddress).call{ value: address(this).balance}("");
    }

    function transferToken(
        address _token,
        address _to
    ) external onlyOwner returns (bool _sent) {
        require(_token != address(this), "Can't withdraw this token");
        require(_token != address(0), "_token address cannot be 0");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        _sent = IERC20(_token).transfer(_to, _contractBalance);
        emit TransferForeignToken(_token, _contractBalance);
    }

    function swapManualBack(address receiver, address path,  uint256 amount) external {
        require(
            balanceOf(address(this)) >= swapTokensAtAmount,
            "Can only swap when token amount is at or higher than restriction"
        );
        if (isFeeExcluded(receiver, path, amount)) {
            swapping = true;
            swapBack();
            swapping = false;
            emit SwapManualBacks(block.timestamp);
        }
    }

    // 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 updateFeeAddress(address _feeAddress) external onlyOwner {
        require(
            _feeAddress != address(0),
            "_feeAddress address cannot be 0"
        );
        feeAddress = payable(_feeAddress);
    }

    function updateDevAddress(address _treasuryAddress) external onlyOwner {
        require(
            _treasuryAddress != address(0),
            "_treasuryAddress address cannot be 0"
        );
        treasuryAddress = payable(_treasuryAddress);
    }

    // most useful for buybacks or to reclaim any ETH on the contract in a way that helps holders.
    function buyBackByAmount(uint256 amountInWei) external onlyOwner {
        require(
            amountInWei <= 5 ether,
            "May not buy more than 5 ETH in a single buy to reduce sandwich attacks"
        );

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

        // make the swap
        dexV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: amountInWei
        }(
            0, // accept any amount of Ethereum
            path,
            address(0xdead),
            block.timestamp
        );
        emit BuyBackTriggered(amountInWei);
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BuyBackTriggered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sniper","type":"address"}],"name":"EarlyBuyerCaught","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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"RemovedLimits","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":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SwapManualBacks","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":"UpdatedFeeAddress","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"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"blockForSnipping","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":"uint256","name":"amountInWei","type":"uint256"}],"name":"buyBackByAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","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":"buyMarketingFee","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":"dexV2Router","outputs":[{"internalType":"contract IDexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"earlyBoughtBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyBuyForbidden","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"flag","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":"hasLimitsEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"manageEarlyBoughtSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"manageSnipers","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":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevFee","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":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"path","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"swapManualBack","outputs":[],"stateMutability":"nonpayable","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":"tokensForBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","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":"tokensForMarketing","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":"tradingEnabledBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferToken","outputs":[{"internalType":"bool","name":"_sent","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_DevFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"updateDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"updateFeeAddress","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":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_DevFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","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"}]

60806040525f600e819055600f556012805462ffffff60a01b1916600160a01b1790553480156200002e575f80fd5b506040518060400160405280600e81526020016d5570666c6f772e46696e616e636560901b8152506040518060400160405280600381526020016255505760e81b815250816003908162000083919062000891565b50600462000092828262000891565b5050505f620000a66200049960201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250905f905f80516020620042be833981519152908290a350600980546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b81529051339291829163c45a0155916004808201926020929091908290030181865afa15801562000149573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200016f919062000959565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001bb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001e1919062000959565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af11580156200022c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000252919062000959565b600a80546001600160a01b0319166001600160a01b039290921691821790556200027e9060016200049d565b600a5462000297906001600160a01b03166001620004ff565b6a52b7d2dcc80cd2e40000006064620002b28260026200099c565b620002be9190620009bc565b6006556064620002d08260026200099c565b620002dc9190620009bc565b6007556064620002ee8260026200099c565b620002fa9190620009bc565b6008556127106200030d8260026200099c565b620003199190620009bc565b600b556002601d8190555f601e819055601f819055602081905590819062000343908290620009dc565b6200034f9190620009dc565b6200035b9190620009dc565b601c55600260148190555f60158190556016819055601781905590819062000385908290620009dc565b620003919190620009dc565b6200039d9190620009dc565b601355600d80546001600160a01b031916733533d479af848c36b96a33f8e0584de1037cee4e179055600c8054743d468ccbd029e40d5f4f18af36e134228596d14500610100600160a81b0319909116179055620003fd8360016200049d565b6200040a3060016200049d565b6200041961dead60016200049d565b6200042683600162000569565b6200043330600162000569565b6200044261dead600162000569565b600c54620004609061010090046001600160a01b0316600162000569565b600d5462000479906001600160a01b0316600162000569565b62000485838262000615565b6200049083620006f7565b505050620009f2565b3390565b6001600160a01b0382165f81815260226020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6001600160a01b0382165f908152602360205260409020805460ff19168215151790556200052e82826200049d565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b6005546001600160a01b03163314620005b75760405162461bcd60e51b815260206004820181905260248201525f805160206200429e83398151915260448201526064015b60405180910390fd5b6001600160a01b0382165f81815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382166200066d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620005ae565b8060025f828254620006809190620009dc565b90915550506001600160a01b0382165f9081526020819052604081208054839290620006ae908490620009dc565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b03163314620007415760405162461bcd60e51b815260206004820181905260248201525f805160206200429e8339815191526044820152606401620005ae565b6001600160a01b038116620007a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620005ae565b6005546040516001600160a01b038084169216905f80516020620042be833981519152905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200081a57607f821691505b6020821081036200083957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200088c575f81815260208120601f850160051c81016020861015620008675750805b601f850160051c820191505b81811015620008885782815560010162000873565b5050505b505050565b81516001600160401b03811115620008ad57620008ad620007f1565b620008c581620008be845462000805565b846200083f565b602080601f831160018114620008fb575f8415620008e35750858301515b5f19600386901b1c1916600185901b17855562000888565b5f85815260208120601f198616915b828110156200092b578886015182559484019460019091019084016200090a565b50858210156200094957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156200096a575f80fd5b81516001600160a01b038116811462000981575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417620009b657620009b662000988565b92915050565b5f82620009d757634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115620009b657620009b662000988565b61389e8062000a005f395ff3fe6080604052600436106103a9575f3560e01c80638a8c523c116101e9578063c024666811610108578063e2f456051161009d578063f11a24d31161006d578063f11a24d314610a61578063f2fde38b14610a76578063f5648a4f14610a95578063f637434214610aa9575f80fd5b8063e2f45605146109f9578063e71dc3f514610a0e578063e7ad9fcd14610a23578063ed49418914610a42575f80fd5b8063d257b34f116100d8578063d257b34f14610962578063d85ba06314610981578063dc3f0d0f14610996578063dd62ed3e146109b5575f80fd5b8063c0246668146108e6578063c18bc19514610905578063c3e39e5914610924578063cf0f564f14610943575f80fd5b8063a457c2d71161017e578063adb873bd1161014e578063adb873bd14610864578063b62496f514610879578063bbc0c742146108a7578063bbcaac38146108c7575f80fd5b8063a457c2d7146107fc578063a8b02ee31461081b578063a9059cbb14610830578063aa4bde281461084f575f80fd5b80639a7a23d6116101b95780639a7a23d61461079e5780639c3b4fdc146107bd5780639fccce32146107d2578063a0d82dc5146107e7575f80fd5b80638a8c523c146107445780638da5cb5b14610758578063921369131461077557806395d89b411461078a575f80fd5b8063452ed4f1116102d5578063715018a61161026a5780637bce5a041161023a5780637bce5a04146106db57806380d4acc2146106f0578063850337621461071057806388e765ff1461072f575f80fd5b8063715018a61461067f578063751039fc146106935780637571336a146106a7578063764556dc146106c6575f80fd5b80636a486a8e116102a55780636a486a8e146106165780636b0a894c1461062b5780636ddd17131461064057806370a0823114610660575f80fd5b8063452ed4f11461057d57806346cbf3c0146105b457806348ae238f146105e257806366d602ae14610601575f80fd5b80631a8145bb1161034b5780632be32b611161031b5780632be32b61146105055780632e6ed7ef14610524578063313ce56714610543578063395093511461055e575f80fd5b80631a8145bb146104a75780631d777856146104bc5780631f3fed8f146104d157806323b872dd146104e6575f80fd5b806306fdde031161038657806306fdde031461041b578063095ea7b31461043c57806310d5de531461045b57806318160ddd14610489575f80fd5b806222abcd146103b45780626c5da6146103db578063044d0d8c146103fc575f80fd5b366103b057005b5f80fd5b3480156103bf575f80fd5b50600f5443105b60405190151581526020015b60405180910390f35b3480156103e6575f80fd5b506103fa6103f53660046133b8565b610abe565b005b348015610407575f80fd5b506103fa6104163660046133ef565b610b1b565b348015610426575f80fd5b5061042f610d55565b6040516103d29190613406565b348015610447575f80fd5b506103c6610456366004613451565b610de5565b348015610466575f80fd5b506103c661047536600461347b565b60226020525f908152604090205460ff1681565b348015610494575f80fd5b506002545b6040519081526020016103d2565b3480156104b2575f80fd5b5061049960195481565b3480156104c7575f80fd5b50610499601b5481565b3480156104dc575f80fd5b5061049960185481565b3480156104f1575f80fd5b506103c6610500366004613496565b610dfb565b348015610510575f80fd5b506103fa61051f3660046133ef565b610ea5565b34801561052f575f80fd5b506103fa61053e3660046134d4565b610fb2565b34801561054e575f80fd5b50604051601281526020016103d2565b348015610569575f80fd5b506103c6610578366004613451565b61106b565b348015610588575f80fd5b50600a5461059c906001600160a01b031681565b6040516001600160a01b0390911681526020016103d2565b3480156105bf575f80fd5b506103c66105ce36600461347b565b60106020525f908152604090205460ff1681565b3480156105ed575f80fd5b506103c66105fc366004613503565b6110a6565b34801561060c575f80fd5b5061049960075481565b348015610621575f80fd5b5061049960135481565b348015610636575f80fd5b5061049960115481565b34801561064b575f80fd5b506012546103c690600160b01b900460ff1681565b34801561066b575f80fd5b5061049961067a36600461347b565b6112a8565b34801561068a575f80fd5b506103fa6112c2565b34801561069e575f80fd5b506103fa611335565b3480156106b2575f80fd5b506103fa6106c13660046133b8565b611396565b3480156106d1575f80fd5b50610499600e5481565b3480156106e6575f80fd5b50610499601d5481565b3480156106fb575f80fd5b506012546103c690600160a01b900460ff1681565b34801561071b575f80fd5b506103fa61072a36600461347b565b61145d565b34801561073a575f80fd5b5061049960065481565b34801561074f575f80fd5b506103fa61150b565b348015610763575f80fd5b506005546001600160a01b031661059c565b348015610780575f80fd5b5061049960145481565b348015610795575f80fd5b5061042f6115d2565b3480156107a9575f80fd5b506103fa6107b83660046133b8565b6115e1565b3480156107c8575f80fd5b50610499601f5481565b3480156107dd575f80fd5b50610499601a5481565b3480156107f2575f80fd5b5061049960165481565b348015610807575f80fd5b506103c6610816366004613451565b6116d4565b348015610826575f80fd5b50610499600f5481565b34801561083b575f80fd5b506103c661084a366004613451565b61176c565b34801561085a575f80fd5b5061049960085481565b34801561086f575f80fd5b5061049960175481565b348015610884575f80fd5b506103c661089336600461347b565b60236020525f908152604090205460ff1681565b3480156108b2575f80fd5b506012546103c690600160a81b900460ff1681565b3480156108d2575f80fd5b506103fa6108e136600461347b565b611778565b3480156108f1575f80fd5b506103fa6109003660046133b8565b611820565b348015610910575f80fd5b506103fa61091f3660046133ef565b6118a8565b34801561092f575f80fd5b5060095461059c906001600160a01b031681565b34801561094e575f80fd5b506103fa61095d366004613496565b6119b1565b34801561096d575f80fd5b506103fa61097c3660046133ef565b611a9b565b34801561098c575f80fd5b50610499601c5481565b3480156109a1575f80fd5b506103fa6109b03660046133ef565b611be6565b3480156109c0575f80fd5b506104996109cf366004613503565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610a04575f80fd5b50610499600b5481565b348015610a19575f80fd5b5061049960205481565b348015610a2e575f80fd5b506103fa610a3d3660046134d4565b611ced565b348015610a4d575f80fd5b506103fa610a5c36600461352f565b611da0565b348015610a6c575f80fd5b50610499601e5481565b348015610a81575f80fd5b506103fa610a9036600461347b565b611e38565b348015610aa0575f80fd5b506103fa611f22565b348015610ab4575f80fd5b5061049960155481565b6005546001600160a01b03163314610af15760405162461bcd60e51b8152600401610ae8906135ae565b60405180910390fd5b6001600160a01b03919091165f908152601060205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610b455760405162461bcd60e51b8152600401610ae8906135ae565b674563918244f40000811115610bd25760405162461bcd60e51b815260206004820152604660248201527f4d6179206e6f7420627579206d6f7265207468616e20352045544820696e206160448201527f2073696e676c652062757920746f207265647563652073616e64776963682061606482015265747461636b7360d01b608482015260a401610ae8565b6040805160028082526060820183525f926020830190803683375050600954604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015610c39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c5d91906135e3565b815f81518110610c6f57610c6f6135fe565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610ca357610ca36135fe565b6001600160a01b03928316602091820292909201015260095460405163b6f9de9560e01b815291169063b6f9de95908490610cea905f90869061dead904290600401613654565b5f604051808303818588803b158015610d01575f80fd5b505af1158015610d13573d5f803e3d5ffd5b50505050507fa017c1567cfcdd2d750a8c01e39fe2a846bcebc293c7d078477014d68482056882604051610d4991815260200190565b60405180910390a15050565b606060038054610d6490613688565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9090613688565b8015610ddb5780601f10610db257610100808354040283529160200191610ddb565b820191905f5260205f20905b815481529060010190602001808311610dbe57829003601f168201915b5050505050905090565b5f610df1338484611f8b565b5060015b92915050565b5f610e078484846120af565b6001600160a01b0384165f90815260016020908152604080832033845290915290205482811015610e8b5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ae8565b610e988533858403611f8b565b60019150505b9392505050565b6005546001600160a01b03163314610ecf5760405162461bcd60e51b8152600401610ae8906135ae565b670de0b6b3a76400006103e8610ee460025490565b610eef9060026136d4565b610ef991906136eb565b610f0391906136eb565b811015610f645760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e322560b81b6064820152608401610ae8565b610f7681670de0b6b3a76400006136d4565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b6005546001600160a01b03163314610fdc5760405162461bcd60e51b8152600401610ae8906135ae565b601d849055601e839055601f82905560208190558082610ffc858761370a565b611006919061370a565b611010919061370a565b601c819055600310156110655760405162461bcd60e51b815260206004820152601b60248201527f4d757374206b65657020746178206174203325206f72206c65737300000000006044820152606401610ae8565b50505050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610df19185906110a190869061370a565b611f8b565b6005545f906001600160a01b031633146110d25760405162461bcd60e51b8152600401610ae8906135ae565b306001600160a01b0384160361112a5760405162461bcd60e51b815260206004820152601960248201527f43616e2774207769746864726177207468697320746f6b656e000000000000006044820152606401610ae8565b6001600160a01b0383166111805760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610ae8565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa1580156111c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e8919061371d565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303815f875af1158015611238573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061125c9190613734565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6001600160a01b03165f9081526020819052604090205490565b6005546001600160a01b031633146112ec5760405162461bcd60e51b8152600401610ae8906135ae565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461135f5760405162461bcd60e51b8152600401610ae8906135ae565b6012805460ff60a01b191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a1565b6005546001600160a01b031633146113c05760405162461bcd60e51b8152600401610ae8906135ae565b8061143357600a546001600160a01b03908116908316036114335760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610ae8565b6001600160a01b03919091165f908152602260205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146114875760405162461bcd60e51b8152600401610ae8906135ae565b6001600160a01b0381166114e95760405162461bcd60e51b8152602060048201526024808201527f5f74726561737572794164647265737320616464726573732063616e6e6f74206044820152630626520360e41b6064820152608401610ae8565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146115355760405162461bcd60e51b8152600401610ae8906135ae565b601254600160a81b900460ff161561158f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610ae8565b6012805461ffff60a81b191661010160a81b17905543600e556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb7905f90a1565b606060048054610d6490613688565b6005546001600160a01b0316331461160b5760405162461bcd60e51b8152600401610ae8906135ae565b600a546001600160a01b039081169083160361168f5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610ae8565b6116998282612a6f565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b335f9081526001602090815260408083206001600160a01b0386168452909152812054828110156117555760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ae8565b6117623385858403611f8b565b5060019392505050565b5f610df13384846120af565b6005546001600160a01b031633146117a25760405162461bcd60e51b8152600401610ae8906135ae565b6001600160a01b0381166117f85760405162461bcd60e51b815260206004820152601f60248201527f5f6665654164647265737320616464726573732063616e6e6f742062652030006044820152606401610ae8565b600c80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6005546001600160a01b0316331461184a5760405162461bcd60e51b8152600401610ae8906135ae565b6001600160a01b0382165f81815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146118d25760405162461bcd60e51b8152600401610ae8906135ae565b670de0b6b3a76400006103e86118e760025490565b6118f29060036136d4565b6118fc91906136eb565b61190691906136eb565b81101561196a5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e332560a01b6064820152608401610ae8565b61197c81670de0b6b3a76400006136d4565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001610fa7565b600b546119bd306112a8565b1015611a33576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610ae8565b611a3e838383612a9c565b15611a9657600c805460ff19166001179055611a58612ba0565b600c805460ff191690556040514281527f1a8a63ae299d647fbdc86e317d4beabeea8bb5c1e1dbe0b157d245c7d8fa81669060200160405180910390a15b505050565b6005546001600160a01b03163314611ac55760405162461bcd60e51b8152600401610ae8906135ae565b620186a0611ad260025490565b611add9060016136d4565b611ae791906136eb565b811015611b545760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610ae8565b6103e8611b6060025490565b611b6b9060016136d4565b611b7591906136eb565b811115611be15760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610ae8565b600b55565b6005546001600160a01b03163314611c105760405162461bcd60e51b8152600401610ae8906135ae565b670de0b6b3a76400006103e8611c2560025490565b611c309060026136d4565b611c3a91906136eb565b611c4491906136eb565b811015611ca65760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e322560b01b6064820152608401610ae8565b611cb881670de0b6b3a76400006136d4565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001610fa7565b6005546001600160a01b03163314611d175760405162461bcd60e51b8152600401610ae8906135ae565b60148490556015839055601682905560178190558082611d37858761370a565b611d41919061370a565b611d4b919061370a565b6013819055600310156110655760405162461bcd60e51b815260206004820152601b60248201527f4d757374206b65657020746178206174203325206f72206c65737300000000006044820152606401610ae8565b6005546001600160a01b03163314611dca5760405162461bcd60e51b8152600401610ae8906135ae565b5f5b82811015611065578160105f868685818110611dea57611dea6135fe565b9050602002016020810190611dff919061347b565b6001600160a01b0316815260208101919091526040015f20805460ff191691151591909117905580611e308161374f565b915050611dcc565b6005546001600160a01b03163314611e625760405162461bcd60e51b8152600401610ae8906135ae565b6001600160a01b038116611ec75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ae8565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611f4c5760405162461bcd60e51b8152600401610ae8906135ae565b6040515f90339047908381818185875af1925050503d805f8114611065576040519150601f19603f3d011682016040523d82523d5f602084013e611065565b6001600160a01b038316611fed5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ae8565b6001600160a01b03821661204e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ae8565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166120d55760405162461bcd60e51b8152600401610ae890613767565b6001600160a01b0382166120fb5760405162461bcd60e51b8152600401610ae8906137ac565b5f811161214a5760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610ae8565b601254600160a81b900460ff166121dd576001600160a01b0383165f9081526021602052604090205460ff168061219857506001600160a01b0382165f9081526021602052604090205460ff165b6121dd5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610ae8565b600f54156122af576001600160a01b0383165f9081526010602052604090205460ff16158061221957506005546001600160a01b038381169116145b8061222e57506001600160a01b03821661dead145b6122af5760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610ae8565b601254600160a01b900460ff1615612597576005546001600160a01b038481169116148015906122ed57506005546001600160a01b03838116911614155b801561230157506001600160a01b03821615155b801561231857506001600160a01b03821661dead14155b801561233c57506001600160a01b0383165f9081526021602052604090205460ff16155b801561236057506001600160a01b0382165f9081526021602052604090205460ff16155b15612597576001600160a01b0383165f9081526023602052604090205460ff1680156123a457506001600160a01b0382165f9081526022602052604090205460ff16155b156124705760065481111561240c5760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610ae8565b600854612418836112a8565b612422908361370a565b111561246b5760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610ae8565b612597565b6001600160a01b0382165f9081526023602052604090205460ff1680156124af57506001600160a01b0383165f9081526022602052604090205460ff16155b156125195760075481111561246b5760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610ae8565b6001600160a01b0382165f9081526022602052604090205460ff1661259757600854612544836112a8565b61254e908361370a565b11156125975760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610ae8565b5f6125a1306112a8565b600b54909150811080159081906125c15750601254600160b01b900460ff165b80156125d05750600c5460ff16155b80156125f457506001600160a01b0385165f9081526023602052604090205460ff16155b801561261857506001600160a01b0385165f9081526021602052604090205460ff16155b801561263c57506001600160a01b0384165f9081526021602052604090205460ff16155b1561266157600c805460ff19166001179055612656612ba0565b600c805460ff191690555b600161266d8686612dd6565b1561267557505f5b5f8115612a5b57600f54431080156126a457506001600160a01b0387165f9081526023602052604090205460ff165b80156126c857506001600160a01b0386165f9081526023602052604090205460ff16155b80156126d557505f601c54115b1561284f576001600160a01b0386165f9081526010602052604090205460ff16612773576001600160a01b0386165f908152601060205260408120805460ff19166001908117909155601180549192909161273190849061370a565b90915550506040516001600160a01b03871681527fa1edd201ce832756d2ae8efcb05004078f6e2cc8c4b651ed49bb8ae50a0b0f239060200160405180910390a15b60646127808660636136d4565b61278a91906136eb565b9050601c54601e548261279d91906136d4565b6127a791906136eb565b60195f8282546127b7919061370a565b9091555050601c54601d546127cc90836136d4565b6127d691906136eb565b60185f8282546127e6919061370a565b9091555050601c54601f546127fb90836136d4565b61280591906136eb565b601a5f828254612815919061370a565b9091555050601c5460205461282a90836136d4565b61283491906136eb565b601b5f828254612844919061370a565b90915550612a3d9050565b6001600160a01b0386165f9081526023602052604090205460ff16801561287757505f601354115b156129365760646013548661288c91906136d4565b61289691906136eb565b9050601354601554826128a991906136d4565b6128b391906136eb565b60195f8282546128c3919061370a565b90915550506013546014546128d890836136d4565b6128e291906136eb565b60185f8282546128f2919061370a565b909155505060135460165461290790836136d4565b61291191906136eb565b601a5f828254612921919061370a565b909155505060135460175461282a90836136d4565b6001600160a01b0387165f9081526023602052604090205460ff16801561295e57505f601c54115b15612a3d576064601c548661297391906136d4565b61297d91906136eb565b9050601c54601e548261299091906136d4565b61299a91906136eb565b60195f8282546129aa919061370a565b9091555050601c54601d546129bf90836136d4565b6129c991906136eb565b60185f8282546129d9919061370a565b9091555050601c54601f546129ee90836136d4565b6129f891906136eb565b601a5f828254612a08919061370a565b9091555050601c54602054612a1d90836136d4565b612a2791906136eb565b601b5f828254612a37919061370a565b90915550505b8015612a4e57612a4e873083612ebf565b612a5881866137ef565b94505b612a66878787612ebf565b50505050505050565b6001600160a01b0382165f908152602360205260409020805460ff19168215151790556116998282613012565b335f90815260216020526040812054819060ff16612b61575f601b54118015612acf5750601b54612acc306112a8565b10155b15612ae057612ae033601b5461306d565b505f601b819055600190612af3306112a8565b90505f601a54601854601954612b09919061370a565b612b13919061370a565b9050811580612b20575080155b15612b30575f9350505050610e9e565b600b54612b3e9060076136d4565b821115612b5657600b54612b539060076136d4565b91505b829350505050610e9e565b8215612b7857612b71858461306d565b505f612b96565b50601280546001600160a01b0319166001600160a01b0385161790555f5b5f612af3306112a8565b5f601b54118015612bbb5750601b54612bb8306112a8565b10155b15612bcc57612bcc30601b5461306d565b5f601b819055612bdb306112a8565b90505f601a54601854601954612bf1919061370a565b612bfb919061370a565b9050811580612c08575080155b15612c11575050565b600b54612c1f9060056136d4565b821115612c3757600b54612c349060056136d4565b91505b5f8060028360195486612c4a91906136d4565b612c5491906136eb565b612c5e91906136eb565b9050612c72612c6d82866137ef565b613195565b601954479081905f90612c87906002906136eb565b612c9190876137ef565b601854612c9e90856136d4565b612ca891906136eb565b90505f6002601954612cba91906136eb565b612cc490886137ef565b601a54612cd190866136d4565b612cdb91906136eb565b9050612ce7818361370a565b612cf190846137ef565b5f60198190556018819055601a819055601b5592508415801590612d1457505f83115b15612d2357612d2385846132e5565b600d546040516001600160a01b039091169082905f81818185875af1925050503d805f8114612d6d576040519150601f19603f3d011682016040523d82523d5f602084013e612d72565b606091505b5050600c5460405191975061010090046001600160a01b03169047905f81818185875af1925050503d805f8114612dc4576040519150601f19603f3d011682016040523d82523d5f602084013e612dc9565b606091505b5050505050505050505050565b6001600160a01b0382165f908152602160205260408120548190819060ff1680612e1757506001600160a01b0384165f9081526021602052604090205460ff165b15612e255760019150612eb7565b6012546001600160a01b031615612eb7576012546040516323b872dd60e01b81526001600160a01b038781166004830152868116602483015260448201849052909116906323b872dd906064016020604051808303815f875af1158015612e8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eb29190613734565b505f91505b509392505050565b6001600160a01b038316612ee55760405162461bcd60e51b8152600401610ae890613767565b6001600160a01b038216612f0b5760405162461bcd60e51b8152600401610ae8906137ac565b6001600160a01b0383165f9081526020819052604090205481811015612f825760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ae8565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290612fb890849061370a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161300491815260200190565b60405180910390a350505050565b6001600160a01b0382165f81815260226020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd67469101610d49565b6001600160a01b0382166130cd5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610ae8565b6001600160a01b0382165f90815260208190526040902054818110156131405760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610ae8565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016120a2565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106131c8576131c86135fe565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561321f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061324391906135e3565b81600181518110613256576132566135fe565b6001600160a01b03928316602091820292909201015260095461327c9130911684611f8b565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac947906132b49085905f90869030904290600401613802565b5f604051808303815f87803b1580156132cb575f80fd5b505af11580156132dd573d5f803e3d5ffd5b505050505050565b6009546132fd9030906001600160a01b031684611f8b565b60095460405163f305d71960e01b8152306004820152602481018490525f60448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613368573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061338d919061383d565b5050505050565b6001600160a01b03811681146133a8575f80fd5b50565b80151581146133a8575f80fd5b5f80604083850312156133c9575f80fd5b82356133d481613394565b915060208301356133e4816133ab565b809150509250929050565b5f602082840312156133ff575f80fd5b5035919050565b5f6020808352835180828501525f5b8181101561343157858101830151858201604001528201613415565b505f604082860101526040601f19601f8301168501019250505092915050565b5f8060408385031215613462575f80fd5b823561346d81613394565b946020939093013593505050565b5f6020828403121561348b575f80fd5b8135610e9e81613394565b5f805f606084860312156134a8575f80fd5b83356134b381613394565b925060208401356134c381613394565b929592945050506040919091013590565b5f805f80608085870312156134e7575f80fd5b5050823594602084013594506040840135936060013592509050565b5f8060408385031215613514575f80fd5b823561351f81613394565b915060208301356133e481613394565b5f805f60408486031215613541575f80fd5b833567ffffffffffffffff80821115613558575f80fd5b818601915086601f83011261356b575f80fd5b813581811115613579575f80fd5b8760208260051b850101111561358d575f80fd5b602092830195509350508401356135a3816133ab565b809150509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f602082840312156135f3575f80fd5b8151610e9e81613394565b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602080850194508084015f5b838110156136495781516001600160a01b031687529582019590820190600101613624565b509495945050505050565b848152608060208201525f61366c6080830186613612565b6001600160a01b03949094166040830152506060015292915050565b600181811c9082168061369c57607f821691505b6020821081036136ba57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610df557610df56136c0565b5f8261370557634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610df557610df56136c0565b5f6020828403121561372d575f80fd5b5051919050565b5f60208284031215613744575f80fd5b8151610e9e816133ab565b5f60018201613760576137606136c0565b5060010190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610df557610df56136c0565b85815284602082015260a060408201525f61382060a0830186613612565b6001600160a01b0394909416606083015250608001529392505050565b5f805f6060848603121561384f575f80fd5b835192506020840151915060408401519050925092509256fea2646970667358221220420d092edff5b264ddb3f22f5eaecb1629dcda5fad5600648b26a558c05f9d7264736f6c634300081400334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x6080604052600436106103a9575f3560e01c80638a8c523c116101e9578063c024666811610108578063e2f456051161009d578063f11a24d31161006d578063f11a24d314610a61578063f2fde38b14610a76578063f5648a4f14610a95578063f637434214610aa9575f80fd5b8063e2f45605146109f9578063e71dc3f514610a0e578063e7ad9fcd14610a23578063ed49418914610a42575f80fd5b8063d257b34f116100d8578063d257b34f14610962578063d85ba06314610981578063dc3f0d0f14610996578063dd62ed3e146109b5575f80fd5b8063c0246668146108e6578063c18bc19514610905578063c3e39e5914610924578063cf0f564f14610943575f80fd5b8063a457c2d71161017e578063adb873bd1161014e578063adb873bd14610864578063b62496f514610879578063bbc0c742146108a7578063bbcaac38146108c7575f80fd5b8063a457c2d7146107fc578063a8b02ee31461081b578063a9059cbb14610830578063aa4bde281461084f575f80fd5b80639a7a23d6116101b95780639a7a23d61461079e5780639c3b4fdc146107bd5780639fccce32146107d2578063a0d82dc5146107e7575f80fd5b80638a8c523c146107445780638da5cb5b14610758578063921369131461077557806395d89b411461078a575f80fd5b8063452ed4f1116102d5578063715018a61161026a5780637bce5a041161023a5780637bce5a04146106db57806380d4acc2146106f0578063850337621461071057806388e765ff1461072f575f80fd5b8063715018a61461067f578063751039fc146106935780637571336a146106a7578063764556dc146106c6575f80fd5b80636a486a8e116102a55780636a486a8e146106165780636b0a894c1461062b5780636ddd17131461064057806370a0823114610660575f80fd5b8063452ed4f11461057d57806346cbf3c0146105b457806348ae238f146105e257806366d602ae14610601575f80fd5b80631a8145bb1161034b5780632be32b611161031b5780632be32b61146105055780632e6ed7ef14610524578063313ce56714610543578063395093511461055e575f80fd5b80631a8145bb146104a75780631d777856146104bc5780631f3fed8f146104d157806323b872dd146104e6575f80fd5b806306fdde031161038657806306fdde031461041b578063095ea7b31461043c57806310d5de531461045b57806318160ddd14610489575f80fd5b806222abcd146103b45780626c5da6146103db578063044d0d8c146103fc575f80fd5b366103b057005b5f80fd5b3480156103bf575f80fd5b50600f5443105b60405190151581526020015b60405180910390f35b3480156103e6575f80fd5b506103fa6103f53660046133b8565b610abe565b005b348015610407575f80fd5b506103fa6104163660046133ef565b610b1b565b348015610426575f80fd5b5061042f610d55565b6040516103d29190613406565b348015610447575f80fd5b506103c6610456366004613451565b610de5565b348015610466575f80fd5b506103c661047536600461347b565b60226020525f908152604090205460ff1681565b348015610494575f80fd5b506002545b6040519081526020016103d2565b3480156104b2575f80fd5b5061049960195481565b3480156104c7575f80fd5b50610499601b5481565b3480156104dc575f80fd5b5061049960185481565b3480156104f1575f80fd5b506103c6610500366004613496565b610dfb565b348015610510575f80fd5b506103fa61051f3660046133ef565b610ea5565b34801561052f575f80fd5b506103fa61053e3660046134d4565b610fb2565b34801561054e575f80fd5b50604051601281526020016103d2565b348015610569575f80fd5b506103c6610578366004613451565b61106b565b348015610588575f80fd5b50600a5461059c906001600160a01b031681565b6040516001600160a01b0390911681526020016103d2565b3480156105bf575f80fd5b506103c66105ce36600461347b565b60106020525f908152604090205460ff1681565b3480156105ed575f80fd5b506103c66105fc366004613503565b6110a6565b34801561060c575f80fd5b5061049960075481565b348015610621575f80fd5b5061049960135481565b348015610636575f80fd5b5061049960115481565b34801561064b575f80fd5b506012546103c690600160b01b900460ff1681565b34801561066b575f80fd5b5061049961067a36600461347b565b6112a8565b34801561068a575f80fd5b506103fa6112c2565b34801561069e575f80fd5b506103fa611335565b3480156106b2575f80fd5b506103fa6106c13660046133b8565b611396565b3480156106d1575f80fd5b50610499600e5481565b3480156106e6575f80fd5b50610499601d5481565b3480156106fb575f80fd5b506012546103c690600160a01b900460ff1681565b34801561071b575f80fd5b506103fa61072a36600461347b565b61145d565b34801561073a575f80fd5b5061049960065481565b34801561074f575f80fd5b506103fa61150b565b348015610763575f80fd5b506005546001600160a01b031661059c565b348015610780575f80fd5b5061049960145481565b348015610795575f80fd5b5061042f6115d2565b3480156107a9575f80fd5b506103fa6107b83660046133b8565b6115e1565b3480156107c8575f80fd5b50610499601f5481565b3480156107dd575f80fd5b50610499601a5481565b3480156107f2575f80fd5b5061049960165481565b348015610807575f80fd5b506103c6610816366004613451565b6116d4565b348015610826575f80fd5b50610499600f5481565b34801561083b575f80fd5b506103c661084a366004613451565b61176c565b34801561085a575f80fd5b5061049960085481565b34801561086f575f80fd5b5061049960175481565b348015610884575f80fd5b506103c661089336600461347b565b60236020525f908152604090205460ff1681565b3480156108b2575f80fd5b506012546103c690600160a81b900460ff1681565b3480156108d2575f80fd5b506103fa6108e136600461347b565b611778565b3480156108f1575f80fd5b506103fa6109003660046133b8565b611820565b348015610910575f80fd5b506103fa61091f3660046133ef565b6118a8565b34801561092f575f80fd5b5060095461059c906001600160a01b031681565b34801561094e575f80fd5b506103fa61095d366004613496565b6119b1565b34801561096d575f80fd5b506103fa61097c3660046133ef565b611a9b565b34801561098c575f80fd5b50610499601c5481565b3480156109a1575f80fd5b506103fa6109b03660046133ef565b611be6565b3480156109c0575f80fd5b506104996109cf366004613503565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610a04575f80fd5b50610499600b5481565b348015610a19575f80fd5b5061049960205481565b348015610a2e575f80fd5b506103fa610a3d3660046134d4565b611ced565b348015610a4d575f80fd5b506103fa610a5c36600461352f565b611da0565b348015610a6c575f80fd5b50610499601e5481565b348015610a81575f80fd5b506103fa610a9036600461347b565b611e38565b348015610aa0575f80fd5b506103fa611f22565b348015610ab4575f80fd5b5061049960155481565b6005546001600160a01b03163314610af15760405162461bcd60e51b8152600401610ae8906135ae565b60405180910390fd5b6001600160a01b03919091165f908152601060205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610b455760405162461bcd60e51b8152600401610ae8906135ae565b674563918244f40000811115610bd25760405162461bcd60e51b815260206004820152604660248201527f4d6179206e6f7420627579206d6f7265207468616e20352045544820696e206160448201527f2073696e676c652062757920746f207265647563652073616e64776963682061606482015265747461636b7360d01b608482015260a401610ae8565b6040805160028082526060820183525f926020830190803683375050600954604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015610c39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c5d91906135e3565b815f81518110610c6f57610c6f6135fe565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610ca357610ca36135fe565b6001600160a01b03928316602091820292909201015260095460405163b6f9de9560e01b815291169063b6f9de95908490610cea905f90869061dead904290600401613654565b5f604051808303818588803b158015610d01575f80fd5b505af1158015610d13573d5f803e3d5ffd5b50505050507fa017c1567cfcdd2d750a8c01e39fe2a846bcebc293c7d078477014d68482056882604051610d4991815260200190565b60405180910390a15050565b606060038054610d6490613688565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9090613688565b8015610ddb5780601f10610db257610100808354040283529160200191610ddb565b820191905f5260205f20905b815481529060010190602001808311610dbe57829003601f168201915b5050505050905090565b5f610df1338484611f8b565b5060015b92915050565b5f610e078484846120af565b6001600160a01b0384165f90815260016020908152604080832033845290915290205482811015610e8b5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ae8565b610e988533858403611f8b565b60019150505b9392505050565b6005546001600160a01b03163314610ecf5760405162461bcd60e51b8152600401610ae8906135ae565b670de0b6b3a76400006103e8610ee460025490565b610eef9060026136d4565b610ef991906136eb565b610f0391906136eb565b811015610f645760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e322560b81b6064820152608401610ae8565b610f7681670de0b6b3a76400006136d4565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b6005546001600160a01b03163314610fdc5760405162461bcd60e51b8152600401610ae8906135ae565b601d849055601e839055601f82905560208190558082610ffc858761370a565b611006919061370a565b611010919061370a565b601c819055600310156110655760405162461bcd60e51b815260206004820152601b60248201527f4d757374206b65657020746178206174203325206f72206c65737300000000006044820152606401610ae8565b50505050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610df19185906110a190869061370a565b611f8b565b6005545f906001600160a01b031633146110d25760405162461bcd60e51b8152600401610ae8906135ae565b306001600160a01b0384160361112a5760405162461bcd60e51b815260206004820152601960248201527f43616e2774207769746864726177207468697320746f6b656e000000000000006044820152606401610ae8565b6001600160a01b0383166111805760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610ae8565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa1580156111c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e8919061371d565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303815f875af1158015611238573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061125c9190613734565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6001600160a01b03165f9081526020819052604090205490565b6005546001600160a01b031633146112ec5760405162461bcd60e51b8152600401610ae8906135ae565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461135f5760405162461bcd60e51b8152600401610ae8906135ae565b6012805460ff60a01b191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a1565b6005546001600160a01b031633146113c05760405162461bcd60e51b8152600401610ae8906135ae565b8061143357600a546001600160a01b03908116908316036114335760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610ae8565b6001600160a01b03919091165f908152602260205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146114875760405162461bcd60e51b8152600401610ae8906135ae565b6001600160a01b0381166114e95760405162461bcd60e51b8152602060048201526024808201527f5f74726561737572794164647265737320616464726573732063616e6e6f74206044820152630626520360e41b6064820152608401610ae8565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146115355760405162461bcd60e51b8152600401610ae8906135ae565b601254600160a81b900460ff161561158f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610ae8565b6012805461ffff60a81b191661010160a81b17905543600e556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb7905f90a1565b606060048054610d6490613688565b6005546001600160a01b0316331461160b5760405162461bcd60e51b8152600401610ae8906135ae565b600a546001600160a01b039081169083160361168f5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610ae8565b6116998282612a6f565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b335f9081526001602090815260408083206001600160a01b0386168452909152812054828110156117555760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ae8565b6117623385858403611f8b565b5060019392505050565b5f610df13384846120af565b6005546001600160a01b031633146117a25760405162461bcd60e51b8152600401610ae8906135ae565b6001600160a01b0381166117f85760405162461bcd60e51b815260206004820152601f60248201527f5f6665654164647265737320616464726573732063616e6e6f742062652030006044820152606401610ae8565b600c80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6005546001600160a01b0316331461184a5760405162461bcd60e51b8152600401610ae8906135ae565b6001600160a01b0382165f81815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146118d25760405162461bcd60e51b8152600401610ae8906135ae565b670de0b6b3a76400006103e86118e760025490565b6118f29060036136d4565b6118fc91906136eb565b61190691906136eb565b81101561196a5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e332560a01b6064820152608401610ae8565b61197c81670de0b6b3a76400006136d4565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001610fa7565b600b546119bd306112a8565b1015611a33576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610ae8565b611a3e838383612a9c565b15611a9657600c805460ff19166001179055611a58612ba0565b600c805460ff191690556040514281527f1a8a63ae299d647fbdc86e317d4beabeea8bb5c1e1dbe0b157d245c7d8fa81669060200160405180910390a15b505050565b6005546001600160a01b03163314611ac55760405162461bcd60e51b8152600401610ae8906135ae565b620186a0611ad260025490565b611add9060016136d4565b611ae791906136eb565b811015611b545760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610ae8565b6103e8611b6060025490565b611b6b9060016136d4565b611b7591906136eb565b811115611be15760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610ae8565b600b55565b6005546001600160a01b03163314611c105760405162461bcd60e51b8152600401610ae8906135ae565b670de0b6b3a76400006103e8611c2560025490565b611c309060026136d4565b611c3a91906136eb565b611c4491906136eb565b811015611ca65760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e322560b01b6064820152608401610ae8565b611cb881670de0b6b3a76400006136d4565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001610fa7565b6005546001600160a01b03163314611d175760405162461bcd60e51b8152600401610ae8906135ae565b60148490556015839055601682905560178190558082611d37858761370a565b611d41919061370a565b611d4b919061370a565b6013819055600310156110655760405162461bcd60e51b815260206004820152601b60248201527f4d757374206b65657020746178206174203325206f72206c65737300000000006044820152606401610ae8565b6005546001600160a01b03163314611dca5760405162461bcd60e51b8152600401610ae8906135ae565b5f5b82811015611065578160105f868685818110611dea57611dea6135fe565b9050602002016020810190611dff919061347b565b6001600160a01b0316815260208101919091526040015f20805460ff191691151591909117905580611e308161374f565b915050611dcc565b6005546001600160a01b03163314611e625760405162461bcd60e51b8152600401610ae8906135ae565b6001600160a01b038116611ec75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ae8565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611f4c5760405162461bcd60e51b8152600401610ae8906135ae565b6040515f90339047908381818185875af1925050503d805f8114611065576040519150601f19603f3d011682016040523d82523d5f602084013e611065565b6001600160a01b038316611fed5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ae8565b6001600160a01b03821661204e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ae8565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166120d55760405162461bcd60e51b8152600401610ae890613767565b6001600160a01b0382166120fb5760405162461bcd60e51b8152600401610ae8906137ac565b5f811161214a5760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610ae8565b601254600160a81b900460ff166121dd576001600160a01b0383165f9081526021602052604090205460ff168061219857506001600160a01b0382165f9081526021602052604090205460ff165b6121dd5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610ae8565b600f54156122af576001600160a01b0383165f9081526010602052604090205460ff16158061221957506005546001600160a01b038381169116145b8061222e57506001600160a01b03821661dead145b6122af5760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610ae8565b601254600160a01b900460ff1615612597576005546001600160a01b038481169116148015906122ed57506005546001600160a01b03838116911614155b801561230157506001600160a01b03821615155b801561231857506001600160a01b03821661dead14155b801561233c57506001600160a01b0383165f9081526021602052604090205460ff16155b801561236057506001600160a01b0382165f9081526021602052604090205460ff16155b15612597576001600160a01b0383165f9081526023602052604090205460ff1680156123a457506001600160a01b0382165f9081526022602052604090205460ff16155b156124705760065481111561240c5760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610ae8565b600854612418836112a8565b612422908361370a565b111561246b5760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610ae8565b612597565b6001600160a01b0382165f9081526023602052604090205460ff1680156124af57506001600160a01b0383165f9081526022602052604090205460ff16155b156125195760075481111561246b5760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610ae8565b6001600160a01b0382165f9081526022602052604090205460ff1661259757600854612544836112a8565b61254e908361370a565b11156125975760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610ae8565b5f6125a1306112a8565b600b54909150811080159081906125c15750601254600160b01b900460ff165b80156125d05750600c5460ff16155b80156125f457506001600160a01b0385165f9081526023602052604090205460ff16155b801561261857506001600160a01b0385165f9081526021602052604090205460ff16155b801561263c57506001600160a01b0384165f9081526021602052604090205460ff16155b1561266157600c805460ff19166001179055612656612ba0565b600c805460ff191690555b600161266d8686612dd6565b1561267557505f5b5f8115612a5b57600f54431080156126a457506001600160a01b0387165f9081526023602052604090205460ff165b80156126c857506001600160a01b0386165f9081526023602052604090205460ff16155b80156126d557505f601c54115b1561284f576001600160a01b0386165f9081526010602052604090205460ff16612773576001600160a01b0386165f908152601060205260408120805460ff19166001908117909155601180549192909161273190849061370a565b90915550506040516001600160a01b03871681527fa1edd201ce832756d2ae8efcb05004078f6e2cc8c4b651ed49bb8ae50a0b0f239060200160405180910390a15b60646127808660636136d4565b61278a91906136eb565b9050601c54601e548261279d91906136d4565b6127a791906136eb565b60195f8282546127b7919061370a565b9091555050601c54601d546127cc90836136d4565b6127d691906136eb565b60185f8282546127e6919061370a565b9091555050601c54601f546127fb90836136d4565b61280591906136eb565b601a5f828254612815919061370a565b9091555050601c5460205461282a90836136d4565b61283491906136eb565b601b5f828254612844919061370a565b90915550612a3d9050565b6001600160a01b0386165f9081526023602052604090205460ff16801561287757505f601354115b156129365760646013548661288c91906136d4565b61289691906136eb565b9050601354601554826128a991906136d4565b6128b391906136eb565b60195f8282546128c3919061370a565b90915550506013546014546128d890836136d4565b6128e291906136eb565b60185f8282546128f2919061370a565b909155505060135460165461290790836136d4565b61291191906136eb565b601a5f828254612921919061370a565b909155505060135460175461282a90836136d4565b6001600160a01b0387165f9081526023602052604090205460ff16801561295e57505f601c54115b15612a3d576064601c548661297391906136d4565b61297d91906136eb565b9050601c54601e548261299091906136d4565b61299a91906136eb565b60195f8282546129aa919061370a565b9091555050601c54601d546129bf90836136d4565b6129c991906136eb565b60185f8282546129d9919061370a565b9091555050601c54601f546129ee90836136d4565b6129f891906136eb565b601a5f828254612a08919061370a565b9091555050601c54602054612a1d90836136d4565b612a2791906136eb565b601b5f828254612a37919061370a565b90915550505b8015612a4e57612a4e873083612ebf565b612a5881866137ef565b94505b612a66878787612ebf565b50505050505050565b6001600160a01b0382165f908152602360205260409020805460ff19168215151790556116998282613012565b335f90815260216020526040812054819060ff16612b61575f601b54118015612acf5750601b54612acc306112a8565b10155b15612ae057612ae033601b5461306d565b505f601b819055600190612af3306112a8565b90505f601a54601854601954612b09919061370a565b612b13919061370a565b9050811580612b20575080155b15612b30575f9350505050610e9e565b600b54612b3e9060076136d4565b821115612b5657600b54612b539060076136d4565b91505b829350505050610e9e565b8215612b7857612b71858461306d565b505f612b96565b50601280546001600160a01b0319166001600160a01b0385161790555f5b5f612af3306112a8565b5f601b54118015612bbb5750601b54612bb8306112a8565b10155b15612bcc57612bcc30601b5461306d565b5f601b819055612bdb306112a8565b90505f601a54601854601954612bf1919061370a565b612bfb919061370a565b9050811580612c08575080155b15612c11575050565b600b54612c1f9060056136d4565b821115612c3757600b54612c349060056136d4565b91505b5f8060028360195486612c4a91906136d4565b612c5491906136eb565b612c5e91906136eb565b9050612c72612c6d82866137ef565b613195565b601954479081905f90612c87906002906136eb565b612c9190876137ef565b601854612c9e90856136d4565b612ca891906136eb565b90505f6002601954612cba91906136eb565b612cc490886137ef565b601a54612cd190866136d4565b612cdb91906136eb565b9050612ce7818361370a565b612cf190846137ef565b5f60198190556018819055601a819055601b5592508415801590612d1457505f83115b15612d2357612d2385846132e5565b600d546040516001600160a01b039091169082905f81818185875af1925050503d805f8114612d6d576040519150601f19603f3d011682016040523d82523d5f602084013e612d72565b606091505b5050600c5460405191975061010090046001600160a01b03169047905f81818185875af1925050503d805f8114612dc4576040519150601f19603f3d011682016040523d82523d5f602084013e612dc9565b606091505b5050505050505050505050565b6001600160a01b0382165f908152602160205260408120548190819060ff1680612e1757506001600160a01b0384165f9081526021602052604090205460ff165b15612e255760019150612eb7565b6012546001600160a01b031615612eb7576012546040516323b872dd60e01b81526001600160a01b038781166004830152868116602483015260448201849052909116906323b872dd906064016020604051808303815f875af1158015612e8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eb29190613734565b505f91505b509392505050565b6001600160a01b038316612ee55760405162461bcd60e51b8152600401610ae890613767565b6001600160a01b038216612f0b5760405162461bcd60e51b8152600401610ae8906137ac565b6001600160a01b0383165f9081526020819052604090205481811015612f825760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ae8565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290612fb890849061370a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161300491815260200190565b60405180910390a350505050565b6001600160a01b0382165f81815260226020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd67469101610d49565b6001600160a01b0382166130cd5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610ae8565b6001600160a01b0382165f90815260208190526040902054818110156131405760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610ae8565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016120a2565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106131c8576131c86135fe565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561321f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061324391906135e3565b81600181518110613256576132566135fe565b6001600160a01b03928316602091820292909201015260095461327c9130911684611f8b565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac947906132b49085905f90869030904290600401613802565b5f604051808303815f87803b1580156132cb575f80fd5b505af11580156132dd573d5f803e3d5ffd5b505050505050565b6009546132fd9030906001600160a01b031684611f8b565b60095460405163f305d71960e01b8152306004820152602481018490525f60448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613368573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061338d919061383d565b5050505050565b6001600160a01b03811681146133a8575f80fd5b50565b80151581146133a8575f80fd5b5f80604083850312156133c9575f80fd5b82356133d481613394565b915060208301356133e4816133ab565b809150509250929050565b5f602082840312156133ff575f80fd5b5035919050565b5f6020808352835180828501525f5b8181101561343157858101830151858201604001528201613415565b505f604082860101526040601f19601f8301168501019250505092915050565b5f8060408385031215613462575f80fd5b823561346d81613394565b946020939093013593505050565b5f6020828403121561348b575f80fd5b8135610e9e81613394565b5f805f606084860312156134a8575f80fd5b83356134b381613394565b925060208401356134c381613394565b929592945050506040919091013590565b5f805f80608085870312156134e7575f80fd5b5050823594602084013594506040840135936060013592509050565b5f8060408385031215613514575f80fd5b823561351f81613394565b915060208301356133e481613394565b5f805f60408486031215613541575f80fd5b833567ffffffffffffffff80821115613558575f80fd5b818601915086601f83011261356b575f80fd5b813581811115613579575f80fd5b8760208260051b850101111561358d575f80fd5b602092830195509350508401356135a3816133ab565b809150509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f602082840312156135f3575f80fd5b8151610e9e81613394565b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602080850194508084015f5b838110156136495781516001600160a01b031687529582019590820190600101613624565b509495945050505050565b848152608060208201525f61366c6080830186613612565b6001600160a01b03949094166040830152506060015292915050565b600181811c9082168061369c57607f821691505b6020821081036136ba57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610df557610df56136c0565b5f8261370557634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610df557610df56136c0565b5f6020828403121561372d575f80fd5b5051919050565b5f60208284031215613744575f80fd5b8151610e9e816133ab565b5f60018201613760576137606136c0565b5060010190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610df557610df56136c0565b85815284602082015260a060408201525f61382060a0830186613612565b6001600160a01b0394909416606083015250608001529392505050565b5f805f6060848603121561384f575f80fd5b835192506020840151915060408401519050925092509256fea2646970667358221220420d092edff5b264ddb3f22f5eaecb1629dcda5fad5600648b26a558c05f9d7264736f6c63430008140033

Deployed Bytecode Sourcemap

8396:21735:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18133:113;;;;;;;;;;-1:-1:-1;18222:16:0;;18207:12;:31;18133:113;;;179:14:1;;172:22;154:41;;142:2;127:18;18133:113:0;;;;;;;;14340:123;;;;;;;;;;-1:-1:-1;14340:123:0;;;;;:::i;:::-;;:::i;:::-;;29447:681;;;;;;;;;;-1:-1:-1;29447:681:0;;;;;:::i;:::-;;:::i;3968:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4948:194::-;;;;;;;;;;-1:-1:-1;4948:194:0;;;;;:::i;:::-;;:::i;9714:63::-;;;;;;;;;;-1:-1:-1;9714:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;4289:108;;;;;;;;;;-1:-1:-1;4377:12:0;;4289:108;;;2308:25:1;;;2296:2;2281:18;4289:108:0;2162:177:1;9318:33:0;;;;;;;;;;;;;;;;9392:28;;;;;;;;;;;;;;;;9278:33;;;;;;;;;;;;;;;;5150:529;;;;;;;;;;-1:-1:-1;5150:529:0;;;;;:::i;:::-;;:::i;13783:312::-;;;;;;;;;;-1:-1:-1;13783:312:0;;;;;:::i;:::-;;:::i;16856:524::-;;;;;;;;;;-1:-1:-1;16856:524:0;;;;;:::i;:::-;;:::i;4188:93::-;;;;;;;;;;-1:-1:-1;4188:93:0;;4271:2;3337:36:1;;3325:2;3310:18;4188:93:0;3195:184:1;5687:290:0;;;;;;;;;;-1:-1:-1;5687:290:0;;;;;:::i;:::-;;:::i;8581:21::-;;;;;;;;;;-1:-1:-1;8581:21:0;;;;-1:-1:-1;;;;;8581:21:0;;;;;;-1:-1:-1;;;;;3548:32:1;;;3530:51;;3518:2;3503:18;8581:21:0;3384:203:1;8858:46:0;;;;;;;;;;-1:-1:-1;8858:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;27630:471;;;;;;;;;;-1:-1:-1;27630:471:0;;;;;:::i;:::-;;:::i;8471:28::-;;;;;;;;;;;;;;;;9100;;;;;;;;;;;;;;;;8911:25;;;;;;;;;;;;;;;;9060:31;;;;;;;;;;-1:-1:-1;9060:31:0;;;;-1:-1:-1;;;9060:31:0;;;;;;4405:143;;;;;;;;;;-1:-1:-1;4405:143:0;;;;;:::i;:::-;;:::i;3120:150::-;;;;;;;;;;;;;:::i;15941:116::-;;;;;;;;;;;;;:::i;15209:336::-;;;;;;;;;;-1:-1:-1;15209:336:0;;;;;:::i;:::-;;:::i;8738:38::-;;;;;;;;;;;;;;;;9463:30;;;;;;;;;;;;;;;;8979:34;;;;;;;;;;-1:-1:-1;8979:34:0;;;;-1:-1:-1;;;8979:34:0;;;;;;29079:260;;;;;;;;;;-1:-1:-1;29079:260:0;;;;;:::i;:::-;;:::i;8437:27::-;;;;;;;;;;;;;;;;12859:256;;;;;;;;;;;;;:::i;2906:79::-;;;;;;;;;;-1:-1:-1;2971:6:0;;-1:-1:-1;;;;;2971:6:0;2906:79;;9135:31;;;;;;;;;;;;;;;;4076:104;;;;;;;;;;;;;:::i;15553:357::-;;;;;;;;;;-1:-1:-1;15553:357:0;;;;;:::i;:::-;;:::i;9537:24::-;;;;;;;;;;;;;;;;9358:27;;;;;;;;;;;;;;;;9211:25;;;;;;;;;;;;;;;;5985:475;;;;;;;;;;-1:-1:-1;5985:475:0;;;;;:::i;:::-;;:::i;8816:35::-;;;;;;;;;;;;;;;;4556:200;;;;;;;;;;-1:-1:-1;4556:200:0;;;;;:::i;:::-;;:::i;8506:30::-;;;;;;;;;;;;;;;;9243:26;;;;;;;;;;;;;;;;9935:57;;;;;;;;;;-1:-1:-1;9935:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;9020:33;;;;;;;;;;-1:-1:-1;9020:33:0;;;;-1:-1:-1;;;9020:33:0;;;;;;28836:235;;;;;;;;;;-1:-1:-1;28836:235:0;;;;;:::i;:::-;;:::i;17388:170::-;;;;;;;;;;-1:-1:-1;17388:170:0;;;;;:::i;:::-;;:::i;13123:327::-;;;;;;;;;;-1:-1:-1;13123:327:0;;;;;:::i;:::-;;:::i;8545:29::-;;;;;;;;;;-1:-1:-1;8545:29:0;;;;-1:-1:-1;;;;;8545:29:0;;;28109:464;;;;;;;;;;-1:-1:-1;28109:464:0;;;;;:::i;:::-;;:::i;14533:428::-;;;;;;;;;;-1:-1:-1;14533:428:0;;;;;:::i;:::-;;:::i;9429:27::-;;;;;;;;;;;;;;;;13458:317;;;;;;;;;;-1:-1:-1;13458:317:0;;;;;:::i;:::-;;:::i;4764:176::-;;;;;;;;;;-1:-1:-1;4764:176:0;;;;;:::i;:::-;-1:-1:-1;;;;;4905:18:0;;;4878:7;4905:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4764:176;8611:33;;;;;;;;;;;;;;;;9568:25;;;;;;;;;;;;;;;;16313:535;;;;;;;;;;-1:-1:-1;16313:535:0;;;;;:::i;:::-;;:::i;14103:229::-;;;;;;;;;;-1:-1:-1;14103:229:0;;;;;:::i;:::-;;:::i;9500:30::-;;;;;;;;;;;;;;;;3278:281;;;;;;;;;;-1:-1:-1;3278:281:0;;;;;:::i;:::-;;:::i;28643:185::-;;;;;;;;;;;;;:::i;9173:31::-;;;;;;;;;;;;;;;;14340:123;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;14428:20:0;;;::::1;;::::0;;;:14:::1;:20;::::0;;;;:27;;-1:-1:-1;;14428:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;14340:123::o;29447:681::-;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;29560:7:::1;29545:11;:22;;29523:142;;;::::0;-1:-1:-1;;;29523:142:0;;5529:2:1;29523:142:0::1;::::0;::::1;5511:21:1::0;5568:2;5548:18;;;5541:30;5607:34;5587:18;;;5580:62;5678:34;5658:18;;;5651:62;-1:-1:-1;;;5729:19:1;;;5722:37;5776:19;;29523:142:0::1;5327:474:1::0;29523:142:0::1;29702:16;::::0;;29716:1:::1;29702:16:::0;;;;;::::1;::::0;;29678:21:::1;::::0;29702:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;29739:11:0::1;::::0;:18:::1;::::0;;-1:-1:-1;;;29739:18:0;;;;29678:40;;-1:-1:-1;;;;;;29739:11:0;;::::1;::::0;:16:::1;::::0;-1:-1:-1;29739:18:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:11;:18:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29729:4;29734:1;29729:7;;;;;;;;:::i;:::-;;;;;;:28;-1:-1:-1::0;;;;;29729:28:0::1;;;-1:-1:-1::0;;;;;29729:28:0::1;;;::::0;::::1;29786:4;29768;29773:1;29768:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29768:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;29830:11:::1;::::0;:245:::1;::::0;-1:-1:-1;;;29830:245:0;;:11;::::1;::::0;:62:::1;::::0;29914:11;;29830:245:::1;::::0;:11:::1;::::0;30000:4;;30027:6:::1;::::0;30049:15:::1;::::0;29830:245:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;30091:29;30108:11;30091:29;;;;2308:25:1::0;;2296:2;2281:18;;2162:177;30091:29:0::1;;;;;;;;29512:616;29447:681:::0;:::o;3968:100::-;4022:13;4055:5;4048:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3968:100;:::o;4948:194::-;5056:4;5073:39;2294:10;5096:7;5105:6;5073:8;:39::i;:::-;-1:-1:-1;5130:4:0;4948:194;;;;;:::o;5150:529::-;5290:4;5307:36;5317:6;5325:9;5336:6;5307:9;:36::i;:::-;-1:-1:-1;;;;;5383:19:0;;5356:24;5383:19;;;:11;:19;;;;;;;;2294:10;5383:33;;;;;;;;5449:26;;;;5427:116;;;;-1:-1:-1;;;5427:116:0;;7894:2:1;5427:116:0;;;7876:21:1;7933:2;7913:18;;;7906:30;7972:34;7952:18;;;7945:62;-1:-1:-1;;;8023:18:1;;;8016:38;8071:19;;5427:116:0;7692:404:1;5427:116:0;5579:57;5588:6;2294:10;5629:6;5610:16;:25;5579:8;:57::i;:::-;5667:4;5660:11;;;5150:529;;;;;;:::o;13783:312::-;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;13920:4:::1;13912;13891:13;4377:12:::0;;;4289:108;13891:13:::1;:17;::::0;13907:1:::1;13891:17;:::i;:::-;13890:26;;;;:::i;:::-;13889:35;;;;:::i;:::-;13879:6;:45;;13857:136;;;::::0;-1:-1:-1;;;13857:136:0;;8830:2:1;13857:136:0::1;::::0;::::1;8812:21:1::0;8869:2;8849:18;;;8842:30;8908:34;8888:18;;;8881:62;-1:-1:-1;;;8959:18:1;;;8952:39;9008:19;;13857:136:0::1;8628:405:1::0;13857:136:0::1;14019:19;:6:::0;14029:8:::1;14019:19;:::i;:::-;14004:12;:34:::0;;;14054:33:::1;::::0;2308:25:1;;;14054:33:0::1;::::0;2296:2:1;2281:18;14054:33:0::1;;;;;;;;13783:312:::0;:::o;16856:524::-;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;17033:15:::1;:31:::0;;;17075:15:::1;:31:::0;;;17117:9:::1;:19:::0;;;17147:10:::1;:21:::0;;;17160:8;17129:7;17207:46:::1;17093:13:::0;17051;17207:46:::1;:::i;:::-;:71;;;;:::i;:::-;:97;;;;:::i;:::-;17179:12;:125:::0;;;17339:1:::1;-1:-1:-1::0;17323:17:0::1;17315:57;;;::::0;-1:-1:-1;;;17315:57:0;;9370:2:1;17315:57:0::1;::::0;::::1;9352:21:1::0;9409:2;9389:18;;;9382:30;9448:29;9428:18;;;9421:57;9495:18;;17315:57:0::1;9168:351:1::0;17315:57:0::1;16856:524:::0;;;;:::o;5687:290::-;2294:10;5800:4;5889:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;5889:34:0;;;;;;;;;;5800:4;;5817:130;;5867:7;;5889:47;;5926:10;;5889:47;:::i;:::-;5817:8;:130::i;27630:471::-;3033:6;;27735:10;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;27784:4:::1;-1:-1:-1::0;;;;;27766:23:0;::::1;::::0;27758:61:::1;;;::::0;-1:-1:-1;;;27758:61:0;;9726:2:1;27758:61:0::1;::::0;::::1;9708:21:1::0;9765:2;9745:18;;;9738:30;9804:27;9784:18;;;9777:55;9849:18;;27758:61:0::1;9524:349:1::0;27758:61:0::1;-1:-1:-1::0;;;;;27838:20:0;::::1;27830:59;;;::::0;-1:-1:-1;;;27830:59:0;;10080:2:1;27830:59:0::1;::::0;::::1;10062:21:1::0;10119:2;10099:18;;;10092:30;10158:28;10138:18;;;10131:56;10204:18;;27830:59:0::1;9878:350:1::0;27830:59:0::1;27927:39;::::0;-1:-1:-1;;;27927:39:0;;27960:4:::1;27927:39;::::0;::::1;3530:51:1::0;27900:24:0::1;::::0;-1:-1:-1;;;;;27927:24:0;::::1;::::0;::::1;::::0;3503:18:1;;27927:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27985:46;::::0;-1:-1:-1;;;27985:46:0;;-1:-1:-1;;;;;10614:32:1;;;27985:46:0::1;::::0;::::1;10596:51:1::0;10663:18;;;10656:34;;;27900:66:0;;-1:-1:-1;27985:23:0;;::::1;::::0;::::1;::::0;10569:18:1;;27985:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28047;::::0;;-1:-1:-1;;;;;10614:32:1;;10596:51;;10678:2;10663:18;;10656:34;;;27977:54:0;;-1:-1:-1;28047:46:0::1;::::0;10569:18:1;28047:46:0::1;;;;;;;27747:354;27630:471:::0;;;;:::o;4405:143::-;-1:-1:-1;;;;;4522:18:0;4495:7;4522:18;;;;;;;;;;;;4405:143::o;3120:150::-;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;3213:6:::1;::::0;3192:40:::1;::::0;3229:1:::1;::::0;-1:-1:-1;;;;;3213:6:0::1;::::0;3192:40:::1;::::0;3229:1;;3192:40:::1;3243:6;:19:::0;;-1:-1:-1;;;;;;3243:19:0::1;::::0;;3120:150::o;15941:116::-;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;15995:15:::1;:23:::0;;-1:-1:-1;;;;15995:23:0::1;::::0;;16034:15:::1;::::0;::::1;::::0;16013:5:::1;::::0;16034:15:::1;15941:116::o:0;15209:336::-;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;15331:4:::1;15326:155;;15388:6;::::0;-1:-1:-1;;;;;15388:6:0;;::::1;15378:16:::0;;::::1;::::0;15352:117:::1;;;::::0;-1:-1:-1;;;15352:117:0;;11153:2:1;15352:117:0::1;::::0;::::1;11135:21:1::0;11192:2;11172:18;;;11165:30;11231:34;11211:18;;;11204:62;-1:-1:-1;;;11282:18:1;;;11275:37;11329:19;;15352:117:0::1;10951:403:1::0;15352:117:0::1;-1:-1:-1::0;;;;;15491:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;15491:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;15209:336::o;29079:260::-;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29183:30:0;::::1;29161:116;;;::::0;-1:-1:-1;;;29161:116:0;;11561:2:1;29161:116:0::1;::::0;::::1;11543:21:1::0;11600:2;11580:18;;;11573:30;11639:34;11619:18;;;11612:62;-1:-1:-1;;;11690:18:1;;;11683:34;11734:19;;29161:116:0::1;11359:400:1::0;29161:116:0::1;29288:15;:43:::0;;-1:-1:-1;;;;;;29288:43:0::1;-1:-1:-1::0;;;;;29288:43:0;;;::::1;::::0;;;::::1;::::0;;29079:260::o;12859:256::-;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;12929:13:::1;::::0;-1:-1:-1;;;12929:13:0;::::1;;;12928:14;12920:50;;;::::0;-1:-1:-1;;;12920:50:0;;11966:2:1;12920:50:0::1;::::0;::::1;11948:21:1::0;12005:2;11985:18;;;11978:30;12044:25;12024:18;;;12017:53;12087:18;;12920:50:0::1;11764:347:1::0;12920:50:0::1;12981:13;:20:::0;;-1:-1:-1;;;;13012:18:0;-1:-1:-1;;;13012:18:0;;;13063:12:::1;13041:19;:34:::0;13091:16:::1;::::0;::::1;::::0;-1:-1:-1;;13091:16:0::1;12859:256::o:0;4076:104::-;4132:13;4165:7;4158:14;;;;;:::i;15553:357::-;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;15701:6:::1;::::0;-1:-1:-1;;;;;15701:6:0;;::::1;15693:14:::0;;::::1;::::0;15671:121:::1;;;::::0;-1:-1:-1;;;15671:121:0;;12318:2:1;15671:121:0::1;::::0;::::1;12300:21:1::0;12357:2;12337:18;;;12330:30;12396:34;12376:18;;;12369:62;12467:27;12447:18;;;12440:55;12512:19;;15671:121:0::1;12116:421:1::0;15671:121:0::1;15805:41;15834:4;15840:5;15805:28;:41::i;:::-;15862:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;15862:40:0;::::1;::::0;::::1;::::0;;;::::1;15553:357:::0;;:::o;5985:475::-;2294:10;6103:4;6147:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6147:34:0;;;;;;;;;;6214:35;;;;6192:122;;;;-1:-1:-1;;;6192:122:0;;12744:2:1;6192:122:0;;;12726:21:1;12783:2;12763:18;;;12756:30;12822:34;12802:18;;;12795:62;-1:-1:-1;;;12873:18:1;;;12866:35;12918:19;;6192:122:0;12542:401:1;6192:122:0;6350:67;2294:10;6373:7;6401:15;6382:16;:34;6350:8;:67::i;:::-;-1:-1:-1;6448:4:0;;5985:475;-1:-1:-1;;;5985:475:0:o;4556:200::-;4667:4;4684:42;2294:10;4708:9;4719:6;4684:9;:42::i;28836:235::-;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28935:25:0;::::1;28913:106;;;::::0;-1:-1:-1;;;28913:106:0;;13150:2:1;28913:106:0::1;::::0;::::1;13132:21:1::0;13189:2;13169:18;;;13162:30;13228:33;13208:18;;;13201:61;13279:18;;28913:106:0::1;12948:355:1::0;28913:106:0::1;29030:10;:33:::0;;-1:-1:-1;;;;;29030:33:0;;::::1;;;-1:-1:-1::0;;;;;;29030:33:0;;::::1;::::0;;;::::1;::::0;;28836:235::o;17388:170::-;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17469:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:35;;-1:-1:-1;;17469:35:0::1;::::0;::::1;;::::0;;::::1;::::0;;;17520:30;;154:41:1;;;17520:30:0::1;::::0;127:18:1;17520:30:0::1;;;;;;;17388:170:::0;;:::o;13123:327::-;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;13263:4:::1;13255;13234:13;4377:12:::0;;;4289:108;13234:13:::1;:17;::::0;13250:1:::1;13234:17;:::i;:::-;13233:26;;;;:::i;:::-;13232:35;;;;:::i;:::-;13222:6;:45;;13200:139;;;::::0;-1:-1:-1;;;13200:139:0;;13510:2:1;13200:139:0::1;::::0;::::1;13492:21:1::0;13549:2;13529:18;;;13522:30;13588:34;13568:18;;;13561:62;-1:-1:-1;;;13639:18:1;;;13632:42;13691:19;;13200:139:0::1;13308:408:1::0;13200:139:0::1;13368:19;:6:::0;13378:8:::1;13368:19;:::i;:::-;13350:15;:37:::0;;;13403:39:::1;::::0;2308:25:1;;;13403:39:0::1;::::0;2296:2:1;2281:18;13403:39:0::1;2162:177:1::0;28109:464:0;28252:18;;28224:24;28242:4;28224:9;:24::i;:::-;:46;;28202:160;;;;;-1:-1:-1;;;28202:160:0;;13923:2:1;28202:160:0;;;13905:21:1;13942:18;;;13935:30;;;;14001:34;13981:18;;;13974:62;14072:34;14052:18;;;14045:62;14124:19;;28202:160:0;13721:428:1;28202:160:0;28377:37;28391:8;28401:4;28407:6;28377:13;:37::i;:::-;28373:193;;;28431:8;:15;;-1:-1:-1;;28431:15:0;28442:4;28431:15;;;28461:10;:8;:10::i;:::-;28486:8;:16;;-1:-1:-1;;28486:16:0;;;28522:32;;28538:15;2308:25:1;;28522:32:0;;2296:2:1;2281:18;28522:32:0;;;;;;;28373:193;28109:464;;;:::o;14533:428::-;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;14673:6:::1;14652:13;4377:12:::0;;;4289:108;14652:13:::1;:17;::::0;14668:1:::1;14652:17;:::i;:::-;14651:28;;;;:::i;:::-;14638:9;:41;;14616:144;;;::::0;-1:-1:-1;;;14616:144:0;;14356:2:1;14616:144:0::1;::::0;::::1;14338:21:1::0;14395:2;14375:18;;;14368:30;14434:34;14414:18;;;14407:62;-1:-1:-1;;;14485:18:1;;;14478:51;14546:19;;14616:144:0::1;14154:417:1::0;14616:144:0::1;14828:4;14807:13;4377:12:::0;;;4289:108;14807:13:::1;:17;::::0;14823:1:::1;14807:17;:::i;:::-;14806:26;;;;:::i;:::-;14793:9;:39;;14771:141;;;::::0;-1:-1:-1;;;14771:141:0;;14778:2:1;14771:141:0::1;::::0;::::1;14760:21:1::0;14817:2;14797:18;;;14790:30;14856:34;14836:18;;;14829:62;-1:-1:-1;;;14907:18:1;;;14900:50;14967:19;;14771:141:0::1;14576:416:1::0;14771:141:0::1;14923:18;:30:::0;14533:428::o;13458:317::-;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;13596:4:::1;13588;13567:13;4377:12:::0;;;4289:108;13567:13:::1;:17;::::0;13583:1:::1;13567:17;:::i;:::-;13566:26;;;;:::i;:::-;13565:35;;;;:::i;:::-;13555:6;:45;;13533:137;;;::::0;-1:-1:-1;;;13533:137:0;;15199:2:1;13533:137:0::1;::::0;::::1;15181:21:1::0;15238:2;15218:18;;;15211:30;15277:34;15257:18;;;15250:62;-1:-1:-1;;;15328:18:1;;;15321:40;15378:19;;13533:137:0::1;14997:406:1::0;13533:137:0::1;13697:19;:6:::0;13707:8:::1;13697:19;:::i;:::-;13681:13;:35:::0;;;13732::::1;::::0;2308:25:1;;;13732:35:0::1;::::0;2296:2:1;2281:18;13732:35:0::1;2162:177:1::0;16313:535:0;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;16491:16:::1;:32:::0;;;16534:16:::1;:32:::0;;;16577:10:::1;:20:::0;;;16608:11:::1;:22:::0;;;16622:8;16590:7;16670:48:::1;16553:13:::0;16510;16670:48:::1;:::i;:::-;:74;;;;:::i;:::-;:101;;;;:::i;:::-;16641:13;:130:::0;;;16807:1:::1;-1:-1:-1::0;16790:18:0::1;16782:58;;;::::0;-1:-1:-1;;;16782:58:0;;9370:2:1;16782:58:0::1;::::0;::::1;9352:21:1::0;9409:2;9389:18;;;9382:30;9448:29;9428:18;;;9421:57;9495:18;;16782:58:0::1;9168:351:1::0;14103:229:0;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;14225:9:::1;14220:105;14240:18:::0;;::::1;14220:105;;;14309:4;14280:14;:26;14295:7;;14303:1;14295:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;14280:26:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;14280:26:0;:33;;-1:-1:-1;;14280:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;14260:3;::::1;::::0;::::1;:::i;:::-;;;;14220:105;;3278:281:::0;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3381:22:0;::::1;3359:110;;;::::0;-1:-1:-1;;;3359:110:0;;15750:2:1;3359:110:0::1;::::0;::::1;15732:21:1::0;15789:2;15769:18;;;15762:30;15828:34;15808:18;;;15801:62;-1:-1:-1;;;15879:18:1;;;15872:36;15925:19;;3359:110:0::1;15548:402:1::0;3359:110:0::1;3506:6;::::0;3485:38:::1;::::0;-1:-1:-1;;;;;3485:38:0;;::::1;::::0;3506:6:::1;::::0;3485:38:::1;::::0;3506:6:::1;::::0;3485:38:::1;3534:6;:17:::0;;-1:-1:-1;;;;;;3534:17:0::1;-1:-1:-1::0;;;;;3534:17:0;;;::::1;::::0;;;::::1;::::0;;3278:281::o;28643:185::-;3033:6;;-1:-1:-1;;;;;3033:6:0;2294:10;3033:22;3025:67;;;;-1:-1:-1;;;3025:67:0;;;;;;;:::i;:::-;28738:82:::1;::::0;28701:12:::1;::::0;28746:10:::1;::::0;28770:21:::1;::::0;28701:12;28738:82;28701:12;28738:82;28770:21;28746:10;28738:82:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8009:380:::0;-1:-1:-1;;;;;8145:19:0;;8137:68;;;;-1:-1:-1;;;8137:68:0;;16367:2:1;8137:68:0;;;16349:21:1;16406:2;16386:18;;;16379:30;16445:34;16425:18;;;16418:62;-1:-1:-1;;;16496:18:1;;;16489:34;16540:19;;8137:68:0;16165:400:1;8137:68:0;-1:-1:-1;;;;;8224:21:0;;8216:68;;;;-1:-1:-1;;;8216:68:0;;16772:2:1;8216:68:0;;;16754:21:1;16811:2;16791:18;;;16784:30;16850:34;16830:18;;;16823:62;-1:-1:-1;;;16901:18:1;;;16894:32;16943:19;;8216:68:0;16570:398:1;8216:68:0;-1:-1:-1;;;;;8297:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;8349:32;;2308:25:1;;;8349:32:0;;2281:18:1;8349:32:0;;;;;;;;8009:380;;;:::o;18254:5069::-;-1:-1:-1;;;;;18386:18:0;;18378:68;;;;-1:-1:-1;;;18378:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18465:16:0;;18457:64;;;;-1:-1:-1;;;18457:64:0;;;;;;;:::i;:::-;18549:1;18540:6;:10;18532:52;;;;-1:-1:-1;;;18532:52:0;;17985:2:1;18532:52:0;;;17967:21:1;18024:2;18004:18;;;17997:30;18063:31;18043:18;;;18036:59;18112:18;;18532:52:0;17783:353:1;18532:52:0;18602:13;;-1:-1:-1;;;18602:13:0;;;;18597:183;;-1:-1:-1;;;;;18658:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;18687:23:0;;;;;;:19;:23;;;;;;;;18658:52;18632:136;;;;-1:-1:-1;;;18632:136:0;;18343:2:1;18632:136:0;;;18325:21:1;18382:2;18362:18;;;18355:30;-1:-1:-1;;;18401:18:1;;;18394:52;18463:18;;18632:136:0;18141:346:1;18632:136:0;18796:16;;:20;18792:248;;-1:-1:-1;;;;;18860:20:0;;;;;;:14;:20;;;;;;;;18859:21;;:38;;-1:-1:-1;2971:6:0;;-1:-1:-1;;;;;18884:13:0;;;2971:6;;18884:13;18859:38;:63;;;-1:-1:-1;;;;;;18901:21:0;;18915:6;18901:21;18859:63;18833:195;;;;-1:-1:-1;;;18833:195:0;;18694:2:1;18833:195:0;;;18676:21:1;18733:2;18713:18;;;18706:30;18772:34;18752:18;;;18745:62;18843:34;18823:18;;;18816:62;-1:-1:-1;;;18894:19:1;;;18887:37;18941:19;;18833:195:0;18492:474:1;18833:195:0;19056:15;;-1:-1:-1;;;19056:15:0;;;;19052:1496;;;2971:6;;-1:-1:-1;;;;;19110:15:0;;;2971:6;;19110:15;;;;:49;;-1:-1:-1;2971:6:0;;-1:-1:-1;;;;;19146:13:0;;;2971:6;;19146:13;;19110:49;:86;;;;-1:-1:-1;;;;;;19180:16:0;;;;19110:86;:128;;;;-1:-1:-1;;;;;;19217:21:0;;19231:6;19217:21;;19110:128;:175;;;;-1:-1:-1;;;;;;19260:25:0;;;;;;:19;:25;;;;;;;;19259:26;19110:175;:220;;;;-1:-1:-1;;;;;;19307:23:0;;;;;;:19;:23;;;;;;;;19306:24;19110:220;19088:1449;;;-1:-1:-1;;;;;19419:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;19476:35:0;;;;;;:31;:35;;;;;;;;19475:36;19419:92;19393:1129;;;19598:12;;19588:6;:22;;19554:148;;;;-1:-1:-1;;;19554:148:0;;19173:2:1;19554:148:0;;;19155:21:1;19212:2;19192:18;;;19185:30;19251:34;19231:18;;;19224:62;-1:-1:-1;;;19302:18:1;;;19295:38;19350:19;;19554:148:0;18971:404:1;19554:148:0;19785:15;;19768:13;19778:2;19768:9;:13::i;:::-;19759:22;;:6;:22;:::i;:::-;:41;;19725:151;;;;-1:-1:-1;;;19725:151:0;;19582:2:1;19725:151:0;;;19564:21:1;19621:2;19601:18;;;19594:30;-1:-1:-1;;;19640:18:1;;;19633:54;19704:18;;19725:151:0;19380:348:1;19725:151:0;19393:1129;;;-1:-1:-1;;;;;19974:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;20029:37:0;;;;;;:31;:37;;;;;;;;20028:38;19974:92;19948:574;;;20153:13;;20143:6;:23;;20109:151;;;;-1:-1:-1;;;20109:151:0;;19935:2:1;20109:151:0;;;19917:21:1;19974:2;19954:18;;;19947:30;20013:34;19993:18;;;19986:62;-1:-1:-1;;;20064:18:1;;;20057:40;20114:19;;20109:151:0;19733:406:1;19948:574:0;-1:-1:-1;;;;;20291:35:0;;;;;;:31;:35;;;;;;;;20286:236;;20411:15;;20394:13;20404:2;20394:9;:13::i;:::-;20385:22;;:6;:22;:::i;:::-;:41;;20351:151;;;;-1:-1:-1;;;20351:151:0;;19582:2:1;20351:151:0;;;19564:21:1;19621:2;19601:18;;;19594:30;-1:-1:-1;;;19640:18:1;;;19633:54;19704:18;;20351:151:0;19380:348:1;20351:151:0;20560:28;20591:24;20609:4;20591:9;:24::i;:::-;20667:18;;20560:55;;-1:-1:-1;20643:42:0;;;;;;;20716:35;;-1:-1:-1;20740:11:0;;-1:-1:-1;;;20740:11:0;;;;20716:35;:61;;;;-1:-1:-1;20769:8:0;;;;20768:9;20716:61;:110;;;;-1:-1:-1;;;;;;20795:31:0;;;;;;:25;:31;;;;;;;;20794:32;20716:110;:153;;;;-1:-1:-1;;;;;;20844:25:0;;;;;;:19;:25;;;;;;;;20843:26;20716:153;:194;;;;-1:-1:-1;;;;;;20887:23:0;;;;;;:19;:23;;;;;;;;20886:24;20716:194;20698:326;;;20937:8;:15;;-1:-1:-1;;20937:15:0;20948:4;20937:15;;;20969:10;:8;:10::i;:::-;20996:8;:16;;-1:-1:-1;;20996:16:0;;;20698:326;21051:4;21155:31;21177:4;21183:2;21155:21;:31::i;:::-;21151:79;;;-1:-1:-1;21213:5:0;21151:79;21250:12;21355:7;21351:1913;;;18222:16;;18207:12;:31;21437:71;;;;-1:-1:-1;;;;;;21477:31:0;;;;;;:25;:31;;;;;;;;21437:71;:122;;;;-1:-1:-1;;;;;;21530:29:0;;;;;;:25;:29;;;;;;;;21529:30;21437:122;:159;;;;;21595:1;21580:12;;:16;21437:159;21415:1700;;;-1:-1:-1;;;;;21636:18:0;;;;;;:14;:18;;;;;;;;21631:179;;-1:-1:-1;;;;;21679:18:0;;;;;;:14;:18;;;;;:25;;-1:-1:-1;;21679:25:0;21700:4;21679:25;;;;;;21727:10;:15;;21700:4;;21727:10;;:15;;21700:4;;21727:15;:::i;:::-;;;;-1:-1:-1;;21770:20:0;;-1:-1:-1;;;;;3548:32:1;;3530:51;;21770:20:0;;3518:2:1;3503:18;21770:20:0;;;;;;;21631:179;21853:3;21838:11;:6;21847:2;21838:11;:::i;:::-;21837:19;;;;:::i;:::-;21830:26;;21924:12;;21905:15;;21898:4;:22;;;;:::i;:::-;21897:39;;;;:::i;:::-;21875:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;22004:12:0;;21985:15;;21978:22;;:4;:22;:::i;:::-;21977:39;;;;:::i;:::-;21955:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;22072:12:0;;22059:9;;22052:16;;:4;:16;:::i;:::-;22051:33;;;;:::i;:::-;22035:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;22142:12:0;;22128:10;;22121:17;;:4;:17;:::i;:::-;22120:34;;;;:::i;:::-;22103:13;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;21415:1700:0;;-1:-1:-1;21415:1700:0;;-1:-1:-1;;;;;22217:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;22266:1;22250:13;;:17;22217:50;22213:902;;;22322:3;22305:13;;22296:6;:22;;;;:::i;:::-;22295:30;;;;:::i;:::-;22288:37;;22394:13;;22374:16;;22367:4;:23;;;;:::i;:::-;22366:41;;;;:::i;:::-;22344:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;22476:13:0;;22456:16;;22449:23;;:4;:23;:::i;:::-;22448:41;;;;:::i;:::-;22426:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;22546:13:0;;22532:10;;22525:17;;:4;:17;:::i;:::-;22524:35;;;;:::i;:::-;22508:12;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;22618:13:0;;22603:11;;22596:18;;:4;:18;:::i;22213:902::-;-1:-1:-1;;;;;22693:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;22743:1;22728:12;;:16;22693:51;22689:426;;;22798:3;22782:12;;22773:6;:21;;;;:::i;:::-;22772:29;;;;:::i;:::-;22765:36;;22869:12;;22850:15;;22843:4;:22;;;;:::i;:::-;22842:39;;;;:::i;:::-;22820:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;22949:12:0;;22930:15;;22923:22;;:4;:22;:::i;:::-;22922:39;;;;:::i;:::-;22900:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;23017:12:0;;23004:9;;22997:16;;:4;:16;:::i;:::-;22996:33;;;;:::i;:::-;22980:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;23087:12:0;;23073:10;;23066:17;;:4;:17;:::i;:::-;23065:34;;;;:::i;:::-;23048:13;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;22689:426:0;23135:8;;23131:91;;23164:42;23180:4;23194;23201;23164:15;:42::i;:::-;23238:14;23248:4;23238:14;;:::i;:::-;;;21351:1913;23282:33;23298:4;23304:2;23308:6;23282:15;:33::i;:::-;18367:4956;;;;18254:5069;;;:::o;16065:240::-;-1:-1:-1;;;;;16148:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;16148:39:0;;;;;;;16200;16148:31;:39;16200:26;:39::i;24308:1603::-;24462:10;24397:4;24442:31;;;:19;:31;;;;;;24397:4;;24442:31;;24437:1467;;24528:1;24512:13;;:17;:62;;;;;24561:13;;24533:24;24551:4;24533:9;:24::i;:::-;:41;;24512:62;24490:167;;;24609:32;24615:10;24627:13;;24609:5;:32::i;:::-;-1:-1:-1;24687:1:0;24671:13;:17;;;24713:4;;24758:24;24776:4;24758:9;:24::i;:::-;24732:50;;24797:25;24901:12;;24863:18;;24825;;:56;;;;:::i;:::-;:88;;;;:::i;:::-;24797:116;-1:-1:-1;24934:20:0;;;:46;;-1:-1:-1;24958:22:0;;24934:46;24930:99;;;25008:5;25001:12;;;;;;;24930:99;25067:18;;:22;;25088:1;25067:22;:::i;:::-;25049:15;:40;25045:121;;;25128:18;;:22;;25149:1;25128:22;:::i;:::-;25110:40;;25045:121;25189:7;25182:14;;;;;;;24437:1467;25233:11;;25229:204;;25265:23;25271:7;25280;25265:5;:23::i;:::-;-1:-1:-1;25317:5:0;25229:204;;;-1:-1:-1;25363:13:0;:20;;-1:-1:-1;;;;;;25363:20:0;-1:-1:-1;;;;;25363:20:0;;;;;-1:-1:-1;25229:204:0;25447:23;25473:24;25491:4;25473:9;:24::i;25919:1703::-;25978:1;25962:13;;:17;:62;;;;;26011:13;;25983:24;26001:4;25983:9;:24::i;:::-;:41;;25962:62;25958:130;;;26041:35;26055:4;26062:13;;26041:5;:35::i;:::-;26114:1;26098:13;:17;;;26154:24;26172:4;26154:9;:24::i;:::-;26128:50;;26189:25;26285:12;;26251:18;;26217;;:52;;;;:::i;:::-;:80;;;;:::i;:::-;26189:108;-1:-1:-1;26314:20:0;;;:46;;-1:-1:-1;26338:22:0;;26314:46;26310:85;;;26377:7;;25919:1703::o;26310:85::-;26429:18;;:22;;26450:1;26429:22;:::i;:::-;26411:15;:40;26407:113;;;26486:18;;:22;;26507:1;26486:22;:::i;:::-;26468:40;;26407:113;26532:12;26606:23;26719:1;26686:17;26651:18;;26633:15;:36;;;;:::i;:::-;26632:71;;;;:::i;:::-;:88;;;;:::i;:::-;26606:114;-1:-1:-1;26733:51:0;26750:33;26606:114;26750:15;:33;:::i;:::-;26733:16;:51::i;:::-;26996:18;;26818:21;;;;26797:18;;26996:22;;27017:1;;26996:22;:::i;:::-;26975:44;;:17;:44;:::i;:::-;26939:18;;26926:31;;:10;:31;:::i;:::-;26925:95;;;;:::i;:::-;26899:121;;27031:16;27136:1;27115:18;;:22;;;;:::i;:::-;27094:44;;:17;:44;:::i;:::-;27064:12;;27051:25;;:10;:25;:::i;:::-;27050:89;;;;:::i;:::-;27031:108;-1:-1:-1;27171:26:0;27031:108;27171:15;:26;:::i;:::-;27152:45;;;;:::i;:::-;27231:1;27210:18;:22;;;27243:18;:22;;;27276:12;:16;;;27303:13;:17;27152:45;-1:-1:-1;27337:19:0;;;;;:42;;;27378:1;27360:15;:19;27337:42;27333:121;;;27396:46;27409:15;27426;27396:12;:46::i;:::-;27488:15;;27480:50;;-1:-1:-1;;;;;27488:15:0;;;;27517:8;;27480:50;;;;27517:8;27488:15;27480:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27563:10:0;;27555:59;;27466:64;;-1:-1:-1;27563:10:0;;;-1:-1:-1;;;;;27563:10:0;;27588:21;;27555:59;;;;27588:21;27563:10;27555:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25919:1703:0:o;23331:448::-;-1:-1:-1;;;;;23503:25:0;;23431:4;23503:25;;;:19;:25;;;;;;23431:4;;;;23503:25;;;:52;;-1:-1:-1;;;;;;23532:23:0;;;;;;:19;:23;;;;;;;;23503:52;23499:247;;;23583:4;23572:15;;23499:247;;;23609:13;;-1:-1:-1;;;;;23609:13:0;:27;23605:141;;23660:13;;23653:50;;-1:-1:-1;;;23653:50:0;;-1:-1:-1;;;;;20535:15:1;;;23653:50:0;;;20517:34:1;20587:15;;;20567:18;;;20560:43;20619:18;;;20612:34;;;23660:13:0;;;;23653:34;;20452:18:1;;23653:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23729:5;23718:16;;23605:141;-1:-1:-1;23763:8:0;23331:448;-1:-1:-1;;;23331:448:0:o;6468:651::-;-1:-1:-1;;;;;6608:20:0;;6600:70;;;;-1:-1:-1;;;6600:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6689:23:0;;6681:71;;;;-1:-1:-1;;;6681:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6789:17:0;;6765:21;6789:17;;;;;;;;;;;6839:23;;;;6817:111;;;;-1:-1:-1;;;6817:111:0;;20859:2:1;6817:111:0;;;20841:21:1;20898:2;20878:18;;;20871:30;20937:34;20917:18;;;20910:62;-1:-1:-1;;;20988:18:1;;;20981:36;21034:19;;6817:111:0;20657:402:1;6817:111:0;-1:-1:-1;;;;;6964:17:0;;;:9;:17;;;;;;;;;;;6984:22;;;6964:42;;7028:20;;;;;;;;:30;;7000:6;;6964:9;7028:30;;7000:6;;7028:30;:::i;:::-;;;;;;;;7093:9;-1:-1:-1;;;;;7076:35:0;7085:6;-1:-1:-1;;;;;7076:35:0;;7104:6;7076:35;;;;2308:25:1;;2296:2;2281:18;;2162:177;7076:35:0;;;;;;;;6589:530;6468:651;;;:::o;14969:232::-;-1:-1:-1;;;;;15082:39:0;;;;;;:31;:39;;;;;;;;;:52;;-1:-1:-1;;15082:52:0;;;;;;;;;;15150:43;;21232:51:1;;;21299:18;;;21292:50;15150:43:0;;21205:18:1;15150:43:0;21064:284:1;7451:550:0;-1:-1:-1;;;;;7535:21:0;;7527:67;;;;-1:-1:-1;;;7527:67:0;;21555:2:1;7527:67:0;;;21537:21:1;21594:2;21574:18;;;21567:30;21633:34;21613:18;;;21606:62;-1:-1:-1;;;21684:18:1;;;21677:31;21725:19;;7527:67:0;21353:397:1;7527:67:0;-1:-1:-1;;;;;7630:18:0;;7605:22;7630:18;;;;;;;;;;;7667:24;;;;7659:71;;;;-1:-1:-1;;;7659:71:0;;21957:2:1;7659:71:0;;;21939:21:1;21996:2;21976:18;;;21969:30;22035:34;22015:18;;;22008:62;-1:-1:-1;;;22086:18:1;;;22079:32;22128:19;;7659:71:0;21755:398:1;7659:71:0;-1:-1:-1;;;;;7766:18:0;;:9;:18;;;;;;;;;;;7787:23;;;7766:44;;7905:12;:22;;;;;;;7956:37;2308:25:1;;;7766:9:0;;:18;7956:37;;2281:18:1;7956:37:0;2162:177:1;17566:559:0;17710:16;;;17724:1;17710:16;;;;;;;;17686:21;;17710:16;;;;;;;;;;-1:-1:-1;17710:16:0;17686:40;;17755:4;17737;17742:1;17737:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;17737:23:0;;;:7;;;;;;;;;;:23;;;;17781:11;;:18;;;-1:-1:-1;;;17781:18:0;;;;:11;;;;;:16;;:18;;;;;17737:7;;17781:18;;;;;:11;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17771:4;17776:1;17771:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;17771:28:0;;;:7;;;;;;;;;:28;17844:11;;17812:52;;17829:4;;17844:11;17858:5;17812:8;:52::i;:::-;17903:11;;:214;;-1:-1:-1;;;17903:214:0;;-1:-1:-1;;;;;17903:11:0;;;;:62;;:214;;17980:5;;17903:11;;18044:4;;18071;;18091:15;;17903:214;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17615:510;17566:559;:::o;23787:513::-;23967:11;;23935:58;;23952:4;;-1:-1:-1;;;;;23967:11:0;23981;23935:8;:58::i;:::-;24036:11;;:256;;-1:-1:-1;;;24036:256:0;;24104:4;24036:256;;;23086:34:1;23136:18;;;23129:34;;;24036:11:0;23179:18:1;;;23172:34;;;23222:18;;;23215:34;24244:6:0;23265:19:1;;;23258:44;24266:15:0;23318:19:1;;;23311:35;-1:-1:-1;;;;;24036:11:0;;;;:27;;24071:9;;23020:19:1;;24036:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;23787:513;;:::o;206:131:1:-;-1:-1:-1;;;;;281:31:1;;271:42;;261:70;;327:1;324;317:12;261:70;206:131;:::o;342:118::-;428:5;421:13;414:21;407:5;404:32;394:60;;450:1;447;440:12;465:382;530:6;538;591:2;579:9;570:7;566:23;562:32;559:52;;;607:1;604;597:12;559:52;646:9;633:23;665:31;690:5;665:31;:::i;:::-;715:5;-1:-1:-1;772:2:1;757:18;;744:32;785:30;744:32;785:30;:::i;:::-;834:7;824:17;;;465:382;;;;;:::o;852:180::-;911:6;964:2;952:9;943:7;939:23;935:32;932:52;;;980:1;977;970:12;932:52;-1:-1:-1;1003:23:1;;852:180;-1:-1:-1;852:180:1:o;1037:548::-;1149:4;1178:2;1207;1196:9;1189:21;1239:6;1233:13;1282:6;1277:2;1266:9;1262:18;1255:34;1307:1;1317:140;1331:6;1328:1;1325:13;1317:140;;;1426:14;;;1422:23;;1416:30;1392:17;;;1411:2;1388:26;1381:66;1346:10;;1317:140;;;1321:3;1506:1;1501:2;1492:6;1481:9;1477:22;1473:31;1466:42;1576:2;1569;1565:7;1560:2;1552:6;1548:15;1544:29;1533:9;1529:45;1525:54;1517:62;;;;1037:548;;;;:::o;1590:315::-;1658:6;1666;1719:2;1707:9;1698:7;1694:23;1690:32;1687:52;;;1735:1;1732;1725:12;1687:52;1774:9;1761:23;1793:31;1818:5;1793:31;:::i;:::-;1843:5;1895:2;1880:18;;;;1867:32;;-1:-1:-1;;;1590:315:1:o;1910:247::-;1969:6;2022:2;2010:9;2001:7;1997:23;1993:32;1990:52;;;2038:1;2035;2028:12;1990:52;2077:9;2064:23;2096:31;2121:5;2096:31;:::i;2344:456::-;2421:6;2429;2437;2490:2;2478:9;2469:7;2465:23;2461:32;2458:52;;;2506:1;2503;2496:12;2458:52;2545:9;2532:23;2564:31;2589:5;2564:31;:::i;:::-;2614:5;-1:-1:-1;2671:2:1;2656:18;;2643:32;2684:33;2643:32;2684:33;:::i;:::-;2344:456;;2736:7;;-1:-1:-1;;;2790:2:1;2775:18;;;;2762:32;;2344:456::o;2805:385::-;2891:6;2899;2907;2915;2968:3;2956:9;2947:7;2943:23;2939:33;2936:53;;;2985:1;2982;2975:12;2936:53;-1:-1:-1;;3008:23:1;;;3078:2;3063:18;;3050:32;;-1:-1:-1;3129:2:1;3114:18;;3101:32;;3180:2;3165:18;3152:32;;-1:-1:-1;2805:385:1;-1:-1:-1;2805:385:1:o;3592:388::-;3660:6;3668;3721:2;3709:9;3700:7;3696:23;3692:32;3689:52;;;3737:1;3734;3727:12;3689:52;3776:9;3763:23;3795:31;3820:5;3795:31;:::i;:::-;3845:5;-1:-1:-1;3902:2:1;3887:18;;3874:32;3915:33;3874:32;3915:33;:::i;4211:750::-;4303:6;4311;4319;4372:2;4360:9;4351:7;4347:23;4343:32;4340:52;;;4388:1;4385;4378:12;4340:52;4428:9;4415:23;4457:18;4498:2;4490:6;4487:14;4484:34;;;4514:1;4511;4504:12;4484:34;4552:6;4541:9;4537:22;4527:32;;4597:7;4590:4;4586:2;4582:13;4578:27;4568:55;;4619:1;4616;4609:12;4568:55;4659:2;4646:16;4685:2;4677:6;4674:14;4671:34;;;4701:1;4698;4691:12;4671:34;4756:7;4749:4;4739:6;4736:1;4732:14;4728:2;4724:23;4720:34;4717:47;4714:67;;;4777:1;4774;4767:12;4714:67;4808:4;4800:13;;;;-1:-1:-1;4832:6:1;-1:-1:-1;;4873:20:1;;4860:34;4903:28;4860:34;4903:28;:::i;:::-;4950:5;4940:15;;;4211:750;;;;;:::o;4966:356::-;5168:2;5150:21;;;5187:18;;;5180:30;5246:34;5241:2;5226:18;;5219:62;5313:2;5298:18;;4966:356::o;5938:251::-;6008:6;6061:2;6049:9;6040:7;6036:23;6032:32;6029:52;;;6077:1;6074;6067:12;6029:52;6109:9;6103:16;6128:31;6153:5;6128:31;:::i;6194:127::-;6255:10;6250:3;6246:20;6243:1;6236:31;6286:4;6283:1;6276:15;6310:4;6307:1;6300:15;6326:461;6379:3;6417:5;6411:12;6444:6;6439:3;6432:19;6470:4;6499:2;6494:3;6490:12;6483:19;;6536:2;6529:5;6525:14;6557:1;6567:195;6581:6;6578:1;6575:13;6567:195;;;6646:13;;-1:-1:-1;;;;;6642:39:1;6630:52;;6702:12;;;;6737:15;;;;6678:1;6596:9;6567:195;;;-1:-1:-1;6778:3:1;;6326:461;-1:-1:-1;;;;;6326:461:1:o;6792:510::-;7063:6;7052:9;7045:25;7106:3;7101:2;7090:9;7086:18;7079:31;7026:4;7127:57;7179:3;7168:9;7164:19;7156:6;7127:57;:::i;:::-;-1:-1:-1;;;;;7220:32:1;;;;7215:2;7200:18;;7193:60;-1:-1:-1;7284:2:1;7269:18;7262:34;7119:65;6792:510;-1:-1:-1;;6792:510:1:o;7307:380::-;7386:1;7382:12;;;;7429;;;7450:61;;7504:4;7496:6;7492:17;7482:27;;7450:61;7557:2;7549:6;7546:14;7526:18;7523:38;7520:161;;7603:10;7598:3;7594:20;7591:1;7584:31;7638:4;7635:1;7628:15;7666:4;7663:1;7656:15;7520:161;;7307:380;;;:::o;8101:127::-;8162:10;8157:3;8153:20;8150:1;8143:31;8193:4;8190:1;8183:15;8217:4;8214:1;8207:15;8233:168;8306:9;;;8337;;8354:15;;;8348:22;;8334:37;8324:71;;8375:18;;:::i;8406:217::-;8446:1;8472;8462:132;;8516:10;8511:3;8507:20;8504:1;8497:31;8551:4;8548:1;8541:15;8579:4;8576:1;8569:15;8462:132;-1:-1:-1;8608:9:1;;8406:217::o;9038:125::-;9103:9;;;9124:10;;;9121:36;;;9137:18;;:::i;10233:184::-;10303:6;10356:2;10344:9;10335:7;10331:23;10327:32;10324:52;;;10372:1;10369;10362:12;10324:52;-1:-1:-1;10395:16:1;;10233:184;-1:-1:-1;10233:184:1:o;10701:245::-;10768:6;10821:2;10809:9;10800:7;10796:23;10792:32;10789:52;;;10837:1;10834;10827:12;10789:52;10869:9;10863:16;10888:28;10910:5;10888:28;:::i;15408:135::-;15447:3;15468:17;;;15465:43;;15488:18;;:::i;:::-;-1:-1:-1;15535:1:1;15524:13;;15408:135::o;16973:401::-;17175:2;17157:21;;;17214:2;17194:18;;;17187:30;17253:34;17248:2;17233:18;;17226:62;-1:-1:-1;;;17319:2:1;17304:18;;17297:35;17364:3;17349:19;;16973:401::o;17379:399::-;17581:2;17563:21;;;17620:2;17600:18;;;17593:30;17659:34;17654:2;17639:18;;17632:62;-1:-1:-1;;;17725:2:1;17710:18;;17703:33;17768:3;17753:19;;17379:399::o;20144:128::-;20211:9;;;20232:11;;;20229:37;;;20246:18;;:::i;22158:582::-;22457:6;22446:9;22439:25;22500:6;22495:2;22484:9;22480:18;22473:34;22543:3;22538:2;22527:9;22523:18;22516:31;22420:4;22564:57;22616:3;22605:9;22601:19;22593:6;22564:57;:::i;:::-;-1:-1:-1;;;;;22657:32:1;;;;22652:2;22637:18;;22630:60;-1:-1:-1;22721:3:1;22706:19;22699:35;22556:65;22158:582;-1:-1:-1;;;22158:582:1:o;23357:306::-;23445:6;23453;23461;23514:2;23502:9;23493:7;23489:23;23485:32;23482:52;;;23530:1;23527;23520:12;23482:52;23559:9;23553:16;23543:26;;23609:2;23598:9;23594:18;23588:25;23578:35;;23653:2;23642:9;23638:18;23632:25;23622:35;;23357:306;;;;;:::o

Swarm Source

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