ETH Price: $3,082.71 (-1.24%)

Token

Arise Chikun (CHIKUN)
 

Overview

Max Total Supply

1,000,000,000 CHIKUN

Holders

188

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
3,178,987.189303747 CHIKUN

Value
$0.00
0x18173037e94332453DAcfAd78c8341C40C6191a8
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:
ChikunCoin

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-07-18
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.17;

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

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

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

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

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
   
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

library Address {
    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal returns(bool){
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        return success;
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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

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

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        uint256 currentAllowance = _allowances[sender][_msgSender()];
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
            unchecked {
                _approve(sender, _msgSender(), currentAllowance - amount);
            }
        }

        _transfer(sender, recipient, amount);

        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

contract ChikunCoin is ERC20, Ownable {
    using Address for address payable;

    IUniswapV2Router02 public uniswapV2Router;
    address public  uniswapV2Pair;

    mapping (address => bool) private _isExcludedFromFees;

    uint256 public  liquidityFeeOnBuy;
    uint256 public  liquidityFeeOnSell;

    uint256 public  marketingFeeOnBuy;
    uint256 public  marketingFeeOnSell;

    uint256 private _totalFeesOnBuy;
    uint256 private _totalFeesOnSell;

    address public  marketingWallet;

    uint256 public  swapTokensAtAmount;
    bool    private swapping;

    bool    public swapEnabled;

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event MarketingWalletChanged(address marketingWallet);
    event UpdateBuyFees(uint256 liquidityFeeOnBuy, uint256 marketingFeeOnBuy);
    event UpdateSellFees(uint256 liquidityFeeOnSell, uint256 marketingFeeOnSell);
    event SwapAndLiquify(uint256 tokensSwapped,uint256 bnbReceived,uint256 tokensIntoLiqudity);
    event SwapAndSendMarketing(uint256 tokensSwapped, uint256 bnbSend);
    event SwapTokensAtAmountUpdated(uint256 swapTokensAtAmount);

    constructor () ERC20("Arise Chikun", "CHIKUN") 
    {   
        address router;
        if (block.chainid == 1 || block.chainid == 5) {
            router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // ETH Uniswap Mainnet % Testnet
        } else {
            revert();
        }

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(router);
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair   = _uniswapV2Pair;

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

        liquidityFeeOnBuy  = 0;
        liquidityFeeOnSell = 0;

        marketingFeeOnBuy  = 0;
        marketingFeeOnSell = 0;

        _totalFeesOnBuy    = liquidityFeeOnBuy  + marketingFeeOnBuy;
        _totalFeesOnSell   = liquidityFeeOnSell + marketingFeeOnSell;

        marketingWallet = 0x1F9521088C71A04e38c7265BAa32C92b620461BF;

        maxTransactionLimitEnabled = true;

        _isExcludedFromMaxTxLimit[owner()] = true;
        _isExcludedFromMaxTxLimit[address(this)] = true;
        _isExcludedFromMaxTxLimit[address(0xdead)] = true;
        _isExcludedFromMaxTxLimit[marketingWallet] = true;
        _isExcludedFromMaxTxLimit[0x1F9521088C71A04e38c7265BAa32C92b620461BF] = true;

        maxWalletLimitEnabled = true;

        _isExcludedFromMaxWalletLimit[owner()] = true;
        _isExcludedFromMaxWalletLimit[address(this)] = true;
        _isExcludedFromMaxWalletLimit[address(0xdead)] = true;
        _isExcludedFromMaxWalletLimit[marketingWallet] = true;
        _isExcludedFromMaxWalletLimit[0x582AdC7E14A6D69c80AdB4491bab9A22B7F4b75f] = true;

        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[address(0xdead)] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[0x1F9521088C71A04e38c7265BAa32C92b620461BF] = true; 

        _mint(owner(), 1e9 * (10 ** decimals()));
        swapTokensAtAmount = totalSupply() / 5_000;
	
        maxTransactionAmountBuy     = totalSupply() * 10 / 1000;
        maxTransactionAmountSell    = totalSupply() * 10 / 1000;
	
        maxWalletAmount             = totalSupply() * 10 / 1000;

        tradingEnabled = false;
        swapEnabled = true;
    }

    receive() external payable {

  	}

    function claimStuckTokens(address token) external onlyOwner {
        require(token != address(this), "Owner cannot claim contract's balance of its own tokens");
        if (token == address(0x0)) {
            payable(msg.sender).sendValue(address(this).balance);
            return;
        }
        IERC20 ERC20token = IERC20(token);
        uint256 balance = ERC20token.balanceOf(address(this));
        ERC20token.transfer(msg.sender, balance);
    }

    function excludeFromFees(address account, bool excluded) external onlyOwner{
        require(_isExcludedFromFees[account] != excluded,"Account is already the value of 'excluded'");
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function updateBuyFees(uint256 _liquidityFeeOnBuy, uint256 _marketingFeeOnBuy) external onlyOwner {
        liquidityFeeOnBuy = _liquidityFeeOnBuy;
        marketingFeeOnBuy = _marketingFeeOnBuy;

        _totalFeesOnBuy   = liquidityFeeOnBuy + marketingFeeOnBuy;


        emit UpdateBuyFees(liquidityFeeOnBuy, marketingFeeOnBuy);
    }

    function updateSellFees(uint256 _liquidityFeeOnSell, uint256 _marketingFeeOnSell) external onlyOwner {
        liquidityFeeOnSell = _liquidityFeeOnSell;
        marketingFeeOnSell = _marketingFeeOnSell;

        _totalFeesOnSell   = liquidityFeeOnSell + marketingFeeOnSell;


        emit UpdateSellFees(liquidityFeeOnSell, marketingFeeOnSell);
    }

    function changeMarketingWallet(address _marketingWallet) external onlyOwner{
        require(_marketingWallet != marketingWallet,"Marketing wallet is already that address");
        require(_marketingWallet != address(0),"Marketing wallet cannot be the zero address");
        marketingWallet = _marketingWallet;

        emit MarketingWalletChanged(marketingWallet);
    }

    bool public tradingEnabled;

    function enableTrading() external onlyOwner{
        require(!tradingEnabled, "Trading already enabled.");
        tradingEnabled = true;
        swapEnabled = true;
    }

    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(tradingEnabled || _isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading not yet enabled!");
       
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (maxTransactionLimitEnabled) 
        {
            if ((from == uniswapV2Pair || to == uniswapV2Pair) &&
                !_isExcludedFromMaxTxLimit[from] && 
                !_isExcludedFromMaxTxLimit[to]
            ) {
                if (from == uniswapV2Pair) {
                    require(
                        amount <= maxTransactionAmountBuy,  
                        "AntiWhale: Transfer amount exceeds the maxTransactionAmount"
                    );
                } else {
                    require(
                        amount <= maxTransactionAmountSell, 
                        "AntiWhale: Transfer amount exceeds the maxTransactionAmount"
                    );
                }
            }
        }

		uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (canSwap &&
            !swapping &&
            to == uniswapV2Pair &&
            _totalFeesOnBuy + _totalFeesOnSell > 0 &&
            swapEnabled
        ) {
            swapping = true;

            uint256 totalFee = _totalFeesOnBuy + _totalFeesOnSell;
            uint256 liquidityShare = liquidityFeeOnBuy + liquidityFeeOnSell;
            uint256 marketingShare = marketingFeeOnBuy + marketingFeeOnSell;

            if (liquidityShare > 0) {
                uint256 liquidityTokens = contractTokenBalance * liquidityShare / totalFee;
                swapAndLiquify(liquidityTokens);
            }
            
            if (marketingShare > 0) {
                uint256 marketingTokens = contractTokenBalance * marketingShare / totalFee;
                swapAndSendMarketing(marketingTokens);
            }          

            swapping = false;
        }

        uint256 _totalFees;
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to] || swapping) {
            _totalFees = 0;
        } else if (from == uniswapV2Pair) {
            _totalFees = _totalFeesOnBuy;
        } else if (to == uniswapV2Pair) {
            _totalFees = _totalFeesOnSell;
        } else {
            _totalFees = 0;
        }

        if (_totalFees > 0) {
            uint256 fees = (amount * _totalFees) / 100;
            amount = amount - fees;
            super._transfer(from, address(this), fees);
        }

        if (maxWalletLimitEnabled) 
        {
            if (!_isExcludedFromMaxWalletLimit[from] && 
                !_isExcludedFromMaxWalletLimit[to] &&
                to != uniswapV2Pair
            ) {
                uint256 balance  = balanceOf(to);
                require(
                    balance + amount <= maxWalletAmount, 
                    "MaxWallet: Recipient exceeds the maxWalletAmount"
                );
            }
        }

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

    function setSwapEnabled(bool _enabled) external onlyOwner{
        require(swapEnabled != _enabled, "swapEnabled already at this state.");
        swapEnabled = _enabled;
    }

    function setSwapTokensAtAmount(uint256 newAmount) external onlyOwner{
        require(newAmount > totalSupply() / 1_000_000, "SwapTokensAtAmount must be greater than 0.0001% of total supply");
        swapTokensAtAmount = newAmount;

        emit SwapTokensAtAmountUpdated(swapTokensAtAmount);
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens / 2;
        uint256 otherHalf = tokens - half;

        uint256 initialBalance = address(this).balance;

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

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            half,
            0,
            path,
            address(this),
            block.timestamp);
        
        uint256 newBalance = address(this).balance - initialBalance;

        uniswapV2Router.addLiquidityETH{value: newBalance}(
            address(this),
            otherHalf,
            0,
            0,
            address(0xdead),
            block.timestamp
        );

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapAndSendMarketing(uint256 tokenAmount) private {
        uint256 initialBalance = address(this).balance;

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

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp);

        uint256 newBalance = address(this).balance - initialBalance;

        payable(marketingWallet).sendValue(newBalance);

        emit SwapAndSendMarketing(tokenAmount, newBalance);
    }

    mapping(address => bool) private _isExcludedFromMaxWalletLimit;
    bool    public maxWalletLimitEnabled;
    uint256 public maxWalletAmount;

    event ExcludedFromMaxWalletLimit(address indexed account, bool isExcluded);
    event MaxWalletLimitStateChanged(bool maxWalletLimit);
    event MaxWalletLimitAmountChanged(uint256 maxWalletAmount);

    function setEnableMaxWalletLimit(bool enable) external onlyOwner {
        require(enable != maxWalletLimitEnabled,"Max wallet limit is already set to that state");
        maxWalletLimitEnabled = enable;

        emit MaxWalletLimitStateChanged(maxWalletLimitEnabled);
    }

    function setMaxWalletAmount(uint256 _maxWalletAmount) external onlyOwner {
        require(_maxWalletAmount >= (totalSupply() / (10 ** decimals())) / 100, "Max wallet percentage cannot be lower than 1%");
        maxWalletAmount = _maxWalletAmount * (10 ** decimals());

        emit MaxWalletLimitAmountChanged(maxWalletAmount);
    }

    function excludeFromMaxWallet(address account, bool exclude) external onlyOwner {
        require( _isExcludedFromMaxWalletLimit[account] != exclude,"Account is already set to that state");
        require(account != address(this), "Can't set this address.");

        _isExcludedFromMaxWalletLimit[account] = exclude;

        emit ExcludedFromMaxWalletLimit(account, exclude);
    }

    function isExcludedFromMaxWalletLimit(address account) public view returns(bool) {
        return _isExcludedFromMaxWalletLimit[account];
    }

    mapping(address => bool) private _isExcludedFromMaxTxLimit;
    bool    public  maxTransactionLimitEnabled;
    uint256 public  maxTransactionAmountBuy;
    uint256 public  maxTransactionAmountSell;

    event ExcludedFromMaxTransactionLimit(address indexed account, bool isExcluded);
    event MaxTransactionLimitStateChanged(bool maxTransactionLimit);
    event MaxTransactionLimitAmountChanged(uint256 maxTransactionAmountBuy, uint256 maxTransactionAmountSell);

    function setEnableMaxTransactionLimit(bool enable) external onlyOwner {
        require(enable != maxTransactionLimitEnabled, "Max transaction limit is already set to that state");
        maxTransactionLimitEnabled = enable;

        emit MaxTransactionLimitStateChanged(maxTransactionLimitEnabled);
    }

    function setMaxTransactionAmounts(uint256 _maxTransactionAmountBuy, uint256 _maxTransactionAmountSell) external onlyOwner {
        require(
            _maxTransactionAmountBuy  >= (totalSupply() / (10 ** decimals())) / 1_000 && 
            _maxTransactionAmountSell >= (totalSupply() / (10 ** decimals())) / 1_000, 
            "Max Transaction limis cannot be lower than 0.1% of total supply"
        ); 
        maxTransactionAmountBuy  = _maxTransactionAmountBuy  * (10 ** decimals());
        maxTransactionAmountSell = _maxTransactionAmountSell * (10 ** decimals());

        emit MaxTransactionLimitAmountChanged(maxTransactionAmountBuy, maxTransactionAmountSell);
    }

    function excludeFromMaxTransactionLimit(address account, bool exclude) external onlyOwner {
        require( _isExcludedFromMaxTxLimit[account] != exclude, "Account is already set to that state");
        require(account != address(this), "Can't set this address.");

        _isExcludedFromMaxTxLimit[account] = exclude;

        emit ExcludedFromMaxTransactionLimit(account, exclude);
    }

    function isExcludedFromMaxTransaction(address account) public view returns(bool) {
        return _isExcludedFromMaxTxLimit[account];
    }
}

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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromMaxTransactionLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromMaxWalletLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"marketingWallet","type":"address"}],"name":"MarketingWalletChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTransactionAmountBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxTransactionAmountSell","type":"uint256"}],"name":"MaxTransactionLimitAmountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"maxTransactionLimit","type":"bool"}],"name":"MaxTransactionLimitStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxWalletAmount","type":"uint256"}],"name":"MaxWalletLimitAmountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"maxWalletLimit","type":"bool"}],"name":"MaxWalletLimitStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bnbReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bnbSend","type":"uint256"}],"name":"SwapAndSendMarketing","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"swapTokensAtAmount","type":"uint256"}],"name":"SwapTokensAtAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidityFeeOnBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketingFeeOnBuy","type":"uint256"}],"name":"UpdateBuyFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidityFeeOnSell","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketingFeeOnSell","type":"uint256"}],"name":"UpdateSellFees","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":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"changeMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"claimStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"account","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"excludeFromMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"excludeFromMaxWallet","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":"account","type":"address"}],"name":"isExcludedFromMaxTransaction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxWalletLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmountBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmountSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionLimitEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletLimitEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setEnableMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setEnableMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTransactionAmountBuy","type":"uint256"},{"internalType":"uint256","name":"_maxTransactionAmountSell","type":"uint256"}],"name":"setMaxTransactionAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletAmount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFeeOnBuy","type":"uint256"},{"internalType":"uint256","name":"_marketingFeeOnBuy","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"_marketingFeeOnSell","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040518060400160405280600c81526020016b20b934b9b29021b434b5bab760a11b8152506040518060400160405280600681526020016521a424a5aaa760d11b815250816003908162000067919062000940565b50600462000076828262000940565b50505060006200008b6200068260201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060004660011480620000eb5750466005145b156200010d5750737a250d5630b4cf539739df2c5dacb4c659f2488d62000112565b600080fd5b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000158573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200017e919062000a0c565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001cc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f2919062000a0c565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000266919062000a0c565b600680546001600160a01b038086166001600160a01b031992831681179093556007805491851691909216179055909150620002a790309060001962000686565b60006009819055600a819055600b819055600c819055620002c9908062000a54565b600d55600c54600a54620002de919062000a54565b600e55600f80546001600160a01b031916731f9521088c71a04e38c7265baa32c92b620461bf1790556016805460ff19166001908117909155601560006200032e6005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260159093528183208054851660019081179091557f7ed1dca03d96f947ab02d66053f47073699eb6287021936c92f54972932767e58054861682179055600f5490911683529082208054841682179055731f9521088c71a04e38c7265baa32c92b620461bf82527f8eff447f677b4b216c5840518bc96f16fac2c36906fbf2e13282148e1c3b91648054841682179055601380549093168117909255601290620004116005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260129093528183208054851660019081179091557f1120e10407cab1193d7c5139d9aae5536deb3d83e855f25f8e42f811c01f56f78054861682179055600f549091168352908220805484168217905573582adc7e14a6d69c80adb4491bab9a22b7f4b75f82527f36971c1140b1564cd1a1c0a568890bdf40cc1168fcd5654b02f095cd8cdeface80549093168117909255600890620004ea6005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905560089092527f046fee3d77c34a6c5e10c3be6dc4b132c30449dbf4f0bc07684896dd093342998054841660019081179091553083529082208054841682179055731f9521088c71a04e38c7265baa32c92b620461bf9091527f5455c18906f1d253e31f3ad63bfa137af3e138e0eeda66162d1659901f1069f28054909216179055620005d2620005ae6005546001600160a01b031690565b620005bc6009600a62000b6d565b620005cc90633b9aca0062000b7e565b620007b2565b611388620005df60025490565b620005eb919062000b98565b6010556103e8620005fb60025490565b6200060890600a62000b7e565b62000614919062000b98565b6017556103e86200062460025490565b6200063190600a62000b7e565b6200063d919062000b98565b6018556103e86200064d60025490565b6200065a90600a62000b7e565b62000666919062000b98565b60145550506011805462ffff0019166101001790555062000bbb565b3390565b6001600160a01b038316620006ee5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620007515760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620006e5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0382166200080a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620006e5565b80600260008282546200081e919062000a54565b90915550506001600160a01b038216600090815260208190526040812080548392906200084d90849062000a54565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620008c757607f821691505b602082108103620008e857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200089757600081815260208120601f850160051c81016020861015620009175750805b601f850160051c820191505b81811015620009385782815560010162000923565b505050505050565b81516001600160401b038111156200095c576200095c6200089c565b62000974816200096d8454620008b2565b84620008ee565b602080601f831160018114620009ac5760008415620009935750858301515b600019600386901b1c1916600185901b17855562000938565b600085815260208120601f198616915b82811015620009dd57888601518255948401946001909101908401620009bc565b5085821015620009fc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000a1f57600080fd5b81516001600160a01b038116811462000a3757600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000a6a5762000a6a62000a3e565b92915050565b600181815b8085111562000ab157816000190482111562000a955762000a9562000a3e565b8085161562000aa357918102915b93841c939080029062000a75565b509250929050565b60008262000aca5750600162000a6a565b8162000ad95750600062000a6a565b816001811462000af2576002811462000afd5762000b1d565b600191505062000a6a565b60ff84111562000b115762000b1162000a3e565b50506001821b62000a6a565b5060208310610133831016604e8410600b841016171562000b42575081810a62000a6a565b62000b4e838362000a70565b806000190482111562000b655762000b6562000a3e565b029392505050565b600062000a3760ff84168362000ab9565b808202811582820484141762000a6a5762000a6a62000a3e565b60008262000bb657634e487b7160e01b600052601260045260246000fd5b500490565b612bcc8062000bcb6000396000f3fe6080604052600436106102815760003560e01c806370a082311161014f578063aa4bde28116100c1578063dc4c7dbc1161007a578063dc4c7dbc146107b2578063dd62ed3e146107c8578063e01af92c1461080e578063e2f456051461082e578063f2fde38b14610844578063f9d0831a1461086457600080fd5b8063aa4bde28146106fc578063afa4f3b214610712578063b6f7f68114610732578063bb85c6d114610752578063c024666814610772578063d2fcc0011461079257600080fd5b80638a8c523c116101135780638a8c523c1461063b5780638da5cb5b1461065057806395d89b411461066e578063a457c2d714610683578063a8a69b9d146106a3578063a9059cbb146106dc57600080fd5b806370a082311461059a578063715018a6146105d057806375f0a874146105e55780637b3c83b114610605578063880bcbc11461061b57600080fd5b80632ba86bf2116101f35780634fbee193116101ac5780634fbee193146104d657806356a6cabf1461050f57806359136fa51461052f5780635fc2e5961461054557806366ca9b831461055b5780636ddd17131461057b57600080fd5b80632ba86bf21461042a5780632ce86fbf14610444578063313ce5671461045a578063395093511461047657806349bd5a5e146104965780634ada218b146104b657600080fd5b806318160ddd1161024557806318160ddd1461036257806318d9ceae1461037757806321a9d82a146103b057806323b872dd146103ca57806327a14fc2146103ea5780632a6c7dba1461040a57600080fd5b80630105d0fd1461028d57806302dbd8f8146102b657806306fdde03146102d8578063095ea7b3146102fa5780631694505e1461032a57600080fd5b3661028857005b600080fd5b34801561029957600080fd5b506102a360175481565b6040519081526020015b60405180910390f35b3480156102c257600080fd5b506102d66102d13660046125cd565b610884565b005b3480156102e457600080fd5b506102ed610917565b6040516102ad91906125ef565b34801561030657600080fd5b5061031a610315366004612652565b6109a9565b60405190151581526020016102ad565b34801561033657600080fd5b5060065461034a906001600160a01b031681565b6040516001600160a01b0390911681526020016102ad565b34801561036e57600080fd5b506002546102a3565b34801561038357600080fd5b5061031a61039236600461267e565b6001600160a01b031660009081526015602052604090205460ff1690565b3480156103bc57600080fd5b5060135461031a9060ff1681565b3480156103d657600080fd5b5061031a6103e53660046126a2565b6109c0565b3480156103f657600080fd5b506102d66104053660046126e3565b610a71565b34801561041657600080fd5b506102d661042536600461270a565b610b77565b34801561043657600080fd5b5060165461031a9060ff1681565b34801561045057600080fd5b506102a3600a5481565b34801561046657600080fd5b50604051600981526020016102ad565b34801561048257600080fd5b5061031a610491366004612652565b610c56565b3480156104a257600080fd5b5060075461034a906001600160a01b031681565b3480156104c257600080fd5b5060115461031a9062010000900460ff1681565b3480156104e257600080fd5b5061031a6104f136600461267e565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561051b57600080fd5b506102d661052a36600461270a565b610c92565b34801561053b57600080fd5b506102a360185481565b34801561055157600080fd5b506102a3600b5481565b34801561056757600080fd5b506102d66105763660046125cd565b610d76565b34801561058757600080fd5b5060115461031a90610100900460ff1681565b3480156105a657600080fd5b506102a36105b536600461267e565b6001600160a01b031660009081526020819052604090205490565b3480156105dc57600080fd5b506102d6610df4565b3480156105f157600080fd5b50600f5461034a906001600160a01b031681565b34801561061157600080fd5b506102a360095481565b34801561062757600080fd5b506102d6610636366004612727565b610e68565b34801561064757600080fd5b506102d6610f84565b34801561065c57600080fd5b506005546001600160a01b031661034a565b34801561067a57600080fd5b506102ed61101a565b34801561068f57600080fd5b5061031a61069e366004612652565b611029565b3480156106af57600080fd5b5061031a6106be36600461267e565b6001600160a01b031660009081526012602052604090205460ff1690565b3480156106e857600080fd5b5061031a6106f7366004612652565b6110c2565b34801561070857600080fd5b506102a360145481565b34801561071e57600080fd5b506102d661072d3660046126e3565b6110cf565b34801561073e57600080fd5b506102d661074d3660046125cd565b6111b9565b34801561075e57600080fd5b506102d661076d36600461267e565b61131c565b34801561077e57600080fd5b506102d661078d366004612727565b61146d565b34801561079e57600080fd5b506102d66107ad366004612727565b611572565b3480156107be57600080fd5b506102a3600c5481565b3480156107d457600080fd5b506102a36107e3366004612760565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561081a57600080fd5b506102d661082936600461270a565b611686565b34801561083a57600080fd5b506102a360105481565b34801561085057600080fd5b506102d661085f36600461267e565b611737565b34801561087057600080fd5b506102d661087f36600461267e565b611822565b6005546001600160a01b031633146108b75760405162461bcd60e51b81526004016108ae9061278e565b60405180910390fd5b600a829055600c8190556108cb81836127d9565b600e55600a54600c546040517f12dd4f8337f0c236c7994706854cca8cd53921c0032cb0fba8cdb797e73f67c69261090b92908252602082015260400190565b60405180910390a15050565b606060038054610926906127ec565b80601f0160208091040260200160405190810160405280929190818152602001828054610952906127ec565b801561099f5780601f106109745761010080835404028352916020019161099f565b820191906000526020600020905b81548152906001019060200180831161098257829003601f168201915b5050505050905090565b60006109b63384846119ce565b5060015b92915050565b6001600160a01b03831660009081526001602090815260408083203384529091528120546000198114610a5b5782811015610a4e5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016108ae565b610a5b85338584036119ce565b610a66858585611af2565b506001949350505050565b6005546001600160a01b03163314610a9b5760405162461bcd60e51b81526004016108ae9061278e565b6064610aa96009600a61290a565b600254610ab69190612919565b610ac09190612919565b811015610b255760405162461bcd60e51b815260206004820152602d60248201527f4d61782077616c6c65742070657263656e746167652063616e6e6f742062652060448201526c6c6f776572207468616e20312560981b60648201526084016108ae565b610b316009600a61290a565b610b3b908261293b565b60148190556040519081527f21bc0ea3406acb92d4449ab33befb4ae82f873a22f3b6cf0e466b2710beb5942906020015b60405180910390a150565b6005546001600160a01b03163314610ba15760405162461bcd60e51b81526004016108ae9061278e565b60135460ff16151581151503610c0f5760405162461bcd60e51b815260206004820152602d60248201527f4d61782077616c6c6574206c696d697420697320616c7265616479207365742060448201526c746f207468617420737461746560981b60648201526084016108ae565b6013805460ff191682151590811790915560405160ff909116151581527f670f884265aba2d05e7c26efbc42f8365effc4cb3fcfcefddba0c0b71a6231f190602001610b6c565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109b6918590610c8d9086906127d9565b6119ce565b6005546001600160a01b03163314610cbc5760405162461bcd60e51b81526004016108ae9061278e565b60165460ff16151581151503610d2f5760405162461bcd60e51b815260206004820152603260248201527f4d6178207472616e73616374696f6e206c696d697420697320616c72656164796044820152712073657420746f207468617420737461746560701b60648201526084016108ae565b6016805460ff191682151590811790915560405160ff909116151581527fe81be35e61864c26afd7a4655e99f321378d0aaae1e5af8ee67b658a7460f3cf90602001610b6c565b6005546001600160a01b03163314610da05760405162461bcd60e51b81526004016108ae9061278e565b6009829055600b819055610db481836127d9565b600d55600954600b546040517fccd61cb5df2cb048d1a7af40a431d6f247af01b6cf048f7a3f2aa9d313e2bc509261090b92908252602082015260400190565b6005546001600160a01b03163314610e1e5760405162461bcd60e51b81526004016108ae9061278e565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610e925760405162461bcd60e51b81526004016108ae9061278e565b6001600160a01b03821660009081526015602052604090205481151560ff909116151503610ed25760405162461bcd60e51b81526004016108ae90612952565b306001600160a01b03831603610f245760405162461bcd60e51b815260206004820152601760248201527621b0b713ba1039b2ba103a3434b99030b2323932b9b99760491b60448201526064016108ae565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527f8727c4afe988887760e8db0bbad9f9fcceee6428545956832f67c8fdbd589c1091015b60405180910390a25050565b6005546001600160a01b03163314610fae5760405162461bcd60e51b81526004016108ae9061278e565b60115462010000900460ff16156110075760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642e000000000000000060448201526064016108ae565b6011805462ffff00191662010100179055565b606060048054610926906127ec565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156110ab5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108ae565b6110b833858584036119ce565b5060019392505050565b60006109b6338484611af2565b6005546001600160a01b031633146110f95760405162461bcd60e51b81526004016108ae9061278e565b620f424061110660025490565b6111109190612919565b81116111845760405162461bcd60e51b815260206004820152603f60248201527f53776170546f6b656e734174416d6f756e74206d75737420626520677265617460448201527f6572207468616e20302e3030303125206f6620746f74616c20737570706c790060648201526084016108ae565b60108190556040518181527f7c26bfee26f82e8cb57af48f4019cc64582db6fac7bad778433f10572ae8b14590602001610b6c565b6005546001600160a01b031633146111e35760405162461bcd60e51b81526004016108ae9061278e565b6103e86111f26009600a61290a565b6002546111ff9190612919565b6112099190612919565b821015801561123d57506103e86112226009600a61290a565b60025461122f9190612919565b6112399190612919565b8110155b6112af5760405162461bcd60e51b815260206004820152603f60248201527f4d6178205472616e73616374696f6e206c696d69732063616e6e6f742062652060448201527f6c6f776572207468616e20302e3125206f6620746f74616c20737570706c790060648201526084016108ae565b6112bb6009600a61290a565b6112c5908361293b565b6017556112d46009600a61290a565b6112de908261293b565b60188190556017546040517f8c8cbc911b80df94332ececb8eb0945274d76fa965600a0f01f42af3f8afb1319261090b928252602082015260400190565b6005546001600160a01b031633146113465760405162461bcd60e51b81526004016108ae9061278e565b600f546001600160a01b03908116908216036113b55760405162461bcd60e51b815260206004820152602860248201527f4d61726b6574696e672077616c6c657420697320616c72656164792074686174604482015267206164647265737360c01b60648201526084016108ae565b6001600160a01b03811661141f5760405162461bcd60e51b815260206004820152602b60248201527f4d61726b6574696e672077616c6c65742063616e6e6f7420626520746865207a60448201526a65726f206164647265737360a81b60648201526084016108ae565b600f80546001600160a01b0319166001600160a01b0383169081179091556040519081527fa964ba5c52d7e7bfcae4fb1ae4db9f211756d0e618e85fac5283b882a39e7a0b90602001610b6c565b6005546001600160a01b031633146114975760405162461bcd60e51b81526004016108ae9061278e565b6001600160a01b03821660009081526008602052604090205481151560ff90911615150361151a5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b60648201526084016108ae565b6001600160a01b038216600081815260086020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101610f78565b6005546001600160a01b0316331461159c5760405162461bcd60e51b81526004016108ae9061278e565b6001600160a01b03821660009081526012602052604090205481151560ff9091161515036115dc5760405162461bcd60e51b81526004016108ae90612952565b306001600160a01b0383160361162e5760405162461bcd60e51b815260206004820152601760248201527621b0b713ba1039b2ba103a3434b99030b2323932b9b99760491b60448201526064016108ae565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527f1d9a11e204b58ad56c619c61600e42167624659d218f0143f1f64956b0daae6c9101610f78565b6005546001600160a01b031633146116b05760405162461bcd60e51b81526004016108ae9061278e565b801515601160019054906101000a900460ff1615150361171d5760405162461bcd60e51b815260206004820152602260248201527f73776170456e61626c656420616c726561647920617420746869732073746174604482015261329760f11b60648201526084016108ae565b601180549115156101000261ff0019909216919091179055565b6005546001600160a01b031633146117615760405162461bcd60e51b81526004016108ae9061278e565b6001600160a01b0381166117c65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ae565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461184c5760405162461bcd60e51b81526004016108ae9061278e565b306001600160a01b038216036118ca5760405162461bcd60e51b815260206004820152603760248201527f4f776e65722063616e6e6f7420636c61696d20636f6e7472616374277320626160448201527f6c616e6365206f6620697473206f776e20746f6b656e7300000000000000000060648201526084016108ae565b6001600160a01b0381166118e6576118e23347611fd7565b5050565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561192f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119539190612996565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156119a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c791906129af565b5050505b50565b6001600160a01b038316611a305760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108ae565b6001600160a01b038216611a915760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108ae565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611b185760405162461bcd60e51b81526004016108ae906129cc565b6001600160a01b038216611b3e5760405162461bcd60e51b81526004016108ae90612a11565b60115462010000900460ff1680611b6d57506001600160a01b03831660009081526008602052604090205460ff165b80611b9057506001600160a01b03821660009081526008602052604090205460ff165b611bdc5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c656421000000000000000060448201526064016108ae565b80600003611bf557611bf083836000612086565b505050565b60165460ff1615611cd7576007546001600160a01b0384811691161480611c2957506007546001600160a01b038381169116145b8015611c4e57506001600160a01b03831660009081526015602052604090205460ff16155b8015611c7357506001600160a01b03821660009081526015602052604090205460ff16155b15611cd7576007546001600160a01b0390811690841603611cb557601754811115611cb05760405162461bcd60e51b81526004016108ae90612a54565b611cd7565b601854811115611cd75760405162461bcd60e51b81526004016108ae90612a54565b3060009081526020819052604090205460105481108015908190611cfe575060115460ff16155b8015611d1757506007546001600160a01b038581169116145b8015611d3257506000600e54600d54611d3091906127d9565b115b8015611d455750601154610100900460ff165b15611df5576011805460ff19166001179055600e54600d54600091611d69916127d9565b90506000600a54600954611d7d91906127d9565b90506000600c54600b54611d9191906127d9565b90508115611dbd57600083611da6848861293b565b611db09190612919565b9050611dbb816121da565b505b8015611de757600083611dd0838861293b565b611dda9190612919565b9050611de581612425565b505b50506011805460ff19169055505b6001600160a01b03851660009081526008602052604081205460ff1680611e3457506001600160a01b03851660009081526008602052604090205460ff165b80611e41575060115460ff165b15611e4e57506000611e90565b6007546001600160a01b0390811690871603611e6d5750600d54611e90565b6007546001600160a01b0390811690861603611e8c5750600e54611e90565b5060005b8015611ec95760006064611ea4838761293b565b611eae9190612919565b9050611eba8186612ab1565b9450611ec7873083612086565b505b60135460ff1615611fc4576001600160a01b03861660009081526012602052604090205460ff16158015611f1657506001600160a01b03851660009081526012602052604090205460ff16155b8015611f3057506007546001600160a01b03868116911614155b15611fc4576001600160a01b038516600090815260208190526040902054601454611f5b86836127d9565b1115611fc25760405162461bcd60e51b815260206004820152603060248201527f4d617857616c6c65743a20526563697069656e7420657863656564732074686560448201526f081b585e15d85b1b195d105b5bdd5b9d60821b60648201526084016108ae565b505b611fcf868686612086565b505050505050565b6000814710156120295760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108ae565b6000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114612076576040519150601f19603f3d011682016040523d82523d6000602084013e61207b565b606091505b509095945050505050565b6001600160a01b0383166120ac5760405162461bcd60e51b81526004016108ae906129cc565b6001600160a01b0382166120d25760405162461bcd60e51b81526004016108ae90612a11565b6001600160a01b0383166000908152602081905260409020548181101561214a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108ae565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906121819084906127d9565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516121cd91815260200190565b60405180910390a36119c7565b60006121e7600283612919565b905060006121f58284612ab1565b6040805160028082526060820183529293504792600092602083019080368337019050509050308160008151811061222f5761222f612ac4565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ac9190612ada565b816001815181106122bf576122bf612ac4565b6001600160a01b03928316602091820292909201015260065460405163791ac94760e01b815291169063791ac94790612305908790600090869030904290600401612af7565b600060405180830381600087803b15801561231f57600080fd5b505af1158015612333573d6000803e3d6000fd5b50505050600082476123459190612ab1565b60065460405163f305d71960e01b815230600482015260248101879052600060448201819052606482015261dead60848201524260a48201529192506001600160a01b03169063f305d71990839060c40160606040518083038185885af11580156123b4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906123d99190612b68565b505060408051878152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a1505050505050565b60408051600280825260608201835247926000929190602083019080368337019050509050308160008151811061245e5761245e612ac4565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156124b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124db9190612ada565b816001815181106124ee576124ee612ac4565b6001600160a01b03928316602091820292909201015260065460405163791ac94760e01b815291169063791ac94790612534908690600090869030904290600401612af7565b600060405180830381600087803b15801561254e57600080fd5b505af1158015612562573d6000803e3d6000fd5b50505050600082476125749190612ab1565b600f5490915061258d906001600160a01b031682611fd7565b5060408051858152602081018390527f957ad1fc6d4d41da6d1a8d37303289ef3c4b78e0285ff5df1e12070ef0e62999910160405180910390a150505050565b600080604083850312156125e057600080fd5b50508035926020909101359150565b600060208083528351808285015260005b8181101561261c57858101830151858201604001528201612600565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146119cb57600080fd5b6000806040838503121561266557600080fd5b82356126708161263d565b946020939093013593505050565b60006020828403121561269057600080fd5b813561269b8161263d565b9392505050565b6000806000606084860312156126b757600080fd5b83356126c28161263d565b925060208401356126d28161263d565b929592945050506040919091013590565b6000602082840312156126f557600080fd5b5035919050565b80151581146119cb57600080fd5b60006020828403121561271c57600080fd5b813561269b816126fc565b6000806040838503121561273a57600080fd5b82356127458161263d565b91506020830135612755816126fc565b809150509250929050565b6000806040838503121561277357600080fd5b823561277e8161263d565b915060208301356127558161263d565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808201808211156109ba576109ba6127c3565b600181811c9082168061280057607f821691505b60208210810361282057634e487b7160e01b600052602260045260246000fd5b50919050565b600181815b80851115612861578160001904821115612847576128476127c3565b8085161561285457918102915b93841c939080029061282b565b509250929050565b600082612878575060016109ba565b81612885575060006109ba565b816001811461289b57600281146128a5576128c1565b60019150506109ba565b60ff8411156128b6576128b66127c3565b50506001821b6109ba565b5060208310610133831016604e8410600b84101617156128e4575081810a6109ba565b6128ee8383612826565b8060001904821115612902576129026127c3565b029392505050565b600061269b60ff841683612869565b60008261293657634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176109ba576109ba6127c3565b60208082526024908201527f4163636f756e7420697320616c72656164792073657420746f207468617420736040820152637461746560e01b606082015260800190565b6000602082840312156129a857600080fd5b5051919050565b6000602082840312156129c157600080fd5b815161269b816126fc565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252603b908201527f416e74695768616c653a205472616e7366657220616d6f756e7420657863656560408201527f647320746865206d61785472616e73616374696f6e416d6f756e740000000000606082015260800190565b818103818111156109ba576109ba6127c3565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612aec57600080fd5b815161269b8161263d565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612b475784516001600160a01b031683529383019391830191600101612b22565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612b7d57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220d824a1cd43bd49d20565ad169402beecc5f5d73297bb973624d49bb22cd5ebf664736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102815760003560e01c806370a082311161014f578063aa4bde28116100c1578063dc4c7dbc1161007a578063dc4c7dbc146107b2578063dd62ed3e146107c8578063e01af92c1461080e578063e2f456051461082e578063f2fde38b14610844578063f9d0831a1461086457600080fd5b8063aa4bde28146106fc578063afa4f3b214610712578063b6f7f68114610732578063bb85c6d114610752578063c024666814610772578063d2fcc0011461079257600080fd5b80638a8c523c116101135780638a8c523c1461063b5780638da5cb5b1461065057806395d89b411461066e578063a457c2d714610683578063a8a69b9d146106a3578063a9059cbb146106dc57600080fd5b806370a082311461059a578063715018a6146105d057806375f0a874146105e55780637b3c83b114610605578063880bcbc11461061b57600080fd5b80632ba86bf2116101f35780634fbee193116101ac5780634fbee193146104d657806356a6cabf1461050f57806359136fa51461052f5780635fc2e5961461054557806366ca9b831461055b5780636ddd17131461057b57600080fd5b80632ba86bf21461042a5780632ce86fbf14610444578063313ce5671461045a578063395093511461047657806349bd5a5e146104965780634ada218b146104b657600080fd5b806318160ddd1161024557806318160ddd1461036257806318d9ceae1461037757806321a9d82a146103b057806323b872dd146103ca57806327a14fc2146103ea5780632a6c7dba1461040a57600080fd5b80630105d0fd1461028d57806302dbd8f8146102b657806306fdde03146102d8578063095ea7b3146102fa5780631694505e1461032a57600080fd5b3661028857005b600080fd5b34801561029957600080fd5b506102a360175481565b6040519081526020015b60405180910390f35b3480156102c257600080fd5b506102d66102d13660046125cd565b610884565b005b3480156102e457600080fd5b506102ed610917565b6040516102ad91906125ef565b34801561030657600080fd5b5061031a610315366004612652565b6109a9565b60405190151581526020016102ad565b34801561033657600080fd5b5060065461034a906001600160a01b031681565b6040516001600160a01b0390911681526020016102ad565b34801561036e57600080fd5b506002546102a3565b34801561038357600080fd5b5061031a61039236600461267e565b6001600160a01b031660009081526015602052604090205460ff1690565b3480156103bc57600080fd5b5060135461031a9060ff1681565b3480156103d657600080fd5b5061031a6103e53660046126a2565b6109c0565b3480156103f657600080fd5b506102d66104053660046126e3565b610a71565b34801561041657600080fd5b506102d661042536600461270a565b610b77565b34801561043657600080fd5b5060165461031a9060ff1681565b34801561045057600080fd5b506102a3600a5481565b34801561046657600080fd5b50604051600981526020016102ad565b34801561048257600080fd5b5061031a610491366004612652565b610c56565b3480156104a257600080fd5b5060075461034a906001600160a01b031681565b3480156104c257600080fd5b5060115461031a9062010000900460ff1681565b3480156104e257600080fd5b5061031a6104f136600461267e565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561051b57600080fd5b506102d661052a36600461270a565b610c92565b34801561053b57600080fd5b506102a360185481565b34801561055157600080fd5b506102a3600b5481565b34801561056757600080fd5b506102d66105763660046125cd565b610d76565b34801561058757600080fd5b5060115461031a90610100900460ff1681565b3480156105a657600080fd5b506102a36105b536600461267e565b6001600160a01b031660009081526020819052604090205490565b3480156105dc57600080fd5b506102d6610df4565b3480156105f157600080fd5b50600f5461034a906001600160a01b031681565b34801561061157600080fd5b506102a360095481565b34801561062757600080fd5b506102d6610636366004612727565b610e68565b34801561064757600080fd5b506102d6610f84565b34801561065c57600080fd5b506005546001600160a01b031661034a565b34801561067a57600080fd5b506102ed61101a565b34801561068f57600080fd5b5061031a61069e366004612652565b611029565b3480156106af57600080fd5b5061031a6106be36600461267e565b6001600160a01b031660009081526012602052604090205460ff1690565b3480156106e857600080fd5b5061031a6106f7366004612652565b6110c2565b34801561070857600080fd5b506102a360145481565b34801561071e57600080fd5b506102d661072d3660046126e3565b6110cf565b34801561073e57600080fd5b506102d661074d3660046125cd565b6111b9565b34801561075e57600080fd5b506102d661076d36600461267e565b61131c565b34801561077e57600080fd5b506102d661078d366004612727565b61146d565b34801561079e57600080fd5b506102d66107ad366004612727565b611572565b3480156107be57600080fd5b506102a3600c5481565b3480156107d457600080fd5b506102a36107e3366004612760565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561081a57600080fd5b506102d661082936600461270a565b611686565b34801561083a57600080fd5b506102a360105481565b34801561085057600080fd5b506102d661085f36600461267e565b611737565b34801561087057600080fd5b506102d661087f36600461267e565b611822565b6005546001600160a01b031633146108b75760405162461bcd60e51b81526004016108ae9061278e565b60405180910390fd5b600a829055600c8190556108cb81836127d9565b600e55600a54600c546040517f12dd4f8337f0c236c7994706854cca8cd53921c0032cb0fba8cdb797e73f67c69261090b92908252602082015260400190565b60405180910390a15050565b606060038054610926906127ec565b80601f0160208091040260200160405190810160405280929190818152602001828054610952906127ec565b801561099f5780601f106109745761010080835404028352916020019161099f565b820191906000526020600020905b81548152906001019060200180831161098257829003601f168201915b5050505050905090565b60006109b63384846119ce565b5060015b92915050565b6001600160a01b03831660009081526001602090815260408083203384529091528120546000198114610a5b5782811015610a4e5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016108ae565b610a5b85338584036119ce565b610a66858585611af2565b506001949350505050565b6005546001600160a01b03163314610a9b5760405162461bcd60e51b81526004016108ae9061278e565b6064610aa96009600a61290a565b600254610ab69190612919565b610ac09190612919565b811015610b255760405162461bcd60e51b815260206004820152602d60248201527f4d61782077616c6c65742070657263656e746167652063616e6e6f742062652060448201526c6c6f776572207468616e20312560981b60648201526084016108ae565b610b316009600a61290a565b610b3b908261293b565b60148190556040519081527f21bc0ea3406acb92d4449ab33befb4ae82f873a22f3b6cf0e466b2710beb5942906020015b60405180910390a150565b6005546001600160a01b03163314610ba15760405162461bcd60e51b81526004016108ae9061278e565b60135460ff16151581151503610c0f5760405162461bcd60e51b815260206004820152602d60248201527f4d61782077616c6c6574206c696d697420697320616c7265616479207365742060448201526c746f207468617420737461746560981b60648201526084016108ae565b6013805460ff191682151590811790915560405160ff909116151581527f670f884265aba2d05e7c26efbc42f8365effc4cb3fcfcefddba0c0b71a6231f190602001610b6c565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109b6918590610c8d9086906127d9565b6119ce565b6005546001600160a01b03163314610cbc5760405162461bcd60e51b81526004016108ae9061278e565b60165460ff16151581151503610d2f5760405162461bcd60e51b815260206004820152603260248201527f4d6178207472616e73616374696f6e206c696d697420697320616c72656164796044820152712073657420746f207468617420737461746560701b60648201526084016108ae565b6016805460ff191682151590811790915560405160ff909116151581527fe81be35e61864c26afd7a4655e99f321378d0aaae1e5af8ee67b658a7460f3cf90602001610b6c565b6005546001600160a01b03163314610da05760405162461bcd60e51b81526004016108ae9061278e565b6009829055600b819055610db481836127d9565b600d55600954600b546040517fccd61cb5df2cb048d1a7af40a431d6f247af01b6cf048f7a3f2aa9d313e2bc509261090b92908252602082015260400190565b6005546001600160a01b03163314610e1e5760405162461bcd60e51b81526004016108ae9061278e565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610e925760405162461bcd60e51b81526004016108ae9061278e565b6001600160a01b03821660009081526015602052604090205481151560ff909116151503610ed25760405162461bcd60e51b81526004016108ae90612952565b306001600160a01b03831603610f245760405162461bcd60e51b815260206004820152601760248201527621b0b713ba1039b2ba103a3434b99030b2323932b9b99760491b60448201526064016108ae565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527f8727c4afe988887760e8db0bbad9f9fcceee6428545956832f67c8fdbd589c1091015b60405180910390a25050565b6005546001600160a01b03163314610fae5760405162461bcd60e51b81526004016108ae9061278e565b60115462010000900460ff16156110075760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642e000000000000000060448201526064016108ae565b6011805462ffff00191662010100179055565b606060048054610926906127ec565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156110ab5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108ae565b6110b833858584036119ce565b5060019392505050565b60006109b6338484611af2565b6005546001600160a01b031633146110f95760405162461bcd60e51b81526004016108ae9061278e565b620f424061110660025490565b6111109190612919565b81116111845760405162461bcd60e51b815260206004820152603f60248201527f53776170546f6b656e734174416d6f756e74206d75737420626520677265617460448201527f6572207468616e20302e3030303125206f6620746f74616c20737570706c790060648201526084016108ae565b60108190556040518181527f7c26bfee26f82e8cb57af48f4019cc64582db6fac7bad778433f10572ae8b14590602001610b6c565b6005546001600160a01b031633146111e35760405162461bcd60e51b81526004016108ae9061278e565b6103e86111f26009600a61290a565b6002546111ff9190612919565b6112099190612919565b821015801561123d57506103e86112226009600a61290a565b60025461122f9190612919565b6112399190612919565b8110155b6112af5760405162461bcd60e51b815260206004820152603f60248201527f4d6178205472616e73616374696f6e206c696d69732063616e6e6f742062652060448201527f6c6f776572207468616e20302e3125206f6620746f74616c20737570706c790060648201526084016108ae565b6112bb6009600a61290a565b6112c5908361293b565b6017556112d46009600a61290a565b6112de908261293b565b60188190556017546040517f8c8cbc911b80df94332ececb8eb0945274d76fa965600a0f01f42af3f8afb1319261090b928252602082015260400190565b6005546001600160a01b031633146113465760405162461bcd60e51b81526004016108ae9061278e565b600f546001600160a01b03908116908216036113b55760405162461bcd60e51b815260206004820152602860248201527f4d61726b6574696e672077616c6c657420697320616c72656164792074686174604482015267206164647265737360c01b60648201526084016108ae565b6001600160a01b03811661141f5760405162461bcd60e51b815260206004820152602b60248201527f4d61726b6574696e672077616c6c65742063616e6e6f7420626520746865207a60448201526a65726f206164647265737360a81b60648201526084016108ae565b600f80546001600160a01b0319166001600160a01b0383169081179091556040519081527fa964ba5c52d7e7bfcae4fb1ae4db9f211756d0e618e85fac5283b882a39e7a0b90602001610b6c565b6005546001600160a01b031633146114975760405162461bcd60e51b81526004016108ae9061278e565b6001600160a01b03821660009081526008602052604090205481151560ff90911615150361151a5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b60648201526084016108ae565b6001600160a01b038216600081815260086020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101610f78565b6005546001600160a01b0316331461159c5760405162461bcd60e51b81526004016108ae9061278e565b6001600160a01b03821660009081526012602052604090205481151560ff9091161515036115dc5760405162461bcd60e51b81526004016108ae90612952565b306001600160a01b0383160361162e5760405162461bcd60e51b815260206004820152601760248201527621b0b713ba1039b2ba103a3434b99030b2323932b9b99760491b60448201526064016108ae565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527f1d9a11e204b58ad56c619c61600e42167624659d218f0143f1f64956b0daae6c9101610f78565b6005546001600160a01b031633146116b05760405162461bcd60e51b81526004016108ae9061278e565b801515601160019054906101000a900460ff1615150361171d5760405162461bcd60e51b815260206004820152602260248201527f73776170456e61626c656420616c726561647920617420746869732073746174604482015261329760f11b60648201526084016108ae565b601180549115156101000261ff0019909216919091179055565b6005546001600160a01b031633146117615760405162461bcd60e51b81526004016108ae9061278e565b6001600160a01b0381166117c65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ae565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461184c5760405162461bcd60e51b81526004016108ae9061278e565b306001600160a01b038216036118ca5760405162461bcd60e51b815260206004820152603760248201527f4f776e65722063616e6e6f7420636c61696d20636f6e7472616374277320626160448201527f6c616e6365206f6620697473206f776e20746f6b656e7300000000000000000060648201526084016108ae565b6001600160a01b0381166118e6576118e23347611fd7565b5050565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561192f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119539190612996565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156119a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c791906129af565b5050505b50565b6001600160a01b038316611a305760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108ae565b6001600160a01b038216611a915760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108ae565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611b185760405162461bcd60e51b81526004016108ae906129cc565b6001600160a01b038216611b3e5760405162461bcd60e51b81526004016108ae90612a11565b60115462010000900460ff1680611b6d57506001600160a01b03831660009081526008602052604090205460ff165b80611b9057506001600160a01b03821660009081526008602052604090205460ff165b611bdc5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c656421000000000000000060448201526064016108ae565b80600003611bf557611bf083836000612086565b505050565b60165460ff1615611cd7576007546001600160a01b0384811691161480611c2957506007546001600160a01b038381169116145b8015611c4e57506001600160a01b03831660009081526015602052604090205460ff16155b8015611c7357506001600160a01b03821660009081526015602052604090205460ff16155b15611cd7576007546001600160a01b0390811690841603611cb557601754811115611cb05760405162461bcd60e51b81526004016108ae90612a54565b611cd7565b601854811115611cd75760405162461bcd60e51b81526004016108ae90612a54565b3060009081526020819052604090205460105481108015908190611cfe575060115460ff16155b8015611d1757506007546001600160a01b038581169116145b8015611d3257506000600e54600d54611d3091906127d9565b115b8015611d455750601154610100900460ff165b15611df5576011805460ff19166001179055600e54600d54600091611d69916127d9565b90506000600a54600954611d7d91906127d9565b90506000600c54600b54611d9191906127d9565b90508115611dbd57600083611da6848861293b565b611db09190612919565b9050611dbb816121da565b505b8015611de757600083611dd0838861293b565b611dda9190612919565b9050611de581612425565b505b50506011805460ff19169055505b6001600160a01b03851660009081526008602052604081205460ff1680611e3457506001600160a01b03851660009081526008602052604090205460ff165b80611e41575060115460ff165b15611e4e57506000611e90565b6007546001600160a01b0390811690871603611e6d5750600d54611e90565b6007546001600160a01b0390811690861603611e8c5750600e54611e90565b5060005b8015611ec95760006064611ea4838761293b565b611eae9190612919565b9050611eba8186612ab1565b9450611ec7873083612086565b505b60135460ff1615611fc4576001600160a01b03861660009081526012602052604090205460ff16158015611f1657506001600160a01b03851660009081526012602052604090205460ff16155b8015611f3057506007546001600160a01b03868116911614155b15611fc4576001600160a01b038516600090815260208190526040902054601454611f5b86836127d9565b1115611fc25760405162461bcd60e51b815260206004820152603060248201527f4d617857616c6c65743a20526563697069656e7420657863656564732074686560448201526f081b585e15d85b1b195d105b5bdd5b9d60821b60648201526084016108ae565b505b611fcf868686612086565b505050505050565b6000814710156120295760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108ae565b6000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114612076576040519150601f19603f3d011682016040523d82523d6000602084013e61207b565b606091505b509095945050505050565b6001600160a01b0383166120ac5760405162461bcd60e51b81526004016108ae906129cc565b6001600160a01b0382166120d25760405162461bcd60e51b81526004016108ae90612a11565b6001600160a01b0383166000908152602081905260409020548181101561214a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108ae565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906121819084906127d9565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516121cd91815260200190565b60405180910390a36119c7565b60006121e7600283612919565b905060006121f58284612ab1565b6040805160028082526060820183529293504792600092602083019080368337019050509050308160008151811061222f5761222f612ac4565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ac9190612ada565b816001815181106122bf576122bf612ac4565b6001600160a01b03928316602091820292909201015260065460405163791ac94760e01b815291169063791ac94790612305908790600090869030904290600401612af7565b600060405180830381600087803b15801561231f57600080fd5b505af1158015612333573d6000803e3d6000fd5b50505050600082476123459190612ab1565b60065460405163f305d71960e01b815230600482015260248101879052600060448201819052606482015261dead60848201524260a48201529192506001600160a01b03169063f305d71990839060c40160606040518083038185885af11580156123b4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906123d99190612b68565b505060408051878152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a1505050505050565b60408051600280825260608201835247926000929190602083019080368337019050509050308160008151811061245e5761245e612ac4565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156124b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124db9190612ada565b816001815181106124ee576124ee612ac4565b6001600160a01b03928316602091820292909201015260065460405163791ac94760e01b815291169063791ac94790612534908690600090869030904290600401612af7565b600060405180830381600087803b15801561254e57600080fd5b505af1158015612562573d6000803e3d6000fd5b50505050600082476125749190612ab1565b600f5490915061258d906001600160a01b031682611fd7565b5060408051858152602081018390527f957ad1fc6d4d41da6d1a8d37303289ef3c4b78e0285ff5df1e12070ef0e62999910160405180910390a150505050565b600080604083850312156125e057600080fd5b50508035926020909101359150565b600060208083528351808285015260005b8181101561261c57858101830151858201604001528201612600565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146119cb57600080fd5b6000806040838503121561266557600080fd5b82356126708161263d565b946020939093013593505050565b60006020828403121561269057600080fd5b813561269b8161263d565b9392505050565b6000806000606084860312156126b757600080fd5b83356126c28161263d565b925060208401356126d28161263d565b929592945050506040919091013590565b6000602082840312156126f557600080fd5b5035919050565b80151581146119cb57600080fd5b60006020828403121561271c57600080fd5b813561269b816126fc565b6000806040838503121561273a57600080fd5b82356127458161263d565b91506020830135612755816126fc565b809150509250929050565b6000806040838503121561277357600080fd5b823561277e8161263d565b915060208301356127558161263d565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808201808211156109ba576109ba6127c3565b600181811c9082168061280057607f821691505b60208210810361282057634e487b7160e01b600052602260045260246000fd5b50919050565b600181815b80851115612861578160001904821115612847576128476127c3565b8085161561285457918102915b93841c939080029061282b565b509250929050565b600082612878575060016109ba565b81612885575060006109ba565b816001811461289b57600281146128a5576128c1565b60019150506109ba565b60ff8411156128b6576128b66127c3565b50506001821b6109ba565b5060208310610133831016604e8410600b84101617156128e4575081810a6109ba565b6128ee8383612826565b8060001904821115612902576129026127c3565b029392505050565b600061269b60ff841683612869565b60008261293657634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176109ba576109ba6127c3565b60208082526024908201527f4163636f756e7420697320616c72656164792073657420746f207468617420736040820152637461746560e01b606082015260800190565b6000602082840312156129a857600080fd5b5051919050565b6000602082840312156129c157600080fd5b815161269b816126fc565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252603b908201527f416e74695768616c653a205472616e7366657220616d6f756e7420657863656560408201527f647320746865206d61785472616e73616374696f6e416d6f756e740000000000606082015260800190565b818103818111156109ba576109ba6127c3565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612aec57600080fd5b815161269b8161263d565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612b475784516001600160a01b031683529383019391830191600101612b22565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612b7d57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220d824a1cd43bd49d20565ad169402beecc5f5d73297bb973624d49bb22cd5ebf664736f6c63430008110033

Deployed Bytecode Sourcemap

19610:14836:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32514:39;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;32514:39:0;;;;;;;;24477:358;;;;;;;;;;-1:-1:-1;24477:358:0;;;;;:::i;:::-;;:::i;:::-;;14896:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;15809:169::-;;;;;;;;;;-1:-1:-1;15809:169:0;;;;;:::i;:::-;;:::i;:::-;;;1623:14:1;;1616:22;1598:41;;1586:2;1571:18;15809:169:0;1458:187:1;19697:41:0;;;;;;;;;;-1:-1:-1;19697:41:0;;;;-1:-1:-1;;;;;19697:41:0;;;;;;-1:-1:-1;;;;;1840:32:1;;;1822:51;;1810:2;1795:18;19697:41:0;1650:229:1;15216:108:0;;;;;;;;;;-1:-1:-1;15304:12:0;;15216:108;;34302:141;;;;;;;;;;-1:-1:-1;34302:141:0;;;;;:::i;:::-;-1:-1:-1;;;;;34401:34:0;34377:4;34401:34;;;:25;:34;;;;;;;;;34302:141;30922:36;;;;;;;;;;-1:-1:-1;30922:36:0;;;;;;;;15986:573;;;;;;;;;;-1:-1:-1;15986:573:0;;;;;:::i;:::-;;:::i;31500:340::-;;;;;;;;;;-1:-1:-1;31500:340:0;;;;;:::i;:::-;;:::i;31212:280::-;;;;;;;;;;-1:-1:-1;31212:280:0;;;;;:::i;:::-;;:::i;32465:42::-;;;;;;;;;;-1:-1:-1;32465:42:0;;;;;;;;19885:34;;;;;;;;;;;;;;;;15116:92;;;;;;;;;;-1:-1:-1;15116:92:0;;15199:1;3293:36:1;;3281:2;3266:18;15116:92:0;3151:184:1;16567:215:0;;;;;;;;;;-1:-1:-1;16567:215:0;;;;;:::i;:::-;;:::i;19745:29::-;;;;;;;;;;-1:-1:-1;19745:29:0;;;;-1:-1:-1;;;;;19745:29:0;;;25230:26;;;;;;;;;;-1:-1:-1;25230:26:0;;;;;;;;;;;23991:125;;;;;;;;;;-1:-1:-1;23991:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;24080:28:0;24056:4;24080:28;;;:19;:28;;;;;;;;;23991:125;32879:311;;;;;;;;;;-1:-1:-1;32879:311:0;;;;;:::i;:::-;;:::i;32560:40::-;;;;;;;;;;;;;;;;19928:33;;;;;;;;;;;;;;;;24124:345;;;;;;;;;;-1:-1:-1;24124:345:0;;;;;:::i;:::-;;:::i;20204:26::-;;;;;;;;;;-1:-1:-1;20204:26:0;;;;;;;;;;;15332:127;;;;;;;;;;-1:-1:-1;15332:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;15433:18:0;15406:7;15433:18;;;;;;;;;;;;15332:127;14083:148;;;;;;;;;;;;;:::i;20090:31::-;;;;;;;;;;-1:-1:-1;20090:31:0;;;;-1:-1:-1;;;;;20090:31:0;;;19845:33;;;;;;;;;;;;;;;;33895:399;;;;;;;;;;-1:-1:-1;33895:399:0;;;;;:::i;:::-;;:::i;25265:175::-;;;;;;;;;;;;;:::i;13869:79::-;;;;;;;;;;-1:-1:-1;13934:6:0;;-1:-1:-1;;;;;13934:6:0;13869:79;;15004:104;;;;;;;;;;;;;:::i;16790:413::-;;;;;;;;;;-1:-1:-1;16790:413:0;;;;;:::i;:::-;;:::i;32247:145::-;;;;;;;;;;-1:-1:-1;32247:145:0;;;;;:::i;:::-;-1:-1:-1;;;;;32346:38:0;32322:4;32346:38;;;:29;:38;;;;;;;;;32247:145;15467:175;;;;;;;;;;-1:-1:-1;15467:175:0;;;;;:::i;:::-;;:::i;30965:30::-;;;;;;;;;;;;;;;;29002:304;;;;;;;;;;-1:-1:-1;29002:304:0;;;;;:::i;:::-;;:::i;33198:689::-;;;;;;;;;;-1:-1:-1;33198:689:0;;;;;:::i;:::-;;:::i;24843:379::-;;;;;;;;;;-1:-1:-1;24843:379:0;;;;;:::i;:::-;;:::i;23693:290::-;;;;;;;;;;-1:-1:-1;23693:290:0;;;;;:::i;:::-;;:::i;31848:391::-;;;;;;;;;;-1:-1:-1;31848:391:0;;;;;:::i;:::-;;:::i;19968:34::-;;;;;;;;;;;;;;;;15650:151;;;;;;;;;;-1:-1:-1;15650:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;15766:18:0;;;15739:7;15766:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;15650:151;28815:179;;;;;;;;;;-1:-1:-1;28815:179:0;;;;;:::i;:::-;;:::i;20130:34::-;;;;;;;;;;;;;;;;14239:244;;;;;;;;;;-1:-1:-1;14239:244:0;;;;;:::i;:::-;;:::i;23220:465::-;;;;;;;;;;-1:-1:-1;23220:465:0;;;;;:::i;:::-;;:::i;24477:358::-;13996:6;;-1:-1:-1;;;;;13996:6:0;13272:10;13996:22;13988:67;;;;-1:-1:-1;;;13988:67:0;;;;;;;:::i;:::-;;;;;;;;;24589:18:::1;:40:::0;;;24640:18:::1;:40:::0;;;24714:39:::1;24661:19:::0;24610;24714:39:::1;:::i;:::-;24693:16;:60:::0;24788:18:::1;::::0;24808::::1;::::0;24773:54:::1;::::0;::::1;::::0;::::1;::::0;24788:18;5125:25:1;;5181:2;5166:18;;5159:34;5113:2;5098:18;;4951:248;24773:54:0::1;;;;;;;;24477:358:::0;;:::o;14896:100::-;14950:13;14983:5;14976:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14896:100;:::o;15809:169::-;15892:4;15909:39;13272:10;15932:7;15941:6;15909:8;:39::i;:::-;-1:-1:-1;15966:4:0;15809:169;;;;;:::o;15986:573::-;-1:-1:-1;;;;;16170:19:0;;16126:4;16170:19;;;:11;:19;;;;;;;;13272:10;16170:33;;;;;;;;-1:-1:-1;;16218:37:0;;16214:265;;16300:6;16280:16;:26;;16272:79;;;;-1:-1:-1;;;16272:79:0;;5791:2:1;16272:79:0;;;5773:21:1;5830:2;5810:18;;;5803:30;5869:34;5849:18;;;5842:62;-1:-1:-1;;;5920:18:1;;;5913:38;5968:19;;16272:79:0;5589:404:1;16272:79:0;16395:57;16404:6;13272:10;16445:6;16426:16;:25;16395:8;:57::i;:::-;16491:36;16501:6;16509:9;16520:6;16491:9;:36::i;:::-;-1:-1:-1;16547:4:0;;15986:573;-1:-1:-1;;;;15986:573:0:o;31500:340::-;13996:6;;-1:-1:-1;;;;;13996:6:0;13272:10;13996:22;13988:67;;;;-1:-1:-1;;;13988:67:0;;;;;;;:::i;:::-;31651:3:::1;31630:16;15199:1:::0;31630:2:::1;:16;:::i;:::-;15304:12:::0;;31613:34:::1;;;;:::i;:::-;31612:42;;;;:::i;:::-;31592:16;:62;;31584:120;;;::::0;-1:-1:-1;;;31584:120:0;;7805:2:1;31584:120:0::1;::::0;::::1;7787:21:1::0;7844:2;7824:18;;;7817:30;7883:34;7863:18;;;7856:62;-1:-1:-1;;;7934:18:1;;;7927:43;7987:19;;31584:120:0::1;7603:409:1::0;31584:120:0::1;31753:16;15199:1:::0;31753:2:::1;:16;:::i;:::-;31733:37;::::0;:16;:37:::1;:::i;:::-;31715:15;:55:::0;;;31788:44:::1;::::0;160:25:1;;;31788:44:0::1;::::0;148:2:1;133:18;31788:44:0::1;;;;;;;;31500:340:::0;:::o;31212:280::-;13996:6;;-1:-1:-1;;;;;13996:6:0;13272:10;13996:22;13988:67;;;;-1:-1:-1;;;13988:67:0;;;;;;;:::i;:::-;31306:21:::1;::::0;::::1;;31296:31;;::::0;::::1;;::::0;31288:88:::1;;;::::0;-1:-1:-1;;;31288:88:0;;8392:2:1;31288:88:0::1;::::0;::::1;8374:21:1::0;8431:2;8411:18;;;8404:30;8470:34;8450:18;;;8443:62;-1:-1:-1;;;8521:18:1;;;8514:43;8574:19;;31288:88:0::1;8190:409:1::0;31288:88:0::1;31387:21;:30:::0;;-1:-1:-1;;31387:30:0::1;::::0;::::1;;::::0;;::::1;::::0;;;31435:49:::1;::::0;31387:30:::1;31462:21:::0;;;1623:14:1;1616:22;1598:41;;31435:49:0::1;::::0;1586:2:1;1571:18;31435:49:0::1;1458:187:1::0;16567:215:0;13272:10;16655:4;16704:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;16704:34:0;;;;;;;;;;16655:4;;16672:80;;16695:7;;16704:47;;16741:10;;16704:47;:::i;:::-;16672:8;:80::i;32879:311::-;13996:6;;-1:-1:-1;;;;;13996:6:0;13272:10;13996:22;13988:67;;;;-1:-1:-1;;;13988:67:0;;;;;;;:::i;:::-;32978:26:::1;::::0;::::1;;32968:36;;::::0;::::1;;::::0;32960:99:::1;;;::::0;-1:-1:-1;;;32960:99:0;;8806:2:1;32960:99:0::1;::::0;::::1;8788:21:1::0;8845:2;8825:18;;;8818:30;8884:34;8864:18;;;8857:62;-1:-1:-1;;;8935:18:1;;;8928:48;8993:19;;32960:99:0::1;8604:414:1::0;32960:99:0::1;33070:26;:35:::0;;-1:-1:-1;;33070:35:0::1;::::0;::::1;;::::0;;::::1;::::0;;;33123:59:::1;::::0;33070:35:::1;33155:26:::0;;;1623:14:1;1616:22;1598:41;;33123:59:0::1;::::0;1586:2:1;1571:18;33123:59:0::1;1458:187:1::0;24124:345:0;13996:6;;-1:-1:-1;;;;;13996:6:0;13272:10;13996:22;13988:67;;;;-1:-1:-1;;;13988:67:0;;;;;;;:::i;:::-;24233:17:::1;:38:::0;;;24282:17:::1;:38:::0;;;24353:37:::1;24302:18:::0;24253;24353:37:::1;:::i;:::-;24333:15;:57:::0;24424:17:::1;::::0;24443::::1;::::0;24410:51:::1;::::0;::::1;::::0;::::1;::::0;24424:17;5125:25:1;;5181:2;5166:18;;5159:34;5113:2;5098:18;;4951:248;14083:148:0;13996:6;;-1:-1:-1;;;;;13996:6:0;13272:10;13996:22;13988:67;;;;-1:-1:-1;;;13988:67:0;;;;;;;:::i;:::-;14174:6:::1;::::0;14153:40:::1;::::0;14190:1:::1;::::0;-1:-1:-1;;;;;14174:6:0::1;::::0;14153:40:::1;::::0;14190:1;;14153:40:::1;14204:6;:19:::0;;-1:-1:-1;;;;;;14204:19:0::1;::::0;;14083:148::o;33895:399::-;13996:6;;-1:-1:-1;;;;;13996:6:0;13272:10;13996:22;13988:67;;;;-1:-1:-1;;;13988:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34005:34:0;::::1;;::::0;;;:25:::1;:34;::::0;;;;;:45;::::1;;:34;::::0;;::::1;:45;;::::0;33996:95:::1;;;;-1:-1:-1::0;;;33996:95:0::1;;;;;;;:::i;:::-;34129:4;-1:-1:-1::0;;;;;34110:24:0;::::1;::::0;34102:60:::1;;;::::0;-1:-1:-1;;;34102:60:0;;9630:2:1;34102:60:0::1;::::0;::::1;9612:21:1::0;9669:2;9649:18;;;9642:30;-1:-1:-1;;;9688:18:1;;;9681:53;9751:18;;34102:60:0::1;9428:347:1::0;34102:60:0::1;-1:-1:-1::0;;;;;34175:34:0;::::1;;::::0;;;:25:::1;:34;::::0;;;;;;;;:44;;-1:-1:-1;;34175:44:0::1;::::0;::::1;;::::0;;::::1;::::0;;;34237:49;;1598:41:1;;;34237:49:0::1;::::0;1571:18:1;34237:49:0::1;;;;;;;;33895:399:::0;;:::o;25265:175::-;13996:6;;-1:-1:-1;;;;;13996:6:0;13272:10;13996:22;13988:67;;;;-1:-1:-1;;;13988:67:0;;;;;;;:::i;:::-;25328:14:::1;::::0;;;::::1;;;25327:15;25319:52;;;::::0;-1:-1:-1;;;25319:52:0;;9982:2:1;25319:52:0::1;::::0;::::1;9964:21:1::0;10021:2;10001:18;;;9994:30;10060:26;10040:18;;;10033:54;10104:18;;25319:52:0::1;9780:348:1::0;25319:52:0::1;25382:14;:21:::0;;-1:-1:-1;;25414:18:0;;;;;25265:175::o;15004:104::-;15060:13;15093:7;15086:14;;;;;:::i;16790:413::-;13272:10;16883:4;16927:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;16927:34:0;;;;;;;;;;16980:35;;;;16972:85;;;;-1:-1:-1;;;16972:85:0;;10335:2:1;16972:85:0;;;10317:21:1;10374:2;10354:18;;;10347:30;10413:34;10393:18;;;10386:62;-1:-1:-1;;;10464:18:1;;;10457:35;10509:19;;16972:85:0;10133:401:1;16972:85:0;17093:67;13272:10;17116:7;17144:15;17125:16;:34;17093:8;:67::i;:::-;-1:-1:-1;17191:4:0;;16790:413;-1:-1:-1;;;16790:413:0:o;15467:175::-;15553:4;15570:42;13272:10;15594:9;15605:6;15570:9;:42::i;29002:304::-;13996:6;;-1:-1:-1;;;;;13996:6:0;13272:10;13996:22;13988:67;;;;-1:-1:-1;;;13988:67:0;;;;;;;:::i;:::-;29117:9:::1;29101:13;15304:12:::0;;;15216:108;29101:13:::1;:25;;;;:::i;:::-;29089:9;:37;29081:113;;;::::0;-1:-1:-1;;;29081:113:0;;10741:2:1;29081:113:0::1;::::0;::::1;10723:21:1::0;10780:2;10760:18;;;10753:30;10819:34;10799:18;;;10792:62;10890:33;10870:18;;;10863:61;10941:19;;29081:113:0::1;10539:427:1::0;29081:113:0::1;29205:18;:30:::0;;;29253:45:::1;::::0;160:25:1;;;29253:45:0::1;::::0;148:2:1;133:18;29253:45:0::1;14:177:1::0;33198:689:0;13996:6;;-1:-1:-1;;;;;13996:6:0;13272:10;13996:22;13988:67;;;;-1:-1:-1;;;13988:67:0;;;;;;;:::i;:::-;33421:5:::1;33400:16;15199:1:::0;33400:2:::1;:16;:::i;:::-;15304:12:::0;;33383:34:::1;;;;:::i;:::-;33382:44;;;;:::i;:::-;33353:24;:73;;:164;;;;-1:-1:-1::0;33512:5:0::1;33491:16;15199:1:::0;33491:2:::1;:16;:::i;:::-;15304:12:::0;;33474:34:::1;;;;:::i;:::-;33473:44;;;;:::i;:::-;33444:25;:73;;33353:164;33331:278;;;::::0;-1:-1:-1;;;33331:278:0;;11173:2:1;33331:278:0::1;::::0;::::1;11155:21:1::0;11212:2;11192:18;;;11185:30;11251:34;11231:18;;;11224:62;11322:33;11302:18;;;11295:61;11373:19;;33331:278:0::1;10971:427:1::0;33331:278:0::1;33677:16;15199:1:::0;33677:2:::1;:16;:::i;:::-;33648:46;::::0;:24;:46:::1;:::i;:::-;33621:23;:73:::0;33761:16:::1;15199:1:::0;33761:2:::1;:16;:::i;:::-;33732:46;::::0;:25;:46:::1;:::i;:::-;33705:24;:73:::0;;;33829:23:::1;::::0;33796:83:::1;::::0;::::1;::::0;::::1;::::0;5125:25:1;;5181:2;5166:18;;5159:34;5113:2;5098:18;;4951:248;24843:379:0;13996:6;;-1:-1:-1;;;;;13996:6:0;13272:10;13996:22;13988:67;;;;-1:-1:-1;;;13988:67:0;;;;;;;:::i;:::-;24957:15:::1;::::0;-1:-1:-1;;;;;24957:15:0;;::::1;24937:35:::0;;::::1;::::0;24929:87:::1;;;::::0;-1:-1:-1;;;24929:87:0;;11605:2:1;24929:87:0::1;::::0;::::1;11587:21:1::0;11644:2;11624:18;;;11617:30;11683:34;11663:18;;;11656:62;-1:-1:-1;;;11734:18:1;;;11727:38;11782:19;;24929:87:0::1;11403:404:1::0;24929:87:0::1;-1:-1:-1::0;;;;;25035:30:0;::::1;25027:85;;;::::0;-1:-1:-1;;;25027:85:0;;12014:2:1;25027:85:0::1;::::0;::::1;11996:21:1::0;12053:2;12033:18;;;12026:30;12092:34;12072:18;;;12065:62;-1:-1:-1;;;12143:18:1;;;12136:41;12194:19;;25027:85:0::1;11812:407:1::0;25027:85:0::1;25123:15;:34:::0;;-1:-1:-1;;;;;;25123:34:0::1;-1:-1:-1::0;;;;;25123:34:0;::::1;::::0;;::::1;::::0;;;25175:39:::1;::::0;1822:51:1;;;25175:39:0::1;::::0;1810:2:1;1795:18;25175:39:0::1;1650:229:1::0;23693:290:0;13996:6;;-1:-1:-1;;;;;13996:6:0;13272:10;13996:22;13988:67;;;;-1:-1:-1;;;13988:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23787:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;:40;::::1;;:28;::::0;;::::1;:40;;::::0;23779:94:::1;;;::::0;-1:-1:-1;;;23779:94:0;;12426:2:1;23779:94:0::1;::::0;::::1;12408:21:1::0;12465:2;12445:18;;;12438:30;12504:34;12484:18;;;12477:62;-1:-1:-1;;;12555:18:1;;;12548:40;12605:19;;23779:94:0::1;12224:406:1::0;23779:94:0::1;-1:-1:-1::0;;;;;23884:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;23884:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;23941:34;;1598:41:1;;;23941:34:0::1;::::0;1571:18:1;23941:34:0::1;1458:187:1::0;31848:391:0;13996:6;;-1:-1:-1;;;;;13996:6:0;13272:10;13996:22;13988:67;;;;-1:-1:-1;;;13988:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31948:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;:49;::::1;;:38;::::0;;::::1;:49;;::::0;31939:98:::1;;;;-1:-1:-1::0;;;31939:98:0::1;;;;;;;:::i;:::-;32075:4;-1:-1:-1::0;;;;;32056:24:0;::::1;::::0;32048:60:::1;;;::::0;-1:-1:-1;;;32048:60:0;;9630:2:1;32048:60:0::1;::::0;::::1;9612:21:1::0;9669:2;9649:18;;;9642:30;-1:-1:-1;;;9688:18:1;;;9681:53;9751:18;;32048:60:0::1;9428:347:1::0;32048:60:0::1;-1:-1:-1::0;;;;;32121:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:48;;-1:-1:-1;;32121:48:0::1;::::0;::::1;;::::0;;::::1;::::0;;;32187:44;;1598:41:1;;;32187:44:0::1;::::0;1571:18:1;32187:44:0::1;1458:187:1::0;28815:179:0;13996:6;;-1:-1:-1;;;;;13996:6:0;13272:10;13996:22;13988:67;;;;-1:-1:-1;;;13988:67:0;;;;;;;:::i;:::-;28906:8:::1;28891:23;;:11;;;;;;;;;;;:23;;::::0;28883:70:::1;;;::::0;-1:-1:-1;;;28883:70:0;;12837:2:1;28883:70:0::1;::::0;::::1;12819:21:1::0;12876:2;12856:18;;;12849:30;12915:34;12895:18;;;12888:62;-1:-1:-1;;;12966:18:1;;;12959:32;13008:19;;28883:70:0::1;12635:398:1::0;28883:70:0::1;28964:11;:22:::0;;;::::1;;;;-1:-1:-1::0;;28964:22:0;;::::1;::::0;;;::::1;::::0;;28815:179::o;14239:244::-;13996:6;;-1:-1:-1;;;;;13996:6:0;13272:10;13996:22;13988:67;;;;-1:-1:-1;;;13988:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14328:22:0;::::1;14320:73;;;::::0;-1:-1:-1;;;14320:73:0;;13240:2:1;14320:73:0::1;::::0;::::1;13222:21:1::0;13279:2;13259:18;;;13252:30;13318:34;13298:18;;;13291:62;-1:-1:-1;;;13369:18:1;;;13362:36;13415:19;;14320:73:0::1;13038:402:1::0;14320:73:0::1;14430:6;::::0;14409:38:::1;::::0;-1:-1:-1;;;;;14409:38:0;;::::1;::::0;14430:6:::1;::::0;14409:38:::1;::::0;14430:6:::1;::::0;14409:38:::1;14458:6;:17:::0;;-1:-1:-1;;;;;;14458:17:0::1;-1:-1:-1::0;;;;;14458:17:0;;;::::1;::::0;;;::::1;::::0;;14239:244::o;23220:465::-;13996:6;;-1:-1:-1;;;;;13996:6:0;13272:10;13996:22;13988:67;;;;-1:-1:-1;;;13988:67:0;;;;;;;:::i;:::-;23316:4:::1;-1:-1:-1::0;;;;;23299:22:0;::::1;::::0;23291:90:::1;;;::::0;-1:-1:-1;;;23291:90:0;;13647:2:1;23291:90:0::1;::::0;::::1;13629:21:1::0;13686:2;13666:18;;;13659:30;13725:34;13705:18;;;13698:62;13796:25;13776:18;;;13769:53;13839:19;;23291:90:0::1;13445:419:1::0;23291:90:0::1;-1:-1:-1::0;;;;;23396:21:0;::::1;23392:127;;23434:52;23442:10;23464:21;23434:29;:52::i;:::-;;23220:465:::0;:::o;23392:127::-:1;23591:35;::::0;-1:-1:-1;;;23591:35:0;;23620:4:::1;23591:35;::::0;::::1;1822:51:1::0;23556:5:0;;23529:17:::1;::::0;-1:-1:-1;;;;;23591:20:0;::::1;::::0;::::1;::::0;1795:18:1;;23591:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23637:40;::::0;-1:-1:-1;;;23637:40:0;;23657:10:::1;23637:40;::::0;::::1;14232:51:1::0;14299:18;;;14292:34;;;23573:53:0;;-1:-1:-1;;;;;;23637:19:0;::::1;::::0;::::1;::::0;14205:18:1;;23637:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23280:405;;14066:1;23220:465:::0;:::o;18958:380::-;-1:-1:-1;;;;;19094:19:0;;19086:68;;;;-1:-1:-1;;;19086:68:0;;14789:2:1;19086:68:0;;;14771:21:1;14828:2;14808:18;;;14801:30;14867:34;14847:18;;;14840:62;-1:-1:-1;;;14918:18:1;;;14911:34;14962:19;;19086:68:0;14587:400:1;19086:68:0;-1:-1:-1;;;;;19173:21:0;;19165:68;;;;-1:-1:-1;;;19165:68:0;;15194:2:1;19165:68:0;;;15176:21:1;15233:2;15213:18;;;15206:30;15272:34;15252:18;;;15245:62;-1:-1:-1;;;15323:18:1;;;15316:32;15365:19;;19165:68:0;14992:398:1;19165:68:0;-1:-1:-1;;;;;19246:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;19298:32;;160:25:1;;;19298:32:0;;133:18:1;19298:32:0;;;;;;;18958:380;;;:::o;25448:3359::-;-1:-1:-1;;;;;25545:18:0;;25537:68;;;;-1:-1:-1;;;25537:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25624:16:0;;25616:64;;;;-1:-1:-1;;;25616:64:0;;;;;;;:::i;:::-;25699:14;;;;;;;;:43;;-1:-1:-1;;;;;;25717:25:0;;;;;;:19;:25;;;;;;;;25699:43;:70;;;-1:-1:-1;;;;;;25746:23:0;;;;;;:19;:23;;;;;;;;25699:70;25691:107;;;;-1:-1:-1;;;25691:107:0;;16407:2:1;25691:107:0;;;16389:21:1;16446:2;16426:18;;;16419:30;16485:26;16465:18;;;16458:54;16529:18;;25691:107:0;16205:348:1;25691:107:0;25822:6;25832:1;25822:11;25818:93;;25850:28;25866:4;25872:2;25876:1;25850:15;:28::i;:::-;25448:3359;;;:::o;25818:93::-;25927:26;;;;25923:752;;;25993:13;;-1:-1:-1;;;;;25985:21:0;;;25993:13;;25985:21;;:44;;-1:-1:-1;26016:13:0;;-1:-1:-1;;;;;26010:19:0;;;26016:13;;26010:19;25985:44;25984:99;;;;-1:-1:-1;;;;;;26052:31:0;;;;;;:25;:31;;;;;;;;26051:32;25984:99;:151;;;;-1:-1:-1;;;;;;26106:29:0;;;;;;:25;:29;;;;;;;;26105:30;25984:151;25980:684;;;26182:13;;-1:-1:-1;;;;;26182:13:0;;;26174:21;;;;26170:479;;26264:23;;26254:6;:33;;26220:180;;;;-1:-1:-1;;;26220:180:0;;;;;;;:::i;:::-;26170:479;;;26493:24;;26483:6;:34;;26449:180;;;;-1:-1:-1;;;26449:180:0;;;;;;;:::i;:::-;26730:4;26681:28;15433:18;;;;;;;;;;;26788;;26764:42;;;;;;;26823:33;;-1:-1:-1;26848:8:0;;;;26847:9;26823:33;:69;;;;-1:-1:-1;26879:13:0;;-1:-1:-1;;;;;26873:19:0;;;26879:13;;26873:19;26823:69;:124;;;;;26946:1;26927:16;;26909:15;;:34;;;;:::i;:::-;:38;26823:124;:152;;;;-1:-1:-1;26964:11:0;;;;;;;26823:152;26819:895;;;27002:8;:15;;-1:-1:-1;;27002:15:0;27013:4;27002:15;;;27071:16;;27053:15;;27002:8;;27053:34;;;:::i;:::-;27034:53;;27102:22;27147:18;;27127:17;;:38;;;;:::i;:::-;27102:63;;27180:22;27225:18;;27205:17;;:38;;;;:::i;:::-;27180:63;-1:-1:-1;27264:18:0;;27260:183;;27303:23;27369:8;27329:37;27352:14;27329:20;:37;:::i;:::-;:48;;;;:::i;:::-;27303:74;;27396:31;27411:15;27396:14;:31::i;:::-;27284:159;27260:183;27475:18;;27471:189;;27514:23;27580:8;27540:37;27563:14;27540:20;:37;:::i;:::-;:48;;;;:::i;:::-;27514:74;;27607:37;27628:15;27607:20;:37::i;:::-;27495:165;27471:189;-1:-1:-1;;27686:8:0;:16;;-1:-1:-1;;27686:16:0;;;-1:-1:-1;26819:895:0;-1:-1:-1;;;;;27759:25:0;;27726:18;27759:25;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;27788:23:0;;;;;;:19;:23;;;;;;;;27759:52;:64;;;-1:-1:-1;27815:8:0;;;;27759:64;27755:333;;;-1:-1:-1;27853:1:0;27755:333;;;27884:13;;-1:-1:-1;;;;;27884:13:0;;;27876:21;;;;27872:216;;-1:-1:-1;27927:15:0;;27872:216;;;27970:13;;-1:-1:-1;;;;;27970:13:0;;;27964:19;;;;27960:128;;-1:-1:-1;28013:16:0;;27960:128;;;-1:-1:-1;28075:1:0;27960:128;28104:14;;28100:183;;28135:12;28174:3;28151:19;28160:10;28151:6;:19;:::i;:::-;28150:27;;;;:::i;:::-;28135:42;-1:-1:-1;28201:13:0;28135:42;28201:6;:13;:::i;:::-;28192:22;;28229:42;28245:4;28259;28266;28229:15;:42::i;:::-;28120:163;28100:183;28299:21;;;;28295:459;;;-1:-1:-1;;;;;28352:35:0;;;;;;:29;:35;;;;;;;;28351:36;:92;;;;-1:-1:-1;;;;;;28410:33:0;;;;;;:29;:33;;;;;;;;28409:34;28351:92;:132;;;;-1:-1:-1;28470:13:0;;-1:-1:-1;;;;;28464:19:0;;;28470:13;;28464:19;;28351:132;28347:396;;;-1:-1:-1;;;;;15433:18:0;;28518:15;15433:18;;;;;;;;;;;28619:15;;28599:16;28609:6;15433:18;28599:16;:::i;:::-;:35;;28569:158;;;;-1:-1:-1;;;28569:158:0;;17321:2:1;28569:158:0;;;17303:21:1;17360:2;17340:18;;;17333:30;17399:34;17379:18;;;17372:62;-1:-1:-1;;;17450:18:1;;;17443:46;17506:19;;28569:158:0;17119:412:1;28569:158:0;28499:244;28347:396;28766:33;28782:4;28788:2;28792:6;28766:15;:33::i;:::-;25526:3281;;;25448:3359;;;:::o;9102:266::-;9181:4;9230:6;9205:21;:31;;9197:73;;;;-1:-1:-1;;;9197:73:0;;17738:2:1;9197:73:0;;;17720:21:1;17777:2;17757:18;;;17750:30;17816:31;17796:18;;;17789:59;17865:18;;9197:73:0;17536:353:1;9197:73:0;9284:12;9302:9;-1:-1:-1;;;;;9302:14:0;9324:6;9302:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9283:52:0;;9102:266;-1:-1:-1;;;;;9102:266:0:o;17211:733::-;-1:-1:-1;;;;;17351:20:0;;17343:70;;;;-1:-1:-1;;;17343:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17432:23:0;;17424:71;;;;-1:-1:-1;;;17424:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17592:17:0;;17568:21;17592:17;;;;;;;;;;;17628:23;;;;17620:74;;;;-1:-1:-1;;;17620:74:0;;18306:2:1;17620:74:0;;;18288:21:1;18345:2;18325:18;;;18318:30;18384:34;18364:18;;;18357:62;-1:-1:-1;;;18435:18:1;;;18428:36;18481:19;;17620:74:0;18104:402:1;17620:74:0;-1:-1:-1;;;;;17730:17:0;;;:9;:17;;;;;;;;;;;17750:22;;;17730:42;;17794:20;;;;;;;;:30;;17766:6;;17730:9;17794:30;;17766:6;;17794:30;:::i;:::-;;;;;;;;17859:9;-1:-1:-1;;;;;17842:35:0;17851:6;-1:-1:-1;;;;;17842:35:0;;17870:6;17842:35;;;;160:25:1;;148:2;133:18;;14:177;17842:35:0;;;;;;;;17890:46;25448:3359;29314:876;29373:12;29388:10;29397:1;29388:6;:10;:::i;:::-;29373:25;-1:-1:-1;29409:17:0;29429:13;29373:25;29429:6;:13;:::i;:::-;29538:16;;;29552:1;29538:16;;;;;;;;29409:33;;-1:-1:-1;29480:21:0;;29455:22;;29538:16;;;;;;;;;;-1:-1:-1;29538:16:0;29514:40;;29583:4;29565;29570:1;29565:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29565:23:0;;;:7;;;;;;;;;;:23;;;;29609:15;;:22;;;-1:-1:-1;;;29609:22:0;;;;:15;;;;;:20;;:22;;;;;29565:7;;29609:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29599:4;29604:1;29599:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29599:32:0;;;:7;;;;;;;;;:32;29644:15;;:179;;-1:-1:-1;;;29644:179:0;;:15;;;:66;;:179;;29725:4;;29644:15;;29760:4;;29787;;29807:15;;29644:179;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29844:18;29889:14;29865:21;:38;;;;:::i;:::-;29916:15;;:205;;-1:-1:-1;;;29916:205:0;;29989:4;29916:205;;;20357:34:1;20407:18;;;20400:34;;;29916:15:0;20450:18:1;;;20443:34;;;20493:18;;;20486:34;30073:6:0;20536:19:1;;;20529:44;30095:15:0;20589:19:1;;;20582:35;29844:59:0;;-1:-1:-1;;;;;;29916:15:0;;:31;;29844:59;;20291:19:1;;29916:205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;30139:43:0;;;21141:25:1;;;21197:2;21182:18;;21175:34;;;21225:18;;;21218:34;;;30139:43:0;;-1:-1:-1;21129:2:1;21114:18;30139:43:0;;;;;;;29362:828;;;;;29314:876;:::o;30198:647::-;30351:16;;;30365:1;30351:16;;;;;;;;30293:21;;30268:22;;30351:16;30365:1;30351:16;;;;;;;;;;-1:-1:-1;30351:16:0;30327:40;;30396:4;30378;30383:1;30378:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30378:23:0;;;:7;;;;;;;;;;:23;;;;30422:15;;:22;;;-1:-1:-1;;;30422:22:0;;;;:15;;;;;:20;;:22;;;;;30378:7;;30422:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30412:4;30417:1;30412:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30412:32:0;;;:7;;;;;;;;;:32;30457:15;;:186;;-1:-1:-1;;;30457:186:0;;:15;;;:66;;:186;;30538:11;;30457:15;;30580:4;;30607;;30627:15;;30457:186;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30656:18;30701:14;30677:21;:38;;;;:::i;:::-;30736:15;;30656:59;;-1:-1:-1;30728:46:0;;-1:-1:-1;;;;;30736:15:0;30656:59;30728:34;:46::i;:::-;-1:-1:-1;30792:45:0;;;5125:25:1;;;5181:2;5166:18;;5159:34;;;30792:45:0;;5098:18:1;30792:45:0;;;;;;;30257:588;;;30198:647;:::o;196:248:1:-;264:6;272;325:2;313:9;304:7;300:23;296:32;293:52;;;341:1;338;331:12;293:52;-1:-1:-1;;364:23:1;;;434:2;419:18;;;406:32;;-1:-1:-1;196:248:1:o;449:548::-;561:4;590:2;619;608:9;601:21;651:6;645:13;694:6;689:2;678:9;674:18;667:34;719:1;729:140;743:6;740:1;737:13;729:140;;;838:14;;;834:23;;828:30;804:17;;;823:2;800:26;793:66;758:10;;729:140;;;733:3;918:1;913:2;904:6;893:9;889:22;885:31;878:42;988:2;981;977:7;972:2;964:6;960:15;956:29;945:9;941:45;937:54;929:62;;;;449:548;;;;:::o;1002:131::-;-1:-1:-1;;;;;1077:31:1;;1067:42;;1057:70;;1123:1;1120;1113:12;1138:315;1206:6;1214;1267:2;1255:9;1246:7;1242:23;1238:32;1235:52;;;1283:1;1280;1273:12;1235:52;1322:9;1309:23;1341:31;1366:5;1341:31;:::i;:::-;1391:5;1443:2;1428:18;;;;1415:32;;-1:-1:-1;;;1138:315:1:o;1884:247::-;1943:6;1996:2;1984:9;1975:7;1971:23;1967:32;1964:52;;;2012:1;2009;2002:12;1964:52;2051:9;2038:23;2070:31;2095:5;2070:31;:::i;:::-;2120:5;1884:247;-1:-1:-1;;;1884:247:1:o;2136:456::-;2213:6;2221;2229;2282:2;2270:9;2261:7;2257:23;2253:32;2250:52;;;2298:1;2295;2288:12;2250:52;2337:9;2324:23;2356:31;2381:5;2356:31;:::i;:::-;2406:5;-1:-1:-1;2463:2:1;2448:18;;2435:32;2476:33;2435:32;2476:33;:::i;:::-;2136:456;;2528:7;;-1:-1:-1;;;2582:2:1;2567:18;;;;2554:32;;2136:456::o;2597:180::-;2656:6;2709:2;2697:9;2688:7;2684:23;2680:32;2677:52;;;2725:1;2722;2715:12;2677:52;-1:-1:-1;2748:23:1;;2597:180;-1:-1:-1;2597:180:1:o;2782:118::-;2868:5;2861:13;2854:21;2847:5;2844:32;2834:60;;2890:1;2887;2880:12;2905:241;2961:6;3014:2;3002:9;2993:7;2989:23;2985:32;2982:52;;;3030:1;3027;3020:12;2982:52;3069:9;3056:23;3088:28;3110:5;3088:28;:::i;3548:382::-;3613:6;3621;3674:2;3662:9;3653:7;3649:23;3645:32;3642:52;;;3690:1;3687;3680:12;3642:52;3729:9;3716:23;3748:31;3773:5;3748:31;:::i;:::-;3798:5;-1:-1:-1;3855:2:1;3840:18;;3827:32;3868:30;3827:32;3868:30;:::i;:::-;3917:7;3907:17;;;3548:382;;;;;:::o;3935:388::-;4003:6;4011;4064:2;4052:9;4043:7;4039:23;4035:32;4032:52;;;4080:1;4077;4070:12;4032:52;4119:9;4106:23;4138:31;4163:5;4138:31;:::i;:::-;4188:5;-1:-1:-1;4245:2:1;4230:18;;4217:32;4258:33;4217:32;4258:33;:::i;4328:356::-;4530:2;4512:21;;;4549:18;;;4542:30;4608:34;4603:2;4588:18;;4581:62;4675:2;4660:18;;4328:356::o;4689:127::-;4750:10;4745:3;4741:20;4738:1;4731:31;4781:4;4778:1;4771:15;4805:4;4802:1;4795:15;4821:125;4886:9;;;4907:10;;;4904:36;;;4920:18;;:::i;5204:380::-;5283:1;5279:12;;;;5326;;;5347:61;;5401:4;5393:6;5389:17;5379:27;;5347:61;5454:2;5446:6;5443:14;5423:18;5420:38;5417:161;;5500:10;5495:3;5491:20;5488:1;5481:31;5535:4;5532:1;5525:15;5563:4;5560:1;5553:15;5417:161;;5204:380;;;:::o;5998:422::-;6087:1;6130:5;6087:1;6144:270;6165:7;6155:8;6152:21;6144:270;;;6224:4;6220:1;6216:6;6212:17;6206:4;6203:27;6200:53;;;6233:18;;:::i;:::-;6283:7;6273:8;6269:22;6266:55;;;6303:16;;;;6266:55;6382:22;;;;6342:15;;;;6144:270;;;6148:3;5998:422;;;;;:::o;6425:806::-;6474:5;6504:8;6494:80;;-1:-1:-1;6545:1:1;6559:5;;6494:80;6593:4;6583:76;;-1:-1:-1;6630:1:1;6644:5;;6583:76;6675:4;6693:1;6688:59;;;;6761:1;6756:130;;;;6668:218;;6688:59;6718:1;6709:10;;6732:5;;;6756:130;6793:3;6783:8;6780:17;6777:43;;;6800:18;;:::i;:::-;-1:-1:-1;;6856:1:1;6842:16;;6871:5;;6668:218;;6970:2;6960:8;6957:16;6951:3;6945:4;6942:13;6938:36;6932:2;6922:8;6919:16;6914:2;6908:4;6905:12;6901:35;6898:77;6895:159;;;-1:-1:-1;7007:19:1;;;7039:5;;6895:159;7086:34;7111:8;7105:4;7086:34;:::i;:::-;7156:6;7152:1;7148:6;7144:19;7135:7;7132:32;7129:58;;;7167:18;;:::i;:::-;7205:20;;6425:806;-1:-1:-1;;;6425:806:1:o;7236:140::-;7294:5;7323:47;7364:4;7354:8;7350:19;7344:4;7323:47;:::i;7381:217::-;7421:1;7447;7437:132;;7491:10;7486:3;7482:20;7479:1;7472:31;7526:4;7523:1;7516:15;7554:4;7551:1;7544:15;7437:132;-1:-1:-1;7583:9:1;;7381:217::o;8017:168::-;8090:9;;;8121;;8138:15;;;8132:22;;8118:37;8108:71;;8159:18;;:::i;9023:400::-;9225:2;9207:21;;;9264:2;9244:18;;;9237:30;9303:34;9298:2;9283:18;;9276:62;-1:-1:-1;;;9369:2:1;9354:18;;9347:34;9413:3;9398:19;;9023:400::o;13869:184::-;13939:6;13992:2;13980:9;13971:7;13967:23;13963:32;13960:52;;;14008:1;14005;13998:12;13960:52;-1:-1:-1;14031:16:1;;13869:184;-1:-1:-1;13869:184:1:o;14337:245::-;14404:6;14457:2;14445:9;14436:7;14432:23;14428:32;14425:52;;;14473:1;14470;14463:12;14425:52;14505:9;14499:16;14524:28;14546:5;14524:28;:::i;15395:401::-;15597:2;15579:21;;;15636:2;15616:18;;;15609:30;15675:34;15670:2;15655:18;;15648:62;-1:-1:-1;;;15741:2:1;15726:18;;15719:35;15786:3;15771:19;;15395:401::o;15801:399::-;16003:2;15985:21;;;16042:2;16022:18;;;16015:30;16081:34;16076:2;16061:18;;16054:62;-1:-1:-1;;;16147:2:1;16132:18;;16125:33;16190:3;16175:19;;15801:399::o;16558:423::-;16760:2;16742:21;;;16799:2;16779:18;;;16772:30;16838:34;16833:2;16818:18;;16811:62;16909:29;16904:2;16889:18;;16882:57;16971:3;16956:19;;16558:423::o;16986:128::-;17053:9;;;17074:11;;;17071:37;;;17088:18;;:::i;18643:127::-;18704:10;18699:3;18695:20;18692:1;18685:31;18735:4;18732:1;18725:15;18759:4;18756:1;18749:15;18775:251;18845:6;18898:2;18886:9;18877:7;18873:23;18869:32;18866:52;;;18914:1;18911;18904:12;18866:52;18946:9;18940:16;18965:31;18990:5;18965:31;:::i;19031:980::-;19293:4;19341:3;19330:9;19326:19;19372:6;19361:9;19354:25;19398:2;19436:6;19431:2;19420:9;19416:18;19409:34;19479:3;19474:2;19463:9;19459:18;19452:31;19503:6;19538;19532:13;19569:6;19561;19554:22;19607:3;19596:9;19592:19;19585:26;;19646:2;19638:6;19634:15;19620:29;;19667:1;19677:195;19691:6;19688:1;19685:13;19677:195;;;19756:13;;-1:-1:-1;;;;;19752:39:1;19740:52;;19847:15;;;;19812:12;;;;19788:1;19706:9;19677:195;;;-1:-1:-1;;;;;;;19928:32:1;;;;19923:2;19908:18;;19901:60;-1:-1:-1;;;19992:3:1;19977:19;19970:35;19889:3;19031:980;-1:-1:-1;;;19031:980:1:o;20628:306::-;20716:6;20724;20732;20785:2;20773:9;20764:7;20760:23;20756:32;20753:52;;;20801:1;20798;20791:12;20753:52;20830:9;20824:16;20814:26;;20880:2;20869:9;20865:18;20859:25;20849:35;;20924:2;20913:9;20909:18;20903:25;20893:35;;20628:306;;;;;:::o

Swarm Source

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