ETH Price: $2,292.47 (-2.77%)

Token

Terra Inu (TINU)
 

Overview

Max Total Supply

1,000,000,000,000,000 TINU

Holders

163

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.458985040250215576 TINU

Value
$0.00
0x38ef64162b682703ceb0e425827958e9f5db02c1
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:
TerraInu

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 11 of 11: TINU.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC20.sol";
import "./Ownable.sol";
import "./SafeMath.sol";

import "./IUniswapV2Pair.sol";
import "./IUniswapV2Router02.sol";
import "./IUniswapV2Factory.sol";

/*
    <> Terra Inu <>
    Website - https://terrainu.org/
    Telegram - https://t.me/Terrainueth
*/

contract TerraInu is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;

    mapping (address => bool) private _isBlacklisted;
    bool private _swapping;
    uint256 private _launchTime;

    address private feeWallet;
    
    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;
        
    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public earlySellActive = true;
    
    // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    uint256 public totalFees;
    uint256 private _marketingFee;
    uint256 private _liquidityFee;
    
    uint256 private _tokensForMarketing;
    uint256 private _tokensForLiquidity;
    
    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcludedMaxTransactionAmount;

    // To watch for early sells
    mapping (address => uint256) private _holderFirstBuyTimestamp;

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

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event feeWalletUpdated(address indexed newWallet, address indexed oldWallet);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiquidity);

    constructor() ERC20("Terra Inu", "TINU") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
        
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
        
        uint256 marketingFee = 5;
        uint256 liquidityFee = 3;
        
        uint256 totalSupply = 1e15 * 1e18;
        
        maxTransactionAmount = totalSupply * 9 / 1000;
        maxWallet = totalSupply * 2 / 100;
        swapTokensAtAmount = totalSupply * 15 / 10000;

        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        totalFees = _marketingFee + _liquidityFee;
        
        feeWallet = address(owner()); // set as fee wallet

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, totalSupply);
    }

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        _launchTime = block.timestamp;
    }
    
    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    // disable early selling tax
    function disableEarlySells() external onlyOwner returns (bool) {
        earlySellActive = false;
        return true;
    }
    
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool) {
        transferDelayEnabled = false;
        return true;
    }
    
     // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool) {
  	    require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
  	    require(newAmount <= totalSupply() * 5 / 1000, "Swap amount cannot be higher than 0.5% total supply.");
  	    swapTokensAtAmount = newAmount;
  	    return true;
  	}
    
    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000) / 1e18, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = newNum * 1e18;
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 5 / 1000)/1e18, "Cannot set maxWallet lower than 0.5%");
        maxWallet = newNum * 1e18;
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }
    
    function updateFees(uint256 marketingFee, uint256 liquidityFee) external onlyOwner {
        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        totalFees = _marketingFee + _liquidityFee;
        require(totalFees <= 10, "Must keep fees at 10% or less");
    }

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

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }
    
    function updateFeeWallet(address newWallet) external onlyOwner {
        emit feeWalletUpdated(newWallet, feeWallet);
        feeWallet = newWallet;
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }
    
    function setBlacklisted(address[] memory blacklisted_) public onlyOwner {
        for (uint i = 0; i < blacklisted_.length; i++) {
            if (blacklisted_[i] != uniswapV2Pair && blacklisted_[i] != address(uniswapV2Router)) {
                _isBlacklisted[blacklisted_[i]] = false;
            }
        }
    }
    
    function delBlacklisted(address[] memory blacklisted_) public onlyOwner {
        for (uint i = 0; i < blacklisted_.length; i++) {
            _isBlacklisted[blacklisted_[i]] = false;
        }
    }
    
    function isSniper(address addr) public view returns (bool) {
        return _isBlacklisted[addr];
    }

    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(!_isBlacklisted[from], "Your address has been marked as a sniper, you are unable to transfer or swap.");
        
         if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (block.timestamp <= _launchTime) _isBlacklisted[to] = true;
        
        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !_swapping
            ) {
                if (!tradingActive) {
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }

                // set first time buy timestamp
                if (balanceOf(to) == 0 && _holderFirstBuyTimestamp[to] == 0) {
                    _holderFirstBuyTimestamp[to] = block.timestamp;
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }
                 
                // when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
                
                // when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if (!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
        if (
            canSwap &&
            !_swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            _swapping = true;
            swapBack();
            _swapping = false;
        }

        bool takeFee = !_swapping;

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

        uint256 fees = 0;
        if (takeFee) {
            if (
                automatedMarketMakerPairs[to] 
                && earlySellActive
                && _holderFirstBuyTimestamp[from] != 0 
                && (_holderFirstBuyTimestamp[from] + (24 hours) >= block.timestamp)
            ) {
                uint256 earlyLiquidityFee = 8;
                uint256 earlyMarketingFee = 5;
                uint256 earlyTotalFees = earlyMarketingFee.add(earlyLiquidityFee);

                fees = amount.mul(earlyTotalFees).div(100);
                _tokensForLiquidity += fees * earlyLiquidityFee / earlyTotalFees;
                _tokensForMarketing += fees * earlyMarketingFee / earlyTotalFees;
            } else {
                fees = amount.mul(totalFees).div(100);
                _tokensForLiquidity += fees * _liquidityFee / totalFees;
                _tokensForMarketing += fees * _marketingFee / totalFees;
            }
            
            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] = uniswapV2Router.WETH();

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }
    
    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = _tokensForLiquidity + _tokensForMarketing;
        
        if (contractBalance == 0 || totalTokensToSwap == 0) return;
        if (contractBalance > swapTokensAtAmount) {
          contractBalance = swapTokensAtAmount;
        }
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * _tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        _swapTokensForEth(amountToSwapForETH); 
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div(totalTokensToSwap);
        uint256 ethForLiquidity = ethBalance - ethForMarketing;
        
        _tokensForLiquidity = 0;
        _tokensForMarketing = 0;

        (bool success, ) = address(feeWallet).call{value: ethForMarketing}("");
                
        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            _addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, _tokensForLiquidity);
        }
    }

 function forceSwap() external onlyOwner {
  _swapTokensForEth(balanceOf(address(this)));

  (bool success, ) = address(feeWallet).call{value: address(this).balance}("");
}

function forceSend() external onlyOwner {
  (bool success, ) = address(feeWallet).call{value: address(this).balance}("");
}

    receive() external payable {}
}

File 1 of 11: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 2 of 11: ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./IERC20Metadata.sol";
import "./Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
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;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

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

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    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);
    }

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 3 of 11: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 4 of 11: IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

File 5 of 11: IUniswapV2Factory.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

File 6 of 11: IUniswapV2Pair.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

File 7 of 11: IUniswapV2Router01.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

File 8 of 11: IUniswapV2Router02.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

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

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

File 9 of 11: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 10 of 11: SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"feeWalletUpdated","type":"event"},{"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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"blacklisted_","type":"address[]"}],"name":"delBlacklisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableEarlySells","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earlySellActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"blacklisted_","type":"address[]"}],"name":"setBlacklisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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":"newWallet","type":"address"}],"name":"updateFeeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600f805462010000600160ff19928316811762ffff001916919091179092556011805490911690911790553480156200003c57600080fd5b506040805180820182526009815268546572726120496e7560b81b60208083019182528351808501909452600484526354494e5560e01b9084015281519192916200008a9160039162000692565b508051620000a090600490602084019062000692565b505050620000bd620000b7620003d960201b60201c565b620003dd565b737a250d5630b4cf539739df2c5dacb4c659f2488d620000df8160016200042f565b600680546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b1580156200013457600080fd5b505afa15801562000149573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200016f919062000738565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620001b857600080fd5b505afa158015620001cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f3919062000738565b6040518363ffffffff1660e01b81526004016200021292919062000768565b602060405180830381600087803b1580156200022d57600080fd5b505af115801562000242573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000268919062000738565b600780546001600160a01b0319166001600160a01b03928316179081905562000294911660016200042f565b600754620002ad906001600160a01b03166001620004a9565b600560036d314dc6448d9338c15b0a000000006103e8620002d08260096200083e565b620002dc91906200081d565b600c556064620002ee8260026200083e565b620002fa91906200081d565b600e556127106200030d82600f6200083e565b6200031991906200081d565b600d556013839055601482905562000332828462000802565b6012556200033f620004fd565b600b80546001600160a01b0319166001600160a01b0392909216919091179055620003756200036d620004fd565b60016200050c565b620003823060016200050c565b6200039161dead60016200050c565b620003a76200039f620004fd565b60016200042f565b620003b43060016200042f565b620003c361dead60016200042f565b620003cf3382620005b4565b50505050620008b3565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62000439620003d9565b6001600160a01b03166200044c620004fd565b6001600160a01b0316146200047e5760405162461bcd60e51b815260040162000475906200078d565b60405180910390fd5b6001600160a01b03919091166000908152601860205260409020805460ff1916911515919091179055565b6001600160a01b0382166000818152601a6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6005546001600160a01b031690565b62000516620003d9565b6001600160a01b031662000529620004fd565b6001600160a01b031614620005525760405162461bcd60e51b815260040162000475906200078d565b6001600160a01b03821660008181526017602052604090819020805460ff1916841515179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df790620005a890849062000782565b60405180910390a25050565b6001600160a01b038216620005dd5760405162461bcd60e51b81526004016200047590620007c2565b620005eb600083836200068d565b8060026000828254620005ff919062000802565b90915550506001600160a01b038216600090815260208190526040812080548392906200062e90849062000802565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9062000673908590620007f9565b60405180910390a362000689600083836200068d565b5050565b505050565b828054620006a09062000860565b90600052602060002090601f016020900481019282620006c457600085556200070f565b82601f10620006df57805160ff19168380011785556200070f565b828001600101855582156200070f579182015b828111156200070f578251825591602001919060010190620006f2565b506200071d92915062000721565b5090565b5b808211156200071d576000815560010162000722565b6000602082840312156200074a578081fd5b81516001600160a01b038116811462000761578182fd5b9392505050565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b600082198211156200081857620008186200089d565b500190565b6000826200083957634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156200085b576200085b6200089d565b500290565b6002810460018216806200087557607f821691505b602082108114156200089757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b612b9580620008c36000396000f3fe60806040526004361061023f5760003560e01c806375c5df911161012e578063c8125e45116100ab578063df778d261161006f578063df778d2614610647578063e2f456051461065c578063e884f26014610671578063f2fde38b14610686578063f8b45b05146106a657610246565b8063c8125e45146105bd578063c876d0b9146105dd578063c8c8ebe4146105f2578063d257b34f14610607578063dd62ed3e1461062757610246565b8063a457c2d7116100f2578063a457c2d714610528578063a9059cbb14610548578063bbc0c74214610568578063c02466681461057d578063c18bc1951461059d57610246565b806375c5df91146104a75780638a8c523c146104bc5780638da5cb5b146104d157806395d89b41146104f35780639a7a23d61461050857610246565b8063313ce567116101bc5780636db79437116101805780636db794371461041d57806370a082311461043d578063715018a61461045d578063751039fc146104725780637571336a1461048757610246565b8063313ce5671461038657806339509351146103a85780634a62bb65146103c85780634fbee193146103dd57806366718524146103fd57610246565b806312b77e8a1161020357806312b77e8a146102fa57806313114a9d1461030f57806318160ddd14610331578063203e727e1461034657806323b872dd1461036657610246565b8063056415ca1461024b57806306fdde0314610276578063095ea7b3146102985780630b559c6f146102b85780630f3a325f146102da57610246565b3661024657005b600080fd5b34801561025757600080fd5b506102606106bb565b60405161026d919061235a565b60405180910390f35b34801561028257600080fd5b5061028b610717565b60405161026d9190612365565b3480156102a457600080fd5b506102606102b33660046121b6565b6107a9565b3480156102c457600080fd5b506102d86102d33660046121e1565b6107cb565b005b3480156102e657600080fd5b506102606102f53660046120d5565b610927565b34801561030657600080fd5b506102d8610949565b34801561031b57600080fd5b506103246109ee565b60405161026d91906129bd565b34801561033d57600080fd5b506103246109f4565b34801561035257600080fd5b506102d86103613660046122a2565b6109fa565b34801561037257600080fd5b50610260610381366004612145565b610aa3565b34801561039257600080fd5b5061039b610ad1565b60405161026d9190612a4c565b3480156103b457600080fd5b506102606103c33660046121b6565b610ad6565b3480156103d457600080fd5b50610260610b22565b3480156103e957600080fd5b506102606103f83660046120d5565b610b2b565b34801561040957600080fd5b506102d86104183660046120d5565b610b49565b34801561042957600080fd5b506102d86104383660046122ba565b610be5565b34801561044957600080fd5b506103246104583660046120d5565b610c5d565b34801561046957600080fd5b506102d8610c78565b34801561047e57600080fd5b50610260610cc3565b34801561049357600080fd5b506102d86104a2366004612185565b610d14565b3480156104b357600080fd5b50610260610d7e565b3480156104c857600080fd5b506102d8610d8d565b3480156104dd57600080fd5b506104e6610de1565b60405161026d919061230b565b3480156104ff57600080fd5b5061028b610df0565b34801561051457600080fd5b506102d8610523366004612185565b610dff565b34801561053457600080fd5b506102606105433660046121b6565b610e76565b34801561055457600080fd5b506102606105633660046121b6565b610ed7565b34801561057457600080fd5b50610260610eef565b34801561058957600080fd5b506102d8610598366004612185565b610efd565b3480156105a957600080fd5b506102d86105b83660046122a2565b610f9c565b3480156105c957600080fd5b506102d86105d83660046121e1565b611045565b3480156105e957600080fd5b506102606110fa565b3480156105fe57600080fd5b50610324611103565b34801561061357600080fd5b506102606106223660046122a2565b611109565b34801561063357600080fd5b5061032461064236600461210d565b6111d2565b34801561065357600080fd5b506102d86111fd565b34801561066857600080fd5b5061032461124d565b34801561067d57600080fd5b50610260611253565b34801561069257600080fd5b506102d86106a13660046120d5565b6112a4565b3480156106b257600080fd5b50610324611315565b60006106c561131b565b6001600160a01b03166106d6610de1565b6001600160a01b0316146107055760405162461bcd60e51b81526004016106fc906127cb565b60405180910390fd5b50600f805462ff000019169055600190565b60606003805461072690612ac8565b80601f016020809104026020016040519081016040528092919081815260200182805461075290612ac8565b801561079f5780601f106107745761010080835404028352916020019161079f565b820191906000526020600020905b81548152906001019060200180831161078257829003601f168201915b5050505050905090565b6000806107b461131b565b90506107c181858561131f565b5060019392505050565b6107d361131b565b6001600160a01b03166107e4610de1565b6001600160a01b03161461080a5760405162461bcd60e51b81526004016106fc906127cb565b60005b81518110156109235760075482516001600160a01b039091169083908390811061084757634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316141580156108a6575060065482516001600160a01b039091169083908390811061089257634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614155b15610911576000600860008484815181106108d157634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8061091b81612b03565b91505061080d565b5050565b6001600160a01b03811660009081526008602052604090205460ff165b919050565b61095161131b565b6001600160a01b0316610962610de1565b6001600160a01b0316146109885760405162461bcd60e51b81526004016106fc906127cb565b600b546040516000916001600160a01b03169047906109a690612308565b60006040518083038185875af1925050503d80600081146109e3576040519150601f19603f3d011682016040523d82523d6000602084013e6109e8565b606091505b50505050565b60125481565b60025490565b610a0261131b565b6001600160a01b0316610a13610de1565b6001600160a01b031614610a395760405162461bcd60e51b81526004016106fc906127cb565b670de0b6b3a76400006103e8610a4d6109f4565b610a58906001612a92565b610a629190612a72565b610a6c9190612a72565b811015610a8b5760405162461bcd60e51b81526004016106fc9061296e565b610a9d81670de0b6b3a7640000612a92565b600c5550565b600080610aae61131b565b9050610abb8582856113d3565b610ac6858585611417565b506001949350505050565b601290565b600080610ae161131b565b6001600160a01b038082166000908152600160209081526040808320938916835292905220549091506107c19082908690610b1d908790612a5a565b61131f565b600f5460ff1681565b6001600160a01b031660009081526017602052604090205460ff1690565b610b5161131b565b6001600160a01b0316610b62610de1565b6001600160a01b031614610b885760405162461bcd60e51b81526004016106fc906127cb565b600b546040516001600160a01b03918216918316907f5deb5ef622431f0df5a39b72dd556892f68ba42aa0f3aaf0800e166ce866492890600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b610bed61131b565b6001600160a01b0316610bfe610de1565b6001600160a01b031614610c245760405162461bcd60e51b81526004016106fc906127cb565b60138290556014819055610c388183612a5a565b6012819055600a10156109235760405162461bcd60e51b81526004016106fc906123fb565b6001600160a01b031660009081526020819052604090205490565b610c8061131b565b6001600160a01b0316610c91610de1565b6001600160a01b031614610cb75760405162461bcd60e51b81526004016106fc906127cb565b610cc16000611af6565b565b6000610ccd61131b565b6001600160a01b0316610cde610de1565b6001600160a01b031614610d045760405162461bcd60e51b81526004016106fc906127cb565b50600f805460ff19169055600190565b610d1c61131b565b6001600160a01b0316610d2d610de1565b6001600160a01b031614610d535760405162461bcd60e51b81526004016106fc906127cb565b6001600160a01b03919091166000908152601860205260409020805460ff1916911515919091179055565b600f5462010000900460ff1681565b610d9561131b565b6001600160a01b0316610da6610de1565b6001600160a01b031614610dcc5760405162461bcd60e51b81526004016106fc906127cb565b600f805461ff00191661010017905542600a55565b6005546001600160a01b031690565b60606004805461072690612ac8565b610e0761131b565b6001600160a01b0316610e18610de1565b6001600160a01b031614610e3e5760405162461bcd60e51b81526004016106fc906127cb565b6007546001600160a01b0383811691161415610e6c5760405162461bcd60e51b81526004016106fc9061252e565b6109238282611b48565b600080610e8161131b565b6001600160a01b0380821660009081526001602090815260408083209389168352929052205490915083811015610eca5760405162461bcd60e51b81526004016106fc90612929565b610ac6828686840361131f565b600080610ee261131b565b90506107c1818585611417565b600f54610100900460ff1681565b610f0561131b565b6001600160a01b0316610f16610de1565b6001600160a01b031614610f3c5760405162461bcd60e51b81526004016106fc906127cb565b6001600160a01b03821660008181526017602052604090819020805460ff1916841515179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df790610f9090849061235a565b60405180910390a25050565b610fa461131b565b6001600160a01b0316610fb5610de1565b6001600160a01b031614610fdb5760405162461bcd60e51b81526004016106fc906127cb565b670de0b6b3a76400006103e8610fef6109f4565b610ffa906005612a92565b6110049190612a72565b61100e9190612a72565b81101561102d5760405162461bcd60e51b81526004016106fc906124ea565b61103f81670de0b6b3a7640000612a92565b600e5550565b61104d61131b565b6001600160a01b031661105e610de1565b6001600160a01b0316146110845760405162461bcd60e51b81526004016106fc906127cb565b60005b8151811015610923576000600860008484815181106110b657634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806110f281612b03565b915050611087565b60115460ff1681565b600c5481565b600061111361131b565b6001600160a01b0316611124610de1565b6001600160a01b03161461114a5760405162461bcd60e51b81526004016106fc906127cb565b620186a06111566109f4565b611161906001612a92565b61116b9190612a72565b82101561118a5760405162461bcd60e51b81526004016106fc9061265e565b6103e86111956109f4565b6111a0906005612a92565b6111aa9190612a72565b8211156111c95760405162461bcd60e51b81526004016106fc906126b3565b50600d55600190565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61120561131b565b6001600160a01b0316611216610de1565b6001600160a01b03161461123c5760405162461bcd60e51b81526004016106fc906127cb565b61098861124830610c5d565b611b9c565b600d5481565b600061125d61131b565b6001600160a01b031661126e610de1565b6001600160a01b0316146112945760405162461bcd60e51b81526004016106fc906127cb565b506011805460ff19169055600190565b6112ac61131b565b6001600160a01b03166112bd610de1565b6001600160a01b0316146112e35760405162461bcd60e51b81526004016106fc906127cb565b6001600160a01b0381166113095760405162461bcd60e51b81526004016106fc90612462565b61131281611af6565b50565b600e5481565b3390565b6001600160a01b0383166113455760405162461bcd60e51b81526004016106fc906128b8565b6001600160a01b03821661136b5760405162461bcd60e51b81526004016106fc906124a8565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906113c69085906129bd565b60405180910390a3505050565b60006113df84846111d2565b905060001981146109e8578181101561140a5760405162461bcd60e51b81526004016106fc9061258b565b6109e8848484840361131f565b6001600160a01b03831661143d5760405162461bcd60e51b81526004016106fc90612800565b6001600160a01b0382166114635760405162461bcd60e51b81526004016106fc906123b8565b6001600160a01b03831660009081526008602052604090205460ff161561149c5760405162461bcd60e51b81526004016106fc90612845565b806114b2576114ad83836000611d21565b611af1565b600a5442116114df576001600160a01b0382166000908152600860205260409020805460ff191660011790555b600f5460ff1615611821576114f2610de1565b6001600160a01b0316836001600160a01b03161415801561152c5750611516610de1565b6001600160a01b0316826001600160a01b031614155b801561154057506001600160a01b03821615155b801561155757506001600160a01b03821661dead14155b8015611566575060095460ff16155b1561182157600f54610100900460ff166115d5576001600160a01b03831660009081526017602052604090205460ff16806115b957506001600160a01b03821660009081526017602052604090205460ff165b6115d55760405162461bcd60e51b81526004016106fc90612432565b6115de82610c5d565b15801561160157506001600160a01b038216600090815260196020526040902054155b15611622576001600160a01b03821660009081526019602052604090204290555b60115460ff16156116c457611635610de1565b6001600160a01b0316826001600160a01b03161415801561166457506006546001600160a01b03838116911614155b801561167e57506007546001600160a01b03838116911614155b156116c4573260009081526010602052604090205443116116b15760405162461bcd60e51b81526004016106fc9061275c565b3260009081526010602052604090204390555b6001600160a01b0383166000908152601a602052604090205460ff16801561170557506001600160a01b03821660009081526018602052604090205460ff16155b1561176557600c5481111561172c5760405162461bcd60e51b81526004016106fc90612707565b600e5461173883610c5d565b6117429083612a5a565b11156117605760405162461bcd60e51b81526004016106fc906128fc565b611821565b6001600160a01b0382166000908152601a602052604090205460ff1680156117a657506001600160a01b03831660009081526018602052604090205460ff16155b156117cd57600c548111156117605760405162461bcd60e51b81526004016106fc90612608565b6001600160a01b03821660009081526018602052604090205460ff1661182157600e546117f983610c5d565b6118039083612a5a565b11156118215760405162461bcd60e51b81526004016106fc906128fc565b600061182c30610c5d565b600d5490915081108015908190611846575060095460ff16155b801561186b57506001600160a01b0385166000908152601a602052604090205460ff16155b801561189057506001600160a01b03851660009081526017602052604090205460ff16155b80156118b557506001600160a01b03841660009081526017602052604090205460ff16155b156118da576009805460ff191660011790556118cf611e45565b6009805460ff191690555b6009546001600160a01b03861660009081526017602052604090205460ff9182161591168061192157506001600160a01b03851660009081526017602052604090205460ff165b1561192a575060005b60008115611ae1576001600160a01b0386166000908152601a602052604090205460ff1680156119625750600f5462010000900460ff165b801561198557506001600160a01b03871660009081526019602052604090205415155b80156119b757506001600160a01b03871660009081526019602052604090205442906119b49062015180612a5a565b10155b15611a45576008600560006119cc8284611fe1565b90506119e360646119dd8a84611ff4565b90612000565b9350806119f08486612a92565b6119fa9190612a72565b60166000828254611a0b9190612a5a565b90915550819050611a1c8386612a92565b611a269190612a72565b60156000828254611a379190612a5a565b90915550611ac39350505050565b611a5f60646119dd60125488611ff490919063ffffffff16565b905060125460145482611a729190612a92565b611a7c9190612a72565b60166000828254611a8d9190612a5a565b9091555050601254601354611aa29083612a92565b611aac9190612a72565b60156000828254611abd9190612a5a565b90915550505b8015611ad457611ad4873083611d21565b611ade8186612ab1565b94505b611aec878787611d21565b505050505b505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000818152601a6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611bdf57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015611c3357600080fd5b505afa158015611c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6b91906120f1565b81600181518110611c8c57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654611cb2913091168461131f565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790611ceb9085906000908690309042906004016129c6565b600060405180830381600087803b158015611d0557600080fd5b505af1158015611d19573d6000803e3d6000fd5b505050505050565b6001600160a01b038316611d475760405162461bcd60e51b81526004016106fc90612800565b6001600160a01b038216611d6d5760405162461bcd60e51b81526004016106fc906123b8565b611d78838383611af1565b6001600160a01b03831660009081526020819052604090205481811015611db15760405162461bcd60e51b81526004016106fc906125c2565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611de8908490612a5a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611e3291906129bd565b60405180910390a36109e8848484611af1565b6000611e5030610c5d565b90506000601554601654611e649190612a5a565b9050811580611e71575080155b15611e7d575050610cc1565b600d54821115611e8d57600d5491505b600060028260165485611ea09190612a92565b611eaa9190612a72565b611eb49190612a72565b90506000611ec2848361200c565b905047611ece82611b9c565b6000611eda478361200c565b90506000611ef7866119dd60155485611ff490919063ffffffff16565b90506000611f058284612ab1565b600060168190556015819055600b5460405192935090916001600160a01b03909116908490611f3390612308565b60006040518083038185875af1925050503d8060008114611f70576040519150601f19603f3d011682016040523d82523d6000602084013e611f75565b606091505b50509050600087118015611f895750600082115b15611fd657611f988783612018565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618683601654604051611fcd93929190612a36565b60405180910390a15b505050505050505050565b6000611fed8284612a5a565b9392505050565b6000611fed8284612a92565b6000611fed8284612a72565b6000611fed8284612ab1565b6006546120309030906001600160a01b03168461131f565b6006546001600160a01b031663f305d71982308560008061204f610de1565b426040518863ffffffff1660e01b81526004016120719695949392919061231f565b6060604051808303818588803b15801561208a57600080fd5b505af115801561209e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120c391906122db565b5050505050565b803561094481612b4a565b6000602082840312156120e6578081fd5b8135611fed81612b4a565b600060208284031215612102578081fd5b8151611fed81612b4a565b6000806040838503121561211f578081fd5b823561212a81612b4a565b9150602083013561213a81612b4a565b809150509250929050565b600080600060608486031215612159578081fd5b833561216481612b4a565b9250602084013561217481612b4a565b929592945050506040919091013590565b60008060408385031215612197578182fd5b82356121a281612b4a565b91506020830135801515811461213a578182fd5b600080604083850312156121c8578182fd5b82356121d381612b4a565b946020939093013593505050565b600060208083850312156121f3578182fd5b823567ffffffffffffffff8082111561220a578384fd5b818501915085601f83011261221d578384fd5b81358181111561222f5761222f612b34565b8381026040518582820101818110858211171561224e5761224e612b34565b604052828152858101935084860182860187018a101561226c578788fd5b8795505b8386101561229557612281816120ca565b855260019590950194938601938601612270565b5098975050505050505050565b6000602082840312156122b3578081fd5b5035919050565b600080604083850312156122cc578182fd5b50508035926020909101359150565b6000806000606084860312156122ef578283fd5b8351925060208401519150604084015190509250925092565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b901515815260200190565b6000602080835283518082850152825b8181101561239157858101830151858201604001528201612375565b818111156123a25783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601d908201527f4d757374206b656570206665657320617420313025206f72206c657373000000604082015260600190565b6020808252601690820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526024908201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604082015263302e352560e01b606082015260800190565b60208082526039908201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060408201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000606082015260800190565b6020808252601d908201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526036908201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656040820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b606082015260800190565b60208082526035908201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60408201527410181718181892903a37ba30b61039bab838363c9760591b606082015260800190565b60208082526034908201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604082015273371018171a92903a37ba30b61039bab838363c9760611b606082015260800190565b60208082526035908201527f427579207472616e7366657220616d6f756e742065786365656473207468652060408201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b606082015260800190565b60208082526049908201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60408201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6060820152681030b63637bbb2b21760b91b608082015260a00190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252604d908201527f596f7572206164647265737320686173206265656e206d61726b65642061732060408201527f6120736e697065722c20796f752061726520756e61626c6520746f207472616e60608201526c39b332b91037b91039bbb0b81760991b608082015260a00190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526013908201527213585e081dd85b1b195d08195e18d959591959606a1b604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252602f908201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060408201526e6c6f776572207468616e20302e312560881b606082015260800190565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015612a155784516001600160a01b0316835293830193918301916001016129f0565b50506001600160a01b03969096166060850152505050608001529392505050565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b60008219821115612a6d57612a6d612b1e565b500190565b600082612a8d57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612aac57612aac612b1e565b500290565b600082821015612ac357612ac3612b1e565b500390565b600281046001821680612adc57607f821691505b60208210811415612afd57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612b1757612b17612b1e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461131257600080fdfea264697066735822122076619dff02bbd7f8de59864be52dc64f24fa40e30ce08432fb81d71c78d47ec464736f6c63430008000033

Deployed Bytecode

0x60806040526004361061023f5760003560e01c806375c5df911161012e578063c8125e45116100ab578063df778d261161006f578063df778d2614610647578063e2f456051461065c578063e884f26014610671578063f2fde38b14610686578063f8b45b05146106a657610246565b8063c8125e45146105bd578063c876d0b9146105dd578063c8c8ebe4146105f2578063d257b34f14610607578063dd62ed3e1461062757610246565b8063a457c2d7116100f2578063a457c2d714610528578063a9059cbb14610548578063bbc0c74214610568578063c02466681461057d578063c18bc1951461059d57610246565b806375c5df91146104a75780638a8c523c146104bc5780638da5cb5b146104d157806395d89b41146104f35780639a7a23d61461050857610246565b8063313ce567116101bc5780636db79437116101805780636db794371461041d57806370a082311461043d578063715018a61461045d578063751039fc146104725780637571336a1461048757610246565b8063313ce5671461038657806339509351146103a85780634a62bb65146103c85780634fbee193146103dd57806366718524146103fd57610246565b806312b77e8a1161020357806312b77e8a146102fa57806313114a9d1461030f57806318160ddd14610331578063203e727e1461034657806323b872dd1461036657610246565b8063056415ca1461024b57806306fdde0314610276578063095ea7b3146102985780630b559c6f146102b85780630f3a325f146102da57610246565b3661024657005b600080fd5b34801561025757600080fd5b506102606106bb565b60405161026d919061235a565b60405180910390f35b34801561028257600080fd5b5061028b610717565b60405161026d9190612365565b3480156102a457600080fd5b506102606102b33660046121b6565b6107a9565b3480156102c457600080fd5b506102d86102d33660046121e1565b6107cb565b005b3480156102e657600080fd5b506102606102f53660046120d5565b610927565b34801561030657600080fd5b506102d8610949565b34801561031b57600080fd5b506103246109ee565b60405161026d91906129bd565b34801561033d57600080fd5b506103246109f4565b34801561035257600080fd5b506102d86103613660046122a2565b6109fa565b34801561037257600080fd5b50610260610381366004612145565b610aa3565b34801561039257600080fd5b5061039b610ad1565b60405161026d9190612a4c565b3480156103b457600080fd5b506102606103c33660046121b6565b610ad6565b3480156103d457600080fd5b50610260610b22565b3480156103e957600080fd5b506102606103f83660046120d5565b610b2b565b34801561040957600080fd5b506102d86104183660046120d5565b610b49565b34801561042957600080fd5b506102d86104383660046122ba565b610be5565b34801561044957600080fd5b506103246104583660046120d5565b610c5d565b34801561046957600080fd5b506102d8610c78565b34801561047e57600080fd5b50610260610cc3565b34801561049357600080fd5b506102d86104a2366004612185565b610d14565b3480156104b357600080fd5b50610260610d7e565b3480156104c857600080fd5b506102d8610d8d565b3480156104dd57600080fd5b506104e6610de1565b60405161026d919061230b565b3480156104ff57600080fd5b5061028b610df0565b34801561051457600080fd5b506102d8610523366004612185565b610dff565b34801561053457600080fd5b506102606105433660046121b6565b610e76565b34801561055457600080fd5b506102606105633660046121b6565b610ed7565b34801561057457600080fd5b50610260610eef565b34801561058957600080fd5b506102d8610598366004612185565b610efd565b3480156105a957600080fd5b506102d86105b83660046122a2565b610f9c565b3480156105c957600080fd5b506102d86105d83660046121e1565b611045565b3480156105e957600080fd5b506102606110fa565b3480156105fe57600080fd5b50610324611103565b34801561061357600080fd5b506102606106223660046122a2565b611109565b34801561063357600080fd5b5061032461064236600461210d565b6111d2565b34801561065357600080fd5b506102d86111fd565b34801561066857600080fd5b5061032461124d565b34801561067d57600080fd5b50610260611253565b34801561069257600080fd5b506102d86106a13660046120d5565b6112a4565b3480156106b257600080fd5b50610324611315565b60006106c561131b565b6001600160a01b03166106d6610de1565b6001600160a01b0316146107055760405162461bcd60e51b81526004016106fc906127cb565b60405180910390fd5b50600f805462ff000019169055600190565b60606003805461072690612ac8565b80601f016020809104026020016040519081016040528092919081815260200182805461075290612ac8565b801561079f5780601f106107745761010080835404028352916020019161079f565b820191906000526020600020905b81548152906001019060200180831161078257829003601f168201915b5050505050905090565b6000806107b461131b565b90506107c181858561131f565b5060019392505050565b6107d361131b565b6001600160a01b03166107e4610de1565b6001600160a01b03161461080a5760405162461bcd60e51b81526004016106fc906127cb565b60005b81518110156109235760075482516001600160a01b039091169083908390811061084757634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316141580156108a6575060065482516001600160a01b039091169083908390811061089257634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614155b15610911576000600860008484815181106108d157634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8061091b81612b03565b91505061080d565b5050565b6001600160a01b03811660009081526008602052604090205460ff165b919050565b61095161131b565b6001600160a01b0316610962610de1565b6001600160a01b0316146109885760405162461bcd60e51b81526004016106fc906127cb565b600b546040516000916001600160a01b03169047906109a690612308565b60006040518083038185875af1925050503d80600081146109e3576040519150601f19603f3d011682016040523d82523d6000602084013e6109e8565b606091505b50505050565b60125481565b60025490565b610a0261131b565b6001600160a01b0316610a13610de1565b6001600160a01b031614610a395760405162461bcd60e51b81526004016106fc906127cb565b670de0b6b3a76400006103e8610a4d6109f4565b610a58906001612a92565b610a629190612a72565b610a6c9190612a72565b811015610a8b5760405162461bcd60e51b81526004016106fc9061296e565b610a9d81670de0b6b3a7640000612a92565b600c5550565b600080610aae61131b565b9050610abb8582856113d3565b610ac6858585611417565b506001949350505050565b601290565b600080610ae161131b565b6001600160a01b038082166000908152600160209081526040808320938916835292905220549091506107c19082908690610b1d908790612a5a565b61131f565b600f5460ff1681565b6001600160a01b031660009081526017602052604090205460ff1690565b610b5161131b565b6001600160a01b0316610b62610de1565b6001600160a01b031614610b885760405162461bcd60e51b81526004016106fc906127cb565b600b546040516001600160a01b03918216918316907f5deb5ef622431f0df5a39b72dd556892f68ba42aa0f3aaf0800e166ce866492890600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b610bed61131b565b6001600160a01b0316610bfe610de1565b6001600160a01b031614610c245760405162461bcd60e51b81526004016106fc906127cb565b60138290556014819055610c388183612a5a565b6012819055600a10156109235760405162461bcd60e51b81526004016106fc906123fb565b6001600160a01b031660009081526020819052604090205490565b610c8061131b565b6001600160a01b0316610c91610de1565b6001600160a01b031614610cb75760405162461bcd60e51b81526004016106fc906127cb565b610cc16000611af6565b565b6000610ccd61131b565b6001600160a01b0316610cde610de1565b6001600160a01b031614610d045760405162461bcd60e51b81526004016106fc906127cb565b50600f805460ff19169055600190565b610d1c61131b565b6001600160a01b0316610d2d610de1565b6001600160a01b031614610d535760405162461bcd60e51b81526004016106fc906127cb565b6001600160a01b03919091166000908152601860205260409020805460ff1916911515919091179055565b600f5462010000900460ff1681565b610d9561131b565b6001600160a01b0316610da6610de1565b6001600160a01b031614610dcc5760405162461bcd60e51b81526004016106fc906127cb565b600f805461ff00191661010017905542600a55565b6005546001600160a01b031690565b60606004805461072690612ac8565b610e0761131b565b6001600160a01b0316610e18610de1565b6001600160a01b031614610e3e5760405162461bcd60e51b81526004016106fc906127cb565b6007546001600160a01b0383811691161415610e6c5760405162461bcd60e51b81526004016106fc9061252e565b6109238282611b48565b600080610e8161131b565b6001600160a01b0380821660009081526001602090815260408083209389168352929052205490915083811015610eca5760405162461bcd60e51b81526004016106fc90612929565b610ac6828686840361131f565b600080610ee261131b565b90506107c1818585611417565b600f54610100900460ff1681565b610f0561131b565b6001600160a01b0316610f16610de1565b6001600160a01b031614610f3c5760405162461bcd60e51b81526004016106fc906127cb565b6001600160a01b03821660008181526017602052604090819020805460ff1916841515179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df790610f9090849061235a565b60405180910390a25050565b610fa461131b565b6001600160a01b0316610fb5610de1565b6001600160a01b031614610fdb5760405162461bcd60e51b81526004016106fc906127cb565b670de0b6b3a76400006103e8610fef6109f4565b610ffa906005612a92565b6110049190612a72565b61100e9190612a72565b81101561102d5760405162461bcd60e51b81526004016106fc906124ea565b61103f81670de0b6b3a7640000612a92565b600e5550565b61104d61131b565b6001600160a01b031661105e610de1565b6001600160a01b0316146110845760405162461bcd60e51b81526004016106fc906127cb565b60005b8151811015610923576000600860008484815181106110b657634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806110f281612b03565b915050611087565b60115460ff1681565b600c5481565b600061111361131b565b6001600160a01b0316611124610de1565b6001600160a01b03161461114a5760405162461bcd60e51b81526004016106fc906127cb565b620186a06111566109f4565b611161906001612a92565b61116b9190612a72565b82101561118a5760405162461bcd60e51b81526004016106fc9061265e565b6103e86111956109f4565b6111a0906005612a92565b6111aa9190612a72565b8211156111c95760405162461bcd60e51b81526004016106fc906126b3565b50600d55600190565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61120561131b565b6001600160a01b0316611216610de1565b6001600160a01b03161461123c5760405162461bcd60e51b81526004016106fc906127cb565b61098861124830610c5d565b611b9c565b600d5481565b600061125d61131b565b6001600160a01b031661126e610de1565b6001600160a01b0316146112945760405162461bcd60e51b81526004016106fc906127cb565b506011805460ff19169055600190565b6112ac61131b565b6001600160a01b03166112bd610de1565b6001600160a01b0316146112e35760405162461bcd60e51b81526004016106fc906127cb565b6001600160a01b0381166113095760405162461bcd60e51b81526004016106fc90612462565b61131281611af6565b50565b600e5481565b3390565b6001600160a01b0383166113455760405162461bcd60e51b81526004016106fc906128b8565b6001600160a01b03821661136b5760405162461bcd60e51b81526004016106fc906124a8565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906113c69085906129bd565b60405180910390a3505050565b60006113df84846111d2565b905060001981146109e8578181101561140a5760405162461bcd60e51b81526004016106fc9061258b565b6109e8848484840361131f565b6001600160a01b03831661143d5760405162461bcd60e51b81526004016106fc90612800565b6001600160a01b0382166114635760405162461bcd60e51b81526004016106fc906123b8565b6001600160a01b03831660009081526008602052604090205460ff161561149c5760405162461bcd60e51b81526004016106fc90612845565b806114b2576114ad83836000611d21565b611af1565b600a5442116114df576001600160a01b0382166000908152600860205260409020805460ff191660011790555b600f5460ff1615611821576114f2610de1565b6001600160a01b0316836001600160a01b03161415801561152c5750611516610de1565b6001600160a01b0316826001600160a01b031614155b801561154057506001600160a01b03821615155b801561155757506001600160a01b03821661dead14155b8015611566575060095460ff16155b1561182157600f54610100900460ff166115d5576001600160a01b03831660009081526017602052604090205460ff16806115b957506001600160a01b03821660009081526017602052604090205460ff165b6115d55760405162461bcd60e51b81526004016106fc90612432565b6115de82610c5d565b15801561160157506001600160a01b038216600090815260196020526040902054155b15611622576001600160a01b03821660009081526019602052604090204290555b60115460ff16156116c457611635610de1565b6001600160a01b0316826001600160a01b03161415801561166457506006546001600160a01b03838116911614155b801561167e57506007546001600160a01b03838116911614155b156116c4573260009081526010602052604090205443116116b15760405162461bcd60e51b81526004016106fc9061275c565b3260009081526010602052604090204390555b6001600160a01b0383166000908152601a602052604090205460ff16801561170557506001600160a01b03821660009081526018602052604090205460ff16155b1561176557600c5481111561172c5760405162461bcd60e51b81526004016106fc90612707565b600e5461173883610c5d565b6117429083612a5a565b11156117605760405162461bcd60e51b81526004016106fc906128fc565b611821565b6001600160a01b0382166000908152601a602052604090205460ff1680156117a657506001600160a01b03831660009081526018602052604090205460ff16155b156117cd57600c548111156117605760405162461bcd60e51b81526004016106fc90612608565b6001600160a01b03821660009081526018602052604090205460ff1661182157600e546117f983610c5d565b6118039083612a5a565b11156118215760405162461bcd60e51b81526004016106fc906128fc565b600061182c30610c5d565b600d5490915081108015908190611846575060095460ff16155b801561186b57506001600160a01b0385166000908152601a602052604090205460ff16155b801561189057506001600160a01b03851660009081526017602052604090205460ff16155b80156118b557506001600160a01b03841660009081526017602052604090205460ff16155b156118da576009805460ff191660011790556118cf611e45565b6009805460ff191690555b6009546001600160a01b03861660009081526017602052604090205460ff9182161591168061192157506001600160a01b03851660009081526017602052604090205460ff165b1561192a575060005b60008115611ae1576001600160a01b0386166000908152601a602052604090205460ff1680156119625750600f5462010000900460ff165b801561198557506001600160a01b03871660009081526019602052604090205415155b80156119b757506001600160a01b03871660009081526019602052604090205442906119b49062015180612a5a565b10155b15611a45576008600560006119cc8284611fe1565b90506119e360646119dd8a84611ff4565b90612000565b9350806119f08486612a92565b6119fa9190612a72565b60166000828254611a0b9190612a5a565b90915550819050611a1c8386612a92565b611a269190612a72565b60156000828254611a379190612a5a565b90915550611ac39350505050565b611a5f60646119dd60125488611ff490919063ffffffff16565b905060125460145482611a729190612a92565b611a7c9190612a72565b60166000828254611a8d9190612a5a565b9091555050601254601354611aa29083612a92565b611aac9190612a72565b60156000828254611abd9190612a5a565b90915550505b8015611ad457611ad4873083611d21565b611ade8186612ab1565b94505b611aec878787611d21565b505050505b505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000818152601a6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611bdf57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015611c3357600080fd5b505afa158015611c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6b91906120f1565b81600181518110611c8c57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654611cb2913091168461131f565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790611ceb9085906000908690309042906004016129c6565b600060405180830381600087803b158015611d0557600080fd5b505af1158015611d19573d6000803e3d6000fd5b505050505050565b6001600160a01b038316611d475760405162461bcd60e51b81526004016106fc90612800565b6001600160a01b038216611d6d5760405162461bcd60e51b81526004016106fc906123b8565b611d78838383611af1565b6001600160a01b03831660009081526020819052604090205481811015611db15760405162461bcd60e51b81526004016106fc906125c2565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611de8908490612a5a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611e3291906129bd565b60405180910390a36109e8848484611af1565b6000611e5030610c5d565b90506000601554601654611e649190612a5a565b9050811580611e71575080155b15611e7d575050610cc1565b600d54821115611e8d57600d5491505b600060028260165485611ea09190612a92565b611eaa9190612a72565b611eb49190612a72565b90506000611ec2848361200c565b905047611ece82611b9c565b6000611eda478361200c565b90506000611ef7866119dd60155485611ff490919063ffffffff16565b90506000611f058284612ab1565b600060168190556015819055600b5460405192935090916001600160a01b03909116908490611f3390612308565b60006040518083038185875af1925050503d8060008114611f70576040519150601f19603f3d011682016040523d82523d6000602084013e611f75565b606091505b50509050600087118015611f895750600082115b15611fd657611f988783612018565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618683601654604051611fcd93929190612a36565b60405180910390a15b505050505050505050565b6000611fed8284612a5a565b9392505050565b6000611fed8284612a92565b6000611fed8284612a72565b6000611fed8284612ab1565b6006546120309030906001600160a01b03168461131f565b6006546001600160a01b031663f305d71982308560008061204f610de1565b426040518863ffffffff1660e01b81526004016120719695949392919061231f565b6060604051808303818588803b15801561208a57600080fd5b505af115801561209e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120c391906122db565b5050505050565b803561094481612b4a565b6000602082840312156120e6578081fd5b8135611fed81612b4a565b600060208284031215612102578081fd5b8151611fed81612b4a565b6000806040838503121561211f578081fd5b823561212a81612b4a565b9150602083013561213a81612b4a565b809150509250929050565b600080600060608486031215612159578081fd5b833561216481612b4a565b9250602084013561217481612b4a565b929592945050506040919091013590565b60008060408385031215612197578182fd5b82356121a281612b4a565b91506020830135801515811461213a578182fd5b600080604083850312156121c8578182fd5b82356121d381612b4a565b946020939093013593505050565b600060208083850312156121f3578182fd5b823567ffffffffffffffff8082111561220a578384fd5b818501915085601f83011261221d578384fd5b81358181111561222f5761222f612b34565b8381026040518582820101818110858211171561224e5761224e612b34565b604052828152858101935084860182860187018a101561226c578788fd5b8795505b8386101561229557612281816120ca565b855260019590950194938601938601612270565b5098975050505050505050565b6000602082840312156122b3578081fd5b5035919050565b600080604083850312156122cc578182fd5b50508035926020909101359150565b6000806000606084860312156122ef578283fd5b8351925060208401519150604084015190509250925092565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b901515815260200190565b6000602080835283518082850152825b8181101561239157858101830151858201604001528201612375565b818111156123a25783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601d908201527f4d757374206b656570206665657320617420313025206f72206c657373000000604082015260600190565b6020808252601690820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526024908201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604082015263302e352560e01b606082015260800190565b60208082526039908201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060408201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000606082015260800190565b6020808252601d908201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526036908201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656040820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b606082015260800190565b60208082526035908201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60408201527410181718181892903a37ba30b61039bab838363c9760591b606082015260800190565b60208082526034908201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604082015273371018171a92903a37ba30b61039bab838363c9760611b606082015260800190565b60208082526035908201527f427579207472616e7366657220616d6f756e742065786365656473207468652060408201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b606082015260800190565b60208082526049908201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60408201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6060820152681030b63637bbb2b21760b91b608082015260a00190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252604d908201527f596f7572206164647265737320686173206265656e206d61726b65642061732060408201527f6120736e697065722c20796f752061726520756e61626c6520746f207472616e60608201526c39b332b91037b91039bbb0b81760991b608082015260a00190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526013908201527213585e081dd85b1b195d08195e18d959591959606a1b604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252602f908201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060408201526e6c6f776572207468616e20302e312560881b606082015260800190565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015612a155784516001600160a01b0316835293830193918301916001016129f0565b50506001600160a01b03969096166060850152505050608001529392505050565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b60008219821115612a6d57612a6d612b1e565b500190565b600082612a8d57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612aac57612aac612b1e565b500290565b600082821015612ac357612ac3612b1e565b500390565b600281046001821680612adc57607f821691505b60208210811415612afd57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612b1757612b17612b1e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461131257600080fdfea264697066735822122076619dff02bbd7f8de59864be52dc64f24fa40e30ce08432fb81d71c78d47ec464736f6c63430008000033

Deployed Bytecode Sourcemap

352:14560:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4232:127;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2196:100:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4547:201::-;;;;;;;;;;-1:-1:-1;4547:201:1;;;;;:::i;:::-;;:::i;6888:322:10:-;;;;;;;;;;-1:-1:-1;6888:322:10;;;;;:::i;:::-;;:::i;:::-;;7437:105;;;;;;;;;;-1:-1:-1;7437:105:10;;;;;:::i;:::-;;:::i;14747:125::-;;;;;;;;;;;;;:::i;1151:24::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3316:108:1:-;;;;;;;;;;;;;:::i;5028:232:10:-;;;;;;;;;;-1:-1:-1;5028:232:10;;;;;:::i;:::-;;:::i;5328:295:1:-;;;;;;;;;;-1:-1:-1;5328:295:1;;;;;:::i;:::-;;:::i;3158:93::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;6032:240::-;;;;;;;;;;-1:-1:-1;6032:240:1;;;;;:::i;:::-;;:::i;798:33:10:-;;;;;;;;;;;;;:::i;6751:125::-;;;;;;;;;;-1:-1:-1;6751:125:10;;;;;:::i;:::-;;:::i;6586:157::-;;;;;;;;;;-1:-1:-1;6586:157:10;;;;;:::i;:::-;;:::i;5647:289::-;;;;;;;;;;-1:-1:-1;5647:289:10;;;;;:::i;:::-;;:::i;3487:127:1:-;;;;;;;;;;-1:-1:-1;3487:127:1;;;;;:::i;:::-;;:::i;1714:103:8:-;;;;;;;;;;;;;:::i;4069:121:10:-;;;;;;;;;;;;;:::i;5491:144::-;;;;;;;;;;-1:-1:-1;5491:144:10;;;;;:::i;:::-;;:::i;878:34::-;;;;;;;;;;;;;:::i;3890:123::-;;;;;;;;;;;;;:::i;1063:87:8:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2415:104:1:-;;;;;;;;;;;;;:::i;6134:244:10:-;;;;;;;;;;-1:-1:-1;6134:244:10;;;;;:::i;:::-;;:::i;6775:438:1:-;;;;;;;;;;-1:-1:-1;6775:438:1;;;;;:::i;:::-;;:::i;3820:193::-;;;;;;;;;;-1:-1:-1;3820:193:1;;;;;:::i;:::-;;:::i;838:33:10:-;;;;;;;;;;;;;:::i;5944:182::-;;;;;;;;;;-1:-1:-1;5944:182:10;;;;;:::i;:::-;;:::i;5268:211::-;;;;;;;;;;-1:-1:-1;5268:211:10;;;;;:::i;:::-;;:::i;7222:203::-;;;;;;;;;;-1:-1:-1;7222:203:10;;;;;:::i;:::-;;:::i;1103:39::-;;;;;;;;;;;;;:::i;675:35::-;;;;;;;;;;;;;:::i;4634:382::-;;;;;;;;;;-1:-1:-1;4634:382:10;;;;;:::i;:::-;;:::i;4076:151:1:-;;;;;;;;;;-1:-1:-1;4076:151:1;;;;;:::i;:::-;;:::i;14568:175:10:-;;;;;;;;;;;;;:::i;717:33::-;;;;;;;;;;;;;:::i;4424:135::-;;;;;;;;;;;;;:::i;1972:201:8:-;;;;;;;;;;-1:-1:-1;1972:201:8;;;;;:::i;:::-;;:::i;757:24:10:-;;;;;;;;;;;;;:::i;4232:127::-;4289:4;1294:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;4306:15:10::1;:23:::0;;-1:-1:-1;;4306:23:10::1;::::0;;;4232:127;:::o;2196:100:1:-;2250:13;2283:5;2276:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2196:100;:::o;4547:201::-;4630:4;4647:13;4663:12;:10;:12::i;:::-;4647:28;;4686:32;4695:5;4702:7;4711:6;4686:8;:32::i;:::-;-1:-1:-1;4736:4:1;;4547:201;-1:-1:-1;;;4547:201:1:o;6888:322:10:-;1294:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;6976:6:10::1;6971:232;6992:12;:19;6988:1;:23;6971:232;;;7056:13;::::0;7037:15;;-1:-1:-1;;;;;7056:13:10;;::::1;::::0;7037:12;;7050:1;;7037:15;::::1;;;-1:-1:-1::0;;;7037:15:10::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;7037:32:10::1;;;:79;;;;-1:-1:-1::0;7100:15:10::1;::::0;7073;;-1:-1:-1;;;;;7100:15:10;;::::1;::::0;7073:12;;7086:1;;7073:15;::::1;;;-1:-1:-1::0;;;7073:15:10::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;7073:43:10::1;;;7037:79;7033:159;;;7171:5;7137:14;:31;7152:12;7165:1;7152:15;;;;;;-1:-1:-1::0;;;7152:15:10::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;7137:31:10::1;-1:-1:-1::0;;;;;7137:31:10::1;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;7033:159;7013:3:::0;::::1;::::0;::::1;:::i;:::-;;;;6971:232;;;;6888:322:::0;:::o;7437:105::-;-1:-1:-1;;;;;7514:20:10;;7490:4;7514:20;;;:14;:20;;;;;;;;7437:105;;;;:::o;14747:125::-;1294:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;14819:9:10::1;::::0;14811:57:::1;::::0;14793:12:::1;::::0;-1:-1:-1;;;;;14819:9:10::1;::::0;14842:21:::1;::::0;14811:57:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;14747:125:10:o;1151:24::-;;;;:::o;3316:108:1:-;3404:12;;3316:108;:::o;5028:232:10:-;1294:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;5149:4:10::1;5141;5121:13;:11;:13::i;:::-;:17;::::0;5137:1:::1;5121:17;:::i;:::-;:24;;;;:::i;:::-;5120:33;;;;:::i;:::-;5110:6;:43;;5102:103;;;;-1:-1:-1::0;;;5102:103:10::1;;;;;;;:::i;:::-;5239:13;:6:::0;5248:4:::1;5239:13;:::i;:::-;5216:20;:36:::0;-1:-1:-1;5028:232:10:o;5328:295:1:-;5459:4;5476:15;5494:12;:10;:12::i;:::-;5476:30;;5517:38;5533:4;5539:7;5548:6;5517:15;:38::i;:::-;5566:27;5576:4;5582:2;5586:6;5566:9;:27::i;:::-;-1:-1:-1;5611:4:1;;5328:295;-1:-1:-1;;;;5328:295:1:o;3158:93::-;3241:2;3158:93;:::o;6032:240::-;6120:4;6137:13;6153:12;:10;:12::i;:::-;-1:-1:-1;;;;;6201:18:1;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;6137:28;;-1:-1:-1;6176:66:1;;6137:28;;6192:7;;6201:40;;6231:10;;6201:40;:::i;:::-;6176:8;:66::i;798:33:10:-;;;;;;:::o;6751:125::-;-1:-1:-1;;;;;6840:28:10;6816:4;6840:28;;;:19;:28;;;;;;;;;6751:125::o;6586:157::-;1294:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;6693:9:10::1;::::0;6665:38:::1;::::0;-1:-1:-1;;;;;6693:9:10;;::::1;::::0;6665:38;::::1;::::0;::::1;::::0;6693:9:::1;::::0;6665:38:::1;6714:9;:21:::0;;-1:-1:-1;;;;;;6714:21:10::1;-1:-1:-1::0;;;;;6714:21:10;;;::::1;::::0;;;::::1;::::0;;6586:157::o;5647:289::-;1294:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;5741:13:10::1;:28:::0;;;5780:13:::1;:28:::0;;;5831:29:::1;5796:12:::0;5757;5831:29:::1;:::i;:::-;5819:9;:41:::0;;;5892:2:::1;-1:-1:-1::0;5879:15:10::1;5871:57;;;;-1:-1:-1::0;;;5871:57:10::1;;;;;;;:::i;3487:127:1:-:0;-1:-1:-1;;;;;3588:18:1;3561:7;3588:18;;;;;;;;;;;;3487:127::o;1714:103:8:-;1294:12;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;4069:121:10:-;4121:4;1294:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;-1:-1:-1;4138:14:10::1;:22:::0;;-1:-1:-1;;4138:22:10::1;::::0;;;4069:121;:::o;5491:144::-;1294:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;5581:39:10;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;5581:46:10::1;::::0;::::1;;::::0;;;::::1;::::0;;5491:144::o;878:34::-;;;;;;;;;:::o;3890:123::-;1294:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;3945:13:10::1;:20:::0;;-1:-1:-1;;3945:20:10::1;;;::::0;;3990:15:::1;3976:11;:29:::0;3890:123::o;1063:87:8:-;1136:6;;-1:-1:-1;;;;;1136:6:8;1063:87;:::o;2415:104:1:-;2471:13;2504:7;2497:14;;;;;:::i;6134:244:10:-;1294:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;6241:13:10::1;::::0;-1:-1:-1;;;;;6233:21:10;;::::1;6241:13:::0;::::1;6233:21;;6225:91;;;;-1:-1:-1::0;;;6225:91:10::1;;;;;;;:::i;:::-;6329:41;6358:4;6364:5;6329:28;:41::i;6775:438:1:-:0;6868:4;6885:13;6901:12;:10;:12::i;:::-;-1:-1:-1;;;;;6951:18:1;;;6924:24;6951:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;6885:28;;-1:-1:-1;6997:35:1;;;;6989:85;;;;-1:-1:-1;;;6989:85:1;;;;;;;:::i;:::-;7110:60;7119:5;7126:7;7154:15;7135:16;:34;7110:8;:60::i;3820:193::-;3899:4;3916:13;3932:12;:10;:12::i;:::-;3916:28;;3955;3965:5;3972:2;3976:6;3955:9;:28::i;838:33:10:-;;;;;;;;;:::o;5944:182::-;1294:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;6029:28:10;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;:39;;-1:-1:-1;;6029:39:10::1;::::0;::::1;;;::::0;;6084:34;::::1;::::0;::::1;::::0;6029:39;;6084:34:::1;:::i;:::-;;;;;;;;5944:182:::0;;:::o;5268:211::-;1294:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;5390:4:10::1;5384;5364:13;:11;:13::i;:::-;:17;::::0;5380:1:::1;5364:17;:::i;:::-;:24;;;;:::i;:::-;5363:31;;;;:::i;:::-;5353:6;:41;;5345:90;;;;-1:-1:-1::0;;;5345:90:10::1;;;;;;;:::i;:::-;5458:13;:6:::0;5467:4:::1;5458:13;:::i;:::-;5446:9;:25:::0;-1:-1:-1;5268:211:10:o;7222:203::-;1294:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;7310:6:10::1;7305:113;7326:12;:19;7322:1;:23;7305:113;;;7401:5;7367:14;:31;7382:12;7395:1;7382:15;;;;;;-1:-1:-1::0;;;7382:15:10::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;7367:31:10::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;7367:31:10;:39;;-1:-1:-1;;7367:39:10::1;::::0;::::1;;::::0;;;::::1;::::0;;7347:3;::::1;::::0;::::1;:::i;:::-;;;;7305:113;;1103:39:::0;;;;;;:::o;675:35::-;;;;:::o;4634:382::-;4715:4;1294:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;4772:6:10::1;4752:13;:11;:13::i;:::-;:17;::::0;4768:1:::1;4752:17;:::i;:::-;:26;;;;:::i;:::-;4739:9;:39;;4731:105;;;;-1:-1:-1::0;;;4731:105:10::1;;;;;;;:::i;:::-;4887:4;4867:13;:11;:13::i;:::-;:17;::::0;4883:1:::1;4867:17;:::i;:::-;:24;;;;:::i;:::-;4854:9;:37;;4846:102;;;;-1:-1:-1::0;;;4846:102:10::1;;;;;;;:::i;:::-;-1:-1:-1::0;4958:18:10::1;:30:::0;5005:4:::1;::::0;4634:382::o;4076:151:1:-;-1:-1:-1;;;;;4192:18:1;;;4165:7;4192:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4076:151::o;14568:175:10:-;1294:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;14613:43:10::1;14631:24;14649:4;14631:9;:24::i;:::-;14613:17;:43::i;717:33::-:0;;;;:::o;4424:135::-;4484:4;1294:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;-1:-1:-1;4501:20:10::1;:28:::0;;-1:-1:-1;;4501:28:10::1;::::0;;;4424:135;:::o;1972:201:8:-;1294:12;:10;:12::i;:::-;-1:-1:-1;;;;;1283:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1283:23:8;;1275:68;;;;-1:-1:-1;;;1275:68:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;2061:22:8;::::1;2053:73;;;;-1:-1:-1::0;;;2053:73:8::1;;;;;;;:::i;:::-;2137:28;2156:8;2137:18;:28::i;:::-;1972:201:::0;:::o;757:24:10:-;;;;:::o;656:98:0:-;736:10;656:98;:::o;10411:380:1:-;-1:-1:-1;;;;;10547:19:1;;10539:68;;;;-1:-1:-1;;;10539:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;10626:21:1;;10618:68;;;;-1:-1:-1;;;10618:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;10699:18:1;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;10751:32;;;;;10729:6;;10751:32;:::i;:::-;;;;;;;;10411:380;;;:::o;11078:453::-;11213:24;11240:25;11250:5;11257:7;11240:9;:25::i;:::-;11213:52;;-1:-1:-1;;11280:16:1;:37;11276:248;;11362:6;11342:16;:26;;11334:68;;;;-1:-1:-1;;;11334:68:1;;;;;;;:::i;:::-;11446:51;11455:5;11462:7;11490:6;11471:16;:25;11446:8;:51::i;7550:4519:10:-;-1:-1:-1;;;;;7682:18:10;;7674:68;;;;-1:-1:-1;;;7674:68:10;;;;;;;:::i;:::-;-1:-1:-1;;;;;7761:16:10;;7753:64;;;;-1:-1:-1;;;7753:64:10;;;;;;;:::i;:::-;-1:-1:-1;;;;;7837:20:10;;;;;;:14;:20;;;;;;;;7836:21;7828:111;;;;-1:-1:-1;;;7828:111:10;;;;;;;:::i;:::-;7965:11;7961:93;;7993:28;8009:4;8015:2;8019:1;7993:15;:28::i;:::-;8036:7;;7961:93;8089:11;;8070:15;:30;8066:61;;-1:-1:-1;;;;;8102:18:10;;;;;;:14;:18;;;;;:25;;-1:-1:-1;;8102:25:10;8123:4;8102:25;;;8066:61;8152:14;;;;8148:2057;;;8213:7;:5;:7::i;:::-;-1:-1:-1;;;;;8205:15:10;:4;-1:-1:-1;;;;;8205:15:10;;;:49;;;;;8247:7;:5;:7::i;:::-;-1:-1:-1;;;;;8241:13:10;:2;-1:-1:-1;;;;;8241:13:10;;;8205:49;:86;;;;-1:-1:-1;;;;;;8275:16:10;;;;8205:86;:128;;;;-1:-1:-1;;;;;;8312:21:10;;8326:6;8312:21;;8205:128;:159;;;;-1:-1:-1;8355:9:10;;;;8354:10;8205:159;8183:2011;;;8404:13;;;;;;;8399:150;;-1:-1:-1;;;;;8450:25:10;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;8479:23:10;;;;;;:19;:23;;;;;;;;8450:52;8442:87;;;;-1:-1:-1;;;8442:87:10;;;;;;;:::i;:::-;8622:13;8632:2;8622:9;:13::i;:::-;:18;:55;;;;-1:-1:-1;;;;;;8644:28:10;;;;;;:24;:28;;;;;;:33;8622:55;8618:150;;;-1:-1:-1;;;;;8702:28:10;;;;;;:24;:28;;;;;8733:15;8702:46;;8618:150;8926:20;;;;8922:423;;;8980:7;:5;:7::i;:::-;-1:-1:-1;;;;;8974:13:10;:2;-1:-1:-1;;;;;8974:13:10;;;:47;;;;-1:-1:-1;9005:15:10;;-1:-1:-1;;;;;8991:30:10;;;9005:15;;8991:30;;8974:47;:79;;;;-1:-1:-1;9039:13:10;;-1:-1:-1;;;;;9025:28:10;;;9039:13;;9025:28;;8974:79;8970:356;;;9118:9;9089:39;;;;:28;:39;;;;;;9131:12;-1:-1:-1;9081:140:10;;;;-1:-1:-1;;;9081:140:10;;;;;;;:::i;:::-;9277:9;9248:39;;;;:28;:39;;;;;9290:12;9248:54;;8970:356;-1:-1:-1;;;;;9415:31:10;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;9451:35:10;;;;;;:31;:35;;;;;;;;9450:36;9415:71;9411:768;;;9529:20;;9519:6;:30;;9511:96;;;;-1:-1:-1;;;9511:96:10;;;;;;;:::i;:::-;9664:9;;9647:13;9657:2;9647:9;:13::i;:::-;9638:22;;:6;:22;:::i;:::-;:35;;9630:67;;;;-1:-1:-1;;;9630:67:10;;;;;;;:::i;:::-;9411:768;;;-1:-1:-1;;;;;9792:29:10;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;9826:37:10;;;;;;:31;:37;;;;;;;;9825:38;9792:71;9788:391;;;9906:20;;9896:6;:30;;9888:97;;;;-1:-1:-1;;;9888:97:10;;;;;;;:::i;9788:391::-;-1:-1:-1;;;;;10033:35:10;;;;;;:31;:35;;;;;;;;10028:151;;10126:9;;10109:13;10119:2;10109:9;:13::i;:::-;10100:22;;:6;:22;:::i;:::-;:35;;10092:67;;;;-1:-1:-1;;;10092:67:10;;;;;;;:::i;:::-;10219:28;10250:24;10268:4;10250:9;:24::i;:::-;10324:18;;10219:55;;-1:-1:-1;10300:42:10;;;;;;;10371:34;;-1:-1:-1;10396:9:10;;;;10395:10;10371:34;:83;;;;-1:-1:-1;;;;;;10423:31:10;;;;;;:25;:31;;;;;;;;10422:32;10371:83;:126;;;;-1:-1:-1;;;;;;10472:25:10;;;;;;:19;:25;;;;;;;;10471:26;10371:126;:167;;;;-1:-1:-1;;;;;;10515:23:10;;;;;;:19;:23;;;;;;;;10514:24;10371:167;10353:297;;;10565:9;:16;;-1:-1:-1;;10565:16:10;10577:4;10565:16;;;10596:10;:8;:10::i;:::-;10621:9;:17;;-1:-1:-1;;10621:17:10;;;10353:297;10678:9;;-1:-1:-1;;;;;10789:25:10;;10662:12;10789:25;;;:19;:25;;;;;;10678:9;;;;10677:10;;10789:25;;:52;;-1:-1:-1;;;;;;10818:23:10;;;;;;:19;:23;;;;;;;;10789:52;10785:100;;;-1:-1:-1;10868:5:10;10785:100;10897:12;10928:7;10924:1092;;;-1:-1:-1;;;;;10974:29:10;;;;;;:25;:29;;;;;;;;:66;;;;-1:-1:-1;11025:15:10;;;;;;;10974:66;:122;;;;-1:-1:-1;;;;;;11061:30:10;;;;;;:24;:30;;;;;;:35;;10974:122;:208;;;;-1:-1:-1;;;;;;11119:30:10;;;;;;:24;:30;;;;;;11166:15;;11119:43;;11153:8;11119:43;:::i;:::-;:62;;10974:208;10952:897;;;11245:1;11293;11217:25;11338:40;11293:1;11245;11338:21;:40::i;:::-;11313:65;-1:-1:-1;11406:35:10;11437:3;11406:26;:6;11313:65;11406:10;:26::i;:::-;:30;;:35::i;:::-;11399:42;-1:-1:-1;11510:14:10;11483:24;11490:17;11399:42;11483:24;:::i;:::-;:41;;;;:::i;:::-;11460:19;;:64;;;;;;;:::i;:::-;;;;-1:-1:-1;11593:14:10;;-1:-1:-1;11566:24:10;11573:17;11566:4;:24;:::i;:::-;:41;;;;:::i;:::-;11543:19;;:64;;;;;;;:::i;:::-;;;;-1:-1:-1;10952:897:10;;-1:-1:-1;;;;10952:897:10;;11655:30;11681:3;11655:21;11666:9;;11655:6;:10;;:21;;;;:::i;:30::-;11648:37;;11750:9;;11734:13;;11727:4;:20;;;;:::i;:::-;:32;;;;:::i;:::-;11704:19;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;11824:9:10;;11808:13;;11801:20;;:4;:20;:::i;:::-;:32;;;;:::i;:::-;11778:19;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;10952:897:10;11881:8;;11877:91;;11910:42;11926:4;11940;11947;11910:15;:42::i;:::-;11990:14;12000:4;11990:14;;:::i;:::-;;;10924:1092;12028:33;12044:4;12050:2;12054:6;12028:15;:33::i;:::-;7550:4519;;;;;;;;:::o;2333:191:8:-;2426:6;;;-1:-1:-1;;;;;2443:17:8;;;-1:-1:-1;;;;;;2443:17:8;;;;;;;2476:40;;2426:6;;;2443:17;2426:6;;2476:40;;2407:16;;2476:40;2333:191;;:::o;6386:188:10:-;-1:-1:-1;;;;;6469:31:10;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;6469:39:10;;;;;;;;;;6526:40;;6469:39;;:31;6526:40;;;6386:188;;:::o;12077:590::-;12228:16;;;12242:1;12228:16;;;;;;;;12204:21;;12228:16;;;;;;;;;;-1:-1:-1;12228:16:10;12204:40;;12273:4;12255;12260:1;12255:7;;;;;;-1:-1:-1;;;12255:7:10;;;;;;;;;-1:-1:-1;;;;;12255:23:10;;;:7;;;;;;;;;;:23;;;;12299:15;;:22;;;-1:-1:-1;;;12299:22:10;;;;:15;;;;;:20;;:22;;;;;12255:7;;12299:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12289:4;12294:1;12289:7;;;;;;-1:-1:-1;;;12289:7:10;;;;;;;;;-1:-1:-1;;;;;12289:32:10;;;:7;;;;;;;;;:32;12366:15;;12334:62;;12351:4;;12366:15;12384:11;12334:8;:62::i;:::-;12435:15;;:224;;-1:-1:-1;;;12435:224:10;;-1:-1:-1;;;;;12435:15:10;;;;:66;;:224;;12516:11;;12435:15;;12586:4;;12613;;12633:15;;12435:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12077:590;;:::o;7692:671:1:-;-1:-1:-1;;;;;7823:18:1;;7815:68;;;;-1:-1:-1;;;7815:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;7902:16:1;;7894:64;;;;-1:-1:-1;;;7894:64:1;;;;;;;:::i;:::-;7971:38;7992:4;7998:2;8002:6;7971:20;:38::i;:::-;-1:-1:-1;;;;;8044:15:1;;8022:19;8044:15;;;;;;;;;;;8078:21;;;;8070:72;;;;-1:-1:-1;;;8070:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;8178:15:1;;;:9;:15;;;;;;;;;;;8196:20;;;8178:38;;8238:13;;;;;;;;:23;;8210:6;;8178:9;8238:23;;8210:6;;8238:23;:::i;:::-;;;;;;;;8294:2;-1:-1:-1;;;;;8279:26:1;8288:4;-1:-1:-1;;;;;8279:26:1;;8298:6;8279:26;;;;;;:::i;:::-;;;;;;;;8318:37;8338:4;8344:2;8348:6;8318:19;:37::i;13201:1362:10:-;13240:23;13266:24;13284:4;13266:9;:24::i;:::-;13240:50;;13301:25;13351:19;;13329;;:41;;;;:::i;:::-;13301:69;-1:-1:-1;13395:20:10;;;:46;;-1:-1:-1;13419:22:10;;13395:46;13391:59;;;13443:7;;;;13391:59;13482:18;;13464:15;:36;13460:103;;;13533:18;;13515:36;;13460:103;13622:23;13708:1;13688:17;13666:19;;13648:15;:37;;;;:::i;:::-;:57;;;;:::i;:::-;:61;;;;:::i;:::-;13622:87;-1:-1:-1;13720:26:10;13749:36;:15;13622:87;13749:19;:36::i;:::-;13720:65;-1:-1:-1;13834:21:10;13868:37;13720:65;13868:17;:37::i;:::-;13927:18;13948:44;:21;13974:17;13948:25;:44::i;:::-;13927:65;;14003:23;14029:58;14069:17;14029:35;14044:19;;14029:10;:14;;:35;;;;:::i;:58::-;14003:84;-1:-1:-1;14098:23:10;14124:28;14003:84;14124:10;:28;:::i;:::-;14195:1;14173:19;:23;;;14207:19;:23;;;14270:9;;14262:51;;14098:54;;-1:-1:-1;14195:1:10;;-1:-1:-1;;;;;14270:9:10;;;;14293:15;;14262:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14243:70;;;14364:1;14346:15;:19;:42;;;;;14387:1;14369:15;:19;14346:42;14342:214;;;14405:47;14419:15;14436;14405:13;:47::i;:::-;14472:72;14487:18;14507:15;14524:19;;14472:72;;;;;;;;:::i;:::-;;;;;;;;14342:214;13201:1362;;;;;;;;;:::o;2833:98:9:-;2891:7;2918:5;2922:1;2918;:5;:::i;:::-;2911:12;2833:98;-1:-1:-1;;;2833:98:9:o;3571:::-;3629:7;3656:5;3660:1;3656;:5;:::i;3970:98::-;4028:7;4055:5;4059:1;4055;:5;:::i;3214:98::-;3272:7;3299:5;3303:1;3299;:5;:::i;12679:514:10:-;12860:15;;12828:62;;12845:4;;-1:-1:-1;;;;;12860:15:10;12878:11;12828:8;:62::i;:::-;12933:15;;-1:-1:-1;;;;;12933:15:10;:31;12972:9;13005:4;13025:11;12933:15;;13137:7;:5;:7::i;:::-;13159:15;12933:252;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;12679:514;;:::o;14:138:11:-;84:20;;113:33;84:20;113:33;:::i;157:259::-;;269:2;257:9;248:7;244:23;240:32;237:2;;;290:6;282;275:22;237:2;334:9;321:23;353:33;380:5;353:33;:::i;421:263::-;;544:2;532:9;523:7;519:23;515:32;512:2;;;565:6;557;550:22;512:2;602:9;596:16;621:33;648:5;621:33;:::i;689:402::-;;;818:2;806:9;797:7;793:23;789:32;786:2;;;839:6;831;824:22;786:2;883:9;870:23;902:33;929:5;902:33;:::i;:::-;954:5;-1:-1:-1;1011:2:11;996:18;;983:32;1024:35;983:32;1024:35;:::i;:::-;1078:7;1068:17;;;776:315;;;;;:::o;1096:470::-;;;;1242:2;1230:9;1221:7;1217:23;1213:32;1210:2;;;1263:6;1255;1248:22;1210:2;1307:9;1294:23;1326:33;1353:5;1326:33;:::i;:::-;1378:5;-1:-1:-1;1435:2:11;1420:18;;1407:32;1448:35;1407:32;1448:35;:::i;:::-;1200:366;;1502:7;;-1:-1:-1;;;1556:2:11;1541:18;;;;1528:32;;1200:366::o;1571:438::-;;;1697:2;1685:9;1676:7;1672:23;1668:32;1665:2;;;1718:6;1710;1703:22;1665:2;1762:9;1749:23;1781:33;1808:5;1781:33;:::i;:::-;1833:5;-1:-1:-1;1890:2:11;1875:18;;1862:32;1932:15;;1925:23;1913:36;;1903:2;;1968:6;1960;1953:22;2014:327;;;2143:2;2131:9;2122:7;2118:23;2114:32;2111:2;;;2164:6;2156;2149:22;2111:2;2208:9;2195:23;2227:33;2254:5;2227:33;:::i;:::-;2279:5;2331:2;2316:18;;;;2303:32;;-1:-1:-1;;;2101:240:11:o;2346:1166::-;;2461:2;2504;2492:9;2483:7;2479:23;2475:32;2472:2;;;2525:6;2517;2510:22;2472:2;2570:9;2557:23;2599:18;2640:2;2632:6;2629:14;2626:2;;;2661:6;2653;2646:22;2626:2;2704:6;2693:9;2689:22;2679:32;;2749:7;2742:4;2738:2;2734:13;2730:27;2720:2;;2776:6;2768;2761:22;2720:2;2817;2804:16;2839:2;2835;2832:10;2829:2;;;2845:18;;:::i;:::-;2892:2;2888;2884:11;2924:2;2918:9;2975:2;2970;2962:6;2958:15;2954:24;3028:6;3016:10;3013:22;3008:2;2996:10;2993:18;2990:46;2987:2;;;3039:18;;:::i;:::-;3075:2;3068:22;3125:18;;;3159:15;;;;-1:-1:-1;3194:11:11;;;3224;;;3220:20;;3217:33;-1:-1:-1;3214:2:11;;;3268:6;3260;3253:22;3214:2;3295:6;3286:15;;3310:171;3324:2;3321:1;3318:9;3310:171;;;3381:25;3402:3;3381:25;:::i;:::-;3369:38;;3342:1;3335:9;;;;;3427:12;;;;3459;;3310:171;;;-1:-1:-1;3500:6:11;2441:1071;-1:-1:-1;;;;;;;;2441:1071:11:o;3517:190::-;;3629:2;3617:9;3608:7;3604:23;3600:32;3597:2;;;3650:6;3642;3635:22;3597:2;-1:-1:-1;3678:23:11;;3587:120;-1:-1:-1;3587:120:11:o;3712:258::-;;;3841:2;3829:9;3820:7;3816:23;3812:32;3809:2;;;3862:6;3854;3847:22;3809:2;-1:-1:-1;;3890:23:11;;;3960:2;3945:18;;;3932:32;;-1:-1:-1;3799:171:11:o;3975:316::-;;;;4132:2;4120:9;4111:7;4107:23;4103:32;4100:2;;;4153:6;4145;4138:22;4100:2;4187:9;4181:16;4171:26;;4237:2;4226:9;4222:18;4216:25;4206:35;;4281:2;4270:9;4266:18;4260:25;4250:35;;4090:201;;;;;:::o;4296:205::-;4496:3;4487:14::o;4506:203::-;-1:-1:-1;;;;;4670:32:11;;;;4652:51;;4640:2;4625:18;;4607:102::o;4714:607::-;-1:-1:-1;;;;;5073:15:11;;;5055:34;;5120:2;5105:18;;5098:34;;;;5163:2;5148:18;;5141:34;;;;5206:2;5191:18;;5184:34;;;;5255:15;;;5249:3;5234:19;;5227:44;5035:3;5287:19;;5280:35;;;;5004:3;4989:19;;4971:350::o;5326:187::-;5491:14;;5484:22;5466:41;;5454:2;5439:18;;5421:92::o;5518:603::-;;5659:2;5688;5677:9;5670:21;5720:6;5714:13;5763:6;5758:2;5747:9;5743:18;5736:34;5788:4;5801:140;5815:6;5812:1;5809:13;5801:140;;;5910:14;;;5906:23;;5900:30;5876:17;;;5895:2;5872:26;5865:66;5830:10;;5801:140;;;5959:6;5956:1;5953:13;5950:2;;;6029:4;6024:2;6015:6;6004:9;6000:22;5996:31;5989:45;5950:2;-1:-1:-1;6105:2:11;6084:15;-1:-1:-1;;6080:29:11;6065:45;;;;6112:2;6061:54;;5639:482;-1:-1:-1;;;5639:482:11:o;6126:399::-;6328:2;6310:21;;;6367:2;6347:18;;;6340:30;6406:34;6401:2;6386:18;;6379:62;-1:-1:-1;;;6472:2:11;6457:18;;6450:33;6515:3;6500:19;;6300:225::o;6530:353::-;6732:2;6714:21;;;6771:2;6751:18;;;6744:30;6810:31;6805:2;6790:18;;6783:59;6874:2;6859:18;;6704:179::o;6888:346::-;7090:2;7072:21;;;7129:2;7109:18;;;7102:30;-1:-1:-1;;;7163:2:11;7148:18;;7141:52;7225:2;7210:18;;7062:172::o;7239:402::-;7441:2;7423:21;;;7480:2;7460:18;;;7453:30;7519:34;7514:2;7499:18;;7492:62;-1:-1:-1;;;7585:2:11;7570:18;;7563:36;7631:3;7616:19;;7413:228::o;7646:398::-;7848:2;7830:21;;;7887:2;7867:18;;;7860:30;7926:34;7921:2;7906:18;;7899:62;-1:-1:-1;;;7992:2:11;7977:18;;7970:32;8034:3;8019:19;;7820:224::o;8049:400::-;8251:2;8233:21;;;8290:2;8270:18;;;8263:30;8329:34;8324:2;8309:18;;8302:62;-1:-1:-1;;;8395:2:11;8380:18;;8373:34;8439:3;8424:19;;8223:226::o;8454:421::-;8656:2;8638:21;;;8695:2;8675:18;;;8668:30;8734:34;8729:2;8714:18;;8707:62;8805:27;8800:2;8785:18;;8778:55;8865:3;8850:19;;8628:247::o;8880:353::-;9082:2;9064:21;;;9121:2;9101:18;;;9094:30;9160:31;9155:2;9140:18;;9133:59;9224:2;9209:18;;9054:179::o;9238:402::-;9440:2;9422:21;;;9479:2;9459:18;;;9452:30;9518:34;9513:2;9498:18;;9491:62;-1:-1:-1;;;9584:2:11;9569:18;;9562:36;9630:3;9615:19;;9412:228::o;9645:418::-;9847:2;9829:21;;;9886:2;9866:18;;;9859:30;9925:34;9920:2;9905:18;;9898:62;-1:-1:-1;;;9991:2:11;9976:18;;9969:52;10053:3;10038:19;;9819:244::o;10068:417::-;10270:2;10252:21;;;10309:2;10289:18;;;10282:30;10348:34;10343:2;10328:18;;10321:62;-1:-1:-1;;;10414:2:11;10399:18;;10392:51;10475:3;10460:19;;10242:243::o;10490:416::-;10692:2;10674:21;;;10731:2;10711:18;;;10704:30;10770:34;10765:2;10750:18;;10743:62;-1:-1:-1;;;10836:2:11;10821:18;;10814:50;10896:3;10881:19;;10664:242::o;10911:417::-;11113:2;11095:21;;;11152:2;11132:18;;;11125:30;11191:34;11186:2;11171:18;;11164:62;-1:-1:-1;;;11257:2:11;11242:18;;11235:51;11318:3;11303:19;;11085:243::o;11333:477::-;11535:2;11517:21;;;11574:2;11554:18;;;11547:30;11613:34;11608:2;11593:18;;11586:62;11684:34;11679:2;11664:18;;11657:62;-1:-1:-1;;;11750:3:11;11735:19;;11728:40;11800:3;11785:19;;11507:303::o;11815:356::-;12017:2;11999:21;;;12036:18;;;12029:30;12095:34;12090:2;12075:18;;12068:62;12162:2;12147:18;;11989:182::o;12176:401::-;12378:2;12360:21;;;12417:2;12397:18;;;12390:30;12456:34;12451:2;12436:18;;12429:62;-1:-1:-1;;;12522:2:11;12507:18;;12500:35;12567:3;12552:19;;12350:227::o;12582:481::-;12784:2;12766:21;;;12823:2;12803:18;;;12796:30;12862:34;12857:2;12842:18;;12835:62;12933:34;12928:2;12913:18;;12906:62;-1:-1:-1;;;12999:3:11;12984:19;;12977:44;13053:3;13038:19;;12756:307::o;13068:400::-;13270:2;13252:21;;;13309:2;13289:18;;;13282:30;13348:34;13343:2;13328:18;;13321:62;-1:-1:-1;;;13414:2:11;13399:18;;13392:34;13458:3;13443:19;;13242:226::o;13473:343::-;13675:2;13657:21;;;13714:2;13694:18;;;13687:30;-1:-1:-1;;;13748:2:11;13733:18;;13726:49;13807:2;13792:18;;13647:169::o;13821:401::-;14023:2;14005:21;;;14062:2;14042:18;;;14035:30;14101:34;14096:2;14081:18;;14074:62;-1:-1:-1;;;14167:2:11;14152:18;;14145:35;14212:3;14197:19;;13995:227::o;14227:411::-;14429:2;14411:21;;;14468:2;14448:18;;;14441:30;14507:34;14502:2;14487:18;;14480:62;-1:-1:-1;;;14573:2:11;14558:18;;14551:45;14628:3;14613:19;;14401:237::o;14643:177::-;14789:25;;;14777:2;14762:18;;14744:76::o;14825:983::-;;15135:3;15124:9;15120:19;15166:6;15155:9;15148:25;15192:2;15230:6;15225:2;15214:9;15210:18;15203:34;15273:3;15268:2;15257:9;15253:18;15246:31;15297:6;15332;15326:13;15363:6;15355;15348:22;15401:3;15390:9;15386:19;15379:26;;15440:2;15432:6;15428:15;15414:29;;15461:4;15474:195;15488:6;15485:1;15482:13;15474:195;;;15553:13;;-1:-1:-1;;;;;15549:39:11;15537:52;;15644:15;;;;15609:12;;;;15585:1;15503:9;15474:195;;;-1:-1:-1;;;;;;;15725:32:11;;;;15720:2;15705:18;;15698:60;-1:-1:-1;;;15789:3:11;15774:19;15767:35;15686:3;15096:712;-1:-1:-1;;;15096:712:11:o;15813:319::-;16015:25;;;16071:2;16056:18;;16049:34;;;;16114:2;16099:18;;16092:34;16003:2;15988:18;;15970:162::o;16137:184::-;16309:4;16297:17;;;;16279:36;;16267:2;16252:18;;16234:87::o;16326:128::-;;16397:1;16393:6;16390:1;16387:13;16384:2;;;16403:18;;:::i;:::-;-1:-1:-1;16439:9:11;;16374:80::o;16459:217::-;;16525:1;16515:2;;-1:-1:-1;;;16550:31:11;;16604:4;16601:1;16594:15;16632:4;16557:1;16622:15;16515:2;-1:-1:-1;16661:9:11;;16505:171::o;16681:168::-;;16787:1;16783;16779:6;16775:14;16772:1;16769:21;16764:1;16757:9;16750:17;16746:45;16743:2;;;16794:18;;:::i;:::-;-1:-1:-1;16834:9:11;;16733:116::o;16854:125::-;;16922:1;16919;16916:8;16913:2;;;16927:18;;:::i;:::-;-1:-1:-1;16964:9:11;;16903:76::o;16984:380::-;17069:1;17059:12;;17116:1;17106:12;;;17127:2;;17181:4;17173:6;17169:17;17159:27;;17127:2;17234;17226:6;17223:14;17203:18;17200:38;17197:2;;;17280:10;17275:3;17271:20;17268:1;17261:31;17315:4;17312:1;17305:15;17343:4;17340:1;17333:15;17197:2;;17039:325;;;:::o;17369:135::-;;-1:-1:-1;;17429:17:11;;17426:2;;;17449:18;;:::i;:::-;-1:-1:-1;17496:1:11;17485:13;;17416:88::o;17509:127::-;17570:10;17565:3;17561:20;17558:1;17551:31;17601:4;17598:1;17591:15;17625:4;17622:1;17615:15;17641:127;17702:10;17697:3;17693:20;17690:1;17683:31;17733:4;17730:1;17723:15;17757:4;17754:1;17747:15;17773:133;-1:-1:-1;;;;;17850:31:11;;17840:42;;17830:2;;17896:1;17893;17886:12

Swarm Source

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