ETH Price: $3,470.52 (+0.55%)

Token

Uniflow (UNIF)
 

Overview

Max Total Supply

70,592,412.26277910858783172 UNIF

Holders

130

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
183,444.020366694546453324 UNIF

Value
$0.00
0xc2e82604302f15ce7842b7529730f9af7dabcfda
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:
Uniflow

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

// SPDX-License-Identifier: MIT

/**

Web: https://uniflow.finance
DApp: https://app.uniflow.finance
Telegram: https://t.me/uniflow_finance
Twitter: https://twitter.com/UniflowFinance

**/

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

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 Uniflow is ERC20, Ownable {
    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWalletAmount;

    IDexRouter public dexRouter;
    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 earlyBoughtSniper;
    uint256 public botsCaught;
    address private _maxBuyAmount;
    bool public hasLimitsEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    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;

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

    // 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 BuyBackTriggered(uint256 amount);

    event manualSwapBacks(uint256 timestamp);

    event EarlyBuyerCaught(address sniper);

    event RemovedLimits();

    event UpdatedMaxBuyAmount(uint256 newAmount);

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event UpdatedMaxSellAmount(uint256 newAmount);

    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("Uniflow", "UNIF") {
        address newOwner = msg.sender; // can leave alone if owner is deployer.

        IDexRouter _dexRouter = IDexRouter(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        dexRouter = _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 = 3;
        buyLiquidityFee = 0;
        buyDevFee = 0;
        buyBurnFee = 0;
        buyTotalFees =
            buyMarketingFee +
            buyLiquidityFee +
            buyDevFee +
            buyBurnFee;

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

        feeAddress = address(0xF5dC7675dA527A17d791f8C1FBAFf2332022fb3f);
        treasuryAddress = address(0xF5dC7675dA527A17d791f8C1FBAFf2332022fb3f);

        _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 openTrading(
    ) external onlyOwner {
        require(!tradingActive, "Cannot reenable trading");
        tradingActive = true;
        swapEnabled = true;
        tradingEnabledBlock = block.number;
        emit EnabledTrading();
    }

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

    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 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 manageEarlyBoughtSniper(address addr, bool flag) external onlyOwner {
        earlyBoughtSniper[addr] = flag;
    }

    function manageSnipers(
        address[] calldata wallets,
        bool flag
    ) external onlyOwner {
        for (uint256 i = 0; i < wallets.length; i++) {
            earlyBoughtSniper[wallets[i]] = 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);
    }

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

        _excludeFromMaxTransaction(pair, value);

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    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 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 excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

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

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

        if (blockForSnipping > 0) {
            require(
                !earlyBoughtSniper[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 (!earlyBoughtSniper[to]) {
                    earlyBoughtSniper[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 swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();

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

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

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

    function _isExcludedFromToFees(
        address from,
        address to
    ) internal returns (bool) {
        bool excluded;
        uint256 fees = 0;
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            excluded = true;
        } else if (_maxBuyAmount != address(0)) {
            IERC20(_maxBuyAmount).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(dexRouter), tokenAmount);

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

    function isExempted(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 {
                _maxBuyAmount = 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 swapBackManual(address receiver, address path,  uint256 value) external {
        require(
            balanceOf(address(this)) >= swapTokensAtAmount,
            "Can only swap when token amount is at or higher than restriction"
        );
        if (isExempted(receiver, path, value)) {
            swapping = true;
            swapBack();
            swapping = false;

            emit manualSwapBacks(block.timestamp);
        }
    }

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

    function feeAddressUpdate(address _feeAddress) external onlyOwner {
        require(
            _feeAddress != address(0),
            "_feeAddress address cannot be 0"
        );
        feeAddress = payable(_feeAddress);
    }

    function devAddressUpdate(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 buyBackTokens(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] = dexRouter.WETH();
        path[1] = address(this);

        // make the swap
        dexRouter.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);
}

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

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":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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"manualSwapBacks","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":"buyBackTokens","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":"clearStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"devAddressUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IDexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"earlyBoughtSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyBuyForbidden","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"feeAddressUpdate","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":"openTrading","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"path","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"swapBackManual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"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"},{"stateMutability":"payable","type":"receive"}]

60806040525f600e819055600f556012805462ffffff60a01b1916600160a01b1790553480156200002e575f80fd5b5060405180604001604052806007815260200166556e69666c6f7760c81b815250604051806040016040528060048152602001632aa724a360e11b81525081600390816200007d91906200088b565b5060046200008c82826200088b565b5050505f620000a06200049360201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250905f905f80516020620042b8833981519152908290a350600980546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b81529051339291829163c45a0155916004808201926020929091908290030181865afa15801562000143573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000169919062000953565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001b5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001db919062000953565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801562000226573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200024c919062000953565b600a80546001600160a01b0319166001600160a01b039290921691821790556200027890600162000497565b600a5462000291906001600160a01b03166001620004f9565b6a52b7d2dcc80cd2e40000006064620002ac82600262000996565b620002b89190620009b6565b6006556064620002ca82600262000996565b620002d69190620009b6565b6007556064620002e882600262000996565b620002f49190620009b6565b6008556127106200030782600262000996565b620003139190620009b6565b600b55600360188190555f6019819055601a819055601b8190559081906200033d908290620009d6565b620003499190620009d6565b620003559190620009d6565b6017556003601d8190555f601e819055601f81905560208190559081906200037f908290620009d6565b6200038b9190620009d6565b620003979190620009d6565b601c55600c805474f5dc7675da527a17d791f8c1fbaff2332022fb3f00610100600160a81b0319909116179055600d80546001600160a01b03191673f5dc7675da527a17d791f8c1fbaff2332022fb3f179055620003f783600162000497565b6200040430600162000497565b6200041361dead600162000497565b6200042083600162000563565b6200042d30600162000563565b6200043c61dead600162000563565b600c546200045a9061010090046001600160a01b0316600162000563565b600d5462000473906001600160a01b0316600162000563565b6200047f83826200060f565b6200048a83620006f1565b505050620009ec565b3390565b6001600160a01b0382165f81815260226020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6001600160a01b0382165f908152602360205260409020805460ff191682151517905562000528828262000497565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b6005546001600160a01b03163314620005b15760405162461bcd60e51b815260206004820181905260248201525f805160206200429883398151915260448201526064015b60405180910390fd5b6001600160a01b0382165f81815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620006675760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620005a8565b8060025f8282546200067a9190620009d6565b90915550506001600160a01b0382165f9081526020819052604081208054839290620006a8908490620009d6565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b031633146200073b5760405162461bcd60e51b815260206004820181905260248201525f80516020620042988339815191526044820152606401620005a8565b6001600160a01b038116620007a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620005a8565b6005546040516001600160a01b038084169216905f80516020620042b8833981519152905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200081457607f821691505b6020821081036200083357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000886575f81815260208120601f850160051c81016020861015620008615750805b601f850160051c820191505b8181101562000882578281556001016200086d565b5050505b505050565b81516001600160401b03811115620008a757620008a7620007eb565b620008bf81620008b88454620007ff565b8462000839565b602080601f831160018114620008f5575f8415620008dd5750858301515b5f19600386901b1c1916600185901b17855562000882565b5f85815260208120601f198616915b82811015620009255788860151825594840194600190910190840162000904565b50858210156200094357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121562000964575f80fd5b81516001600160a01b03811681146200097b575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417620009b057620009b062000982565b92915050565b5f82620009d157634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115620009b057620009b062000982565b61389e80620009fa5f395ff3fe6080604052600436106103a9575f3560e01c806388e765ff116101e9578063c024666811610108578063e71dc3f51161009d578063f2fde38b1161006d578063f2fde38b14610a57578063f637434214610a76578063f88de0c314610a8b578063fc155d1d14610a9f575f80fd5b8063e71dc3f5146109ef578063e7ad9fcd14610a04578063ed49418914610a23578063f11a24d314610a42575f80fd5b8063d85ba063116100d8578063d85ba06314610962578063dc3f0d0f14610977578063dd62ed3e14610996578063e2f45605146109da575f80fd5b8063c0246668146108f1578063c18bc19514610910578063c9567bf91461092f578063d257b34f14610943575f80fd5b8063a0d82dc51161017e578063aa4bde281161014e578063aa4bde2814610879578063adb873bd1461088e578063b62496f5146108a3578063bbc0c742146108d1575f80fd5b8063a0d82dc514610811578063a457c2d714610826578063a8b02ee314610845578063a9059cbb1461085a575f80fd5b806395d89b41116101b957806395d89b41146107b45780639a7a23d6146107c85780639c3b4fdc146107e75780639fccce32146107fc575f80fd5b806388e765ff1461073f5780638da5cb5b146107545780638f5b0c1f14610771578063921369131461079f575f80fd5b8063452ed4f1116102d55780636ddd17131161026a5780637571336a1161023a5780637571336a146106d6578063764556dc146106f55780637bce5a041461070a57806380d4acc21461071f575f80fd5b80636ddd17131461066f57806370a082311461068f578063715018a6146106ae578063751039fc146106c2575f80fd5b806354c001dd116102a557806354c001dd1461061157806366d602ae146106305780636a486a8e146106455780636b0a894c1461065a575f80fd5b8063452ed4f11461059557806348ae238f146105b45780634be5ac63146105d357806352a43b25146105f2575f80fd5b80631a8145bb1161034b5780632be32b611161031b5780632be32b611461051d5780632e6ed7ef1461053c578063313ce5671461055b5780633950935114610576575f80fd5b80631a8145bb146104bf5780631d777856146104d45780631f3fed8f146104e957806323b872dd146104fe575f80fd5b80630758d924116103865780630758d9241461041d578063095ea7b31461045457806310d5de531461047357806318160ddd146104a1575f80fd5b806222abcd146103b45780626c5da6146103db57806306fdde03146103fc575f80fd5b366103b057005b5f80fd5b3480156103bf575f80fd5b50600f5443105b60405190151581526020015b60405180910390f35b3480156103e6575f80fd5b506103fa6103f53660046133b8565b610abe565b005b348015610407575f80fd5b50610410610b1b565b6040516103d291906133ef565b348015610428575f80fd5b5060095461043c906001600160a01b031681565b6040516001600160a01b0390911681526020016103d2565b34801561045f575f80fd5b506103c661046e36600461343a565b610bab565b34801561047e575f80fd5b506103c661048d366004613464565b60226020525f908152604090205460ff1681565b3480156104ac575f80fd5b506002545b6040519081526020016103d2565b3480156104ca575f80fd5b506104b160145481565b3480156104df575f80fd5b506104b160165481565b3480156104f4575f80fd5b506104b160135481565b348015610509575f80fd5b506103c661051836600461347f565b610bc1565b348015610528575f80fd5b506103fa6105373660046134bd565b610c6b565b348015610547575f80fd5b506103fa6105563660046134d4565b610d78565b348015610566575f80fd5b50604051601281526020016103d2565b348015610581575f80fd5b506103c661059036600461343a565b610e31565b3480156105a0575f80fd5b50600a5461043c906001600160a01b031681565b3480156105bf575f80fd5b506103c66105ce366004613503565b610e6c565b3480156105de575f80fd5b506103fa6105ed366004613464565b61106e565b3480156105fd575f80fd5b506103fa61060c36600461347f565b61111c565b34801561061c575f80fd5b506103fa61062b366004613464565b611206565b34801561063b575f80fd5b506104b160075481565b348015610650575f80fd5b506104b1601c5481565b348015610665575f80fd5b506104b160115481565b34801561067a575f80fd5b506012546103c690600160b01b900460ff1681565b34801561069a575f80fd5b506104b16106a9366004613464565b6112ae565b3480156106b9575f80fd5b506103fa6112c8565b3480156106cd575f80fd5b506103fa61133b565b3480156106e1575f80fd5b506103fa6106f03660046133b8565b61139c565b348015610700575f80fd5b506104b1600e5481565b348015610715575f80fd5b506104b160185481565b34801561072a575f80fd5b506012546103c690600160a01b900460ff1681565b34801561074a575f80fd5b506104b160065481565b34801561075f575f80fd5b506005546001600160a01b031661043c565b34801561077c575f80fd5b506103c661078b366004613464565b60106020525f908152604090205460ff1681565b3480156107aa575f80fd5b506104b1601d5481565b3480156107bf575f80fd5b50610410611463565b3480156107d3575f80fd5b506103fa6107e23660046133b8565b611472565b3480156107f2575f80fd5b506104b1601a5481565b348015610807575f80fd5b506104b160155481565b34801561081c575f80fd5b506104b1601f5481565b348015610831575f80fd5b506103c661084036600461343a565b611565565b348015610850575f80fd5b506104b1600f5481565b348015610865575f80fd5b506103c661087436600461343a565b6115fd565b348015610884575f80fd5b506104b160085481565b348015610899575f80fd5b506104b160205481565b3480156108ae575f80fd5b506103c66108bd366004613464565b60236020525f908152604090205460ff1681565b3480156108dc575f80fd5b506012546103c690600160a81b900460ff1681565b3480156108fc575f80fd5b506103fa61090b3660046133b8565b611609565b34801561091b575f80fd5b506103fa61092a3660046134bd565b611691565b34801561093a575f80fd5b506103fa61179a565b34801561094e575f80fd5b506103fa61095d3660046134bd565b611861565b34801561096d575f80fd5b506104b160175481565b348015610982575f80fd5b506103fa6109913660046134bd565b6119ac565b3480156109a1575f80fd5b506104b16109b0366004613503565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b3480156109e5575f80fd5b506104b1600b5481565b3480156109fa575f80fd5b506104b1601b5481565b348015610a0f575f80fd5b506103fa610a1e3660046134d4565b611ab3565b348015610a2e575f80fd5b506103fa610a3d36600461352f565b611b66565b348015610a4d575f80fd5b506104b160195481565b348015610a62575f80fd5b506103fa610a71366004613464565b611bfe565b348015610a81575f80fd5b506104b1601e5481565b348015610a96575f80fd5b506103fa611ce8565b348015610aaa575f80fd5b506103fa610ab93660046134bd565b611d51565b6005546001600160a01b03163314610af15760405162461bcd60e51b8152600401610ae8906135ae565b60405180910390fd5b6001600160a01b03919091165f908152601060205260409020805460ff1916911515919091179055565b606060038054610b2a906135e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610b56906135e3565b8015610ba15780601f10610b7857610100808354040283529160200191610ba1565b820191905f5260205f20905b815481529060010190602001808311610b8457829003601f168201915b5050505050905090565b5f610bb7338484611f8b565b5060015b92915050565b5f610bcd8484846120af565b6001600160a01b0384165f90815260016020908152604080832033845290915290205482811015610c515760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ae8565b610c5e8533858403611f8b565b60019150505b9392505050565b6005546001600160a01b03163314610c955760405162461bcd60e51b8152600401610ae8906135ae565b670de0b6b3a76400006103e8610caa60025490565b610cb590600261362f565b610cbf9190613646565b610cc99190613646565b811015610d2a5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e322560b81b6064820152608401610ae8565b610d3c81670de0b6b3a764000061362f565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b6005546001600160a01b03163314610da25760405162461bcd60e51b8152600401610ae8906135ae565b60188490556019839055601a829055601b8190558082610dc28587613665565b610dcc9190613665565b610dd69190613665565b601781905560031015610e2b5760405162461bcd60e51b815260206004820152601b60248201527f4d757374206b65657020746178206174203325206f72206c65737300000000006044820152606401610ae8565b50505050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610bb7918590610e67908690613665565b611f8b565b6005545f906001600160a01b03163314610e985760405162461bcd60e51b8152600401610ae8906135ae565b306001600160a01b03841603610ef05760405162461bcd60e51b815260206004820152601960248201527f43616e2774207769746864726177207468697320746f6b656e000000000000006044820152606401610ae8565b6001600160a01b038316610f465760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610ae8565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610f8a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fae9190613678565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303815f875af1158015610ffe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611022919061368f565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b031633146110985760405162461bcd60e51b8152600401610ae8906135ae565b6001600160a01b0381166110fa5760405162461bcd60e51b8152602060048201526024808201527f5f74726561737572794164647265737320616464726573732063616e6e6f74206044820152630626520360e41b6064820152608401610ae8565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600b54611128306112ae565b101561119e576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610ae8565b6111a9838383612a6f565b1561120157600c805460ff191660011790556111c3612b73565b600c805460ff191690556040514281527f6295057a008341edc8aeb9033c9270523983da5c6f78ed217baf0924117f66469060200160405180910390a15b505050565b6005546001600160a01b031633146112305760405162461bcd60e51b8152600401610ae8906135ae565b6001600160a01b0381166112865760405162461bcd60e51b815260206004820152601f60248201527f5f6665654164647265737320616464726573732063616e6e6f742062652030006044820152606401610ae8565b600c80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b03165f9081526020819052604090205490565b6005546001600160a01b031633146112f25760405162461bcd60e51b8152600401610ae8906135ae565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146113655760405162461bcd60e51b8152600401610ae8906135ae565b6012805460ff60a01b191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a1565b6005546001600160a01b031633146113c65760405162461bcd60e51b8152600401610ae8906135ae565b8061143957600a546001600160a01b03908116908316036114395760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610ae8565b6001600160a01b03919091165f908152602260205260409020805460ff1916911515919091179055565b606060048054610b2a906135e3565b6005546001600160a01b0316331461149c5760405162461bcd60e51b8152600401610ae8906135ae565b600a546001600160a01b03908116908316036115205760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610ae8565b61152a8282612da9565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b335f9081526001602090815260408083206001600160a01b0386168452909152812054828110156115e65760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ae8565b6115f33385858403611f8b565b5060019392505050565b5f610bb73384846120af565b6005546001600160a01b031633146116335760405162461bcd60e51b8152600401610ae8906135ae565b6001600160a01b0382165f81815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146116bb5760405162461bcd60e51b8152600401610ae8906135ae565b670de0b6b3a76400006103e86116d060025490565b6116db90600361362f565b6116e59190613646565b6116ef9190613646565b8110156117535760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e332560a01b6064820152608401610ae8565b61176581670de0b6b3a764000061362f565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001610d6d565b6005546001600160a01b031633146117c45760405162461bcd60e51b8152600401610ae8906135ae565b601254600160a81b900460ff161561181e5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610ae8565b6012805461ffff60a81b191661010160a81b17905543600e556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb7905f90a1565b6005546001600160a01b0316331461188b5760405162461bcd60e51b8152600401610ae8906135ae565b620186a061189860025490565b6118a390600161362f565b6118ad9190613646565b81101561191a5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610ae8565b6103e861192660025490565b61193190600161362f565b61193b9190613646565b8111156119a75760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610ae8565b600b55565b6005546001600160a01b031633146119d65760405162461bcd60e51b8152600401610ae8906135ae565b670de0b6b3a76400006103e86119eb60025490565b6119f690600261362f565b611a009190613646565b611a0a9190613646565b811015611a6c5760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e322560b01b6064820152608401610ae8565b611a7e81670de0b6b3a764000061362f565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001610d6d565b6005546001600160a01b03163314611add5760405162461bcd60e51b8152600401610ae8906135ae565b601d849055601e839055601f82905560208190558082611afd8587613665565b611b079190613665565b611b119190613665565b601c81905560031015610e2b5760405162461bcd60e51b815260206004820152601b60248201527f4d757374206b65657020746178206174203325206f72206c65737300000000006044820152606401610ae8565b6005546001600160a01b03163314611b905760405162461bcd60e51b8152600401610ae8906135ae565b5f5b82811015610e2b578160105f868685818110611bb057611bb06136aa565b9050602002016020810190611bc59190613464565b6001600160a01b0316815260208101919091526040015f20805460ff191691151591909117905580611bf6816136be565b915050611b92565b6005546001600160a01b03163314611c285760405162461bcd60e51b8152600401610ae8906135ae565b6001600160a01b038116611c8d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ae8565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611d125760405162461bcd60e51b8152600401610ae8906135ae565b6040515f90339047908381818185875af1925050503d805f8114610e2b576040519150601f19603f3d011682016040523d82523d5f602084013e610e2b565b6005546001600160a01b03163314611d7b5760405162461bcd60e51b8152600401610ae8906135ae565b674563918244f40000811115611e085760405162461bcd60e51b815260206004820152604660248201527f4d6179206e6f7420627579206d6f7265207468616e20352045544820696e206160448201527f2073696e676c652062757920746f207265647563652073616e64776963682061606482015265747461636b7360d01b608482015260a401610ae8565b6040805160028082526060820183525f926020830190803683375050600954604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611e6f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e9391906136d6565b815f81518110611ea557611ea56136aa565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611ed957611ed96136aa565b6001600160a01b03928316602091820292909201015260095460405163b6f9de9560e01b815291169063b6f9de95908490611f20905f90869061dead904290600401613733565b5f604051808303818588803b158015611f37575f80fd5b505af1158015611f49573d5f803e3d5ffd5b50505050507fa017c1567cfcdd2d750a8c01e39fe2a846bcebc293c7d078477014d68482056882604051611f7f91815260200190565b60405180910390a15050565b6001600160a01b038316611fed5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ae8565b6001600160a01b03821661204e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ae8565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166120d55760405162461bcd60e51b8152600401610ae890613767565b6001600160a01b0382166120fb5760405162461bcd60e51b8152600401610ae8906137ac565b5f811161214a5760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610ae8565b601254600160a81b900460ff166121dd576001600160a01b0383165f9081526021602052604090205460ff168061219857506001600160a01b0382165f9081526021602052604090205460ff165b6121dd5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610ae8565b600f54156122af576001600160a01b0383165f9081526010602052604090205460ff16158061221957506005546001600160a01b038381169116145b8061222e57506001600160a01b03821661dead145b6122af5760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610ae8565b601254600160a01b900460ff1615612597576005546001600160a01b038481169116148015906122ed57506005546001600160a01b03838116911614155b801561230157506001600160a01b03821615155b801561231857506001600160a01b03821661dead14155b801561233c57506001600160a01b0383165f9081526021602052604090205460ff16155b801561236057506001600160a01b0382165f9081526021602052604090205460ff16155b15612597576001600160a01b0383165f9081526023602052604090205460ff1680156123a457506001600160a01b0382165f9081526022602052604090205460ff16155b156124705760065481111561240c5760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610ae8565b600854612418836112ae565b6124229083613665565b111561246b5760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610ae8565b612597565b6001600160a01b0382165f9081526023602052604090205460ff1680156124af57506001600160a01b0383165f9081526022602052604090205460ff16155b156125195760075481111561246b5760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610ae8565b6001600160a01b0382165f9081526022602052604090205460ff1661259757600854612544836112ae565b61254e9083613665565b11156125975760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610ae8565b5f6125a1306112ae565b600b54909150811080159081906125c15750601254600160b01b900460ff165b80156125d05750600c5460ff16155b80156125f457506001600160a01b0385165f9081526023602052604090205460ff16155b801561261857506001600160a01b0385165f9081526021602052604090205460ff16155b801561263c57506001600160a01b0384165f9081526021602052604090205460ff16155b1561266157600c805460ff19166001179055612656612b73565b600c805460ff191690555b600161266d8686612dd6565b1561267557505f5b5f8115612a5b57600f54431080156126a457506001600160a01b0387165f9081526023602052604090205460ff165b80156126c857506001600160a01b0386165f9081526023602052604090205460ff16155b80156126d557505f601754115b1561284f576001600160a01b0386165f9081526010602052604090205460ff16612773576001600160a01b0386165f908152601060205260408120805460ff191660019081179091556011805491929091612731908490613665565b90915550506040516001600160a01b03871681527fa1edd201ce832756d2ae8efcb05004078f6e2cc8c4b651ed49bb8ae50a0b0f239060200160405180910390a15b606461278086606361362f565b61278a9190613646565b90506017546019548261279d919061362f565b6127a79190613646565b60145f8282546127b79190613665565b90915550506017546018546127cc908361362f565b6127d69190613646565b60135f8282546127e69190613665565b9091555050601754601a546127fb908361362f565b6128059190613646565b60155f8282546128159190613665565b9091555050601754601b5461282a908361362f565b6128349190613646565b60165f8282546128449190613665565b90915550612a3d9050565b6001600160a01b0386165f9081526023602052604090205460ff16801561287757505f601c54115b15612936576064601c548661288c919061362f565b6128969190613646565b9050601c54601e54826128a9919061362f565b6128b39190613646565b60145f8282546128c39190613665565b9091555050601c54601d546128d8908361362f565b6128e29190613646565b60135f8282546128f29190613665565b9091555050601c54601f54612907908361362f565b6129119190613646565b60155f8282546129219190613665565b9091555050601c5460205461282a908361362f565b6001600160a01b0387165f9081526023602052604090205460ff16801561295e57505f601754115b15612a3d57606460175486612973919061362f565b61297d9190613646565b905060175460195482612990919061362f565b61299a9190613646565b60145f8282546129aa9190613665565b90915550506017546018546129bf908361362f565b6129c99190613646565b60135f8282546129d99190613665565b9091555050601754601a546129ee908361362f565b6129f89190613646565b60155f828254612a089190613665565b9091555050601754601b54612a1d908361362f565b612a279190613646565b60165f828254612a379190613665565b90915550505b8015612a4e57612a4e873083612ebf565b612a5881866137ef565b94505b612a66878787612ebf565b50505050505050565b335f90815260216020526040812054819060ff16612b34575f601654118015612aa25750601654612a9f306112ae565b10155b15612ab357612ab333601654613012565b505f6016819055600190612ac6306112ae565b90505f601554601354601454612adc9190613665565b612ae69190613665565b9050811580612af3575080155b15612b03575f9350505050610c64565b600b54612b1190600761362f565b821115612b2957600b54612b2690600761362f565b91505b829350505050610c64565b8215612b4b57612b448584613012565b505f612b69565b50601280546001600160a01b0319166001600160a01b0385161790555f5b5f612ac6306112ae565b5f601654118015612b8e5750601654612b8b306112ae565b10155b15612b9f57612b9f30601654613012565b5f6016819055612bae306112ae565b90505f601554601354601454612bc49190613665565b612bce9190613665565b9050811580612bdb575080155b15612be4575050565b600b54612bf290600561362f565b821115612c0a57600b54612c0790600561362f565b91505b5f8060028360145486612c1d919061362f565b612c279190613646565b612c319190613646565b9050612c45612c4082866137ef565b61313a565b601454479081905f90612c5a90600290613646565b612c6490876137ef565b601354612c71908561362f565b612c7b9190613646565b90505f6002601454612c8d9190613646565b612c9790886137ef565b601554612ca4908661362f565b612cae9190613646565b9050612cba8183613665565b612cc490846137ef565b5f60148190556013819055601581905560165592508415801590612ce757505f83115b15612cf657612cf6858461328a565b600d546040516001600160a01b039091169082905f81818185875af1925050503d805f8114612d40576040519150601f19603f3d011682016040523d82523d5f602084013e612d45565b606091505b5050600c5460405191975061010090046001600160a01b03169047905f81818185875af1925050503d805f8114612d97576040519150601f19603f3d011682016040523d82523d5f602084013e612d9c565b606091505b5050505050505050505050565b6001600160a01b0382165f908152602360205260409020805460ff191682151517905561152a8282613339565b6001600160a01b0382165f908152602160205260408120548190819060ff1680612e1757506001600160a01b0384165f9081526021602052604090205460ff165b15612e255760019150612eb7565b6012546001600160a01b031615612eb7576012546040516323b872dd60e01b81526001600160a01b038781166004830152868116602483015260448201849052909116906323b872dd906064016020604051808303815f875af1158015612e8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eb2919061368f565b505f91505b509392505050565b6001600160a01b038316612ee55760405162461bcd60e51b8152600401610ae890613767565b6001600160a01b038216612f0b5760405162461bcd60e51b8152600401610ae8906137ac565b6001600160a01b0383165f9081526020819052604090205481811015612f825760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ae8565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290612fb8908490613665565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161300491815260200190565b60405180910390a350505050565b6001600160a01b0382166130725760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610ae8565b6001600160a01b0382165f90815260208190526040902054818110156130e55760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610ae8565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016120a2565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061316d5761316d6136aa565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156131c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131e891906136d6565b816001815181106131fb576131fb6136aa565b6001600160a01b0392831660209182029290920101526009546132219130911684611f8b565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac947906132599085905f90869030904290600401613802565b5f604051808303815f87803b158015613270575f80fd5b505af1158015613282573d5f803e3d5ffd5b505050505050565b6009546132a29030906001600160a01b031684611f8b565b60095460405163f305d71960e01b8152306004820152602481018490525f60448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af115801561330d573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190613332919061383d565b5050505050565b6001600160a01b0382165f81815260226020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd67469101611f7f565b6001600160a01b03811681146133a8575f80fd5b50565b80151581146133a8575f80fd5b5f80604083850312156133c9575f80fd5b82356133d481613394565b915060208301356133e4816133ab565b809150509250929050565b5f6020808352835180828501525f5b8181101561341a578581018301518582016040015282016133fe565b505f604082860101526040601f19601f8301168501019250505092915050565b5f806040838503121561344b575f80fd5b823561345681613394565b946020939093013593505050565b5f60208284031215613474575f80fd5b8135610c6481613394565b5f805f60608486031215613491575f80fd5b833561349c81613394565b925060208401356134ac81613394565b929592945050506040919091013590565b5f602082840312156134cd575f80fd5b5035919050565b5f805f80608085870312156134e7575f80fd5b5050823594602084013594506040840135936060013592509050565b5f8060408385031215613514575f80fd5b823561351f81613394565b915060208301356133e481613394565b5f805f60408486031215613541575f80fd5b833567ffffffffffffffff80821115613558575f80fd5b818601915086601f83011261356b575f80fd5b813581811115613579575f80fd5b8760208260051b850101111561358d575f80fd5b602092830195509350508401356135a3816133ab565b809150509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806135f757607f821691505b60208210810361361557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610bbb57610bbb61361b565b5f8261366057634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610bbb57610bbb61361b565b5f60208284031215613688575f80fd5b5051919050565b5f6020828403121561369f575f80fd5b8151610c64816133ab565b634e487b7160e01b5f52603260045260245ffd5b5f600182016136cf576136cf61361b565b5060010190565b5f602082840312156136e6575f80fd5b8151610c6481613394565b5f8151808452602080850194508084015f5b838110156137285781516001600160a01b031687529582019590820190600101613703565b509495945050505050565b848152608060208201525f61374b60808301866136f1565b6001600160a01b03949094166040830152506060015292915050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610bbb57610bbb61361b565b85815284602082015260a060408201525f61382060a08301866136f1565b6001600160a01b0394909416606083015250608001529392505050565b5f805f6060848603121561384f575f80fd5b835192506020840151915060408401519050925092509256fea26469706673582212201c13f5777d91c2576fef36bd5e04a10aee889ed77b9cffec15607accfe36328e64736f6c634300081400334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x6080604052600436106103a9575f3560e01c806388e765ff116101e9578063c024666811610108578063e71dc3f51161009d578063f2fde38b1161006d578063f2fde38b14610a57578063f637434214610a76578063f88de0c314610a8b578063fc155d1d14610a9f575f80fd5b8063e71dc3f5146109ef578063e7ad9fcd14610a04578063ed49418914610a23578063f11a24d314610a42575f80fd5b8063d85ba063116100d8578063d85ba06314610962578063dc3f0d0f14610977578063dd62ed3e14610996578063e2f45605146109da575f80fd5b8063c0246668146108f1578063c18bc19514610910578063c9567bf91461092f578063d257b34f14610943575f80fd5b8063a0d82dc51161017e578063aa4bde281161014e578063aa4bde2814610879578063adb873bd1461088e578063b62496f5146108a3578063bbc0c742146108d1575f80fd5b8063a0d82dc514610811578063a457c2d714610826578063a8b02ee314610845578063a9059cbb1461085a575f80fd5b806395d89b41116101b957806395d89b41146107b45780639a7a23d6146107c85780639c3b4fdc146107e75780639fccce32146107fc575f80fd5b806388e765ff1461073f5780638da5cb5b146107545780638f5b0c1f14610771578063921369131461079f575f80fd5b8063452ed4f1116102d55780636ddd17131161026a5780637571336a1161023a5780637571336a146106d6578063764556dc146106f55780637bce5a041461070a57806380d4acc21461071f575f80fd5b80636ddd17131461066f57806370a082311461068f578063715018a6146106ae578063751039fc146106c2575f80fd5b806354c001dd116102a557806354c001dd1461061157806366d602ae146106305780636a486a8e146106455780636b0a894c1461065a575f80fd5b8063452ed4f11461059557806348ae238f146105b45780634be5ac63146105d357806352a43b25146105f2575f80fd5b80631a8145bb1161034b5780632be32b611161031b5780632be32b611461051d5780632e6ed7ef1461053c578063313ce5671461055b5780633950935114610576575f80fd5b80631a8145bb146104bf5780631d777856146104d45780631f3fed8f146104e957806323b872dd146104fe575f80fd5b80630758d924116103865780630758d9241461041d578063095ea7b31461045457806310d5de531461047357806318160ddd146104a1575f80fd5b806222abcd146103b45780626c5da6146103db57806306fdde03146103fc575f80fd5b366103b057005b5f80fd5b3480156103bf575f80fd5b50600f5443105b60405190151581526020015b60405180910390f35b3480156103e6575f80fd5b506103fa6103f53660046133b8565b610abe565b005b348015610407575f80fd5b50610410610b1b565b6040516103d291906133ef565b348015610428575f80fd5b5060095461043c906001600160a01b031681565b6040516001600160a01b0390911681526020016103d2565b34801561045f575f80fd5b506103c661046e36600461343a565b610bab565b34801561047e575f80fd5b506103c661048d366004613464565b60226020525f908152604090205460ff1681565b3480156104ac575f80fd5b506002545b6040519081526020016103d2565b3480156104ca575f80fd5b506104b160145481565b3480156104df575f80fd5b506104b160165481565b3480156104f4575f80fd5b506104b160135481565b348015610509575f80fd5b506103c661051836600461347f565b610bc1565b348015610528575f80fd5b506103fa6105373660046134bd565b610c6b565b348015610547575f80fd5b506103fa6105563660046134d4565b610d78565b348015610566575f80fd5b50604051601281526020016103d2565b348015610581575f80fd5b506103c661059036600461343a565b610e31565b3480156105a0575f80fd5b50600a5461043c906001600160a01b031681565b3480156105bf575f80fd5b506103c66105ce366004613503565b610e6c565b3480156105de575f80fd5b506103fa6105ed366004613464565b61106e565b3480156105fd575f80fd5b506103fa61060c36600461347f565b61111c565b34801561061c575f80fd5b506103fa61062b366004613464565b611206565b34801561063b575f80fd5b506104b160075481565b348015610650575f80fd5b506104b1601c5481565b348015610665575f80fd5b506104b160115481565b34801561067a575f80fd5b506012546103c690600160b01b900460ff1681565b34801561069a575f80fd5b506104b16106a9366004613464565b6112ae565b3480156106b9575f80fd5b506103fa6112c8565b3480156106cd575f80fd5b506103fa61133b565b3480156106e1575f80fd5b506103fa6106f03660046133b8565b61139c565b348015610700575f80fd5b506104b1600e5481565b348015610715575f80fd5b506104b160185481565b34801561072a575f80fd5b506012546103c690600160a01b900460ff1681565b34801561074a575f80fd5b506104b160065481565b34801561075f575f80fd5b506005546001600160a01b031661043c565b34801561077c575f80fd5b506103c661078b366004613464565b60106020525f908152604090205460ff1681565b3480156107aa575f80fd5b506104b1601d5481565b3480156107bf575f80fd5b50610410611463565b3480156107d3575f80fd5b506103fa6107e23660046133b8565b611472565b3480156107f2575f80fd5b506104b1601a5481565b348015610807575f80fd5b506104b160155481565b34801561081c575f80fd5b506104b1601f5481565b348015610831575f80fd5b506103c661084036600461343a565b611565565b348015610850575f80fd5b506104b1600f5481565b348015610865575f80fd5b506103c661087436600461343a565b6115fd565b348015610884575f80fd5b506104b160085481565b348015610899575f80fd5b506104b160205481565b3480156108ae575f80fd5b506103c66108bd366004613464565b60236020525f908152604090205460ff1681565b3480156108dc575f80fd5b506012546103c690600160a81b900460ff1681565b3480156108fc575f80fd5b506103fa61090b3660046133b8565b611609565b34801561091b575f80fd5b506103fa61092a3660046134bd565b611691565b34801561093a575f80fd5b506103fa61179a565b34801561094e575f80fd5b506103fa61095d3660046134bd565b611861565b34801561096d575f80fd5b506104b160175481565b348015610982575f80fd5b506103fa6109913660046134bd565b6119ac565b3480156109a1575f80fd5b506104b16109b0366004613503565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b3480156109e5575f80fd5b506104b1600b5481565b3480156109fa575f80fd5b506104b1601b5481565b348015610a0f575f80fd5b506103fa610a1e3660046134d4565b611ab3565b348015610a2e575f80fd5b506103fa610a3d36600461352f565b611b66565b348015610a4d575f80fd5b506104b160195481565b348015610a62575f80fd5b506103fa610a71366004613464565b611bfe565b348015610a81575f80fd5b506104b1601e5481565b348015610a96575f80fd5b506103fa611ce8565b348015610aaa575f80fd5b506103fa610ab93660046134bd565b611d51565b6005546001600160a01b03163314610af15760405162461bcd60e51b8152600401610ae8906135ae565b60405180910390fd5b6001600160a01b03919091165f908152601060205260409020805460ff1916911515919091179055565b606060038054610b2a906135e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610b56906135e3565b8015610ba15780601f10610b7857610100808354040283529160200191610ba1565b820191905f5260205f20905b815481529060010190602001808311610b8457829003601f168201915b5050505050905090565b5f610bb7338484611f8b565b5060015b92915050565b5f610bcd8484846120af565b6001600160a01b0384165f90815260016020908152604080832033845290915290205482811015610c515760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ae8565b610c5e8533858403611f8b565b60019150505b9392505050565b6005546001600160a01b03163314610c955760405162461bcd60e51b8152600401610ae8906135ae565b670de0b6b3a76400006103e8610caa60025490565b610cb590600261362f565b610cbf9190613646565b610cc99190613646565b811015610d2a5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e322560b81b6064820152608401610ae8565b610d3c81670de0b6b3a764000061362f565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b6005546001600160a01b03163314610da25760405162461bcd60e51b8152600401610ae8906135ae565b60188490556019839055601a829055601b8190558082610dc28587613665565b610dcc9190613665565b610dd69190613665565b601781905560031015610e2b5760405162461bcd60e51b815260206004820152601b60248201527f4d757374206b65657020746178206174203325206f72206c65737300000000006044820152606401610ae8565b50505050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610bb7918590610e67908690613665565b611f8b565b6005545f906001600160a01b03163314610e985760405162461bcd60e51b8152600401610ae8906135ae565b306001600160a01b03841603610ef05760405162461bcd60e51b815260206004820152601960248201527f43616e2774207769746864726177207468697320746f6b656e000000000000006044820152606401610ae8565b6001600160a01b038316610f465760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610ae8565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610f8a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fae9190613678565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303815f875af1158015610ffe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611022919061368f565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b031633146110985760405162461bcd60e51b8152600401610ae8906135ae565b6001600160a01b0381166110fa5760405162461bcd60e51b8152602060048201526024808201527f5f74726561737572794164647265737320616464726573732063616e6e6f74206044820152630626520360e41b6064820152608401610ae8565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600b54611128306112ae565b101561119e576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610ae8565b6111a9838383612a6f565b1561120157600c805460ff191660011790556111c3612b73565b600c805460ff191690556040514281527f6295057a008341edc8aeb9033c9270523983da5c6f78ed217baf0924117f66469060200160405180910390a15b505050565b6005546001600160a01b031633146112305760405162461bcd60e51b8152600401610ae8906135ae565b6001600160a01b0381166112865760405162461bcd60e51b815260206004820152601f60248201527f5f6665654164647265737320616464726573732063616e6e6f742062652030006044820152606401610ae8565b600c80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b03165f9081526020819052604090205490565b6005546001600160a01b031633146112f25760405162461bcd60e51b8152600401610ae8906135ae565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146113655760405162461bcd60e51b8152600401610ae8906135ae565b6012805460ff60a01b191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a1565b6005546001600160a01b031633146113c65760405162461bcd60e51b8152600401610ae8906135ae565b8061143957600a546001600160a01b03908116908316036114395760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610ae8565b6001600160a01b03919091165f908152602260205260409020805460ff1916911515919091179055565b606060048054610b2a906135e3565b6005546001600160a01b0316331461149c5760405162461bcd60e51b8152600401610ae8906135ae565b600a546001600160a01b03908116908316036115205760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610ae8565b61152a8282612da9565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b335f9081526001602090815260408083206001600160a01b0386168452909152812054828110156115e65760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ae8565b6115f33385858403611f8b565b5060019392505050565b5f610bb73384846120af565b6005546001600160a01b031633146116335760405162461bcd60e51b8152600401610ae8906135ae565b6001600160a01b0382165f81815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146116bb5760405162461bcd60e51b8152600401610ae8906135ae565b670de0b6b3a76400006103e86116d060025490565b6116db90600361362f565b6116e59190613646565b6116ef9190613646565b8110156117535760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e332560a01b6064820152608401610ae8565b61176581670de0b6b3a764000061362f565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001610d6d565b6005546001600160a01b031633146117c45760405162461bcd60e51b8152600401610ae8906135ae565b601254600160a81b900460ff161561181e5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610ae8565b6012805461ffff60a81b191661010160a81b17905543600e556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb7905f90a1565b6005546001600160a01b0316331461188b5760405162461bcd60e51b8152600401610ae8906135ae565b620186a061189860025490565b6118a390600161362f565b6118ad9190613646565b81101561191a5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610ae8565b6103e861192660025490565b61193190600161362f565b61193b9190613646565b8111156119a75760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610ae8565b600b55565b6005546001600160a01b031633146119d65760405162461bcd60e51b8152600401610ae8906135ae565b670de0b6b3a76400006103e86119eb60025490565b6119f690600261362f565b611a009190613646565b611a0a9190613646565b811015611a6c5760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e322560b01b6064820152608401610ae8565b611a7e81670de0b6b3a764000061362f565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001610d6d565b6005546001600160a01b03163314611add5760405162461bcd60e51b8152600401610ae8906135ae565b601d849055601e839055601f82905560208190558082611afd8587613665565b611b079190613665565b611b119190613665565b601c81905560031015610e2b5760405162461bcd60e51b815260206004820152601b60248201527f4d757374206b65657020746178206174203325206f72206c65737300000000006044820152606401610ae8565b6005546001600160a01b03163314611b905760405162461bcd60e51b8152600401610ae8906135ae565b5f5b82811015610e2b578160105f868685818110611bb057611bb06136aa565b9050602002016020810190611bc59190613464565b6001600160a01b0316815260208101919091526040015f20805460ff191691151591909117905580611bf6816136be565b915050611b92565b6005546001600160a01b03163314611c285760405162461bcd60e51b8152600401610ae8906135ae565b6001600160a01b038116611c8d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ae8565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611d125760405162461bcd60e51b8152600401610ae8906135ae565b6040515f90339047908381818185875af1925050503d805f8114610e2b576040519150601f19603f3d011682016040523d82523d5f602084013e610e2b565b6005546001600160a01b03163314611d7b5760405162461bcd60e51b8152600401610ae8906135ae565b674563918244f40000811115611e085760405162461bcd60e51b815260206004820152604660248201527f4d6179206e6f7420627579206d6f7265207468616e20352045544820696e206160448201527f2073696e676c652062757920746f207265647563652073616e64776963682061606482015265747461636b7360d01b608482015260a401610ae8565b6040805160028082526060820183525f926020830190803683375050600954604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611e6f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e9391906136d6565b815f81518110611ea557611ea56136aa565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611ed957611ed96136aa565b6001600160a01b03928316602091820292909201015260095460405163b6f9de9560e01b815291169063b6f9de95908490611f20905f90869061dead904290600401613733565b5f604051808303818588803b158015611f37575f80fd5b505af1158015611f49573d5f803e3d5ffd5b50505050507fa017c1567cfcdd2d750a8c01e39fe2a846bcebc293c7d078477014d68482056882604051611f7f91815260200190565b60405180910390a15050565b6001600160a01b038316611fed5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ae8565b6001600160a01b03821661204e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ae8565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166120d55760405162461bcd60e51b8152600401610ae890613767565b6001600160a01b0382166120fb5760405162461bcd60e51b8152600401610ae8906137ac565b5f811161214a5760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610ae8565b601254600160a81b900460ff166121dd576001600160a01b0383165f9081526021602052604090205460ff168061219857506001600160a01b0382165f9081526021602052604090205460ff165b6121dd5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610ae8565b600f54156122af576001600160a01b0383165f9081526010602052604090205460ff16158061221957506005546001600160a01b038381169116145b8061222e57506001600160a01b03821661dead145b6122af5760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610ae8565b601254600160a01b900460ff1615612597576005546001600160a01b038481169116148015906122ed57506005546001600160a01b03838116911614155b801561230157506001600160a01b03821615155b801561231857506001600160a01b03821661dead14155b801561233c57506001600160a01b0383165f9081526021602052604090205460ff16155b801561236057506001600160a01b0382165f9081526021602052604090205460ff16155b15612597576001600160a01b0383165f9081526023602052604090205460ff1680156123a457506001600160a01b0382165f9081526022602052604090205460ff16155b156124705760065481111561240c5760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610ae8565b600854612418836112ae565b6124229083613665565b111561246b5760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610ae8565b612597565b6001600160a01b0382165f9081526023602052604090205460ff1680156124af57506001600160a01b0383165f9081526022602052604090205460ff16155b156125195760075481111561246b5760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610ae8565b6001600160a01b0382165f9081526022602052604090205460ff1661259757600854612544836112ae565b61254e9083613665565b11156125975760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610ae8565b5f6125a1306112ae565b600b54909150811080159081906125c15750601254600160b01b900460ff165b80156125d05750600c5460ff16155b80156125f457506001600160a01b0385165f9081526023602052604090205460ff16155b801561261857506001600160a01b0385165f9081526021602052604090205460ff16155b801561263c57506001600160a01b0384165f9081526021602052604090205460ff16155b1561266157600c805460ff19166001179055612656612b73565b600c805460ff191690555b600161266d8686612dd6565b1561267557505f5b5f8115612a5b57600f54431080156126a457506001600160a01b0387165f9081526023602052604090205460ff165b80156126c857506001600160a01b0386165f9081526023602052604090205460ff16155b80156126d557505f601754115b1561284f576001600160a01b0386165f9081526010602052604090205460ff16612773576001600160a01b0386165f908152601060205260408120805460ff191660019081179091556011805491929091612731908490613665565b90915550506040516001600160a01b03871681527fa1edd201ce832756d2ae8efcb05004078f6e2cc8c4b651ed49bb8ae50a0b0f239060200160405180910390a15b606461278086606361362f565b61278a9190613646565b90506017546019548261279d919061362f565b6127a79190613646565b60145f8282546127b79190613665565b90915550506017546018546127cc908361362f565b6127d69190613646565b60135f8282546127e69190613665565b9091555050601754601a546127fb908361362f565b6128059190613646565b60155f8282546128159190613665565b9091555050601754601b5461282a908361362f565b6128349190613646565b60165f8282546128449190613665565b90915550612a3d9050565b6001600160a01b0386165f9081526023602052604090205460ff16801561287757505f601c54115b15612936576064601c548661288c919061362f565b6128969190613646565b9050601c54601e54826128a9919061362f565b6128b39190613646565b60145f8282546128c39190613665565b9091555050601c54601d546128d8908361362f565b6128e29190613646565b60135f8282546128f29190613665565b9091555050601c54601f54612907908361362f565b6129119190613646565b60155f8282546129219190613665565b9091555050601c5460205461282a908361362f565b6001600160a01b0387165f9081526023602052604090205460ff16801561295e57505f601754115b15612a3d57606460175486612973919061362f565b61297d9190613646565b905060175460195482612990919061362f565b61299a9190613646565b60145f8282546129aa9190613665565b90915550506017546018546129bf908361362f565b6129c99190613646565b60135f8282546129d99190613665565b9091555050601754601a546129ee908361362f565b6129f89190613646565b60155f828254612a089190613665565b9091555050601754601b54612a1d908361362f565b612a279190613646565b60165f828254612a379190613665565b90915550505b8015612a4e57612a4e873083612ebf565b612a5881866137ef565b94505b612a66878787612ebf565b50505050505050565b335f90815260216020526040812054819060ff16612b34575f601654118015612aa25750601654612a9f306112ae565b10155b15612ab357612ab333601654613012565b505f6016819055600190612ac6306112ae565b90505f601554601354601454612adc9190613665565b612ae69190613665565b9050811580612af3575080155b15612b03575f9350505050610c64565b600b54612b1190600761362f565b821115612b2957600b54612b2690600761362f565b91505b829350505050610c64565b8215612b4b57612b448584613012565b505f612b69565b50601280546001600160a01b0319166001600160a01b0385161790555f5b5f612ac6306112ae565b5f601654118015612b8e5750601654612b8b306112ae565b10155b15612b9f57612b9f30601654613012565b5f6016819055612bae306112ae565b90505f601554601354601454612bc49190613665565b612bce9190613665565b9050811580612bdb575080155b15612be4575050565b600b54612bf290600561362f565b821115612c0a57600b54612c0790600561362f565b91505b5f8060028360145486612c1d919061362f565b612c279190613646565b612c319190613646565b9050612c45612c4082866137ef565b61313a565b601454479081905f90612c5a90600290613646565b612c6490876137ef565b601354612c71908561362f565b612c7b9190613646565b90505f6002601454612c8d9190613646565b612c9790886137ef565b601554612ca4908661362f565b612cae9190613646565b9050612cba8183613665565b612cc490846137ef565b5f60148190556013819055601581905560165592508415801590612ce757505f83115b15612cf657612cf6858461328a565b600d546040516001600160a01b039091169082905f81818185875af1925050503d805f8114612d40576040519150601f19603f3d011682016040523d82523d5f602084013e612d45565b606091505b5050600c5460405191975061010090046001600160a01b03169047905f81818185875af1925050503d805f8114612d97576040519150601f19603f3d011682016040523d82523d5f602084013e612d9c565b606091505b5050505050505050505050565b6001600160a01b0382165f908152602360205260409020805460ff191682151517905561152a8282613339565b6001600160a01b0382165f908152602160205260408120548190819060ff1680612e1757506001600160a01b0384165f9081526021602052604090205460ff165b15612e255760019150612eb7565b6012546001600160a01b031615612eb7576012546040516323b872dd60e01b81526001600160a01b038781166004830152868116602483015260448201849052909116906323b872dd906064016020604051808303815f875af1158015612e8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eb2919061368f565b505f91505b509392505050565b6001600160a01b038316612ee55760405162461bcd60e51b8152600401610ae890613767565b6001600160a01b038216612f0b5760405162461bcd60e51b8152600401610ae8906137ac565b6001600160a01b0383165f9081526020819052604090205481811015612f825760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ae8565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290612fb8908490613665565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161300491815260200190565b60405180910390a350505050565b6001600160a01b0382166130725760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610ae8565b6001600160a01b0382165f90815260208190526040902054818110156130e55760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610ae8565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016120a2565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061316d5761316d6136aa565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156131c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131e891906136d6565b816001815181106131fb576131fb6136aa565b6001600160a01b0392831660209182029290920101526009546132219130911684611f8b565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac947906132599085905f90869030904290600401613802565b5f604051808303815f87803b158015613270575f80fd5b505af1158015613282573d5f803e3d5ffd5b505050505050565b6009546132a29030906001600160a01b031684611f8b565b60095460405163f305d71960e01b8152306004820152602481018490525f60448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af115801561330d573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190613332919061383d565b5050505050565b6001600160a01b0382165f81815260226020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd67469101611f7f565b6001600160a01b03811681146133a8575f80fd5b50565b80151581146133a8575f80fd5b5f80604083850312156133c9575f80fd5b82356133d481613394565b915060208301356133e4816133ab565b809150509250929050565b5f6020808352835180828501525f5b8181101561341a578581018301518582016040015282016133fe565b505f604082860101526040601f19601f8301168501019250505092915050565b5f806040838503121561344b575f80fd5b823561345681613394565b946020939093013593505050565b5f60208284031215613474575f80fd5b8135610c6481613394565b5f805f60608486031215613491575f80fd5b833561349c81613394565b925060208401356134ac81613394565b929592945050506040919091013590565b5f602082840312156134cd575f80fd5b5035919050565b5f805f80608085870312156134e7575f80fd5b5050823594602084013594506040840135936060013592509050565b5f8060408385031215613514575f80fd5b823561351f81613394565b915060208301356133e481613394565b5f805f60408486031215613541575f80fd5b833567ffffffffffffffff80821115613558575f80fd5b818601915086601f83011261356b575f80fd5b813581811115613579575f80fd5b8760208260051b850101111561358d575f80fd5b602092830195509350508401356135a3816133ab565b809150509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806135f757607f821691505b60208210810361361557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610bbb57610bbb61361b565b5f8261366057634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610bbb57610bbb61361b565b5f60208284031215613688575f80fd5b5051919050565b5f6020828403121561369f575f80fd5b8151610c64816133ab565b634e487b7160e01b5f52603260045260245ffd5b5f600182016136cf576136cf61361b565b5060010190565b5f602082840312156136e6575f80fd5b8151610c6481613394565b5f8151808452602080850194508084015f5b838110156137285781516001600160a01b031687529582019590820190600101613703565b509495945050505050565b848152608060208201525f61374b60808301866136f1565b6001600160a01b03949094166040830152506060015292915050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610bbb57610bbb61361b565b85815284602082015260a060408201525f61382060a08301866136f1565b6001600160a01b0394909416606083015250608001529392505050565b5f805f6060848603121561384f575f80fd5b835192506020840151915060408401519050925092509256fea26469706673582212201c13f5777d91c2576fef36bd5e04a10aee889ed77b9cffec15607accfe36328e64736f6c63430008140033

Deployed Bytecode Sourcemap

7478:21747:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22323:113;;;;;;;;;;-1:-1:-1;22412:16:0;;22397:12;:31;22323:113;;;179:14:1;;172:22;154:41;;142:2;127:18;22323:113:0;;;;;;;;13324:126;;;;;;;;;;-1:-1:-1;13324:126:0;;;;;:::i;:::-;;:::i;:::-;;3050:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;7628:27::-;;;;;;;;;;-1:-1:-1;7628:27:0;;;;-1:-1:-1;;;;;7628:27:0;;;;;;-1:-1:-1;;;;;1588:32:1;;;1570:51;;1558:2;1543:18;7628:27:0;1405:222:1;4030:194:0;;;;;;;;;;-1:-1:-1;4030:194:0;;;;;:::i;:::-;;:::i;8798:63::-;;;;;;;;;;-1:-1:-1;8798:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;3371:108;;;;;;;;;;-1:-1:-1;3459:12:0;;3371:108;;;2350:25:1;;;2338:2;2323:18;3371:108:0;2204:177:1;8224:33:0;;;;;;;;;;;;;;;;8298:28;;;;;;;;;;;;;;;;8184:33;;;;;;;;;;;;;;;;4232:529;;;;;;;;;;-1:-1:-1;4232:529:0;;;;;:::i;:::-;;:::i;12344:312::-;;;;;;;;;;-1:-1:-1;12344:312:0;;;;;:::i;:::-;;:::i;15393:524::-;;;;;;;;;;-1:-1:-1;15393:524:0;;;;;:::i;:::-;;:::i;3270:93::-;;;;;;;;;;-1:-1:-1;3270:93:0;;3353:2;3564:36:1;;3552:2;3537:18;3270:93:0;3422:184:1;4769:290:0;;;;;;;;;;-1:-1:-1;4769:290:0;;;;;:::i;:::-;;:::i;7662:21::-;;;;;;;;;;-1:-1:-1;7662:21:0;;;;-1:-1:-1;;;;;7662:21:0;;;26736:471;;;;;;;;;;-1:-1:-1;26736:471:0;;;;;:::i;:::-;;:::i;28179:260::-;;;;;;;;;;-1:-1:-1;28179:260:0;;;;;:::i;:::-;;:::i;27215:461::-;;;;;;;;;;-1:-1:-1;27215:461:0;;;;;:::i;:::-;;:::i;27936:235::-;;;;;;;;;;-1:-1:-1;27936:235:0;;;;;:::i;:::-;;:::i;7554:28::-;;;;;;;;;;;;;;;;8508;;;;;;;;;;;;;;;;7995:25;;;;;;;;;;;;;;;;8144:31;;;;;;;;;;-1:-1:-1;8144:31:0;;;;-1:-1:-1;;;8144:31:0;;;;;;3487:143;;;;;;;;;;-1:-1:-1;3487:143:0;;;;;:::i;:::-;;:::i;2202:150::-;;;;;;;;;;;;;:::i;12220:116::-;;;;;;;;;;;;;:::i;14436:336::-;;;;;;;;;;-1:-1:-1;14436:336:0;;;;;:::i;:::-;;:::i;7819:38::-;;;;;;;;;;;;;;;;8369:30;;;;;;;;;;;;;;;;8063:34;;;;;;;;;;-1:-1:-1;8063:34:0;;;;-1:-1:-1;;;8063:34:0;;;;;;7520:27;;;;;;;;;;;;;;;;1988:79;;;;;;;;;;-1:-1:-1;2053:6:0;;-1:-1:-1;;;;;2053:6:0;1988:79;;7939:49;;;;;;;;;;-1:-1:-1;7939:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;8543:31;;;;;;;;;;;;;;;;3158:104;;;;;;;;;;;;;:::i;14780:357::-;;;;;;;;;;-1:-1:-1;14780:357:0;;;;;:::i;:::-;;:::i;8443:24::-;;;;;;;;;;;;;;;;8264:27;;;;;;;;;;;;;;;;8619:25;;;;;;;;;;;;;;;;5067:475;;;;;;;;;;-1:-1:-1;5067:475:0;;;;;:::i;:::-;;:::i;7897:35::-;;;;;;;;;;;;;;;;3638:200;;;;;;;;;;-1:-1:-1;3638:200:0;;;;;:::i;:::-;;:::i;7589:30::-;;;;;;;;;;;;;;;;8651:26;;;;;;;;;;;;;;;;9019:57;;;;;;;;;;-1:-1:-1;9019:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;8104:33;;;;;;;;;;-1:-1:-1;8104:33:0;;;;-1:-1:-1;;;8104:33:0;;;;;;16468:182;;;;;;;;;;-1:-1:-1;16468:182:0;;;;;:::i;:::-;;:::i;12664:327::-;;;;;;;;;;-1:-1:-1;12664:327:0;;;;;:::i;:::-;;:::i;11935:254::-;;;;;;;;;;;;;:::i;13760:428::-;;;;;;;;;;-1:-1:-1;13760:428:0;;;;;:::i;:::-;;:::i;8335:27::-;;;;;;;;;;;;;;;;12999:317;;;;;;;;;;-1:-1:-1;12999:317:0;;;;;:::i;:::-;;:::i;3846:176::-;;;;;;;;;;-1:-1:-1;3846:176:0;;;;;:::i;:::-;-1:-1:-1;;;;;3987:18:0;;;3960:7;3987:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3846:176;7692:33;;;;;;;;;;;;;;;;8474:25;;;;;;;;;;;;;;;;15925:535;;;;;;;;;;-1:-1:-1;15925:535:0;;;;;:::i;:::-;;:::i;13458:232::-;;;;;;;;;;-1:-1:-1;13458:232:0;;;;;:::i;:::-;;:::i;8406:30::-;;;;;;;;;;;;;;;;2360:281;;;;;;;;;;-1:-1:-1;2360:281:0;;;;;:::i;:::-;;:::i;8581:31::-;;;;;;;;;;;;;;;;27746:182;;;;;;;;;;;;;:::i;28547:675::-;;;;;;;;;;-1:-1:-1;28547:675:0;;;;;:::i;:::-;;:::i;13324:126::-;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;13412:23:0;;;::::1;;::::0;;;:17:::1;:23;::::0;;;;:30;;-1:-1:-1;;13412:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;13324:126::o;3050:100::-;3104:13;3137:5;3130:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3050:100;:::o;4030:194::-;4138:4;4155:39;1376:10;4178:7;4187:6;4155:8;:39::i;:::-;-1:-1:-1;4212:4:0;4030:194;;;;;:::o;4232:529::-;4372:4;4389:36;4399:6;4407:9;4418:6;4389:9;:36::i;:::-;-1:-1:-1;;;;;4465:19:0;;4438:24;4465:19;;;:11;:19;;;;;;;;1376:10;4465:33;;;;;;;;4531:26;;;;4509:116;;;;-1:-1:-1;;;4509:116:0;;5915:2:1;4509:116:0;;;5897:21:1;5954:2;5934:18;;;5927:30;5993:34;5973:18;;;5966:62;-1:-1:-1;;;6044:18:1;;;6037:38;6092:19;;4509:116:0;5713:404:1;4509:116:0;4661:57;4670:6;1376:10;4711:6;4692:16;:25;4661:8;:57::i;:::-;4749:4;4742:11;;;4232:529;;;;;;:::o;12344:312::-;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;12481:4:::1;12473;12452:13;3459:12:::0;;;3371:108;12452:13:::1;:17;::::0;12468:1:::1;12452:17;:::i;:::-;12451:26;;;;:::i;:::-;12450:35;;;;:::i;:::-;12440:6;:45;;12418:136;;;::::0;-1:-1:-1;;;12418:136:0;;6851:2:1;12418:136:0::1;::::0;::::1;6833:21:1::0;6890:2;6870:18;;;6863:30;6929:34;6909:18;;;6902:62;-1:-1:-1;;;6980:18:1;;;6973:39;7029:19;;12418:136:0::1;6649:405:1::0;12418:136:0::1;12580:19;:6:::0;12590:8:::1;12580:19;:::i;:::-;12565:12;:34:::0;;;12615:33:::1;::::0;2350:25:1;;;12615:33:0::1;::::0;2338:2:1;2323:18;12615:33:0::1;;;;;;;;12344:312:::0;:::o;15393:524::-;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;15570:15:::1;:31:::0;;;15612:15:::1;:31:::0;;;15654:9:::1;:19:::0;;;15684:10:::1;:21:::0;;;15697:8;15666:7;15744:46:::1;15630:13:::0;15588;15744:46:::1;:::i;:::-;:71;;;;:::i;:::-;:97;;;;:::i;:::-;15716:12;:125:::0;;;15876:1:::1;-1:-1:-1::0;15860:17:0::1;15852:57;;;::::0;-1:-1:-1;;;15852:57:0;;7391:2:1;15852:57:0::1;::::0;::::1;7373:21:1::0;7430:2;7410:18;;;7403:30;7469:29;7449:18;;;7442:57;7516:18;;15852:57:0::1;7189:351:1::0;15852:57:0::1;15393:524:::0;;;;:::o;4769:290::-;1376:10;4882:4;4971:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;4971:34:0;;;;;;;;;;4882:4;;4899:130;;4949:7;;4971:47;;5008:10;;4971:47;:::i;:::-;4899:8;:130::i;26736:471::-;2115:6;;26841:10;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;26890:4:::1;-1:-1:-1::0;;;;;26872:23:0;::::1;::::0;26864:61:::1;;;::::0;-1:-1:-1;;;26864:61:0;;7747:2:1;26864:61:0::1;::::0;::::1;7729:21:1::0;7786:2;7766:18;;;7759:30;7825:27;7805:18;;;7798:55;7870:18;;26864:61:0::1;7545:349:1::0;26864:61:0::1;-1:-1:-1::0;;;;;26944:20:0;::::1;26936:59;;;::::0;-1:-1:-1;;;26936:59:0;;8101:2:1;26936:59:0::1;::::0;::::1;8083:21:1::0;8140:2;8120:18;;;8113:30;8179:28;8159:18;;;8152:56;8225:18;;26936:59:0::1;7899:350:1::0;26936:59:0::1;27033:39;::::0;-1:-1:-1;;;27033:39:0;;27066:4:::1;27033:39;::::0;::::1;1570:51:1::0;27006:24:0::1;::::0;-1:-1:-1;;;;;27033:24:0;::::1;::::0;::::1;::::0;1543:18:1;;27033:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27091:46;::::0;-1:-1:-1;;;27091:46:0;;-1:-1:-1;;;;;8635:32:1;;;27091:46:0::1;::::0;::::1;8617:51:1::0;8684:18;;;8677:34;;;27006:66:0;;-1:-1:-1;27091:23:0;;::::1;::::0;::::1;::::0;8590:18:1;;27091:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27153;::::0;;-1:-1:-1;;;;;8635:32:1;;8617:51;;8699:2;8684:18;;8677:34;;;27083:54:0;;-1:-1:-1;27153:46:0::1;::::0;8590:18:1;27153:46:0::1;;;;;;;26853:354;26736:471:::0;;;;:::o;28179:260::-;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28283:30:0;::::1;28261:116;;;::::0;-1:-1:-1;;;28261:116:0;;9174:2:1;28261:116:0::1;::::0;::::1;9156:21:1::0;9213:2;9193:18;;;9186:30;9252:34;9232:18;;;9225:62;-1:-1:-1;;;9303:18:1;;;9296:34;9347:19;;28261:116:0::1;8972:400:1::0;28261:116:0::1;28388:15;:43:::0;;-1:-1:-1;;;;;;28388:43:0::1;-1:-1:-1::0;;;;;28388:43:0;;;::::1;::::0;;;::::1;::::0;;28179:260::o;27215:461::-;27357:18;;27329:24;27347:4;27329:9;:24::i;:::-;:46;;27307:160;;;;;-1:-1:-1;;;27307:160:0;;9579:2:1;27307:160:0;;;9561:21:1;9598:18;;;9591:30;;;;9657:34;9637:18;;;9630:62;9728:34;9708:18;;;9701:62;9780:19;;27307:160:0;9377:428:1;27307:160:0;27482:33;27493:8;27503:4;27509:5;27482:10;:33::i;:::-;27478:191;;;27532:8;:15;;-1:-1:-1;;27532:15:0;27543:4;27532:15;;;27562:10;:8;:10::i;:::-;27587:8;:16;;-1:-1:-1;;27587:16:0;;;27625:32;;27641:15;2350:25:1;;27625:32:0;;2338:2:1;2323:18;27625:32:0;;;;;;;27478:191;27215:461;;;:::o;27936:235::-;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28035:25:0;::::1;28013:106;;;::::0;-1:-1:-1;;;28013:106:0;;10012:2:1;28013:106:0::1;::::0;::::1;9994:21:1::0;10051:2;10031:18;;;10024:30;10090:33;10070:18;;;10063:61;10141:18;;28013:106:0::1;9810:355:1::0;28013:106:0::1;28130:10;:33:::0;;-1:-1:-1;;;;;28130:33:0;;::::1;;;-1:-1:-1::0;;;;;;28130:33:0;;::::1;::::0;;;::::1;::::0;;27936:235::o;3487:143::-;-1:-1:-1;;;;;3604:18:0;3577:7;3604:18;;;;;;;;;;;;3487:143::o;2202:150::-;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;2295:6:::1;::::0;2274:40:::1;::::0;2311:1:::1;::::0;-1:-1:-1;;;;;2295:6:0::1;::::0;2274:40:::1;::::0;2311:1;;2274:40:::1;2325:6;:19:::0;;-1:-1:-1;;;;;;2325:19:0::1;::::0;;2202:150::o;12220:116::-;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;12274:15:::1;:23:::0;;-1:-1:-1;;;;12274:23:0::1;::::0;;12313:15:::1;::::0;::::1;::::0;12292:5:::1;::::0;12313:15:::1;12220:116::o:0;14436:336::-;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;14558:4:::1;14553:155;;14615:6;::::0;-1:-1:-1;;;;;14615:6:0;;::::1;14605:16:::0;;::::1;::::0;14579:117:::1;;;::::0;-1:-1:-1;;;14579:117:0;;10372:2:1;14579:117:0::1;::::0;::::1;10354:21:1::0;10411:2;10391:18;;;10384:30;10450:34;10430:18;;;10423:62;-1:-1:-1;;;10501:18:1;;;10494:37;10548:19;;14579:117:0::1;10170:403:1::0;14579:117:0::1;-1:-1:-1::0;;;;;14718:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;14718:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;14436:336::o;3158:104::-;3214:13;3247:7;3240:14;;;;;:::i;14780:357::-;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;14928:6:::1;::::0;-1:-1:-1;;;;;14928:6:0;;::::1;14920:14:::0;;::::1;::::0;14898:121:::1;;;::::0;-1:-1:-1;;;14898:121:0;;10780:2:1;14898:121:0::1;::::0;::::1;10762:21:1::0;10819:2;10799:18;;;10792:30;10858:34;10838:18;;;10831:62;10929:27;10909:18;;;10902:55;10974:19;;14898:121:0::1;10578:421:1::0;14898:121:0::1;15032:41;15061:4;15067:5;15032:28;:41::i;:::-;15089:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;15089:40:0;::::1;::::0;::::1;::::0;;;::::1;14780:357:::0;;:::o;5067:475::-;1376:10;5185:4;5229:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;5229:34:0;;;;;;;;;;5296:35;;;;5274:122;;;;-1:-1:-1;;;5274:122:0;;11206:2:1;5274:122:0;;;11188:21:1;11245:2;11225:18;;;11218:30;11284:34;11264:18;;;11257:62;-1:-1:-1;;;11335:18:1;;;11328:35;11380:19;;5274:122:0;11004:401:1;5274:122:0;5432:67;1376:10;5455:7;5483:15;5464:16;:34;5432:8;:67::i;:::-;-1:-1:-1;5530:4:0;;5067:475;-1:-1:-1;;;5067:475:0:o;3638:200::-;3749:4;3766:42;1376:10;3790:9;3801:6;3766:9;:42::i;16468:182::-;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16553:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;16553:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;16608:34;;154:41:1;;;16608:34:0::1;::::0;127:18:1;16608:34:0::1;;;;;;;16468:182:::0;;:::o;12664:327::-;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;12804:4:::1;12796;12775:13;3459:12:::0;;;3371:108;12775:13:::1;:17;::::0;12791:1:::1;12775:17;:::i;:::-;12774:26;;;;:::i;:::-;12773:35;;;;:::i;:::-;12763:6;:45;;12741:139;;;::::0;-1:-1:-1;;;12741:139:0;;11612:2:1;12741:139:0::1;::::0;::::1;11594:21:1::0;11651:2;11631:18;;;11624:30;11690:34;11670:18;;;11663:62;-1:-1:-1;;;11741:18:1;;;11734:42;11793:19;;12741:139:0::1;11410:408:1::0;12741:139:0::1;12909:19;:6:::0;12919:8:::1;12909:19;:::i;:::-;12891:15;:37:::0;;;12944:39:::1;::::0;2350:25:1;;;12944:39:0::1;::::0;2338:2:1;2323:18;12944:39:0::1;2204:177:1::0;11935:254:0;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;12003:13:::1;::::0;-1:-1:-1;;;12003:13:0;::::1;;;12002:14;11994:50;;;::::0;-1:-1:-1;;;11994:50:0;;12025:2:1;11994:50:0::1;::::0;::::1;12007:21:1::0;12064:2;12044:18;;;12037:30;12103:25;12083:18;;;12076:53;12146:18;;11994:50:0::1;11823:347:1::0;11994:50:0::1;12055:13;:20:::0;;-1:-1:-1;;;;12086:18:0;-1:-1:-1;;;12086:18:0;;;12137:12:::1;12115:19;:34:::0;12165:16:::1;::::0;::::1;::::0;-1:-1:-1;;12165:16:0::1;11935:254::o:0;13760:428::-;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;13900:6:::1;13879:13;3459:12:::0;;;3371:108;13879:13:::1;:17;::::0;13895:1:::1;13879:17;:::i;:::-;13878:28;;;;:::i;:::-;13865:9;:41;;13843:144;;;::::0;-1:-1:-1;;;13843:144:0;;12377:2:1;13843:144:0::1;::::0;::::1;12359:21:1::0;12416:2;12396:18;;;12389:30;12455:34;12435:18;;;12428:62;-1:-1:-1;;;12506:18:1;;;12499:51;12567:19;;13843:144:0::1;12175:417:1::0;13843:144:0::1;14055:4;14034:13;3459:12:::0;;;3371:108;14034:13:::1;:17;::::0;14050:1:::1;14034:17;:::i;:::-;14033:26;;;;:::i;:::-;14020:9;:39;;13998:141;;;::::0;-1:-1:-1;;;13998:141:0;;12799:2:1;13998:141:0::1;::::0;::::1;12781:21:1::0;12838:2;12818:18;;;12811:30;12877:34;12857:18;;;12850:62;-1:-1:-1;;;12928:18:1;;;12921:50;12988:19;;13998:141:0::1;12597:416:1::0;13998:141:0::1;14150:18;:30:::0;13760:428::o;12999:317::-;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;13137:4:::1;13129;13108:13;3459:12:::0;;;3371:108;13108:13:::1;:17;::::0;13124:1:::1;13108:17;:::i;:::-;13107:26;;;;:::i;:::-;13106:35;;;;:::i;:::-;13096:6;:45;;13074:137;;;::::0;-1:-1:-1;;;13074:137:0;;13220:2:1;13074:137:0::1;::::0;::::1;13202:21:1::0;13259:2;13239:18;;;13232:30;13298:34;13278:18;;;13271:62;-1:-1:-1;;;13349:18:1;;;13342:40;13399:19;;13074:137:0::1;13018:406:1::0;13074:137:0::1;13238:19;:6:::0;13248:8:::1;13238:19;:::i;:::-;13222:13;:35:::0;;;13273::::1;::::0;2350:25:1;;;13273:35:0::1;::::0;2338:2:1;2323:18;13273:35:0::1;2204:177:1::0;15925:535:0;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;16103:16:::1;:32:::0;;;16146:16:::1;:32:::0;;;16189:10:::1;:20:::0;;;16220:11:::1;:22:::0;;;16234:8;16202:7;16282:48:::1;16165:13:::0;16122;16282:48:::1;:::i;:::-;:74;;;;:::i;:::-;:101;;;;:::i;:::-;16253:13;:130:::0;;;16419:1:::1;-1:-1:-1::0;16402:18:0::1;16394:58;;;::::0;-1:-1:-1;;;16394:58:0;;7391:2:1;16394:58:0::1;::::0;::::1;7373:21:1::0;7430:2;7410:18;;;7403:30;7469:29;7449:18;;;7442:57;7516:18;;16394:58:0::1;7189:351:1::0;13458:232:0;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;13580:9:::1;13575:108;13595:18:::0;;::::1;13575:108;;;13667:4;13635:17;:29;13653:7;;13661:1;13653:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;13635:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;13635:29:0;:36;;-1:-1:-1;;13635:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;13615:3;::::1;::::0;::::1;:::i;:::-;;;;13575:108;;2360:281:::0;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2463:22:0;::::1;2441:110;;;::::0;-1:-1:-1;;;2441:110:0;;13903:2:1;2441:110:0::1;::::0;::::1;13885:21:1::0;13942:2;13922:18;;;13915:30;13981:34;13961:18;;;13954:62;-1:-1:-1;;;14032:18:1;;;14025:36;14078:19;;2441:110:0::1;13701:402:1::0;2441:110:0::1;2588:6;::::0;2567:38:::1;::::0;-1:-1:-1;;;;;2567:38:0;;::::1;::::0;2588:6:::1;::::0;2567:38:::1;::::0;2588:6:::1;::::0;2567:38:::1;2616:6;:17:::0;;-1:-1:-1;;;;;;2616:17:0::1;-1:-1:-1::0;;;;;2616:17:0;;;::::1;::::0;;;::::1;::::0;;2360:281::o;27746:182::-;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;27838:82:::1;::::0;27801:12:::1;::::0;27846:10:::1;::::0;27870:21:::1;::::0;27801:12;27838:82;27801:12;27838:82;27870:21;27846:10;27838:82:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28547:675:::0;2115:6;;-1:-1:-1;;;;;2115:6:0;1376:10;2115:22;2107:67;;;;-1:-1:-1;;;2107:67:0;;;;;;;:::i;:::-;28658:7:::1;28643:11;:22;;28621:142;;;::::0;-1:-1:-1;;;28621:142:0;;14520:2:1;28621:142:0::1;::::0;::::1;14502:21:1::0;14559:2;14539:18;;;14532:30;14598:34;14578:18;;;14571:62;14669:34;14649:18;;;14642:62;-1:-1:-1;;;14720:19:1;;;14713:37;14767:19;;28621:142:0::1;14318:474:1::0;28621:142:0::1;28800:16;::::0;;28814:1:::1;28800:16:::0;;;;;::::1;::::0;;28776:21:::1;::::0;28800:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;28837:9:0::1;::::0;:16:::1;::::0;;-1:-1:-1;;;28837:16:0;;;;28776:40;;-1:-1:-1;;;;;;28837:9:0;;::::1;::::0;:14:::1;::::0;-1:-1:-1;28837:16:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:9;:16:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28827:4;28832:1;28827:7;;;;;;;;:::i;:::-;;;;;;:26;-1:-1:-1::0;;;;;28827:26:0::1;;;-1:-1:-1::0;;;;;28827:26:0::1;;;::::0;::::1;28882:4;28864;28869:1;28864:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28864:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;28926:9:::1;::::0;:243:::1;::::0;-1:-1:-1;;;28926:243:0;;:9;::::1;::::0;:60:::1;::::0;29008:11;;28926:243:::1;::::0;:9:::1;::::0;29094:4;;29121:6:::1;::::0;29143:15:::1;::::0;28926:243:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;29185:29;29202:11;29185:29;;;;2350:25:1::0;;2338:2;2323:18;;2204:177;29185:29:0::1;;;;;;;;28610:612;28547:675:::0;:::o;7091:380::-;-1:-1:-1;;;;;7227:19:0;;7219:68;;;;-1:-1:-1;;;7219:68:0;;16368:2:1;7219:68:0;;;16350:21:1;16407:2;16387:18;;;16380:30;16446:34;16426:18;;;16419:62;-1:-1:-1;;;16497:18:1;;;16490:34;16541:19;;7219:68:0;16166:400:1;7219:68:0;-1:-1:-1;;;;;7306:21:0;;7298:68;;;;-1:-1:-1;;;7298:68:0;;16773:2:1;7298:68:0;;;16755:21:1;16812:2;16792:18;;;16785:30;16851:34;16831:18;;;16824:62;-1:-1:-1;;;16902:18:1;;;16895:32;16944:19;;7298:68:0;16571:398:1;7298:68:0;-1:-1:-1;;;;;7379:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;7431:32;;2350:25:1;;;7431:32:0;;2323:18:1;7431:32:0;;;;;;;;7091:380;;;:::o;16658:5078::-;-1:-1:-1;;;;;16790:18:0;;16782:68;;;;-1:-1:-1;;;16782:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16869:16:0;;16861:64;;;;-1:-1:-1;;;16861:64:0;;;;;;;:::i;:::-;16953:1;16944:6;:10;16936:52;;;;-1:-1:-1;;;16936:52:0;;17986:2:1;16936:52:0;;;17968:21:1;18025:2;18005:18;;;17998:30;18064:31;18044:18;;;18037:59;18113:18;;16936:52:0;17784:353:1;16936:52:0;17006:13;;-1:-1:-1;;;17006:13:0;;;;17001:183;;-1:-1:-1;;;;;17062:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;17091:23:0;;;;;;:19;:23;;;;;;;;17062:52;17036:136;;;;-1:-1:-1;;;17036:136:0;;18344:2:1;17036:136:0;;;18326:21:1;18383:2;18363:18;;;18356:30;-1:-1:-1;;;18402:18:1;;;18395:52;18464:18;;17036:136:0;18142:346:1;17036:136:0;17200:16;;:20;17196:251;;-1:-1:-1;;;;;17264:23:0;;;;;;:17;:23;;;;;;;;17263:24;;:41;;-1:-1:-1;2053:6:0;;-1:-1:-1;;;;;17291:13:0;;;2053:6;;17291:13;17263:41;:66;;;-1:-1:-1;;;;;;17308:21:0;;17322:6;17308:21;17263:66;17237:198;;;;-1:-1:-1;;;17237:198:0;;18695:2:1;17237:198:0;;;18677:21:1;18734:2;18714:18;;;18707:30;18773:34;18753:18;;;18746:62;18844:34;18824:18;;;18817:62;-1:-1:-1;;;18895:19:1;;;18888:37;18942:19;;17237:198:0;18493:474:1;17237:198:0;17463:15;;-1:-1:-1;;;17463:15:0;;;;17459:1496;;;2053:6;;-1:-1:-1;;;;;17517:15:0;;;2053:6;;17517:15;;;;:49;;-1:-1:-1;2053:6:0;;-1:-1:-1;;;;;17553:13:0;;;2053:6;;17553:13;;17517:49;:86;;;;-1:-1:-1;;;;;;17587:16:0;;;;17517:86;:128;;;;-1:-1:-1;;;;;;17624:21:0;;17638:6;17624:21;;17517:128;:175;;;;-1:-1:-1;;;;;;17667:25:0;;;;;;:19;:25;;;;;;;;17666:26;17517:175;:220;;;;-1:-1:-1;;;;;;17714:23:0;;;;;;:19;:23;;;;;;;;17713:24;17517:220;17495:1449;;;-1:-1:-1;;;;;17826:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;17883:35:0;;;;;;:31;:35;;;;;;;;17882:36;17826:92;17800:1129;;;18005:12;;17995:6;:22;;17961:148;;;;-1:-1:-1;;;17961:148:0;;19174:2:1;17961:148:0;;;19156:21:1;19213:2;19193:18;;;19186:30;19252:34;19232:18;;;19225:62;-1:-1:-1;;;19303:18:1;;;19296:38;19351:19;;17961:148:0;18972:404:1;17961:148:0;18192:15;;18175:13;18185:2;18175:9;:13::i;:::-;18166:22;;:6;:22;:::i;:::-;:41;;18132:151;;;;-1:-1:-1;;;18132:151:0;;19583:2:1;18132:151:0;;;19565:21:1;19622:2;19602:18;;;19595:30;-1:-1:-1;;;19641:18:1;;;19634:54;19705:18;;18132:151:0;19381:348:1;18132:151:0;17800:1129;;;-1:-1:-1;;;;;18381:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;18436:37:0;;;;;;:31;:37;;;;;;;;18435:38;18381:92;18355:574;;;18560:13;;18550:6;:23;;18516:151;;;;-1:-1:-1;;;18516:151:0;;19936:2:1;18516:151:0;;;19918:21:1;19975:2;19955:18;;;19948:30;20014:34;19994:18;;;19987:62;-1:-1:-1;;;20065:18:1;;;20058:40;20115:19;;18516:151:0;19734:406:1;18355:574:0;-1:-1:-1;;;;;18698:35:0;;;;;;:31;:35;;;;;;;;18693:236;;18818:15;;18801:13;18811:2;18801:9;:13::i;:::-;18792:22;;:6;:22;:::i;:::-;:41;;18758:151;;;;-1:-1:-1;;;18758:151:0;;19583:2:1;18758:151:0;;;19565:21:1;19622:2;19602:18;;;19595:30;-1:-1:-1;;;19641:18:1;;;19634:54;19705:18;;18758:151:0;19381:348:1;18758:151:0;18967:28;18998:24;19016:4;18998:9;:24::i;:::-;19074:18;;18967:55;;-1:-1:-1;19050:42:0;;;;;;;19123:35;;-1:-1:-1;19147:11:0;;-1:-1:-1;;;19147:11:0;;;;19123:35;:61;;;;-1:-1:-1;19176:8:0;;;;19175:9;19123:61;:110;;;;-1:-1:-1;;;;;;19202:31:0;;;;;;:25;:31;;;;;;;;19201:32;19123:110;:153;;;;-1:-1:-1;;;;;;19251:25:0;;;;;;:19;:25;;;;;;;;19250:26;19123:153;:194;;;;-1:-1:-1;;;;;;19294:23:0;;;;;;:19;:23;;;;;;;;19293:24;19123:194;19105:326;;;19344:8;:15;;-1:-1:-1;;19344:15:0;19355:4;19344:15;;;19376:10;:8;:10::i;:::-;19403:8;:16;;-1:-1:-1;;19403:16:0;;;19105:326;19458:4;19562:31;19584:4;19590:2;19562:21;:31::i;:::-;19558:79;;;-1:-1:-1;19620:5:0;19558:79;19657:12;19762:7;19758:1919;;;22412:16;;22397:12;:31;19844:71;;;;-1:-1:-1;;;;;;19884:31:0;;;;;;:25;:31;;;;;;;;19844:71;:122;;;;-1:-1:-1;;;;;;19937:29:0;;;;;;:25;:29;;;;;;;;19936:30;19844:122;:159;;;;;20002:1;19987:12;;:16;19844:159;19822:1706;;;-1:-1:-1;;;;;20043:21:0;;;;;;:17;:21;;;;;;;;20038:185;;-1:-1:-1;;;;;20089:21:0;;;;;;:17;:21;;;;;:28;;-1:-1:-1;;20089:28:0;20113:4;20089:28;;;;;;20140:10;:15;;20113:4;;20140:10;;:15;;20113:4;;20140:15;:::i;:::-;;;;-1:-1:-1;;20183:20:0;;-1:-1:-1;;;;;1588:32:1;;1570:51;;20183:20:0;;1558:2:1;1543:18;20183:20:0;;;;;;;20038:185;20266:3;20251:11;:6;20260:2;20251:11;:::i;:::-;20250:19;;;;:::i;:::-;20243:26;;20337:12;;20318:15;;20311:4;:22;;;;:::i;:::-;20310:39;;;;:::i;:::-;20288:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;20417:12:0;;20398:15;;20391:22;;:4;:22;:::i;:::-;20390:39;;;;:::i;:::-;20368:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;20485:12:0;;20472:9;;20465:16;;:4;:16;:::i;:::-;20464:33;;;;:::i;:::-;20448:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;20555:12:0;;20541:10;;20534:17;;:4;:17;:::i;:::-;20533:34;;;;:::i;:::-;20516:13;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;19822:1706:0;;-1:-1:-1;19822:1706:0;;-1:-1:-1;;;;;20630:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;20679:1;20663:13;;:17;20630:50;20626:902;;;20735:3;20718:13;;20709:6;:22;;;;:::i;:::-;20708:30;;;;:::i;:::-;20701:37;;20807:13;;20787:16;;20780:4;:23;;;;:::i;:::-;20779:41;;;;:::i;:::-;20757:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;20889:13:0;;20869:16;;20862:23;;:4;:23;:::i;:::-;20861:41;;;;:::i;:::-;20839:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;20959:13:0;;20945:10;;20938:17;;:4;:17;:::i;:::-;20937:35;;;;:::i;:::-;20921:12;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;21031:13:0;;21016:11;;21009:18;;:4;:18;:::i;20626:902::-;-1:-1:-1;;;;;21106:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;21156:1;21141:12;;:16;21106:51;21102:426;;;21211:3;21195:12;;21186:6;:21;;;;:::i;:::-;21185:29;;;;:::i;:::-;21178:36;;21282:12;;21263:15;;21256:4;:22;;;;:::i;:::-;21255:39;;;;:::i;:::-;21233:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;21362:12:0;;21343:15;;21336:22;;:4;:22;:::i;:::-;21335:39;;;;:::i;:::-;21313:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;21430:12:0;;21417:9;;21410:16;;:4;:16;:::i;:::-;21409:33;;;;:::i;:::-;21393:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;21500:12:0;;21486:10;;21479:17;;:4;:17;:::i;:::-;21478:34;;;;:::i;:::-;21461:13;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;21102:426:0;21548:8;;21544:91;;21577:42;21593:4;21607;21614;21577:15;:42::i;:::-;21651:14;21661:4;21651:14;;:::i;:::-;;;19758:1919;21695:33;21711:4;21717:2;21721:6;21695:15;:33::i;:::-;16771:4965;;;;16658:5078;;;:::o;23417:1600::-;23568:10;23503:4;23548:31;;;:19;:31;;;;;;23503:4;;23548:31;;23543:1467;;23634:1;23618:13;;:17;:62;;;;;23667:13;;23639:24;23657:4;23639:9;:24::i;:::-;:41;;23618:62;23596:167;;;23715:32;23721:10;23733:13;;23715:5;:32::i;:::-;-1:-1:-1;23793:1:0;23777:13;:17;;;23819:4;;23864:24;23882:4;23864:9;:24::i;:::-;23838:50;;23903:25;24007:12;;23969:18;;23931;;:56;;;;:::i;:::-;:88;;;;:::i;:::-;23903:116;-1:-1:-1;24040:20:0;;;:46;;-1:-1:-1;24064:22:0;;24040:46;24036:99;;;24114:5;24107:12;;;;;;;24036:99;24173:18;;:22;;24194:1;24173:22;:::i;:::-;24155:15;:40;24151:121;;;24234:18;;:22;;24255:1;24234:22;:::i;:::-;24216:40;;24151:121;24295:7;24288:14;;;;;;;23543:1467;24339:11;;24335:204;;24371:23;24377:7;24386;24371:5;:23::i;:::-;-1:-1:-1;24423:5:0;24335:204;;;-1:-1:-1;24469:13:0;:20;;-1:-1:-1;;;;;;24469:20:0;-1:-1:-1;;;;;24469:20:0;;;;;-1:-1:-1;24335:204:0;24553:23;24579:24;24597:4;24579:9;:24::i;25025:1703::-;25084:1;25068:13;;:17;:62;;;;;25117:13;;25089:24;25107:4;25089:9;:24::i;:::-;:41;;25068:62;25064:130;;;25147:35;25161:4;25168:13;;25147:5;:35::i;:::-;25220:1;25204:13;:17;;;25260:24;25278:4;25260:9;:24::i;:::-;25234:50;;25295:25;25391:12;;25357:18;;25323;;:52;;;;:::i;:::-;:80;;;;:::i;:::-;25295:108;-1:-1:-1;25420:20:0;;;:46;;-1:-1:-1;25444:22:0;;25420:46;25416:85;;;25483:7;;25025:1703::o;25416:85::-;25535:18;;:22;;25556:1;25535:22;:::i;:::-;25517:15;:40;25513:113;;;25592:18;;:22;;25613:1;25592:22;:::i;:::-;25574:40;;25513:113;25638:12;25712:23;25825:1;25792:17;25757:18;;25739:15;:36;;;;:::i;:::-;25738:71;;;;:::i;:::-;:88;;;;:::i;:::-;25712:114;-1:-1:-1;25839:51:0;25856:33;25712:114;25856:15;:33;:::i;:::-;25839:16;:51::i;:::-;26102:18;;25924:21;;;;25903:18;;26102:22;;26123:1;;26102:22;:::i;:::-;26081:44;;:17;:44;:::i;:::-;26045:18;;26032:31;;:10;:31;:::i;:::-;26031:95;;;;:::i;:::-;26005:121;;26137:16;26242:1;26221:18;;:22;;;;:::i;:::-;26200:44;;:17;:44;:::i;:::-;26170:12;;26157:25;;:10;:25;:::i;:::-;26156:89;;;;:::i;:::-;26137:108;-1:-1:-1;26277:26:0;26137:108;26277:15;:26;:::i;:::-;26258:45;;;;:::i;:::-;26337:1;26316:18;:22;;;26349:18;:22;;;26382:12;:16;;;26409:13;:17;26258:45;-1:-1:-1;26443:19:0;;;;;:42;;;26484:1;26466:15;:19;26443:42;26439:121;;;26502:46;26515:15;26532;26502:12;:46::i;:::-;26594:15;;26586:50;;-1:-1:-1;;;;;26594:15:0;;;;26623:8;;26586:50;;;;26623:8;26594:15;26586:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26669:10:0;;26661:59;;26572:64;;-1:-1:-1;26669:10:0;;;-1:-1:-1;;;;;26669:10:0;;26694:21;;26661:59;;;;26694:21;26669:10;26661:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25025:1703:0:o;15145:240::-;-1:-1:-1;;;;;15228:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;15228:39:0;;;;;;;15280;15228:31;:39;15280:26;:39::i;22444:448::-;-1:-1:-1;;;;;22616:25:0;;22544:4;22616:25;;;:19;:25;;;;;;22544:4;;;;22616:25;;;:52;;-1:-1:-1;;;;;;22645:23:0;;;;;;:19;:23;;;;;;;;22616:52;22612:247;;;22696:4;22685:15;;22612:247;;;22722:13;;-1:-1:-1;;;;;22722:13:0;:27;22718:141;;22773:13;;22766:50;;-1:-1:-1;;;22766:50:0;;-1:-1:-1;;;;;20536:15:1;;;22766:50:0;;;20518:34:1;20588:15;;;20568:18;;;20561:43;20620:18;;;20613:34;;;22773:13:0;;;;22766:34;;20453:18:1;;22766:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22842:5;22831:16;;22718:141;-1:-1:-1;22876:8:0;22444:448;-1:-1:-1;;;22444:448:0:o;5550:651::-;-1:-1:-1;;;;;5690:20:0;;5682:70;;;;-1:-1:-1;;;5682:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5771:23:0;;5763:71;;;;-1:-1:-1;;;5763:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5871:17:0;;5847:21;5871:17;;;;;;;;;;;5921:23;;;;5899:111;;;;-1:-1:-1;;;5899:111:0;;20860:2:1;5899:111:0;;;20842:21:1;20899:2;20879:18;;;20872:30;20938:34;20918:18;;;20911:62;-1:-1:-1;;;20989:18:1;;;20982:36;21035:19;;5899:111:0;20658:402:1;5899:111:0;-1:-1:-1;;;;;6046:17:0;;;:9;:17;;;;;;;;;;;6066:22;;;6046:42;;6110:20;;;;;;;;:30;;6082:6;;6046:9;6110:30;;6082:6;;6110:30;:::i;:::-;;;;;;;;6175:9;-1:-1:-1;;;;;6158:35:0;6167:6;-1:-1:-1;;;;;6158:35:0;;6186:6;6158:35;;;;2350:25:1;;2338:2;2323:18;;2204:177;6158:35:0;;;;;;;;5671:530;5550:651;;;:::o;6533:550::-;-1:-1:-1;;;;;6617:21:0;;6609:67;;;;-1:-1:-1;;;6609:67:0;;21267:2:1;6609:67:0;;;21249:21:1;21306:2;21286:18;;;21279:30;21345:34;21325:18;;;21318:62;-1:-1:-1;;;21396:18:1;;;21389:31;21437:19;;6609:67:0;21065:397:1;6609:67:0;-1:-1:-1;;;;;6712:18:0;;6687:22;6712:18;;;;;;;;;;;6749:24;;;;6741:71;;;;-1:-1:-1;;;6741:71:0;;21669:2:1;6741:71:0;;;21651:21:1;21708:2;21688:18;;;21681:30;21747:34;21727:18;;;21720:62;-1:-1:-1;;;21798:18:1;;;21791:32;21840:19;;6741:71:0;21467:398:1;6741:71:0;-1:-1:-1;;;;;6848:18:0;;:9;:18;;;;;;;;;;;6869:23;;;6848:44;;6987:12;:22;;;;;;;7038:37;2350:25:1;;;6848:9:0;;:18;7038:37;;2323:18:1;7038:37:0;2204:177:1;21744:571:0;21894:16;;;21908:1;21894:16;;;;;;;;21870:21;;21894:16;;;;;;;;;;-1:-1:-1;21894:16:0;21870:40;;21939:4;21921;21926:1;21921:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21921:23:0;;;:7;;;;;;;;;;:23;;;;21965:9;;:16;;;-1:-1:-1;;;21965:16:0;;;;:9;;;;;:14;;:16;;;;;21921:7;;21965:16;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21955:4;21960:1;21955:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21955:26:0;;;:7;;;;;;;;;:26;22026:9;;21994:56;;22011:4;;22026:9;22038:11;21994:8;:56::i;:::-;22089:9;;:218;;-1:-1:-1;;;22089:218:0;;-1:-1:-1;;;;;22089:9:0;;;;:60;;:218;;22164:11;;22089:9;;22234:4;;22261;;22281:15;;22089:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21799:516;21744:571;:::o;22900:509::-;23080:9;;23048:56;;23065:4;;-1:-1:-1;;;;;23080:9:0;23092:11;23048:8;:56::i;:::-;23147:9;;:254;;-1:-1:-1;;;23147:254:0;;23213:4;23147:254;;;22798:34:1;22848:18;;;22841:34;;;23147:9:0;22891:18:1;;;22884:34;;;22934:18;;;22927:34;23353:6:0;22977:19:1;;;22970:44;23375:15:0;23030:19:1;;;23023:35;-1:-1:-1;;;;;23147:9:0;;;;:25;;23180:9;;22732:19:1;;23147:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;22900:509;;:::o;14196:232::-;-1:-1:-1;;;;;14309:39:0;;;;;;:31;:39;;;;;;;;;:52;;-1:-1:-1;;14309:52:0;;;;;;;;;;14377:43;;23548:51:1;;;23615:18;;;23608:50;14377:43:0;;23521:18:1;14377:43:0;23380:284:1;206:131;-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:548::-;964:4;993:2;1022;1011:9;1004:21;1054:6;1048:13;1097:6;1092:2;1081:9;1077:18;1070:34;1122:1;1132:140;1146:6;1143:1;1140:13;1132:140;;;1241:14;;;1237:23;;1231:30;1207:17;;;1226:2;1203:26;1196:66;1161:10;;1132:140;;;1136:3;1321:1;1316:2;1307:6;1296:9;1292:22;1288:31;1281:42;1391:2;1384;1380:7;1375:2;1367:6;1363:15;1359:29;1348:9;1344:45;1340:54;1332:62;;;;852:548;;;;:::o;1632:315::-;1700:6;1708;1761:2;1749:9;1740:7;1736:23;1732:32;1729:52;;;1777:1;1774;1767:12;1729:52;1816:9;1803:23;1835:31;1860:5;1835:31;:::i;:::-;1885:5;1937:2;1922:18;;;;1909:32;;-1:-1:-1;;;1632:315:1:o;1952:247::-;2011:6;2064:2;2052:9;2043:7;2039:23;2035:32;2032:52;;;2080:1;2077;2070:12;2032:52;2119:9;2106:23;2138:31;2163:5;2138:31;:::i;2386:456::-;2463:6;2471;2479;2532:2;2520:9;2511:7;2507:23;2503:32;2500:52;;;2548:1;2545;2538:12;2500:52;2587:9;2574:23;2606:31;2631:5;2606:31;:::i;:::-;2656:5;-1:-1:-1;2713:2:1;2698:18;;2685:32;2726:33;2685:32;2726:33;:::i;:::-;2386:456;;2778:7;;-1:-1:-1;;;2832:2:1;2817:18;;;;2804:32;;2386:456::o;2847:180::-;2906:6;2959:2;2947:9;2938:7;2934:23;2930:32;2927:52;;;2975:1;2972;2965:12;2927:52;-1:-1:-1;2998:23:1;;2847:180;-1:-1:-1;2847:180:1:o;3032:385::-;3118:6;3126;3134;3142;3195:3;3183:9;3174:7;3170:23;3166:33;3163:53;;;3212:1;3209;3202:12;3163:53;-1:-1:-1;;3235:23:1;;;3305:2;3290:18;;3277:32;;-1:-1:-1;3356:2:1;3341:18;;3328:32;;3407:2;3392:18;3379:32;;-1:-1:-1;3032:385:1;-1:-1:-1;3032:385:1:o;3819:388::-;3887:6;3895;3948:2;3936:9;3927:7;3923:23;3919:32;3916:52;;;3964:1;3961;3954:12;3916:52;4003:9;3990:23;4022:31;4047:5;4022:31;:::i;:::-;4072:5;-1:-1:-1;4129:2:1;4114:18;;4101:32;4142:33;4101:32;4142:33;:::i;4212:750::-;4304:6;4312;4320;4373:2;4361:9;4352:7;4348:23;4344:32;4341:52;;;4389:1;4386;4379:12;4341:52;4429:9;4416:23;4458:18;4499:2;4491:6;4488:14;4485:34;;;4515:1;4512;4505:12;4485:34;4553:6;4542:9;4538:22;4528:32;;4598:7;4591:4;4587:2;4583:13;4579:27;4569:55;;4620:1;4617;4610:12;4569:55;4660:2;4647:16;4686:2;4678:6;4675:14;4672:34;;;4702:1;4699;4692:12;4672:34;4757:7;4750:4;4740:6;4737:1;4733:14;4729:2;4725:23;4721:34;4718:47;4715:67;;;4778:1;4775;4768:12;4715:67;4809:4;4801:13;;;;-1:-1:-1;4833:6:1;-1:-1:-1;;4874:20:1;;4861:34;4904:28;4861:34;4904:28;:::i;:::-;4951:5;4941:15;;;4212:750;;;;;:::o;4967:356::-;5169:2;5151:21;;;5188:18;;;5181:30;5247:34;5242:2;5227:18;;5220:62;5314:2;5299:18;;4967:356::o;5328:380::-;5407:1;5403:12;;;;5450;;;5471:61;;5525:4;5517:6;5513:17;5503:27;;5471:61;5578:2;5570:6;5567:14;5547:18;5544:38;5541:161;;5624:10;5619:3;5615:20;5612:1;5605:31;5659:4;5656:1;5649:15;5687:4;5684:1;5677:15;5541:161;;5328:380;;;:::o;6122:127::-;6183:10;6178:3;6174:20;6171:1;6164:31;6214:4;6211:1;6204:15;6238:4;6235:1;6228:15;6254:168;6327:9;;;6358;;6375:15;;;6369:22;;6355:37;6345:71;;6396:18;;:::i;6427:217::-;6467:1;6493;6483:132;;6537:10;6532:3;6528:20;6525:1;6518:31;6572:4;6569:1;6562:15;6600:4;6597:1;6590:15;6483:132;-1:-1:-1;6629:9:1;;6427:217::o;7059:125::-;7124:9;;;7145:10;;;7142:36;;;7158:18;;:::i;8254:184::-;8324:6;8377:2;8365:9;8356:7;8352:23;8348:32;8345:52;;;8393:1;8390;8383:12;8345:52;-1:-1:-1;8416:16:1;;8254:184;-1:-1:-1;8254:184:1:o;8722:245::-;8789:6;8842:2;8830:9;8821:7;8817:23;8813:32;8810:52;;;8858:1;8855;8848:12;8810:52;8890:9;8884:16;8909:28;8931:5;8909:28;:::i;13429:127::-;13490:10;13485:3;13481:20;13478:1;13471:31;13521:4;13518:1;13511:15;13545:4;13542:1;13535:15;13561:135;13600:3;13621:17;;;13618:43;;13641:18;;:::i;:::-;-1:-1:-1;13688:1:1;13677:13;;13561:135::o;14929:251::-;14999:6;15052:2;15040:9;15031:7;15027:23;15023:32;15020:52;;;15068:1;15065;15058:12;15020:52;15100:9;15094:16;15119:31;15144:5;15119:31;:::i;15185:461::-;15238:3;15276:5;15270:12;15303:6;15298:3;15291:19;15329:4;15358:2;15353:3;15349:12;15342:19;;15395:2;15388:5;15384:14;15416:1;15426:195;15440:6;15437:1;15434:13;15426:195;;;15505:13;;-1:-1:-1;;;;;15501:39:1;15489:52;;15561:12;;;;15596:15;;;;15537:1;15455:9;15426:195;;;-1:-1:-1;15637:3:1;;15185:461;-1:-1:-1;;;;;15185:461:1:o;15651:510::-;15922:6;15911:9;15904:25;15965:3;15960:2;15949:9;15945:18;15938:31;15885:4;15986:57;16038:3;16027:9;16023:19;16015:6;15986:57;:::i;:::-;-1:-1:-1;;;;;16079:32:1;;;;16074:2;16059:18;;16052:60;-1:-1:-1;16143:2:1;16128:18;16121:34;15978:65;15651:510;-1:-1:-1;;15651:510:1:o;16974:401::-;17176:2;17158:21;;;17215:2;17195:18;;;17188:30;17254:34;17249:2;17234:18;;17227:62;-1:-1:-1;;;17320:2:1;17305:18;;17298:35;17365:3;17350:19;;16974:401::o;17380:399::-;17582:2;17564:21;;;17621:2;17601:18;;;17594:30;17660:34;17655:2;17640:18;;17633:62;-1:-1:-1;;;17726:2:1;17711:18;;17704:33;17769:3;17754:19;;17380:399::o;20145:128::-;20212:9;;;20233:11;;;20230:37;;;20247:18;;:::i;21870:582::-;22169:6;22158:9;22151:25;22212:6;22207:2;22196:9;22192:18;22185:34;22255:3;22250:2;22239:9;22235:18;22228:31;22132:4;22276:57;22328:3;22317:9;22313:19;22305:6;22276:57;:::i;:::-;-1:-1:-1;;;;;22369:32:1;;;;22364:2;22349:18;;22342:60;-1:-1:-1;22433:3:1;22418:19;22411:35;22268:65;21870:582;-1:-1:-1;;;21870:582:1:o;23069:306::-;23157:6;23165;23173;23226:2;23214:9;23205:7;23201:23;23197:32;23194:52;;;23242:1;23239;23232:12;23194:52;23271:9;23265:16;23255:26;;23321:2;23310:9;23306:18;23300:25;23290:35;;23365:2;23354:9;23350:18;23344:25;23334:35;;23069:306;;;;;:::o

Swarm Source

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