ETH Price: $2,310.01 (-0.25%)

Token

Street Fighter (KO)
 

Overview

Max Total Supply

1,000,000,000,000,000 KO

Holders

58

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
340,109,091,359.73403266 KO

Value
$0.00
0x30351c8ed45e91ae36bf0871eba91e240e41ae28
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:
StreetFighter

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-20
*/

//SPDX-License-Identifier: MIT
//Twitter https://twitter.com/SFERC20
//Website https://www.streetfightertoken.com/
//Telegram https://t.me/streetfightererc20
// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol
pragma solidity 0.8.20;

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

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

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

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol

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

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

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)



/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)


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

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

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)


/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// File: StreetFighter.sol

contract StreetFighter is ERC20, Ownable {
  
    uint256 public buyFee = 10; // 10% buy marketing fee
    uint256 public sellFee = 10; // 10% sell marketing fee
    uint256 public marketingShare = 50; //fee share
    uint256 public devShare = 50; //fee share
    uint256 public maxWalletLimit = 1e13 * 1e9; //1% of the supply 
    uint256 public swapTokensAtAmount = 1e7 * 1e9; //tokens swap threshold (1 million tokens)
    uint256 private tradingStartAt;

    address public uniswapV2Pair;
    address public marketingWallet;
    address public devWallet;
    IUniswapV2Router02 router = IUniswapV2Router02 (0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); //uniswap v2 router

    mapping(address => bool) public blacklisted;
    mapping(address => bool) public excludedFromFees;
    mapping(address => bool) public automatedMarketMakerPairs;

    bool public tradingEnabled;
    bool private swapping;
    bool public swapEnabled;
    constructor () ERC20("Street Fighter", "KO"){
        address _uniswapV2Pair = IUniswapV2Factory(router.factory())
            .createPair(address(this), router.WETH());
           uniswapV2Pair   = _uniswapV2Pair;
           marketingWallet = address(0x523b5b8f09914cf32624c63B8eE4C77e5093a14a);
           devWallet = address(0xfb40DB524AD1cc4bc17D637b40e4E8e421378c06); 
           
           automatedMarketMakerPairs[uniswapV2Pair] = true;
           excludedFromFees[address(this)] = true;
           excludedFromFees[msg.sender] = true;
           excludedFromFees[marketingWallet] = true;

            _mint(msg.sender, 1e15 * 1e9); //1,000,000,000,000,000 KO
    }

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

    receive () external payable {}
   
    ///@dev manage the blacklist
    ///@param account: wallet or bot to be blacklisted
    ///@param isBot: bool value, true means (blacklisted), false means unblacklisted
    function blacklist(address account, bool isBot) external onlyOwner {
        blacklisted[account] = isBot;
    }
    
    ///@dev update the token amount for swap
    ///@param newAmount: new swap amount
    function updateSwapAtAmount (uint256 newAmount) external onlyOwner {
        require (newAmount <= totalSupply()/100000, "amount must less than equals to 0.001% of the supply"); 
        swapTokensAtAmount = newAmount;
    }

    ///@dev update max Wallet amount
    ///@param maxHoldingAmount: new max wallet limit
    ///Requirements: amount must be greator than equals to 1 percent of the total supply
    function updateMaxWallet(uint256 maxHoldingAmount) external onlyOwner {
        require(maxHoldingAmount >= totalSupply() / 100, "max wallet limit should be atleast 1% of the supply");
        maxWalletLimit = maxHoldingAmount;
    }
    

    ///@dev set fees for buy and sell
    ///@param buy: new buy fees
    ///@param sell: new sell fees
    ///Requirements --
    /// buy and sell fees should be less than equals to 20
    function setFees (uint256 buy, uint256 sell) external onlyOwner {
        buyFee = buy;
        sellFee = sell;
        require (buyFee + sellFee <= 20, "Max Fees limit is 20% combined");
    }
    
    ///@dev enable trading
    ///once enbaled, it can never be turned off
    function enableTrading() external onlyOwner{
        require(!tradingEnabled, "Trading already enabled.");
        tradingEnabled = true;
        swapEnabled = true;
        tradingStartAt = block.number;
    }
    

    ///@dev add or remove new pairs
    ///@param newPair: address of new pair
    ///@param value: bool value, true means set new pair, false means remove pair from list 
    function updateAutomatedPairs (address newPair, bool value) external onlyOwner {
        require (newPair != uniswapV2Pair, "can't update main pair");
        automatedMarketMakerPairs[newPair] = value;
    }
   
    ///@dev update wallets
    ///@param nMarketing: new marketing wallet address
    ///@param nDev: new dev wallet address
    function updateMarketingAndDevWallets (address nMarketing, address nDev) external onlyOwner {
        require (nMarketing != address(0) && nDev != address(0), "zero address not allowed");
        marketingWallet = nMarketing;
        devWallet = nDev;
    }
    
    ///manage the transfer and fees
    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(!blacklisted[to] && !blacklisted[from], "Blacklisted");
        require(tradingEnabled || excludedFromFees[from] || excludedFromFees[to], "Trading not yet enabled!");
       
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

		uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (canSwap &&
            !swapping &&
            automatedMarketMakerPairs[to] &&
            swapEnabled
        ) {
            swapping = true;
                
            swapAndLiquify(contractTokenBalance);
            uint256 ethBalance = address(this).balance;
            uint256 marketingPart = (ethBalance * marketingShare) / 100;
            uint256 devPart = (ethBalance * devShare) / 100;
            (bool m,) = marketingWallet.call{value: marketingPart}("");
            require (m, "eth to marketing wallet failed");
            (bool d,) = devWallet.call{value: devPart}("");
            require(d, "eth to dev wallet failed");

            swapping = false;
        }

         bool takeFee = !swapping;
 
        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (excludedFromFees[from] || excludedFromFees[to]) {
            takeFee = false;
        }
 
       uint256 totalFee = buyFee + sellFee;
       uint256 fees = 0;
        /// only take fees on buys/sells, do not take on wallet transfers
        if (takeFee && totalFee > 0) {
            
            if(!automatedMarketMakerPairs[to]){
                require (balanceOf(to) + amount <= maxWalletLimit, "Max wallet limit exceeds");
            }
            /// on sell
            if (automatedMarketMakerPairs[to]) {
                fees = (amount * sellFee) / 100;
               
            }
            /// on buy
            
            if (automatedMarketMakerPairs[from]) {
                fees = (amount * buyFee) / 100;
                ///first two blocks blacklisted
                if(block.number <= tradingStartAt + 2){
                    blacklisted[to] = true;
                }
               
            }
 
            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }
 
            amount = amount - fees;
        }

        super._transfer(from, to, amount);
    }
   
    ///@notice swap the collected tax tokens to ether
    function swapAndLiquify(uint256 tokens) private {
       
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        if(allowance(address(this), address(router)) < tokens ){
       _approve(address(this), address(router), ~uint256(0));
        }
       router.swapExactTokensForETHSupportingFeeOnTransferTokens(
           tokens,
            0,
            path,
            address(this),
            block.timestamp);
        
    }
    
    ///@dev claim stucked ether
    ///only dev or marketing wallet can call this function
    function claimStuckEth () external {
        require (msg.sender == marketingWallet || msg.sender == devWallet);
        address caller = msg.sender;
        (bool sent,) = caller.call{value: address(this).balance}("");
        require(sent, "eth claim failed");
    }
    
    ///@dev claim stucked tokens
    ///@param token: token address to rescue
    ///@param amount: amount of stucked token
    function claimStuckedTokens( IERC20 token, uint256 amount) external{
        require(msg.sender == marketingWallet || msg.sender == devWallet);
        token.transfer(msg.sender, amount);
    }
    

    ///@dev update the wallet shares for fees
    ///@param marketing: marketing share
    ///@param dev: dev share
    function updateWalletShares (uint256 marketing, uint256 dev) external onlyOwner {
        require (marketing+dev == 100, "sum of shares must be 100");
        marketingShare = marketing;
        devShare = dev;
    }


}

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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isBot","type":"bool"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimStuckedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":"devShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingShare","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":"maxWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"buy","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"name":"setFees","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newPair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"updateAutomatedPairs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nMarketing","type":"address"},{"internalType":"address","name":"nDev","type":"address"}],"name":"updateMarketingAndDevWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxHoldingAmount","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"dev","type":"uint256"}],"name":"updateWalletShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600a600681905560078190556032600881905560095569021e19e0c9bab24000009055662386f26fc10000600b55601080546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17905534801562000064575f80fd5b506040518060400160405280600e81526020016d29ba3932b2ba102334b3b43a32b960911b815250604051806040016040528060028152602001614b4f60f01b8152508160039081620000b89190620004d9565b506004620000c78282620004d9565b505050620000e4620000de6200031c60201b60201c565b62000320565b6010546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa1580156200012c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001529190620005a1565b6001600160a01b031663c9c653963060105f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001b2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001d89190620005a1565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801562000223573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002499190620005a1565b600d80546001600160a01b038084166001600160a01b03199283168117909355600e8054831673523b5b8f09914cf32624c63b8ee4c77e5093a14a178155600f805490931673fb40db524ad1cc4bc17d637b40e4e8e421378c06179092555f928352601360209081526040808520805460ff1990811660019081179092553087526012909352818620805484168217905533808752828720805485168317905594549093168552909320805490931617909155909150620003159069d3c21bcecceda100000062000371565b50620005f6565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038216620003cc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060025f828254620003df9190620005d0565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200046357607f821691505b6020821081036200048257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000435575f81815260208120601f850160051c81016020861015620004b05750805b601f850160051c820191505b81811015620004d157828155600101620004bc565b505050505050565b81516001600160401b03811115620004f557620004f56200043a565b6200050d816200050684546200044e565b8462000488565b602080601f83116001811462000543575f84156200052b5750858301515b5f19600386901b1c1916600185901b178555620004d1565b5f85815260208120601f198616915b82811015620005735788860151825594840194600190910190840162000552565b50858210156200059157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215620005b2575f80fd5b81516001600160a01b0381168114620005c9575f80fd5b9392505050565b80820180821115620005f057634e487b7160e01b5f52601160045260245ffd5b92915050565b611c2380620006045f395ff3fe608060405260043610610220575f3560e01c806375f0a8741161011e578063ad2e4f95116100a8578063dbe66ca01161006d578063dbe66ca01461062b578063dd62ed3e14610659578063e2f4560514610678578063f2fde38b1461068d578063f4755bf2146106ac575f80fd5b8063ad2e4f951461057c578063aed04fae1461059b578063b62496f5146105b0578063c55d2287146105de578063dbac26e9146105fd575f80fd5b80638ea5220f116100ee5780638ea5220f146104ec57806395d89b411461050b578063a456a2601461051f578063a457c2d71461053e578063a9059cbb1461055d575f80fd5b806375f0a8741461047d57806377c06f831461049c5780638a8c523c146104bb5780638da5cb5b146104cf575f80fd5b8063356b932a116101aa5780634ada218b1161016f5780634ada218b146103e857806366a88d96146104015780636ddd17131461041657806370a0823114610435578063715018a614610469575f80fd5b8063356b932a1461034a578063395093511461035e578063404e51291461037d578063470624021461039c57806349bd5a5e146103b1575f80fd5b806318160ddd116101f057806318160ddd146102c85780631c499ab0146102dc57806323b872dd146102fb5780632b14ca561461031a578063313ce5671461032f575f80fd5b806306fdde031461022b57806309218ee714610255578063095ea7b3146102785780630b78f9c0146102a7575f80fd5b3661022757005b5f80fd5b348015610236575f80fd5b5061023f6106cb565b60405161024c9190611874565b60405180910390f35b348015610260575f80fd5b5061026a60085481565b60405190815260200161024c565b348015610283575f80fd5b506102976102923660046118d3565b61075b565b604051901515815260200161024c565b3480156102b2575f80fd5b506102c66102c13660046118fd565b610774565b005b3480156102d3575f80fd5b5060025461026a565b3480156102e7575f80fd5b506102c66102f636600461191d565b6107e9565b348015610306575f80fd5b50610297610315366004611934565b610876565b348015610325575f80fd5b5061026a60075481565b34801561033a575f80fd5b506040516009815260200161024c565b348015610355575f80fd5b506102c6610899565b348015610369575f80fd5b506102976103783660046118d3565b61094e565b348015610388575f80fd5b506102c661039736600461197f565b61096f565b3480156103a7575f80fd5b5061026a60065481565b3480156103bc575f80fd5b50600d546103d0906001600160a01b031681565b6040516001600160a01b03909116815260200161024c565b3480156103f3575f80fd5b506014546102979060ff1681565b34801561040c575f80fd5b5061026a600a5481565b348015610421575f80fd5b506014546102979062010000900460ff1681565b348015610440575f80fd5b5061026a61044f3660046119b6565b6001600160a01b03165f9081526020819052604090205490565b348015610474575f80fd5b506102c66109a1565b348015610488575f80fd5b50600e546103d0906001600160a01b031681565b3480156104a7575f80fd5b506102c66104b63660046118d3565b6109b4565b3480156104c6575f80fd5b506102c6610a52565b3480156104da575f80fd5b506005546001600160a01b03166103d0565b3480156104f7575f80fd5b50600f546103d0906001600160a01b031681565b348015610516575f80fd5b5061023f610ac4565b34801561052a575f80fd5b506102c66105393660046118fd565b610ad3565b348015610549575f80fd5b506102976105583660046118d3565b610b3f565b348015610568575f80fd5b506102976105773660046118d3565b610bb9565b348015610587575f80fd5b506102c661059636600461197f565b610bc6565b3480156105a6575f80fd5b5061026a60095481565b3480156105bb575f80fd5b506102976105ca3660046119b6565b60136020525f908152604090205460ff1681565b3480156105e9575f80fd5b506102c66105f836600461191d565b610c4f565b348015610608575f80fd5b506102976106173660046119b6565b60116020525f908152604090205460ff1681565b348015610636575f80fd5b506102976106453660046119b6565b60126020525f908152604090205460ff1681565b348015610664575f80fd5b5061026a6106733660046119d8565b610cdf565b348015610683575f80fd5b5061026a600b5481565b348015610698575f80fd5b506102c66106a73660046119b6565b610d09565b3480156106b7575f80fd5b506102c66106c63660046119d8565b610d82565b6060600380546106da90611a04565b80601f016020809104026020016040519081016040528092919081815260200182805461070690611a04565b80156107515780601f1061072857610100808354040283529160200191610751565b820191905f5260205f20905b81548152906001019060200180831161073457829003601f168201915b5050505050905090565b5f33610768818585610e24565b60019150505b92915050565b61077c610f47565b6006829055600781905560146107928284611a50565b11156107e55760405162461bcd60e51b815260206004820152601e60248201527f4d61782046656573206c696d69742069732032302520636f6d62696e6564000060448201526064015b60405180910390fd5b5050565b6107f1610f47565b60646107fc60025490565b6108069190611a63565b8110156108715760405162461bcd60e51b815260206004820152603360248201527f6d61782077616c6c6574206c696d69742073686f756c642062652061746c65616044820152727374203125206f662074686520737570706c7960681b60648201526084016107dc565b600a55565b5f33610883858285610fa1565b61088e858585611019565b506001949350505050565b600e546001600160a01b03163314806108bc5750600f546001600160a01b031633145b6108c4575f80fd5b60405133905f90829047908381818185875af1925050503d805f8114610905576040519150601f19603f3d011682016040523d82523d5f602084013e61090a565b606091505b50509050806107e55760405162461bcd60e51b815260206004820152601060248201526f195d1a0818db185a5b4819985a5b195960821b60448201526064016107dc565b5f336107688185856109608383610cdf565b61096a9190611a50565b610e24565b610977610f47565b6001600160a01b03919091165f908152601160205260409020805460ff1916911515919091179055565b6109a9610f47565b6109b25f61158b565b565b600e546001600160a01b03163314806109d75750600f546001600160a01b031633145b6109df575f80fd5b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190611a82565b505050565b610a5a610f47565b60145460ff1615610aad5760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642e000000000000000060448201526064016107dc565b6014805462ff00ff19166201000117905543600c55565b6060600480546106da90611a04565b610adb610f47565b610ae58183611a50565b606414610b345760405162461bcd60e51b815260206004820152601960248201527f73756d206f6620736861726573206d757374206265203130300000000000000060448201526064016107dc565b600891909155600955565b5f3381610b4c8286610cdf565b905083811015610bac5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016107dc565b61088e8286868403610e24565b5f33610768818585611019565b610bce610f47565b600d546001600160a01b0390811690831603610c255760405162461bcd60e51b815260206004820152601660248201527531b0b713ba103ab83230ba329036b0b4b7103830b4b960511b60448201526064016107dc565b6001600160a01b03919091165f908152601360205260409020805460ff1916911515919091179055565b610c57610f47565b620186a0610c6460025490565b610c6e9190611a63565b811115610cda5760405162461bcd60e51b815260206004820152603460248201527f616d6f756e74206d757374206c657373207468616e20657175616c7320746f20604482015273302e30303125206f662074686520737570706c7960601b60648201526084016107dc565b600b55565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b610d11610f47565b6001600160a01b038116610d765760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107dc565b610d7f8161158b565b50565b610d8a610f47565b6001600160a01b03821615801590610daa57506001600160a01b03811615155b610df65760405162461bcd60e51b815260206004820152601860248201527f7a65726f2061646472657373206e6f7420616c6c6f776564000000000000000060448201526064016107dc565b600e80546001600160a01b039384166001600160a01b031991821617909155600f8054929093169116179055565b6001600160a01b038316610e865760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016107dc565b6001600160a01b038216610ee75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016107dc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146109b25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107dc565b5f610fac8484610cdf565b90505f19811461101357818110156110065760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016107dc565b6110138484848403610e24565b50505050565b6001600160a01b03831661103f5760405162461bcd60e51b81526004016107dc90611a9d565b6001600160a01b0382166110655760405162461bcd60e51b81526004016107dc90611ae2565b6001600160a01b0382165f9081526011602052604090205460ff161580156110a557506001600160a01b0383165f9081526011602052604090205460ff16155b6110df5760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b60448201526064016107dc565b60145460ff168061110757506001600160a01b0383165f9081526012602052604090205460ff165b8061112957506001600160a01b0382165f9081526012602052604090205460ff165b6111755760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c656421000000000000000060448201526064016107dc565b805f0361118757610a4d83835f6115dc565b305f90815260208190526040902054600b54811080159081906111b25750601454610100900460ff16155b80156111d557506001600160a01b0384165f9081526013602052604090205460ff165b80156111e9575060145462010000900460ff165b15611397576014805461ff00191661010017905561120682611704565b60085447905f9060649061121a9084611b25565b6112249190611a63565b90505f6064600954846112379190611b25565b6112419190611a63565b600e546040519192505f916001600160a01b039091169084908381818185875af1925050503d805f8114611290576040519150601f19603f3d011682016040523d82523d5f602084013e611295565b606091505b50509050806112e65760405162461bcd60e51b815260206004820152601e60248201527f65746820746f206d61726b6574696e672077616c6c6574206661696c6564000060448201526064016107dc565b600f546040515f916001600160a01b03169084908381818185875af1925050503d805f8114611330576040519150601f19603f3d011682016040523d82523d5f602084013e611335565b606091505b50509050806113865760405162461bcd60e51b815260206004820152601860248201527f65746820746f206465762077616c6c6574206661696c6564000000000000000060448201526064016107dc565b50506014805461ff00191690555050505b6014546001600160a01b0386165f9081526012602052604090205460ff6101009092048216159116806113e157506001600160a01b0385165f9081526012602052604090205460ff165b156113e957505f5b5f6007546006546113fa9190611a50565b90505f82801561140957505f82115b15611576576001600160a01b0387165f9081526013602052604090205460ff166114a757600a548661144f896001600160a01b03165f9081526020819052604090205490565b6114599190611a50565b11156114a75760405162461bcd60e51b815260206004820152601860248201527f4d61782077616c6c6574206c696d69742065786365656473000000000000000060448201526064016107dc565b6001600160a01b0387165f9081526013602052604090205460ff16156114e4576064600754876114d79190611b25565b6114e19190611a63565b90505b6001600160a01b0388165f9081526013602052604090205460ff1615611558576064600654876115149190611b25565b61151e9190611a63565b9050600c54600261152f9190611a50565b4311611558576001600160a01b0387165f908152601160205260409020805460ff191660011790555b8015611569576115698830836115dc565b6115738187611b3c565b95505b6115818888886115dc565b5050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0383166116025760405162461bcd60e51b81526004016107dc90611a9d565b6001600160a01b0382166116285760405162461bcd60e51b81526004016107dc90611ae2565b6001600160a01b0383165f908152602081905260409020548181101561169f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016107dc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611013565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061173757611737611b4f565b6001600160a01b03928316602091820292909201810191909152601054604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561178e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117b29190611b63565b816001815181106117c5576117c5611b4f565b6001600160a01b03928316602091820292909201015260105483916117ec91309116610cdf565b101561180b5760105461180b9030906001600160a01b03165f19610e24565b60105460405163791ac94760e01b81526001600160a01b039091169063791ac947906118439085905f90869030904290600401611b7e565b5f604051808303815f87803b15801561185a575f80fd5b505af115801561186c573d5f803e3d5ffd5b505050505050565b5f6020808352835180828501525f5b8181101561189f57858101830151858201604001528201611883565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610d7f575f80fd5b5f80604083850312156118e4575f80fd5b82356118ef816118bf565b946020939093013593505050565b5f806040838503121561190e575f80fd5b50508035926020909101359150565b5f6020828403121561192d575f80fd5b5035919050565b5f805f60608486031215611946575f80fd5b8335611951816118bf565b92506020840135611961816118bf565b929592945050506040919091013590565b8015158114610d7f575f80fd5b5f8060408385031215611990575f80fd5b823561199b816118bf565b915060208301356119ab81611972565b809150509250929050565b5f602082840312156119c6575f80fd5b81356119d1816118bf565b9392505050565b5f80604083850312156119e9575f80fd5b82356119f4816118bf565b915060208301356119ab816118bf565b600181811c90821680611a1857607f821691505b602082108103611a3657634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561076e5761076e611a3c565b5f82611a7d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611a92575f80fd5b81516119d181611972565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b808202811582820484141761076e5761076e611a3c565b8181038181111561076e5761076e611a3c565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611b73575f80fd5b81516119d1816118bf565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b81811015611bcc5784516001600160a01b031683529383019391830191600101611ba7565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122054fd72134f481b8ce4b69ad63fffbb8eaa4bb8e7859f136e578312cfa343eecb64736f6c63430008140033

Deployed Bytecode

0x608060405260043610610220575f3560e01c806375f0a8741161011e578063ad2e4f95116100a8578063dbe66ca01161006d578063dbe66ca01461062b578063dd62ed3e14610659578063e2f4560514610678578063f2fde38b1461068d578063f4755bf2146106ac575f80fd5b8063ad2e4f951461057c578063aed04fae1461059b578063b62496f5146105b0578063c55d2287146105de578063dbac26e9146105fd575f80fd5b80638ea5220f116100ee5780638ea5220f146104ec57806395d89b411461050b578063a456a2601461051f578063a457c2d71461053e578063a9059cbb1461055d575f80fd5b806375f0a8741461047d57806377c06f831461049c5780638a8c523c146104bb5780638da5cb5b146104cf575f80fd5b8063356b932a116101aa5780634ada218b1161016f5780634ada218b146103e857806366a88d96146104015780636ddd17131461041657806370a0823114610435578063715018a614610469575f80fd5b8063356b932a1461034a578063395093511461035e578063404e51291461037d578063470624021461039c57806349bd5a5e146103b1575f80fd5b806318160ddd116101f057806318160ddd146102c85780631c499ab0146102dc57806323b872dd146102fb5780632b14ca561461031a578063313ce5671461032f575f80fd5b806306fdde031461022b57806309218ee714610255578063095ea7b3146102785780630b78f9c0146102a7575f80fd5b3661022757005b5f80fd5b348015610236575f80fd5b5061023f6106cb565b60405161024c9190611874565b60405180910390f35b348015610260575f80fd5b5061026a60085481565b60405190815260200161024c565b348015610283575f80fd5b506102976102923660046118d3565b61075b565b604051901515815260200161024c565b3480156102b2575f80fd5b506102c66102c13660046118fd565b610774565b005b3480156102d3575f80fd5b5060025461026a565b3480156102e7575f80fd5b506102c66102f636600461191d565b6107e9565b348015610306575f80fd5b50610297610315366004611934565b610876565b348015610325575f80fd5b5061026a60075481565b34801561033a575f80fd5b506040516009815260200161024c565b348015610355575f80fd5b506102c6610899565b348015610369575f80fd5b506102976103783660046118d3565b61094e565b348015610388575f80fd5b506102c661039736600461197f565b61096f565b3480156103a7575f80fd5b5061026a60065481565b3480156103bc575f80fd5b50600d546103d0906001600160a01b031681565b6040516001600160a01b03909116815260200161024c565b3480156103f3575f80fd5b506014546102979060ff1681565b34801561040c575f80fd5b5061026a600a5481565b348015610421575f80fd5b506014546102979062010000900460ff1681565b348015610440575f80fd5b5061026a61044f3660046119b6565b6001600160a01b03165f9081526020819052604090205490565b348015610474575f80fd5b506102c66109a1565b348015610488575f80fd5b50600e546103d0906001600160a01b031681565b3480156104a7575f80fd5b506102c66104b63660046118d3565b6109b4565b3480156104c6575f80fd5b506102c6610a52565b3480156104da575f80fd5b506005546001600160a01b03166103d0565b3480156104f7575f80fd5b50600f546103d0906001600160a01b031681565b348015610516575f80fd5b5061023f610ac4565b34801561052a575f80fd5b506102c66105393660046118fd565b610ad3565b348015610549575f80fd5b506102976105583660046118d3565b610b3f565b348015610568575f80fd5b506102976105773660046118d3565b610bb9565b348015610587575f80fd5b506102c661059636600461197f565b610bc6565b3480156105a6575f80fd5b5061026a60095481565b3480156105bb575f80fd5b506102976105ca3660046119b6565b60136020525f908152604090205460ff1681565b3480156105e9575f80fd5b506102c66105f836600461191d565b610c4f565b348015610608575f80fd5b506102976106173660046119b6565b60116020525f908152604090205460ff1681565b348015610636575f80fd5b506102976106453660046119b6565b60126020525f908152604090205460ff1681565b348015610664575f80fd5b5061026a6106733660046119d8565b610cdf565b348015610683575f80fd5b5061026a600b5481565b348015610698575f80fd5b506102c66106a73660046119b6565b610d09565b3480156106b7575f80fd5b506102c66106c63660046119d8565b610d82565b6060600380546106da90611a04565b80601f016020809104026020016040519081016040528092919081815260200182805461070690611a04565b80156107515780601f1061072857610100808354040283529160200191610751565b820191905f5260205f20905b81548152906001019060200180831161073457829003601f168201915b5050505050905090565b5f33610768818585610e24565b60019150505b92915050565b61077c610f47565b6006829055600781905560146107928284611a50565b11156107e55760405162461bcd60e51b815260206004820152601e60248201527f4d61782046656573206c696d69742069732032302520636f6d62696e6564000060448201526064015b60405180910390fd5b5050565b6107f1610f47565b60646107fc60025490565b6108069190611a63565b8110156108715760405162461bcd60e51b815260206004820152603360248201527f6d61782077616c6c6574206c696d69742073686f756c642062652061746c65616044820152727374203125206f662074686520737570706c7960681b60648201526084016107dc565b600a55565b5f33610883858285610fa1565b61088e858585611019565b506001949350505050565b600e546001600160a01b03163314806108bc5750600f546001600160a01b031633145b6108c4575f80fd5b60405133905f90829047908381818185875af1925050503d805f8114610905576040519150601f19603f3d011682016040523d82523d5f602084013e61090a565b606091505b50509050806107e55760405162461bcd60e51b815260206004820152601060248201526f195d1a0818db185a5b4819985a5b195960821b60448201526064016107dc565b5f336107688185856109608383610cdf565b61096a9190611a50565b610e24565b610977610f47565b6001600160a01b03919091165f908152601160205260409020805460ff1916911515919091179055565b6109a9610f47565b6109b25f61158b565b565b600e546001600160a01b03163314806109d75750600f546001600160a01b031633145b6109df575f80fd5b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190611a82565b505050565b610a5a610f47565b60145460ff1615610aad5760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642e000000000000000060448201526064016107dc565b6014805462ff00ff19166201000117905543600c55565b6060600480546106da90611a04565b610adb610f47565b610ae58183611a50565b606414610b345760405162461bcd60e51b815260206004820152601960248201527f73756d206f6620736861726573206d757374206265203130300000000000000060448201526064016107dc565b600891909155600955565b5f3381610b4c8286610cdf565b905083811015610bac5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016107dc565b61088e8286868403610e24565b5f33610768818585611019565b610bce610f47565b600d546001600160a01b0390811690831603610c255760405162461bcd60e51b815260206004820152601660248201527531b0b713ba103ab83230ba329036b0b4b7103830b4b960511b60448201526064016107dc565b6001600160a01b03919091165f908152601360205260409020805460ff1916911515919091179055565b610c57610f47565b620186a0610c6460025490565b610c6e9190611a63565b811115610cda5760405162461bcd60e51b815260206004820152603460248201527f616d6f756e74206d757374206c657373207468616e20657175616c7320746f20604482015273302e30303125206f662074686520737570706c7960601b60648201526084016107dc565b600b55565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b610d11610f47565b6001600160a01b038116610d765760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107dc565b610d7f8161158b565b50565b610d8a610f47565b6001600160a01b03821615801590610daa57506001600160a01b03811615155b610df65760405162461bcd60e51b815260206004820152601860248201527f7a65726f2061646472657373206e6f7420616c6c6f776564000000000000000060448201526064016107dc565b600e80546001600160a01b039384166001600160a01b031991821617909155600f8054929093169116179055565b6001600160a01b038316610e865760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016107dc565b6001600160a01b038216610ee75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016107dc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146109b25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107dc565b5f610fac8484610cdf565b90505f19811461101357818110156110065760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016107dc565b6110138484848403610e24565b50505050565b6001600160a01b03831661103f5760405162461bcd60e51b81526004016107dc90611a9d565b6001600160a01b0382166110655760405162461bcd60e51b81526004016107dc90611ae2565b6001600160a01b0382165f9081526011602052604090205460ff161580156110a557506001600160a01b0383165f9081526011602052604090205460ff16155b6110df5760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b60448201526064016107dc565b60145460ff168061110757506001600160a01b0383165f9081526012602052604090205460ff165b8061112957506001600160a01b0382165f9081526012602052604090205460ff165b6111755760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c656421000000000000000060448201526064016107dc565b805f0361118757610a4d83835f6115dc565b305f90815260208190526040902054600b54811080159081906111b25750601454610100900460ff16155b80156111d557506001600160a01b0384165f9081526013602052604090205460ff165b80156111e9575060145462010000900460ff165b15611397576014805461ff00191661010017905561120682611704565b60085447905f9060649061121a9084611b25565b6112249190611a63565b90505f6064600954846112379190611b25565b6112419190611a63565b600e546040519192505f916001600160a01b039091169084908381818185875af1925050503d805f8114611290576040519150601f19603f3d011682016040523d82523d5f602084013e611295565b606091505b50509050806112e65760405162461bcd60e51b815260206004820152601e60248201527f65746820746f206d61726b6574696e672077616c6c6574206661696c6564000060448201526064016107dc565b600f546040515f916001600160a01b03169084908381818185875af1925050503d805f8114611330576040519150601f19603f3d011682016040523d82523d5f602084013e611335565b606091505b50509050806113865760405162461bcd60e51b815260206004820152601860248201527f65746820746f206465762077616c6c6574206661696c6564000000000000000060448201526064016107dc565b50506014805461ff00191690555050505b6014546001600160a01b0386165f9081526012602052604090205460ff6101009092048216159116806113e157506001600160a01b0385165f9081526012602052604090205460ff165b156113e957505f5b5f6007546006546113fa9190611a50565b90505f82801561140957505f82115b15611576576001600160a01b0387165f9081526013602052604090205460ff166114a757600a548661144f896001600160a01b03165f9081526020819052604090205490565b6114599190611a50565b11156114a75760405162461bcd60e51b815260206004820152601860248201527f4d61782077616c6c6574206c696d69742065786365656473000000000000000060448201526064016107dc565b6001600160a01b0387165f9081526013602052604090205460ff16156114e4576064600754876114d79190611b25565b6114e19190611a63565b90505b6001600160a01b0388165f9081526013602052604090205460ff1615611558576064600654876115149190611b25565b61151e9190611a63565b9050600c54600261152f9190611a50565b4311611558576001600160a01b0387165f908152601160205260409020805460ff191660011790555b8015611569576115698830836115dc565b6115738187611b3c565b95505b6115818888886115dc565b5050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0383166116025760405162461bcd60e51b81526004016107dc90611a9d565b6001600160a01b0382166116285760405162461bcd60e51b81526004016107dc90611ae2565b6001600160a01b0383165f908152602081905260409020548181101561169f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016107dc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611013565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061173757611737611b4f565b6001600160a01b03928316602091820292909201810191909152601054604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561178e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117b29190611b63565b816001815181106117c5576117c5611b4f565b6001600160a01b03928316602091820292909201015260105483916117ec91309116610cdf565b101561180b5760105461180b9030906001600160a01b03165f19610e24565b60105460405163791ac94760e01b81526001600160a01b039091169063791ac947906118439085905f90869030904290600401611b7e565b5f604051808303815f87803b15801561185a575f80fd5b505af115801561186c573d5f803e3d5ffd5b505050505050565b5f6020808352835180828501525f5b8181101561189f57858101830151858201604001528201611883565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610d7f575f80fd5b5f80604083850312156118e4575f80fd5b82356118ef816118bf565b946020939093013593505050565b5f806040838503121561190e575f80fd5b50508035926020909101359150565b5f6020828403121561192d575f80fd5b5035919050565b5f805f60608486031215611946575f80fd5b8335611951816118bf565b92506020840135611961816118bf565b929592945050506040919091013590565b8015158114610d7f575f80fd5b5f8060408385031215611990575f80fd5b823561199b816118bf565b915060208301356119ab81611972565b809150509250929050565b5f602082840312156119c6575f80fd5b81356119d1816118bf565b9392505050565b5f80604083850312156119e9575f80fd5b82356119f4816118bf565b915060208301356119ab816118bf565b600181811c90821680611a1857607f821691505b602082108103611a3657634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561076e5761076e611a3c565b5f82611a7d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611a92575f80fd5b81516119d181611972565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b808202811582820484141761076e5761076e611a3c565b8181038181111561076e5761076e611a3c565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611b73575f80fd5b81516119d1816118bf565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b81811015611bcc5784516001600160a01b031683529383019391830191600101611ba7565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122054fd72134f481b8ce4b69ad63fffbb8eaa4bb8e7859f136e578312cfa343eecb64736f6c63430008140033

Deployed Bytecode Sourcemap

26110:8724:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12427:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26280:34;;;;;;;;;;;;;;;;;;;713:25:1;;;701:2;686:18;26280:34:0;567:177:1;14787:201:0;;;;;;;;;;-1:-1:-1;14787:201:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;14787:201:0;1205:187:1;29145:197:0;;;;;;;;;;-1:-1:-1;29145:197:0;;;;;:::i;:::-;;:::i;:::-;;13556:108;;;;;;;;;;-1:-1:-1;13644:12:0;;13556:108;;28704:236;;;;;;;;;;-1:-1:-1;28704:236:0;;;;;:::i;:::-;;:::i;15568:261::-;;;;;;;;;;-1:-1:-1;15568:261:0;;;;;:::i;:::-;;:::i;26220:27::-;;;;;;;;;;;;;;;;27764:84;;;;;;;;;;-1:-1:-1;27764:84:0;;27839:1;2438:36:1;;2426:2;2411:18;27764:84:0;2296:184:1;33866:273:0;;;;;;;;;;;;;:::i;16238:238::-;;;;;;;;;;-1:-1:-1;16238:238:0;;;;;:::i;:::-;;:::i;28073:114::-;;;;;;;;;;-1:-1:-1;28073:114:0;;;;;:::i;:::-;;:::i;26162:26::-;;;;;;;;;;;;;;;;26583:28;;;;;;;;;;-1:-1:-1;26583:28:0;;;;-1:-1:-1;;;;;26583:28:0;;;;;;-1:-1:-1;;;;;3159:32:1;;;3141:51;;3129:2;3114:18;26583:28:0;2995:203:1;26978:26:0;;;;;;;;;;-1:-1:-1;26978:26:0;;;;;;;;26380:42;;;;;;;;;;;;;;;;27039:23;;;;;;;;;;-1:-1:-1;27039:23:0;;;;;;;;;;;13727:127;;;;;;;;;;-1:-1:-1;13727:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;13828:18:0;13801:7;13828:18;;;;;;;;;;;;13727:127;25263:103;;;;;;;;;;;;;:::i;26618:30::-;;;;;;;;;;-1:-1:-1;26618:30:0;;;;-1:-1:-1;;;;;26618:30:0;;;34278:196;;;;;;;;;;-1:-1:-1;34278:196:0;;;;;:::i;:::-;;:::i;29431:215::-;;;;;;;;;;;;;:::i;24622:87::-;;;;;;;;;;-1:-1:-1;24695:6:0;;-1:-1:-1;;;;;24695:6:0;24622:87;;26655:24;;;;;;;;;;-1:-1:-1;26655:24:0;;;;-1:-1:-1;;;;;26655:24:0;;;12646:104;;;;;;;;;;;;;:::i;34607:220::-;;;;;;;;;;-1:-1:-1;34607:220:0;;;;;:::i;:::-;;:::i;16979:436::-;;;;;;;;;;-1:-1:-1;16979:436:0;;;;;:::i;:::-;;:::i;14060:193::-;;;;;;;;;;-1:-1:-1;14060:193:0;;;;;:::i;:::-;;:::i;29835:211::-;;;;;;;;;;-1:-1:-1;29835:211:0;;;;;:::i;:::-;;:::i;26333:28::-;;;;;;;;;;;;;;;;26912:57;;;;;;;;;;-1:-1:-1;26912:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;28287:227;;;;;;;;;;-1:-1:-1;28287:227:0;;;;;:::i;:::-;;:::i;26807:43::-;;;;;;;;;;-1:-1:-1;26807:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;26857:48;;;;;;;;;;-1:-1:-1;26857:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;14316:151;;;;;;;;;;-1:-1:-1;14316:151:0;;;;;:::i;:::-;;:::i;26449:45::-;;;;;;;;;;;;;;;;25521:201;;;;;;;;;;-1:-1:-1;25521:201:0;;;;;:::i;:::-;;:::i;30185:261::-;;;;;;;;;;-1:-1:-1;30185:261:0;;;;;:::i;:::-;;:::i;12427:100::-;12481:13;12514:5;12507:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12427:100;:::o;14787:201::-;14870:4;10180:10;14926:32;10180:10;14942:7;14951:6;14926:8;:32::i;:::-;14976:4;14969:11;;;14787:201;;;;;:::o;29145:197::-;24508:13;:11;:13::i;:::-;29220:6:::1;:12:::0;;;29243:7:::1;:14:::0;;;29297:2:::1;29277:16;29253:4:::0;29229:3;29277:16:::1;:::i;:::-;:22;;29268:66;;;::::0;-1:-1:-1;;;29268:66:0;;5031:2:1;29268:66:0::1;::::0;::::1;5013:21:1::0;5070:2;5050:18;;;5043:30;5109:32;5089:18;;;5082:60;5159:18;;29268:66:0::1;;;;;;;;;29145:197:::0;;:::o;28704:236::-;24508:13;:11;:13::i;:::-;28829:3:::1;28813:13;13644:12:::0;;;13556:108;28813:13:::1;:19;;;;:::i;:::-;28793:16;:39;;28785:103;;;::::0;-1:-1:-1;;;28785:103:0;;5612:2:1;28785:103:0::1;::::0;::::1;5594:21:1::0;5651:2;5631:18;;;5624:30;5690:34;5670:18;;;5663:62;-1:-1:-1;;;5741:18:1;;;5734:49;5800:19;;28785:103:0::1;5410:415:1::0;28785:103:0::1;28899:14;:33:::0;28704:236::o;15568:261::-;15665:4;10180:10;15723:38;15739:4;10180:10;15754:6;15723:15;:38::i;:::-;15772:27;15782:4;15788:2;15792:6;15772:9;:27::i;:::-;-1:-1:-1;15817:4:0;;15568:261;-1:-1:-1;;;;15568:261:0:o;33866:273::-;33935:15;;-1:-1:-1;;;;;33935:15:0;33921:10;:29;;:56;;-1:-1:-1;33968:9:0;;-1:-1:-1;;;;;33968:9:0;33954:10;:23;33921:56;33912:66;;;;;;34042:45;;34006:10;;33989:14;;34006:10;;34061:21;;33989:14;34042:45;33989:14;34042:45;34061:21;34006:10;34042:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34027:60;;;34106:4;34098:33;;;;-1:-1:-1;;;34098:33:0;;6242:2:1;34098:33:0;;;6224:21:1;6281:2;6261:18;;;6254:30;-1:-1:-1;;;6300:18:1;;;6293:46;6356:18;;34098:33:0;6040:340:1;16238:238:0;16326:4;10180:10;16382:64;10180:10;16398:7;16435:10;16407:25;10180:10;16398:7;16407:9;:25::i;:::-;:38;;;;:::i;:::-;16382:8;:64::i;28073:114::-;24508:13;:11;:13::i;:::-;-1:-1:-1;;;;;28151:20:0;;;::::1;;::::0;;;:11:::1;:20;::::0;;;;:28;;-1:-1:-1;;28151:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28073:114::o;25263:103::-;24508:13;:11;:13::i;:::-;25328:30:::1;25355:1;25328:18;:30::i;:::-;25263:103::o:0;34278:196::-;34378:15;;-1:-1:-1;;;;;34378:15:0;34364:10;:29;;:56;;-1:-1:-1;34411:9:0;;-1:-1:-1;;;;;34411:9:0;34397:10;:23;34364:56;34356:65;;;;;;34432:34;;-1:-1:-1;;;34432:34:0;;34447:10;34432:34;;;6559:51:1;6626:18;;;6619:34;;;-1:-1:-1;;;;;34432:14:0;;;;;6532:18:1;;34432:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34278:196;;:::o;29431:215::-;24508:13;:11;:13::i;:::-;29494:14:::1;::::0;::::1;;29493:15;29485:52;;;::::0;-1:-1:-1;;;29485:52:0;;7116:2:1;29485:52:0::1;::::0;::::1;7098:21:1::0;7155:2;7135:18;;;7128:30;7194:26;7174:18;;;7167:54;7238:18;;29485:52:0::1;6914:348:1::0;29485:52:0::1;29548:14;:21:::0;;-1:-1:-1;;29580:18:0;;;;;29626:12:::1;29609:14;:29:::0;29431:215::o;12646:104::-;12702:13;12735:7;12728:14;;;;;:::i;34607:220::-;24508:13;:11;:13::i;:::-;34707::::1;34717:3:::0;34707:9;:13:::1;:::i;:::-;34724:3;34707:20;34698:59;;;::::0;-1:-1:-1;;;34698:59:0;;7469:2:1;34698:59:0::1;::::0;::::1;7451:21:1::0;7508:2;7488:18;;;7481:30;7547:27;7527:18;;;7520:55;7592:18;;34698:59:0::1;7267:349:1::0;34698:59:0::1;34768:14;:26:::0;;;;34805:8:::1;:14:::0;34607:220::o;16979:436::-;17072:4;10180:10;17072:4;17155:25;10180:10;17172:7;17155:9;:25::i;:::-;17128:52;;17219:15;17199:16;:35;;17191:85;;;;-1:-1:-1;;;17191:85:0;;7823:2:1;17191:85:0;;;7805:21:1;7862:2;7842:18;;;7835:30;7901:34;7881:18;;;7874:62;-1:-1:-1;;;7952:18:1;;;7945:35;7997:19;;17191:85:0;7621:401:1;17191:85:0;17312:60;17321:5;17328:7;17356:15;17337:16;:34;17312:8;:60::i;14060:193::-;14139:4;10180:10;14195:28;10180:10;14212:2;14216:6;14195:9;:28::i;29835:211::-;24508:13;:11;:13::i;:::-;29945::::1;::::0;-1:-1:-1;;;;;29945:13:0;;::::1;29934:24:::0;;::::1;::::0;29925:60:::1;;;::::0;-1:-1:-1;;;29925:60:0;;8229:2:1;29925:60:0::1;::::0;::::1;8211:21:1::0;8268:2;8248:18;;;8241:30;-1:-1:-1;;;8287:18:1;;;8280:52;8349:18;;29925:60:0::1;8027:346:1::0;29925:60:0::1;-1:-1:-1::0;;;;;29996:34:0;;;::::1;;::::0;;;:25:::1;:34;::::0;;;;:42;;-1:-1:-1;;29996:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;29835:211::o;28287:227::-;24508:13;:11;:13::i;:::-;28401:6:::1;28387:13;13644:12:::0;;;13556:108;28387:13:::1;:20;;;;:::i;:::-;28374:9;:33;;28365:99;;;::::0;-1:-1:-1;;;28365:99:0;;8580:2:1;28365:99:0::1;::::0;::::1;8562:21:1::0;8619:2;8599:18;;;8592:30;8658:34;8638:18;;;8631:62;-1:-1:-1;;;8709:18:1;;;8702:50;8769:19;;28365:99:0::1;8378:416:1::0;28365:99:0::1;28476:18;:30:::0;28287:227::o;14316:151::-;-1:-1:-1;;;;;14432:18:0;;;14405:7;14432:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14316:151::o;25521:201::-;24508:13;:11;:13::i;:::-;-1:-1:-1;;;;;25610:22:0;::::1;25602:73;;;::::0;-1:-1:-1;;;25602:73:0;;9001:2:1;25602:73:0::1;::::0;::::1;8983:21:1::0;9040:2;9020:18;;;9013:30;9079:34;9059:18;;;9052:62;-1:-1:-1;;;9130:18:1;;;9123:36;9176:19;;25602:73:0::1;8799:402:1::0;25602:73:0::1;25686:28;25705:8;25686:18;:28::i;:::-;25521:201:::0;:::o;30185:261::-;24508:13;:11;:13::i;:::-;-1:-1:-1;;;;;30297:24:0;::::1;::::0;;::::1;::::0;:46:::1;;-1:-1:-1::0;;;;;;30325:18:0;::::1;::::0;::::1;30297:46;30288:84;;;::::0;-1:-1:-1;;;30288:84:0;;9408:2:1;30288:84:0::1;::::0;::::1;9390:21:1::0;9447:2;9427:18;;;9420:30;9486:26;9466:18;;;9459:54;9530:18;;30288:84:0::1;9206:348:1::0;30288:84:0::1;30383:15;:28:::0;;-1:-1:-1;;;;;30383:28:0;;::::1;-1:-1:-1::0;;;;;;30383:28:0;;::::1;;::::0;;;30422:9:::1;:16:::0;;;;;::::1;::::0;::::1;;::::0;;30185:261::o;20972:346::-;-1:-1:-1;;;;;21074:19:0;;21066:68;;;;-1:-1:-1;;;21066:68:0;;9761:2:1;21066:68:0;;;9743:21:1;9800:2;9780:18;;;9773:30;9839:34;9819:18;;;9812:62;-1:-1:-1;;;9890:18:1;;;9883:34;9934:19;;21066:68:0;9559:400:1;21066:68:0;-1:-1:-1;;;;;21153:21:0;;21145:68;;;;-1:-1:-1;;;21145:68:0;;10166:2:1;21145:68:0;;;10148:21:1;10205:2;10185:18;;;10178:30;10244:34;10224:18;;;10217:62;-1:-1:-1;;;10295:18:1;;;10288:32;10337:19;;21145:68:0;9964:398:1;21145:68:0;-1:-1:-1;;;;;21226:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;21278:32;;713:25:1;;;21278:32:0;;686:18:1;21278:32:0;;;;;;;20972:346;;;:::o;24787:132::-;24695:6;;-1:-1:-1;;;;;24695:6:0;10180:10;24851:23;24843:68;;;;-1:-1:-1;;;24843:68:0;;10569:2:1;24843:68:0;;;10551:21:1;;;10588:18;;;10581:30;10647:34;10627:18;;;10620:62;10699:18;;24843:68:0;10367:356:1;21609:419:0;21710:24;21737:25;21747:5;21754:7;21737:9;:25::i;:::-;21710:52;;-1:-1:-1;;21777:16:0;:37;21773:248;;21859:6;21839:16;:26;;21831:68;;;;-1:-1:-1;;;21831:68:0;;10930:2:1;21831:68:0;;;10912:21:1;10969:2;10949:18;;;10942:30;11008:31;10988:18;;;10981:59;11057:18;;21831:68:0;10728:353:1;21831:68:0;21943:51;21952:5;21959:7;21987:6;21968:16;:25;21943:8;:51::i;:::-;21699:329;21609:419;;;:::o;30495:2685::-;-1:-1:-1;;;;;30592:18:0;;30584:68;;;;-1:-1:-1;;;30584:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30671:16:0;;30663:64;;;;-1:-1:-1;;;30663:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30747:15:0;;;;;;:11;:15;;;;;;;;30746:16;:38;;;;-1:-1:-1;;;;;;30767:17:0;;;;;;:11;:17;;;;;;;;30766:18;30746:38;30738:62;;;;-1:-1:-1;;;30738:62:0;;12098:2:1;30738:62:0;;;12080:21:1;12137:2;12117:18;;;12110:30;-1:-1:-1;;;12156:18:1;;;12149:41;12207:18;;30738:62:0;11896:335:1;30738:62:0;30819:14;;;;;:40;;-1:-1:-1;;;;;;30837:22:0;;;;;;:16;:22;;;;;;;;30819:40;:64;;;-1:-1:-1;;;;;;30863:20:0;;;;;;:16;:20;;;;;;;;30819:64;30811:101;;;;-1:-1:-1;;;30811:101:0;;12438:2:1;30811:101:0;;;12420:21:1;12477:2;12457:18;;;12450:30;12516:26;12496:18;;;12489:54;12560:18;;30811:101:0;12236:348:1;30811:101:0;30936:6;30946:1;30936:11;30932:93;;30964:28;30980:4;30986:2;30990:1;30964:15;:28::i;30932:93::-;31080:4;31031:28;13828:18;;;;;;;;;;;31138;;31114:42;;;;;;;31173:33;;-1:-1:-1;31198:8:0;;;;;;;31197:9;31173:33;:79;;;;-1:-1:-1;;;;;;31223:29:0;;;;;;:25;:29;;;;;;;;31173:79;:107;;;;-1:-1:-1;31269:11:0;;;;;;;31173:107;31169:707;;;31307:8;:15;;-1:-1:-1;;31307:15:0;;;;;31355:36;31370:20;31355:14;:36::i;:::-;31501:14;;31427:21;;31406:18;;31519:3;;31488:27;;31427:21;31488:27;:::i;:::-;31487:35;;;;:::i;:::-;31463:59;;31537:15;31581:3;31569:8;;31556:10;:21;;;;:::i;:::-;31555:29;;;;:::i;:::-;31611:15;;:46;;31537:47;;-1:-1:-1;31600:6:0;;-1:-1:-1;;;;;31611:15:0;;;;31639:13;;31600:6;31611:46;31600:6;31611:46;31639:13;31611:15;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31599:58;;;31681:1;31672:45;;;;-1:-1:-1;;;31672:45:0;;12964:2:1;31672:45:0;;;12946:21:1;13003:2;12983:18;;;12976:30;13042:32;13022:18;;;13015:60;13092:18;;31672:45:0;12762:354:1;31672:45:0;31744:9;;:34;;31733:6;;-1:-1:-1;;;;;31744:9:0;;31766:7;;31733:6;31744:34;31733:6;31744:34;31766:7;31744:9;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31732:46;;;31801:1;31793:38;;;;-1:-1:-1;;;31793:38:0;;13323:2:1;31793:38:0;;;13305:21:1;13362:2;13342:18;;;13335:30;13401:26;13381:18;;;13374:54;13445:18;;31793:38:0;13121:348:1;31793:38:0;-1:-1:-1;;31848:8:0;:16;;-1:-1:-1;;31848:16:0;;;-1:-1:-1;;;31169:707:0;31905:8;;-1:-1:-1;;;;;32016:22:0;;31889:12;32016:22;;;:16;:22;;;;;;31905:8;;;;;;;31904:9;;32016:22;;:46;;-1:-1:-1;;;;;;32042:20:0;;;;;;:16;:20;;;;;;;;32016:46;32012:94;;;-1:-1:-1;32089:5:0;32012:94;32118:16;32146:7;;32137:6;;:16;;;;:::i;:::-;32118:35;;32163:12;32269:7;:23;;;;;32291:1;32280:8;:12;32269:23;32265:862;;;-1:-1:-1;;;;;32327:29:0;;;;;;:25;:29;;;;;;;;32323:147;;32411:14;;32401:6;32385:13;32395:2;-1:-1:-1;;;;;13828:18:0;13801:7;13828:18;;;;;;;;;;;;13727:127;32385:13;:22;;;;:::i;:::-;:40;;32376:78;;;;-1:-1:-1;;;32376:78:0;;13676:2:1;32376:78:0;;;13658:21:1;13715:2;13695:18;;;13688:30;13754:26;13734:18;;;13727:54;13798:18;;32376:78:0;13474:348:1;32376:78:0;-1:-1:-1;;;;;32513:29:0;;;;;;:25;:29;;;;;;;;32509:118;;;32591:3;32580:7;;32571:6;:16;;;;:::i;:::-;32570:24;;;;:::i;:::-;32563:31;;32509:118;-1:-1:-1;;;;;32683:31:0;;;;;;:25;:31;;;;;;;;32679:289;;;32762:3;32752:6;;32743;:15;;;;:::i;:::-;32742:23;;;;:::i;:::-;32735:30;;32852:14;;32869:1;32852:18;;;;:::i;:::-;32836:12;:34;32833:103;;-1:-1:-1;;;;;32894:15:0;;;;;;:11;:15;;;;;:22;;-1:-1:-1;;32894:22:0;32912:4;32894:22;;;32833:103;32989:8;;32985:91;;33018:42;33034:4;33048;33055;33018:15;:42::i;:::-;33102:13;33111:4;33102:6;:13;:::i;:::-;33093:22;;32265:862;33139:33;33155:4;33161:2;33165:6;33139:15;:33::i;:::-;30573:2607;;;;;30495:2685;;;:::o;25882:191::-;25975:6;;;-1:-1:-1;;;;;25992:17:0;;;-1:-1:-1;;;;;;25992:17:0;;;;;;;26025:40;;25975:6;;;25992:17;25975:6;;26025:40;;25956:16;;26025:40;25945:128;25882:191;:::o;17885:806::-;-1:-1:-1;;;;;17982:18:0;;17974:68;;;;-1:-1:-1;;;17974:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18061:16:0;;18053:64;;;;-1:-1:-1;;;18053:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18203:15:0;;18181:19;18203:15;;;;;;;;;;;18237:21;;;;18229:72;;;;-1:-1:-1;;;18229:72:0;;14162:2:1;18229:72:0;;;14144:21:1;14201:2;14181:18;;;14174:30;14240:34;14220:18;;;14213:62;-1:-1:-1;;;14291:18:1;;;14284:36;14337:19;;18229:72:0;13960:402:1;18229:72:0;-1:-1:-1;;;;;18337:15:0;;;:9;:15;;;;;;;;;;;18355:20;;;18337:38;;18555:13;;;;;;;;;;:23;;;;;;18607:26;;713:25:1;;;18555:13:0;;18607:26;;686:18:1;18607:26:0;;;;;;;18646:37;34278:196;33246:515;33338:16;;;33352:1;33338:16;;;;;;;;33314:21;;33338:16;;;;;;;;;;-1:-1:-1;33338:16:0;33314:40;;33383:4;33365;33370:1;33365:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33365:23:0;;;:7;;;;;;;;;;:23;;;;33409:6;;:13;;;-1:-1:-1;;;33409:13:0;;;;:6;;;;;:11;;:13;;;;;33365:7;;33409:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33399:4;33404:1;33399:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33399:23:0;;;:7;;;;;;;;;:23;33469:6;;33480;;33436:41;;33454:4;;33469:6;33436:9;:41::i;:::-;:50;33433:130;;;33530:6;;33498:53;;33515:4;;-1:-1:-1;;;;;33530:6:0;-1:-1:-1;;33498:8:0;:53::i;:::-;33572:6;;:171;;-1:-1:-1;;;33572:171:0;;-1:-1:-1;;;;;33572:6:0;;;;:57;;:171;;33643:6;;33572;;33680:4;;33707;;33727:15;;33572:171;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33294:467;33246:515;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:315;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1397:248::-;1465:6;1473;1526:2;1514:9;1505:7;1501:23;1497:32;1494:52;;;1542:1;1539;1532:12;1494:52;-1:-1:-1;;1565:23:1;;;1635:2;1620:18;;;1607:32;;-1:-1:-1;1397:248:1:o;1650:180::-;1709:6;1762:2;1750:9;1741:7;1737:23;1733:32;1730:52;;;1778:1;1775;1768:12;1730:52;-1:-1:-1;1801:23:1;;1650:180;-1:-1:-1;1650:180:1:o;1835:456::-;1912:6;1920;1928;1981:2;1969:9;1960:7;1956:23;1952:32;1949:52;;;1997:1;1994;1987:12;1949:52;2036:9;2023:23;2055:31;2080:5;2055:31;:::i;:::-;2105:5;-1:-1:-1;2162:2:1;2147:18;;2134:32;2175:33;2134:32;2175:33;:::i;:::-;1835:456;;2227:7;;-1:-1:-1;;;2281:2:1;2266:18;;;;2253:32;;1835:456::o;2485:118::-;2571:5;2564:13;2557:21;2550:5;2547:32;2537:60;;2593:1;2590;2583:12;2608:382;2673:6;2681;2734:2;2722:9;2713:7;2709:23;2705:32;2702:52;;;2750:1;2747;2740:12;2702:52;2789:9;2776:23;2808:31;2833:5;2808:31;:::i;:::-;2858:5;-1:-1:-1;2915:2:1;2900:18;;2887:32;2928:30;2887:32;2928:30;:::i;:::-;2977:7;2967:17;;;2608:382;;;;;:::o;3203:247::-;3262:6;3315:2;3303:9;3294:7;3290:23;3286:32;3283:52;;;3331:1;3328;3321:12;3283:52;3370:9;3357:23;3389:31;3414:5;3389:31;:::i;:::-;3439:5;3203:247;-1:-1:-1;;;3203:247:1:o;3789:388::-;3857:6;3865;3918:2;3906:9;3897:7;3893:23;3889:32;3886:52;;;3934:1;3931;3924:12;3886:52;3973:9;3960:23;3992:31;4017:5;3992:31;:::i;:::-;4042:5;-1:-1:-1;4099:2:1;4084:18;;4071:32;4112:33;4071:32;4112:33;:::i;4182:380::-;4261:1;4257:12;;;;4304;;;4325:61;;4379:4;4371:6;4367:17;4357:27;;4325:61;4432:2;4424:6;4421:14;4401:18;4398:38;4395:161;;4478:10;4473:3;4469:20;4466:1;4459:31;4513:4;4510:1;4503:15;4541:4;4538:1;4531:15;4395:161;;4182:380;;;:::o;4567:127::-;4628:10;4623:3;4619:20;4616:1;4609:31;4659:4;4656:1;4649:15;4683:4;4680:1;4673:15;4699:125;4764:9;;;4785:10;;;4782:36;;;4798:18;;:::i;5188:217::-;5228:1;5254;5244:132;;5298:10;5293:3;5289:20;5286:1;5279:31;5333:4;5330:1;5323:15;5361:4;5358:1;5351:15;5244:132;-1:-1:-1;5390:9:1;;5188:217::o;6664:245::-;6731:6;6784:2;6772:9;6763:7;6759:23;6755:32;6752:52;;;6800:1;6797;6790:12;6752:52;6832:9;6826:16;6851:28;6873:5;6851:28;:::i;11086:401::-;11288:2;11270:21;;;11327:2;11307:18;;;11300:30;11366:34;11361:2;11346:18;;11339:62;-1:-1:-1;;;11432:2:1;11417:18;;11410:35;11477:3;11462:19;;11086:401::o;11492:399::-;11694:2;11676:21;;;11733:2;11713:18;;;11706:30;11772:34;11767:2;11752:18;;11745:62;-1:-1:-1;;;11838:2:1;11823:18;;11816:33;11881:3;11866:19;;11492:399::o;12589:168::-;12662:9;;;12693;;12710:15;;;12704:22;;12690:37;12680:71;;12731:18;;:::i;13827:128::-;13894:9;;;13915:11;;;13912:37;;;13929:18;;:::i;14499:127::-;14560:10;14555:3;14551:20;14548:1;14541:31;14591:4;14588:1;14581:15;14615:4;14612:1;14605:15;14631:251;14701:6;14754:2;14742:9;14733:7;14729:23;14725:32;14722:52;;;14770:1;14767;14760:12;14722:52;14802:9;14796:16;14821:31;14846:5;14821:31;:::i;14887:980::-;15149:4;15197:3;15186:9;15182:19;15228:6;15217:9;15210:25;15254:2;15292:6;15287:2;15276:9;15272:18;15265:34;15335:3;15330:2;15319:9;15315:18;15308:31;15359:6;15394;15388:13;15425:6;15417;15410:22;15463:3;15452:9;15448:19;15441:26;;15502:2;15494:6;15490:15;15476:29;;15523:1;15533:195;15547:6;15544:1;15541:13;15533:195;;;15612:13;;-1:-1:-1;;;;;15608:39:1;15596:52;;15703:15;;;;15668:12;;;;15644:1;15562:9;15533:195;;;-1:-1:-1;;;;;;;15784:32:1;;;;15779:2;15764:18;;15757:60;-1:-1:-1;;;15848:3:1;15833:19;15826:35;15745:3;14887:980;-1:-1:-1;;;14887:980:1:o

Swarm Source

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