ETH Price: $2,977.70 (-1.02%)
Gas: 2 Gwei

Token

Baby Grok (GROKBABY)
 

Overview

Max Total Supply

1,000,000,000 GROKBABY

Holders

100

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
107,566.086474465388799297 GROKBABY

Value
$0.00
0x6548f790ad5ad77e04be18778eeff0425d732d67
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:
GROKBABY

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-11-14
*/

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;

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

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

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

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

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

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

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

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

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

}

/**
 * @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.
 */
 //Modieified public to external as called out from Audit.
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 anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() external 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) external 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);
    }
}

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

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

    function name() external pure returns (string memory);

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function burn(
        address to
    ) external returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);

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

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(
        uint256 amountIn,
        address[] calldata path
    ) external view returns (uint256[] memory amounts);

    function getAmountsIn(
        uint256 amountOut,
        address[] calldata path
    ) external view returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

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

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

contract GROKBABY is Context, IERC20, Ownable {
    using Address for address;
    //Contract Update Information
    //Cleaned old Code duplicates due to audit recommendations.
    string public constant contractVersion = "3.3";
    string public constant contractDev = "CFG";
    string public constant contractEdition = "SAFU";
    //Definition of Wallets for Marketing or team.
    address payable public marketingWallet =
        payable(0x1897fdF067c29C60c2b5fbfe8e8bc4e328630a9F);

    //Dead Wallet for SAFU Contract
    address public constant deadWallet = address(0xdEaD);
    //Mapping section for better tracking.
    mapping(address => uint256) private _tOwned;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _noFeeWallet;


    event ExcludeStatus(address,bool);
    event UpdateMarketingWallet(address);
    event UpdateTokensToSwap(uint256);
    event UpdateBuyFee(uint256);
    event UpdateSellFee(uint256);
    event TransferStatus(bool);
    event UpdateDistribution(uint256,uint256);
    event RecoveredETH(uint256);
    event RecoveredTokens(uint256);
    event TradingStarted(bool);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event SwapTokensForETH(uint256 amountIn, address[] path);
    //Supply Definition.
    uint256 private _tTotal = 1_000_000_000 ether;
    uint256 private _tFeeTotal;
    //Token Definition.
    string public constant name = "Baby Grok";
    string public constant symbol = "GROKBABY";
    uint8 public constant decimals = 18;
    //Taxes Definition.
    uint public buyFee = 1;

    uint256 public sellFee = 1;

    uint256 public marketingTokensCollected = 0;

    uint256 public minimumTokensBeforeSwap = 100_000 ether;

    //Trading Controls added for SAFU Requirements
    bool public tradingEnabled;
    //Router and Pair Configuration.
    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address private immutable WETH;
    //Tracking of Automatic Swap vs Manual Swap.
    bool public inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor() {
        _tOwned[_msgSender()] = _tTotal;
        address currentRouter;
        //Adding Variables for all the routers for easier deployment for our customers.
        if (block.chainid == 56) {
            currentRouter = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // PCS Router
            _noFeeWallet[0x407993575c91ce7643a4d4cCACc9A98c36eE1BBE] = true;//PinkSale Lock
        } else if (block.chainid == 97) {
            currentRouter = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1; // PCS Testnet
            _noFeeWallet[0x5E5b9bE5fd939c578ABE5800a90C566eeEbA44a5] = true;//PinkSale Lock
        } else if (block.chainid == 43114) {
            currentRouter = 0x60aE616a2155Ee3d9A68541Ba4544862310933d4; //Avax Mainnet
        } else if (block.chainid == 137) {
            currentRouter = 0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff; //Polygon Ropsten
        } else if (block.chainid == 6066) {
            currentRouter = 0x4169Db906fcBFB8b12DbD20d98850Aee05B7D889; //Tres Leches Chain
        } else if (block.chainid == 250) {
            currentRouter = 0xF491e7B69E4244ad4002BC14e878a34207E38c29; //SpookySwap FTM
        } else if (block.chainid == 42161) {
            currentRouter = 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506; //Arbitrum Sushi
            _noFeeWallet[0xeBb415084Ce323338CFD3174162964CC23753dFD] = true;//PinkSale Lock
        } else if (block.chainid == 1 || block.chainid == 5) {
            currentRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; //Mainnet
            _noFeeWallet[0x71B5759d73262FBb223956913ecF4ecC51057641] = true;//PinkSale Lock
        } else {
            revert("You're not Blade");
        }

        //End of Router Variables.
        //Create Pair in the contructor, this may fail on some blockchains and can be done in a separate line if needed.
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(currentRouter);
        WETH = _uniswapV2Router.WETH();
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), WETH);
        uniswapV2Router = _uniswapV2Router;
        _noFeeWallet[owner()] = true;
        _noFeeWallet[address(this)] = true;

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    //Readable Functions.
    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }


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

    //ERC 20 Standard Transfer Functions
    function transfer(
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    //ERC 20 Standard Allowance Function
    //updated _owner to owner_ as requested by audit.
    function allowance(
        address owner_,
        address spender
    ) external  view override returns (uint256) {
        return _allowances[owner_][spender];
    }

    //ERC 20 Standard Approve Function
    function approve(
        address spender,
        uint256 amount
    ) external  override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    //ERC 20 Standard Transfer From
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        uint currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "ERC20: transfer amount exceeds allowance"
        );
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), currentAllowance - amount);
        return true;
    }

    //ERC 20 Standard increase Allowance
    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) external virtual returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] + addedValue
        );
        return true;
    }

    //ERC 20 Standard decrease Allowance
    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) external virtual returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] - subtractedValue
        );
        return true;
    }

    //Approve Function
    function _approve(address _owner, address spender, uint256 amount) private {
        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);
    }

    //Transfer function, validate correct wallet structure, take fees, and other custom taxes are done during the transfer.
    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(
            _tOwned[from] >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        require(tradingEnabled || _noFeeWallet[from] || _noFeeWallet[to], "Trading not yet enabled!");

        //Adding logic for automatic swap.
        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >=
            minimumTokensBeforeSwap;
        uint fee = 0;
        //if any account belongs to _noFeeWallet account then remove the fee
        if (
            !inSwapAndLiquify &&
            from != uniswapV2Pair &&
            overMinimumTokenBalance &&
            swapAndLiquifyEnabled
        ) {
            swapAndLiquify();
        }
        if (to == uniswapV2Pair && !_noFeeWallet[from]) {
            fee = (sellFee * amount) / 100;
        }
        if (from == uniswapV2Pair && !_noFeeWallet[to]) {
            fee = (buyFee * amount) / 100;
        }
        amount -= fee;
        if (fee > 0) {
            _tokenTransfer(from, address(this), fee);
            marketingTokensCollected += fee;
        }
        _tokenTransfer(from, to, amount);
    }

    //Swap Tokens for BNB or to add liquidity either automatically or manual, by default this is set to manual.
    //Corrected newBalance bug, it sending bnb to wallet and any remaining is on contract and can be recoverred.
    function swapAndLiquify() private lockTheSwap {
        uint256 totalTokens = balanceOf(address(this));
        swapTokensForEth(totalTokens);
        uint ethBalance = address(this).balance;

        transferToAddressETH(marketingWallet, ethBalance);

        marketingTokensCollected = 0;
    }

    //swap for eth is to support the converstion of tokens to weth during swapandliquify this is a supporting function
    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

        emit SwapTokensForETH(tokenAmount, path);
    }

    //ERC 20 standard transfer, only added if taking fees to countup the amount of fees for better tracking and split purpose.
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        _tOwned[sender] -= amount;
        _tOwned[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function isExcludedFromFee(address account) external view returns (bool) {
        return _noFeeWallet[account];
    }

    //exclude wallets from fees, this is needed for launch or other contracts.
    //changed _isExcludedFromFee to NoFeeWallet, attempting to adddress Whiteliste Detection Issue.
    function setNoFeeWallets(address account, bool status) external onlyOwner {
        require(_noFeeWallet[account] != status, "The wallet already have that status.");
        _noFeeWallet[account] = status;
        emit ExcludeStatus(account,status);
				   
		  
    }
    //Automatic Swap Configuration.
    function setTokensToSwap(
        uint256 _minimumTokensBeforeSwap
    ) external onlyOwner {
        require(
            _minimumTokensBeforeSwap >= 100 ether,
            "You need to enter more than 100 tokens."
        );
        minimumTokensBeforeSwap = _minimumTokensBeforeSwap;
        emit UpdateTokensToSwap(_minimumTokensBeforeSwap);
    }

    function setSwapAndLiquifyEnabled(bool _enabled) external onlyOwner {
        require(swapAndLiquifyEnabled != _enabled, "Value already set");
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    //set a new marketing wallet.
    function setMarketingWallet(address _marketingWallet) external onlyOwner {
        require(_marketingWallet != address(0), "setmarketingWallet: ZERO");
        marketingWallet = payable(_marketingWallet);
        emit UpdateMarketingWallet(_marketingWallet);
    }

    function setBuyFee(uint256 _buyFee) external onlyOwner {
        require(_buyFee <= 10, "Buy Fee cannot be more than 10%");
        buyFee = _buyFee;
        emit UpdateBuyFee(_buyFee);
    }

    function setSellFee(uint256 _sellFee) external onlyOwner {
        require(_sellFee <= 10, "Sell Fee cannot be more than 10%");
        sellFee = _sellFee;
        emit UpdateSellFee(_sellFee);
    }

    function transferToAddressETH(
        address payable recipient,
        uint256 amount
    ) private {
        (bool succ, ) = recipient.call{value: amount}("");
        require(succ, "Transfer failed.");
    }

    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

    /////---fallback--////
    //This cannot be removed as is a fallback to the swapAndLiquify
    event SwapETHForTokens(uint256 amountIn, address[] path);

    function swapETHForTokens(uint256 amount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = address(this);
        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: amount
        }(
            0, // accept any amount of Tokens
            path,
            deadWallet, // Burn address
            block.timestamp + 300
        );
        emit SwapETHForTokens(amount, path);
    }

    // Withdraw ETH that's potentially stuck in the Contract
    function recoverETHfromContract() external onlyOwner {
        uint ethBalance = address(this).balance;
        (bool succ, ) = payable(marketingWallet).call{value: ethBalance}("");
        require(succ, "Transfer failed");
        emit TransferStatus(succ);
        emit RecoveredETH(ethBalance);
    }

    // Withdraw ERC20 tokens that are potentially stuck in Contract
    function recoverTokensFromContract(
        address _tokenAddress,
        uint256 _amount
    ) external onlyOwner {
        require(
            _tokenAddress != address(this),
            "Owner can't claim contract's balance of its own tokens"
        );
        bool succ = IERC20(_tokenAddress).transfer(marketingWallet, _amount);
        require(succ, "Transfer failed");
        emit TransferStatus(succ);
        emit RecoveredTokens(_amount);
    }
        //Trading Controls for SAFU Contract
        function enableTrading() external onlyOwner{
        require(!tradingEnabled, "Trading already enabled.");
        tradingEnabled = true;
        swapAndLiquifyEnabled = true;
        emit TradingStarted(true);
        emit SwapAndLiquifyEnabledUpdated(true);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"bool","name":"","type":"bool"}],"name":"ExcludeStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"RecoveredETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"RecoveredTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"","type":"bool"}],"name":"TradingStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"","type":"bool"}],"name":"TransferStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"UpdateBuyFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"UpdateDistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"UpdateMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"UpdateSellFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"UpdateTokensToSwap","type":"event"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractDev","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractEdition","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inSwapAndLiquify","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":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingTokensCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","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":"recoverETHfromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverTokensFromContract","outputs":[],"stateMutability":"nonpayable","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":"_buyFee","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setNoFeeWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellFee","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumTokensBeforeSwap","type":"uint256"}],"name":"setTokensToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e0604052600180546001600160a01b031916731897fdf067c29c60c2b5fbfe8e8bc4e328630a9f1781556b033b2e3c9fd0803ce80000006005556007819055600855600060095569152d02c7e14af6800000600a55600b805462ff0000191690553480156200006e57600080fd5b506200007a3362000557565b6005543360009081526002602052604081209190915546603803620000fe575073407993575c91ce7643a4d4ccacc9a98c36ee1bbe60005260046020527f08c4af94d8202ba5e54a3e903f85ac9d5fea893273242d4351861b8bbd750f5e805460ff191660011790557310ed43c718714eb63d5aa57b78b54704e256024e6200032b565b466061036200016c5750735e5b9be5fd939c578abe5800a90c566eeeba44a560005260046020527f65bf78b4da50a390256c55a501ce5996ea5884d4bc60c7ccdb6040afecc732a9805460ff1916600117905573d99d1c33f9fc3444f8101754abc46c52416550d16200032b565b4661a86a036200019257507360ae616a2155ee3d9a68541ba4544862310933d46200032b565b46608903620001b7575073a5e0829caced8ffdd4de3c43696c57f7d7a678ff6200032b565b466117b203620001dd5750734169db906fcbfb8b12dbd20d98850aee05b7d8896200032b565b4660fa0362000202575073f491e7b69e4244ad4002bc14e878a34207e38c296200032b565b4661a4b10362000271575073ebb415084ce323338cfd3174162964cc23753dfd60005260046020527f6b2598e28cbe88f18b5046672f2b9c1c422c67a4dca00ba189a6c5fa4c308222805460ff19166001179055731b02da8cb0d097eb8d57a175b88c7d8b479975066200032b565b4660011480620002815750466005145b15620002ec57507371b5759d73262fbb223956913ecf4ecc5105764160005260046020527f181b38dae107ad7a36f51e654ef972d6c41d165bcb40c2dfb49fb5e641e8f466805460ff19166001179055737a250d5630b4cf539739df2c5dacb4c659f2488d6200032b565b60405162461bcd60e51b815260206004820152601060248201526f596f75277265206e6f7420426c61646560801b604482015260640160405180910390fd5b6000819050806001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200036f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003959190620005a7565b6001600160a01b031660c0816001600160a01b031681525050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004139190620005a7565b60c0516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801562000465573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200048b9190620005a7565b6001600160a01b0390811660a0528116608052600160046000620004b76000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526004909252902080549091166001179055620004ff3390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6005546040516200054791815260200190565b60405180910390a35050620005d9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215620005ba57600080fd5b81516001600160a01b0381168114620005d257600080fd5b9392505050565b60805160a05160c051611d1f6200062c6000396000611830015260008181610451015281816114f30152818161155401526115d00152600081816102e40152818161188801526118c40152611d1f6000f3fe6080604052600436106102295760003560e01c806370a0823111610123578063a0a8e460116100ab578063d2d7ad831161006f578063d2d7ad83146106f7578063dd62ed3e1461070d578063e3e715b414610753578063e6be4a7214610773578063f2fde38b1461079357600080fd5b8063a0a8e46014610653578063a457c2d714610682578063a9059cbb146106a2578063c49b9a80146106c2578063ce831ed5146106e257600080fd5b806385141a77116100f257806385141a77146105b65780638a8c523c146105cc5780638b4cee08146105e15780638da5cb5b1461060157806395d89b411461061f57600080fd5b806370a082311461051c578063715018a61461055257806375f0a874146105675780637724bad81461058757600080fd5b8063313ce567116101b15780634a74bb02116101755780634a74bb02146104735780634ada218b146104935780635342acb4146104ad5780635d098b38146104e65780636ca60bc61461050657600080fd5b8063313ce567146103c257806339509351146103e9578063461d947614610409578063470624021461042957806349bd5a5e1461043f57600080fd5b806318160ddd116101f857806318160ddd1461031e578063220f66961461033d57806323b872dd1461035c5780632a4a7ba81461037c5780632b14ca56146103ac57600080fd5b806306fdde0314610235578063095ea7b3146102805780630cc835a3146102b05780631694505e146102d257600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5061026a60405180604001604052806009815260200168426162792047726f6b60b81b81525081565b6040516102779190611a00565b60405180910390f35b34801561028c57600080fd5b506102a061029b366004611a6a565b6107b3565b6040519015158152602001610277565b3480156102bc57600080fd5b506102d06102cb366004611a94565b6107ca565b005b3480156102de57600080fd5b506103067f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610277565b34801561032a57600080fd5b506005545b604051908152602001610277565b34801561034957600080fd5b50600b546102a090610100900460ff1681565b34801561036857600080fd5b506102a0610377366004611aad565b610864565b34801561038857600080fd5b5061026a604051806040016040528060048152602001635341465560e01b81525081565b3480156103b857600080fd5b5061032f60085481565b3480156103ce57600080fd5b506103d7601281565b60405160ff9091168152602001610277565b3480156103f557600080fd5b506102a0610404366004611a6a565b610913565b34801561041557600080fd5b506102d0610424366004611a94565b61094a565b34801561043557600080fd5b5061032f60075481565b34801561044b57600080fd5b506103067f000000000000000000000000000000000000000000000000000000000000000081565b34801561047f57600080fd5b50600b546102a09062010000900460ff1681565b34801561049f57600080fd5b50600b546102a09060ff1681565b3480156104b957600080fd5b506102a06104c8366004611ae9565b6001600160a01b031660009081526004602052604090205460ff1690565b3480156104f257600080fd5b506102d0610501366004611ae9565b6109f0565b34801561051257600080fd5b5061032f60095481565b34801561052857600080fd5b5061032f610537366004611ae9565b6001600160a01b031660009081526002602052604090205490565b34801561055e57600080fd5b506102d0610a9c565b34801561057357600080fd5b50600154610306906001600160a01b031681565b34801561059357600080fd5b5061026a6040518060400160405280600381526020016243464760e81b81525081565b3480156105c257600080fd5b5061030661dead81565b3480156105d857600080fd5b506102d0610ab0565b3480156105ed57600080fd5b506102d06105fc366004611a94565b610b86565b34801561060d57600080fd5b506000546001600160a01b0316610306565b34801561062b57600080fd5b5061026a6040518060400160405280600881526020016747524f4b4241425960c01b81525081565b34801561065f57600080fd5b5061026a60405180604001604052806003815260200162332e3360e81b81525081565b34801561068e57600080fd5b506102a061069d366004611a6a565b610c14565b3480156106ae57600080fd5b506102a06106bd366004611a6a565b610c4b565b3480156106ce57600080fd5b506102d06106dd366004611b19565b610c58565b3480156106ee57600080fd5b506102d0610d01565b34801561070357600080fd5b5061032f600a5481565b34801561071957600080fd5b5061032f610728366004611b36565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801561075f57600080fd5b506102d061076e366004611b69565b610e0f565b34801561077f57600080fd5b506102d061078e366004611a6a565b610eef565b34801561079f57600080fd5b506102d06107ae366004611ae9565b611095565b60006107c033848461110e565b5060015b92915050565b6107d2611233565b600a8111156108285760405162461bcd60e51b815260206004820152601f60248201527f427579204665652063616e6e6f74206265206d6f7265207468616e203130250060448201526064015b60405180910390fd5b60078190556040518181527fa480a3a15a511fbdc37ae77ae3f490e03ab3688adde11456ce779e6c1e0abaa2906020015b60405180910390a150565b6001600160a01b0383166000908152600360209081526040808320338452909152812054828110156108e95760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b606482015260840161081f565b6108f485858561128d565b61090885336109038685611bb6565b61110e565b506001949350505050565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916107c0918590610903908690611bc9565b610952611233565b68056bc75e2d631000008110156109bb5760405162461bcd60e51b815260206004820152602760248201527f596f75206e65656420746f20656e746572206d6f7265207468616e20313030206044820152663a37b5b2b7399760c91b606482015260840161081f565b600a8190556040518181527f17339d8f3c3323d3df3b092130f1bedb79d8e20de4d3ff176b316e89be357cbe90602001610859565b6109f8611233565b6001600160a01b038116610a4e5760405162461bcd60e51b815260206004820152601860248201527f7365746d61726b6574696e6757616c6c65743a205a45524f0000000000000000604482015260640161081f565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f090602001610859565b610aa4611233565b610aae6000611692565b565b610ab8611233565b600b5460ff1615610b0b5760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642e0000000000000000604482015260640161081f565b600b805462ff00ff191662010001179055604051600181527ff789dd0d6d54bc0d9b7a5955aac4c052f81fb39e63f533a8d4820f6e862c78a39060200160405180910390a1604051600181527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599060200160405180910390a1565b610b8e611233565b600a811115610bdf5760405162461bcd60e51b815260206004820181905260248201527f53656c6c204665652063616e6e6f74206265206d6f7265207468616e20313025604482015260640161081f565b60088190556040518181527f7d59573ec4acab62b908b5c1cde109eb12273d011506abaa850256636a42d54a90602001610859565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916107c0918590610903908690611bb6565b60006107c033848461128d565b610c60611233565b801515600b60029054906101000a900460ff16151503610cb65760405162461bcd60e51b815260206004820152601160248201527015985b1d5948185b1c9958591e481cd95d607a1b604482015260640161081f565b600b8054821515620100000262ff0000199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061085990831515815260200190565b610d09611233565b60015460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610d5a576040519150601f19603f3d011682016040523d82523d6000602084013e610d5f565b606091505b5050905080610da25760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161081f565b60405181151581527fc9946980dc929f521b40f678c5eeae1c213b0c26c005bd48d44905450951166e9060200160405180910390a16040518281527ffc3b2917f34bc4fba1516519d275441646d5088542342f58de8eea6a7cb5c2ab906020015b60405180910390a15050565b610e17611233565b6001600160a01b03821660009081526004602052604090205481151560ff909116151503610e935760405162461bcd60e51b8152602060048201526024808201527f5468652077616c6c657420616c726561647920686176652074686174207374616044820152633a3ab99760e11b606482015260840161081f565b6001600160a01b038216600081815260046020908152604091829020805460ff19168515159081179091558251938452908301527f09cdf0cfa7a040edd81ed835da9c0da414b3b1bc89788f88ba53288ce596b5fa9101610e03565b610ef7611233565b306001600160a01b03831603610f6e5760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b606482015260840161081f565b60015460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905260009184169063a9059cbb906044016020604051808303816000875af1158015610fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe79190611bdc565b9050806110285760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161081f565b60405181151581527fc9946980dc929f521b40f678c5eeae1c213b0c26c005bd48d44905450951166e9060200160405180910390a16040518281527f9717b3559fe85dc5c6941748cdc56fc5ca4e06048d7b836c700c174f78369bef9060200160405180910390a1505050565b61109d611233565b6001600160a01b0381166111025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161081f565b61110b81611692565b50565b6001600160a01b0383166111705760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161081f565b6001600160a01b0382166111d15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161081f565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000546001600160a01b03163314610aae5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161081f565b6001600160a01b0383166112f15760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161081f565b6001600160a01b0382166113535760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161081f565b600081116113b55760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161081f565b6001600160a01b03831660009081526002602052604090205481111561142c5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161081f565b600b5460ff168061145557506001600160a01b03831660009081526004602052604090205460ff165b8061147857506001600160a01b03821660009081526004602052604090205460ff165b6114c45760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c6564210000000000000000604482015260640161081f565b30600090815260026020526040812054600a54600b5491929083101591610100900460ff1615801561152857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614155b80156115315750815b80156115455750600b5462010000900460ff165b15611552576115526116e2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b03161480156115ac57506001600160a01b03861660009081526004602052604090205460ff16155b156115ce576064846008546115c19190611bf9565b6115cb9190611c10565b90505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614801561162857506001600160a01b03851660009081526004602052604090205460ff16155b1561164a5760648460075461163d9190611bf9565b6116479190611c10565b90505b6116548185611bb6565b9350801561167f57611667863083611738565b80600960008282546116799190611bc9565b90915550505b61168a868686611738565b505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600b805461ff00191661010017905530600090815260026020526040812054905061170c816117d9565b6001544790611724906001600160a01b031682611965565b50506000600955600b805461ff0019169055565b6001600160a01b03831660009081526002602052604081208054839290611760908490611bb6565b90915550506001600160a01b0382166000908152600260205260408120805483929061178d908490611bc9565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161122691815260200190565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061180e5761180e611c32565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061186257611862611c32565b60200260200101906001600160a01b031690816001600160a01b0316815250506118ad307f00000000000000000000000000000000000000000000000000000000000000008461110e565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790611902908590600090869030904290600401611c8c565b600060405180830381600087803b15801561191c57600080fd5b505af1158015611930573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051610e03929190611cc8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146119b2576040519150601f19603f3d011682016040523d82523d6000602084013e6119b7565b606091505b50509050806119fb5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015260640161081f565b505050565b600060208083528351808285015260005b81811015611a2d57858101830151858201604001528201611a11565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611a6557600080fd5b919050565b60008060408385031215611a7d57600080fd5b611a8683611a4e565b946020939093013593505050565b600060208284031215611aa657600080fd5b5035919050565b600080600060608486031215611ac257600080fd5b611acb84611a4e565b9250611ad960208501611a4e565b9150604084013590509250925092565b600060208284031215611afb57600080fd5b611b0482611a4e565b9392505050565b801515811461110b57600080fd5b600060208284031215611b2b57600080fd5b8135611b0481611b0b565b60008060408385031215611b4957600080fd5b611b5283611a4e565b9150611b6060208401611a4e565b90509250929050565b60008060408385031215611b7c57600080fd5b611b8583611a4e565b91506020830135611b9581611b0b565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107c4576107c4611ba0565b808201808211156107c4576107c4611ba0565b600060208284031215611bee57600080fd5b8151611b0481611b0b565b80820281158282048414176107c4576107c4611ba0565b600082611c2d57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015611c815781516001600160a01b031687529582019590820190600101611c5c565b509495945050505050565b85815284602082015260a060408201526000611cab60a0830186611c48565b6001600160a01b0394909416606083015250608001529392505050565b828152604060208201526000611ce16040830184611c48565b94935050505056fea26469706673582212200208844f3a97f19045421f55428dab20af9968291dd8b17fde36806ed7d6faab64736f6c63430008130033

Deployed Bytecode

0x6080604052600436106102295760003560e01c806370a0823111610123578063a0a8e460116100ab578063d2d7ad831161006f578063d2d7ad83146106f7578063dd62ed3e1461070d578063e3e715b414610753578063e6be4a7214610773578063f2fde38b1461079357600080fd5b8063a0a8e46014610653578063a457c2d714610682578063a9059cbb146106a2578063c49b9a80146106c2578063ce831ed5146106e257600080fd5b806385141a77116100f257806385141a77146105b65780638a8c523c146105cc5780638b4cee08146105e15780638da5cb5b1461060157806395d89b411461061f57600080fd5b806370a082311461051c578063715018a61461055257806375f0a874146105675780637724bad81461058757600080fd5b8063313ce567116101b15780634a74bb02116101755780634a74bb02146104735780634ada218b146104935780635342acb4146104ad5780635d098b38146104e65780636ca60bc61461050657600080fd5b8063313ce567146103c257806339509351146103e9578063461d947614610409578063470624021461042957806349bd5a5e1461043f57600080fd5b806318160ddd116101f857806318160ddd1461031e578063220f66961461033d57806323b872dd1461035c5780632a4a7ba81461037c5780632b14ca56146103ac57600080fd5b806306fdde0314610235578063095ea7b3146102805780630cc835a3146102b05780631694505e146102d257600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5061026a60405180604001604052806009815260200168426162792047726f6b60b81b81525081565b6040516102779190611a00565b60405180910390f35b34801561028c57600080fd5b506102a061029b366004611a6a565b6107b3565b6040519015158152602001610277565b3480156102bc57600080fd5b506102d06102cb366004611a94565b6107ca565b005b3480156102de57600080fd5b506103067f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610277565b34801561032a57600080fd5b506005545b604051908152602001610277565b34801561034957600080fd5b50600b546102a090610100900460ff1681565b34801561036857600080fd5b506102a0610377366004611aad565b610864565b34801561038857600080fd5b5061026a604051806040016040528060048152602001635341465560e01b81525081565b3480156103b857600080fd5b5061032f60085481565b3480156103ce57600080fd5b506103d7601281565b60405160ff9091168152602001610277565b3480156103f557600080fd5b506102a0610404366004611a6a565b610913565b34801561041557600080fd5b506102d0610424366004611a94565b61094a565b34801561043557600080fd5b5061032f60075481565b34801561044b57600080fd5b506103067f000000000000000000000000fad6d60edb79eff2e3d5572c65a9bea4911514c881565b34801561047f57600080fd5b50600b546102a09062010000900460ff1681565b34801561049f57600080fd5b50600b546102a09060ff1681565b3480156104b957600080fd5b506102a06104c8366004611ae9565b6001600160a01b031660009081526004602052604090205460ff1690565b3480156104f257600080fd5b506102d0610501366004611ae9565b6109f0565b34801561051257600080fd5b5061032f60095481565b34801561052857600080fd5b5061032f610537366004611ae9565b6001600160a01b031660009081526002602052604090205490565b34801561055e57600080fd5b506102d0610a9c565b34801561057357600080fd5b50600154610306906001600160a01b031681565b34801561059357600080fd5b5061026a6040518060400160405280600381526020016243464760e81b81525081565b3480156105c257600080fd5b5061030661dead81565b3480156105d857600080fd5b506102d0610ab0565b3480156105ed57600080fd5b506102d06105fc366004611a94565b610b86565b34801561060d57600080fd5b506000546001600160a01b0316610306565b34801561062b57600080fd5b5061026a6040518060400160405280600881526020016747524f4b4241425960c01b81525081565b34801561065f57600080fd5b5061026a60405180604001604052806003815260200162332e3360e81b81525081565b34801561068e57600080fd5b506102a061069d366004611a6a565b610c14565b3480156106ae57600080fd5b506102a06106bd366004611a6a565b610c4b565b3480156106ce57600080fd5b506102d06106dd366004611b19565b610c58565b3480156106ee57600080fd5b506102d0610d01565b34801561070357600080fd5b5061032f600a5481565b34801561071957600080fd5b5061032f610728366004611b36565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801561075f57600080fd5b506102d061076e366004611b69565b610e0f565b34801561077f57600080fd5b506102d061078e366004611a6a565b610eef565b34801561079f57600080fd5b506102d06107ae366004611ae9565b611095565b60006107c033848461110e565b5060015b92915050565b6107d2611233565b600a8111156108285760405162461bcd60e51b815260206004820152601f60248201527f427579204665652063616e6e6f74206265206d6f7265207468616e203130250060448201526064015b60405180910390fd5b60078190556040518181527fa480a3a15a511fbdc37ae77ae3f490e03ab3688adde11456ce779e6c1e0abaa2906020015b60405180910390a150565b6001600160a01b0383166000908152600360209081526040808320338452909152812054828110156108e95760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b606482015260840161081f565b6108f485858561128d565b61090885336109038685611bb6565b61110e565b506001949350505050565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916107c0918590610903908690611bc9565b610952611233565b68056bc75e2d631000008110156109bb5760405162461bcd60e51b815260206004820152602760248201527f596f75206e65656420746f20656e746572206d6f7265207468616e20313030206044820152663a37b5b2b7399760c91b606482015260840161081f565b600a8190556040518181527f17339d8f3c3323d3df3b092130f1bedb79d8e20de4d3ff176b316e89be357cbe90602001610859565b6109f8611233565b6001600160a01b038116610a4e5760405162461bcd60e51b815260206004820152601860248201527f7365746d61726b6574696e6757616c6c65743a205a45524f0000000000000000604482015260640161081f565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f090602001610859565b610aa4611233565b610aae6000611692565b565b610ab8611233565b600b5460ff1615610b0b5760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642e0000000000000000604482015260640161081f565b600b805462ff00ff191662010001179055604051600181527ff789dd0d6d54bc0d9b7a5955aac4c052f81fb39e63f533a8d4820f6e862c78a39060200160405180910390a1604051600181527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599060200160405180910390a1565b610b8e611233565b600a811115610bdf5760405162461bcd60e51b815260206004820181905260248201527f53656c6c204665652063616e6e6f74206265206d6f7265207468616e20313025604482015260640161081f565b60088190556040518181527f7d59573ec4acab62b908b5c1cde109eb12273d011506abaa850256636a42d54a90602001610859565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916107c0918590610903908690611bb6565b60006107c033848461128d565b610c60611233565b801515600b60029054906101000a900460ff16151503610cb65760405162461bcd60e51b815260206004820152601160248201527015985b1d5948185b1c9958591e481cd95d607a1b604482015260640161081f565b600b8054821515620100000262ff0000199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061085990831515815260200190565b610d09611233565b60015460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610d5a576040519150601f19603f3d011682016040523d82523d6000602084013e610d5f565b606091505b5050905080610da25760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161081f565b60405181151581527fc9946980dc929f521b40f678c5eeae1c213b0c26c005bd48d44905450951166e9060200160405180910390a16040518281527ffc3b2917f34bc4fba1516519d275441646d5088542342f58de8eea6a7cb5c2ab906020015b60405180910390a15050565b610e17611233565b6001600160a01b03821660009081526004602052604090205481151560ff909116151503610e935760405162461bcd60e51b8152602060048201526024808201527f5468652077616c6c657420616c726561647920686176652074686174207374616044820152633a3ab99760e11b606482015260840161081f565b6001600160a01b038216600081815260046020908152604091829020805460ff19168515159081179091558251938452908301527f09cdf0cfa7a040edd81ed835da9c0da414b3b1bc89788f88ba53288ce596b5fa9101610e03565b610ef7611233565b306001600160a01b03831603610f6e5760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b606482015260840161081f565b60015460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905260009184169063a9059cbb906044016020604051808303816000875af1158015610fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe79190611bdc565b9050806110285760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161081f565b60405181151581527fc9946980dc929f521b40f678c5eeae1c213b0c26c005bd48d44905450951166e9060200160405180910390a16040518281527f9717b3559fe85dc5c6941748cdc56fc5ca4e06048d7b836c700c174f78369bef9060200160405180910390a1505050565b61109d611233565b6001600160a01b0381166111025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161081f565b61110b81611692565b50565b6001600160a01b0383166111705760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161081f565b6001600160a01b0382166111d15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161081f565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000546001600160a01b03163314610aae5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161081f565b6001600160a01b0383166112f15760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161081f565b6001600160a01b0382166113535760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161081f565b600081116113b55760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161081f565b6001600160a01b03831660009081526002602052604090205481111561142c5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161081f565b600b5460ff168061145557506001600160a01b03831660009081526004602052604090205460ff165b8061147857506001600160a01b03821660009081526004602052604090205460ff165b6114c45760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c6564210000000000000000604482015260640161081f565b30600090815260026020526040812054600a54600b5491929083101591610100900460ff1615801561152857507f000000000000000000000000fad6d60edb79eff2e3d5572c65a9bea4911514c86001600160a01b0316866001600160a01b031614155b80156115315750815b80156115455750600b5462010000900460ff165b15611552576115526116e2565b7f000000000000000000000000fad6d60edb79eff2e3d5572c65a9bea4911514c86001600160a01b0316856001600160a01b03161480156115ac57506001600160a01b03861660009081526004602052604090205460ff16155b156115ce576064846008546115c19190611bf9565b6115cb9190611c10565b90505b7f000000000000000000000000fad6d60edb79eff2e3d5572c65a9bea4911514c86001600160a01b0316866001600160a01b031614801561162857506001600160a01b03851660009081526004602052604090205460ff16155b1561164a5760648460075461163d9190611bf9565b6116479190611c10565b90505b6116548185611bb6565b9350801561167f57611667863083611738565b80600960008282546116799190611bc9565b90915550505b61168a868686611738565b505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600b805461ff00191661010017905530600090815260026020526040812054905061170c816117d9565b6001544790611724906001600160a01b031682611965565b50506000600955600b805461ff0019169055565b6001600160a01b03831660009081526002602052604081208054839290611760908490611bb6565b90915550506001600160a01b0382166000908152600260205260408120805483929061178d908490611bc9565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161122691815260200190565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061180e5761180e611c32565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061186257611862611c32565b60200260200101906001600160a01b031690816001600160a01b0316815250506118ad307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461110e565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790611902908590600090869030904290600401611c8c565b600060405180830381600087803b15801561191c57600080fd5b505af1158015611930573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051610e03929190611cc8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146119b2576040519150601f19603f3d011682016040523d82523d6000602084013e6119b7565b606091505b50509050806119fb5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015260640161081f565b505050565b600060208083528351808285015260005b81811015611a2d57858101830151858201604001528201611a11565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611a6557600080fd5b919050565b60008060408385031215611a7d57600080fd5b611a8683611a4e565b946020939093013593505050565b600060208284031215611aa657600080fd5b5035919050565b600080600060608486031215611ac257600080fd5b611acb84611a4e565b9250611ad960208501611a4e565b9150604084013590509250925092565b600060208284031215611afb57600080fd5b611b0482611a4e565b9392505050565b801515811461110b57600080fd5b600060208284031215611b2b57600080fd5b8135611b0481611b0b565b60008060408385031215611b4957600080fd5b611b5283611a4e565b9150611b6060208401611a4e565b90509250929050565b60008060408385031215611b7c57600080fd5b611b8583611a4e565b91506020830135611b9581611b0b565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107c4576107c4611ba0565b808201808211156107c4576107c4611ba0565b600060208284031215611bee57600080fd5b8151611b0481611b0b565b80820281158282048414176107c4576107c4611ba0565b600082611c2d57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015611c815781516001600160a01b031687529582019590820190600101611c5c565b509495945050505050565b85815284602082015260a060408201526000611cab60a0830186611c48565b6001600160a01b0394909416606083015250608001529392505050565b828152604060208201526000611ce16040830184611c48565b94935050505056fea26469706673582212200208844f3a97f19045421f55428dab20af9968291dd8b17fde36806ed7d6faab64736f6c63430008130033

Deployed Bytecode Sourcemap

15554:14967:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17141:41;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17141:41:0;;;;;;;;;;;;:::i;:::-;;;;;;;;21127:189;;;;;;;;;;-1:-1:-1;21127:189:0;;;;;:::i;:::-;;:::i;:::-;;;1169:14:1;;1162:22;1144:41;;1132:2;1117:18;21127:189:0;1004:187:1;27798:195:0;;;;;;;;;;-1:-1:-1;27798:195:0;;;;;:::i;:::-;;:::i;:::-;;17609:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1571:32:1;;;1553:51;;1541:2;1526:18;17609:51:0;1381:229:1;20335:95:0;;;;;;;;;;-1:-1:-1;20415:7:0;;20335:95;;;1761:25:1;;;1749:2;1734:18;20335:95:0;1615:177:1;17799:28:0;;;;;;;;;;-1:-1:-1;17799:28:0;;;;;;;;;;;21361:480;;;;;;;;;;-1:-1:-1;21361:480:0;;;;;:::i;:::-;;:::i;15841:47::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15841:47:0;;;;;17336:26;;;;;;;;;;;;;;;;17238:35;;;;;;;;;;;;17271:2;17238:35;;;;;2302:4:1;2290:17;;;2272:36;;2260:2;2245:18;17238:35:0;2130:184:1;21891:292:0;;;;;;;;;;-1:-1:-1;21891:292:0;;;;;:::i;:::-;;:::i;26864:360::-;;;;;;;;;;-1:-1:-1;26864:360:0;;;;;:::i;:::-;;:::i;17305:22::-;;;;;;;;;;;;;;;;17667:38;;;;;;;;;;;;;;;17834:41;;;;;;;;;;-1:-1:-1;17834:41:0;;;;;;;;;;;17538:26;;;;;;;;;;-1:-1:-1;17538:26:0;;;;;;;;26238:120;;;;;;;;;;-1:-1:-1;26238:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;26329:21:0;26305:4;26329:21;;;:12;:21;;;;;;;;;26238:120;27522:268;;;;;;;;;;-1:-1:-1;27522:268:0;;;;;:::i;:::-;;:::i;17371:43::-;;;;;;;;;;;;;;;;20440:117;;;;;;;;;;-1:-1:-1;20440:117:0;;;;;:::i;:::-;-1:-1:-1;;;;;20533:16:0;20506:7;20533:16;;;:7;:16;;;;;;;20440:117;5670:105;;;;;;;;;;;;;:::i;15947:101::-;;;;;;;;;;-1:-1:-1;15947:101:0;;;;-1:-1:-1;;;;;15947:101:0;;;15792:42;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15792:42:0;;;;;16094:52;;;;;;;;;;;;16139:6;16094:52;;30245:271;;;;;;;;;;;;;:::i;28001:203::-;;;;;;;;;;-1:-1:-1;28001:203:0;;;;;:::i;:::-;;:::i;5022:87::-;;;;;;;;;;-1:-1:-1;5068:7:0;5095:6;-1:-1:-1;;;;;5095:6:0;5022:87;;17189:42;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17189:42:0;;;;;15739:46;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15739:46:0;;;;;22233:302;;;;;;;;;;-1:-1:-1;22233:302:0;;;;;:::i;:::-;;:::i;20607:194::-;;;;;;;;;;-1:-1:-1;20607:194:0;;;;;:::i;:::-;;:::i;27232:247::-;;;;;;;;;;-1:-1:-1;27232:247:0;;;;;:::i;:::-;;:::i;29333:309::-;;;;;;;;;;;;;:::i;17423:54::-;;;;;;;;;;;;;;;;20906:173;;;;;;;;;;-1:-1:-1;20906:173:0;;;;;:::i;:::-;-1:-1:-1;;;;;21043:19:0;;;21016:7;21043:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;20906:173;26547:274;;;;;;;;;;-1:-1:-1;26547:274:0;;;;;:::i;:::-;;:::i;29719:470::-;;;;;;;;;;-1:-1:-1;29719:470:0;;;;;:::i;:::-;;:::i;5930:240::-;;;;;;;;;;-1:-1:-1;5930:240:0;;;;;:::i;:::-;;:::i;21127:189::-;21230:4;21247:39;180:10;21270:7;21279:6;21247:8;:39::i;:::-;-1:-1:-1;21304:4:0;21127:189;;;;;:::o;27798:195::-;4908:13;:11;:13::i;:::-;27883:2:::1;27872:7;:13;;27864:57;;;::::0;-1:-1:-1;;;27864:57:0;;4098:2:1;27864:57:0::1;::::0;::::1;4080:21:1::0;4137:2;4117:18;;;4110:30;4176:33;4156:18;;;4149:61;4227:18;;27864:57:0::1;;;;;;;;;27932:6;:16:::0;;;27964:21:::1;::::0;1761:25:1;;;27964:21:0::1;::::0;1749:2:1;1734:18;27964:21:0::1;;;;;;;;27798:195:::0;:::o;21361:480::-;-1:-1:-1;;;;;21536:19:0;;21495:4;21536:19;;;:11;:19;;;;;;;;180:10;21536:33;;;;;;;;21602:26;;;;21580:116;;;;-1:-1:-1;;;21580:116:0;;4458:2:1;21580:116:0;;;4440:21:1;4497:2;4477:18;;;4470:30;4536:34;4516:18;;;4509:62;-1:-1:-1;;;4587:18:1;;;4580:38;4635:19;;21580:116:0;4256:404:1;21580:116:0;21707:36;21717:6;21725:9;21736:6;21707:9;:36::i;:::-;21754:57;21763:6;180:10;21785:25;21804:6;21785:16;:25;:::i;:::-;21754:8;:57::i;:::-;-1:-1:-1;21829:4:0;;21361:480;-1:-1:-1;;;;21361:480:0:o;21891:292::-;180:10;22006:4;22095:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;22095:34:0;;;;;;;;;;22006:4;;22023:130;;22073:7;;22095:47;;22132:10;;22095:47;:::i;26864:360::-;4908:13;:11;:13::i;:::-;27019:9:::1;26991:24;:37;;26969:126;;;::::0;-1:-1:-1;;;26969:126:0;;5262:2:1;26969:126:0::1;::::0;::::1;5244:21:1::0;5301:2;5281:18;;;5274:30;5340:34;5320:18;;;5313:62;-1:-1:-1;;;5391:18:1;;;5384:37;5438:19;;26969:126:0::1;5060:403:1::0;26969:126:0::1;27106:23;:50:::0;;;27172:44:::1;::::0;1761:25:1;;;27172:44:0::1;::::0;1749:2:1;1734:18;27172:44:0::1;1615:177:1::0;27522:268:0;4908:13;:11;:13::i;:::-;-1:-1:-1;;;;;27614:30:0;::::1;27606:67;;;::::0;-1:-1:-1;;;27606:67:0;;5670:2:1;27606:67:0::1;::::0;::::1;5652:21:1::0;5709:2;5689:18;;;5682:30;5748:26;5728:18;;;5721:54;5792:18;;27606:67:0::1;5468:348:1::0;27606:67:0::1;27684:15;:43:::0;;-1:-1:-1;;;;;;27684:43:0::1;-1:-1:-1::0;;;;;27684:43:0;::::1;::::0;;::::1;::::0;;;27743:39:::1;::::0;1553:51:1;;;27743:39:0::1;::::0;1541:2:1;1526:18;27743:39:0::1;1381:229:1::0;5670:105:0;4908:13;:11;:13::i;:::-;5737:30:::1;5764:1;5737:18;:30::i;:::-;5670:105::o:0;30245:271::-;4908:13;:11;:13::i;:::-;30308:14:::1;::::0;::::1;;30307:15;30299:52;;;::::0;-1:-1:-1;;;30299:52:0;;6023:2:1;30299:52:0::1;::::0;::::1;6005:21:1::0;6062:2;6042:18;;;6035:30;6101:26;6081:18;;;6074:54;6145:18;;30299:52:0::1;5821:348:1::0;30299:52:0::1;30362:14;:21:::0;;-1:-1:-1;;30394:28:0;;;;;30438:20:::1;::::0;-1:-1:-1;1144:41:1;;30438:20:0::1;::::0;1132:2:1;1117:18;30438:20:0::1;;;;;;;30474:34;::::0;30503:4:::1;1144:41:1::0;;30474:34:0::1;::::0;1132:2:1;1117:18;30474:34:0::1;;;;;;;30245:271::o:0;28001:203::-;4908:13;:11;:13::i;:::-;28089:2:::1;28077:8;:14;;28069:59;;;::::0;-1:-1:-1;;;28069:59:0;;6376:2:1;28069:59:0::1;::::0;::::1;6358:21:1::0;;;6395:18;;;6388:30;6454:34;6434:18;;;6427:62;6506:18;;28069:59:0::1;6174:356:1::0;28069:59:0::1;28139:7;:18:::0;;;28173:23:::1;::::0;1761:25:1;;;28173:23:0::1;::::0;1749:2:1;1734:18;28173:23:0::1;1615:177:1::0;22233:302:0;180:10;22353:4;22442:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;22442:34:0;;;;;;;;;;22353:4;;22370:135;;22420:7;;22442:52;;22479:15;;22442:52;:::i;20607:194::-;20712:4;20729:42;180:10;20753:9;20764:6;20729:9;:42::i;27232:247::-;4908:13;:11;:13::i;:::-;27344:8:::1;27319:33;;:21;;;;;;;;;;;:33;;::::0;27311:63:::1;;;::::0;-1:-1:-1;;;27311:63:0;;6737:2:1;27311:63:0::1;::::0;::::1;6719:21:1::0;6776:2;6756:18;;;6749:30;-1:-1:-1;;;6795:18:1;;;6788:47;6852:18;;27311:63:0::1;6535:341:1::0;27311:63:0::1;27385:21;:32:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;27385:32:0;;::::1;;::::0;;27433:38:::1;::::0;::::1;::::0;::::1;::::0;27409:8;1169:14:1;1162:22;1144:41;;1132:2;1117:18;;1004:187;29333:309:0;4908:13;:11;:13::i;:::-;29471:15:::1;::::0;29463:52:::1;::::0;29415:21:::1;::::0;29397:15:::1;::::0;-1:-1:-1;;;;;29471:15:0;;::::1;::::0;29415:21;;29397:15;29463:52;29397:15;29463:52;29415:21;29471:15;29463:52:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29447:68;;;29534:4;29526:32;;;::::0;-1:-1:-1;;;29526:32:0;;7293:2:1;29526:32:0::1;::::0;::::1;7275:21:1::0;7332:2;7312:18;;;7305:30;-1:-1:-1;;;7351:18:1;;;7344:45;7406:18;;29526:32:0::1;7091:339:1::0;29526:32:0::1;29574:20;::::0;1169:14:1;;1162:22;1144:41;;29574:20:0::1;::::0;1132:2:1;1117:18;29574:20:0::1;;;;;;;29610:24;::::0;1761:25:1;;;29610:24:0::1;::::0;1749:2:1;1734:18;29610:24:0::1;;;;;;;;29386:256;;29333:309::o:0;26547:274::-;4908:13;:11;:13::i;:::-;-1:-1:-1;;;;;26640:21:0;::::1;;::::0;;;:12:::1;:21;::::0;;;;;:31;::::1;;:21;::::0;;::::1;:31;;::::0;26632:80:::1;;;::::0;-1:-1:-1;;;26632:80:0;;7637:2:1;26632:80:0::1;::::0;::::1;7619:21:1::0;7676:2;7656:18;;;7649:30;7715:34;7695:18;;;7688:62;-1:-1:-1;;;7766:18:1;;;7759:34;7810:19;;26632:80:0::1;7435:400:1::0;26632:80:0::1;-1:-1:-1::0;;;;;26723:21:0;::::1;;::::0;;;:12:::1;:21;::::0;;;;;;;;:30;;-1:-1:-1;;26723:30:0::1;::::0;::::1;;::::0;;::::1;::::0;;;26769:29;;8008:51:1;;;8075:18;;;8068:50;26769:29:0::1;::::0;7981:18:1;26769:29:0::1;7840:284:1::0;29719:470:0;4908:13;:11;:13::i;:::-;29896:4:::1;-1:-1:-1::0;;;;;29871:30:0;::::1;::::0;29849:134:::1;;;::::0;-1:-1:-1;;;29849:134:0;;8331:2:1;29849:134:0::1;::::0;::::1;8313:21:1::0;8370:2;8350:18;;;8343:30;8409:34;8389:18;;;8382:62;-1:-1:-1;;;8460:18:1;;;8453:52;8522:19;;29849:134:0::1;8129:418:1::0;29849:134:0::1;30037:15;::::0;30006:56:::1;::::0;-1:-1:-1;;;30006:56:0;;-1:-1:-1;;;;;30037:15:0;;::::1;30006:56;::::0;::::1;8734:51:1::0;8801:18;;;8794:34;;;29994:9:0::1;::::0;30006:30;::::1;::::0;::::1;::::0;8707:18:1;;30006:56:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29994:68;;30081:4;30073:32;;;::::0;-1:-1:-1;;;30073:32:0;;7293:2:1;30073:32:0::1;::::0;::::1;7275:21:1::0;7332:2;7312:18;;;7305:30;-1:-1:-1;;;7351:18:1;;;7344:45;7406:18;;30073:32:0::1;7091:339:1::0;30073:32:0::1;30121:20;::::0;1169:14:1;;1162:22;1144:41;;30121:20:0::1;::::0;1132:2:1;1117:18;30121:20:0::1;;;;;;;30157:24;::::0;1761:25:1;;;30157:24:0::1;::::0;1749:2:1;1734:18;30157:24:0::1;;;;;;;29838:351;29719:470:::0;;:::o;5930:240::-;4908:13;:11;:13::i;:::-;-1:-1:-1;;;;;6035:22:0;::::1;6013:110;;;::::0;-1:-1:-1;;;6013:110:0;;9291:2:1;6013:110:0::1;::::0;::::1;9273:21:1::0;9330:2;9310:18;;;9303:30;9369:34;9349:18;;;9342:62;-1:-1:-1;;;9420:18:1;;;9413:36;9466:19;;6013:110:0::1;9089:402:1::0;6013:110:0::1;6134:28;6153:8;6134:18;:28::i;:::-;5930:240:::0;:::o;22567:341::-;-1:-1:-1;;;;;22661:20:0;;22653:69;;;;-1:-1:-1;;;22653:69:0;;9698:2:1;22653:69:0;;;9680:21:1;9737:2;9717:18;;;9710:30;9776:34;9756:18;;;9749:62;-1:-1:-1;;;9827:18:1;;;9820:34;9871:19;;22653:69:0;9496:400:1;22653:69:0;-1:-1:-1;;;;;22741:21:0;;22733:68;;;;-1:-1:-1;;;22733:68:0;;10103:2:1;22733:68:0;;;10085:21:1;10142:2;10122:18;;;10115:30;10181:34;10161:18;;;10154:62;-1:-1:-1;;;10232:18:1;;;10225:32;10274:19;;22733:68:0;9901:398:1;22733:68:0;-1:-1:-1;;;;;22814:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;22867:33;;1761:25:1;;;22867:33:0;;1734:18:1;22867:33:0;;;;;;;;22567:341;;;:::o;5187:132::-;5068:7;5095:6;-1:-1:-1;;;;;5095:6:0;180:10;5251:23;5243:68;;;;-1:-1:-1;;;5243:68:0;;10506:2:1;5243:68:0;;;10488:21:1;;;10525:18;;;10518:30;10584:34;10564:18;;;10557:62;10636:18;;5243:68:0;10304:356:1;23041:1495:0;-1:-1:-1;;;;;23129:18:0;;23121:68;;;;-1:-1:-1;;;23121:68:0;;10867:2:1;23121:68:0;;;10849:21:1;10906:2;10886:18;;;10879:30;10945:34;10925:18;;;10918:62;-1:-1:-1;;;10996:18:1;;;10989:35;11041:19;;23121:68:0;10665:401:1;23121:68:0;-1:-1:-1;;;;;23208:16:0;;23200:64;;;;-1:-1:-1;;;23200:64:0;;11273:2:1;23200:64:0;;;11255:21:1;11312:2;11292:18;;;11285:30;11351:34;11331:18;;;11324:62;-1:-1:-1;;;11402:18:1;;;11395:33;11445:19;;23200:64:0;11071:399:1;23200:64:0;23292:1;23283:6;:10;23275:64;;;;-1:-1:-1;;;23275:64:0;;11677:2:1;23275:64:0;;;11659:21:1;11716:2;11696:18;;;11689:30;11755:34;11735:18;;;11728:62;-1:-1:-1;;;11806:18:1;;;11799:39;11855:19;;23275:64:0;11475:405:1;23275:64:0;-1:-1:-1;;;;;23372:13:0;;;;;;:7;:13;;;;;;:23;-1:-1:-1;23372:23:0;23350:111;;;;-1:-1:-1;;;23350:111:0;;12087:2:1;23350:111:0;;;12069:21:1;12126:2;12106:18;;;12099:30;12165:34;12145:18;;;12138:62;-1:-1:-1;;;12216:18:1;;;12209:36;12262:19;;23350:111:0;11885:402:1;23350:111:0;23480:14;;;;;:36;;-1:-1:-1;;;;;;23498:18:0;;;;;;:12;:18;;;;;;;;23480:36;:56;;;-1:-1:-1;;;;;;23520:16:0;;;;;;:12;:16;;;;;;;;23480:56;23472:93;;;;-1:-1:-1;;;23472:93:0;;12494:2:1;23472:93:0;;;12476:21:1;12533:2;12513:18;;;12506:30;12572:26;12552:18;;;12545:54;12616:18;;23472:93:0;12292:348:1;23472:93:0;23671:4;23622:28;20533:16;;;:7;:16;;;;;;23756:23;;23910:16;;20533;;23719:60;;;;;23910:16;;;;;23909:17;:55;;;;;23951:13;-1:-1:-1;;;;;23943:21:0;:4;-1:-1:-1;;;;;23943:21:0;;;23909:55;:95;;;;;23981:23;23909:95;:133;;;;-1:-1:-1;24021:21:0;;;;;;;23909:133;23891:206;;;24069:16;:14;:16::i;:::-;24117:13;-1:-1:-1;;;;;24111:19:0;:2;-1:-1:-1;;;;;24111:19:0;;:42;;;;-1:-1:-1;;;;;;24135:18:0;;;;;;:12;:18;;;;;;;;24134:19;24111:42;24107:105;;;24197:3;24187:6;24177:7;;:16;;;;:::i;:::-;24176:24;;;;:::i;:::-;24170:30;;24107:105;24234:13;-1:-1:-1;;;;;24226:21:0;:4;-1:-1:-1;;;;;24226:21:0;;:42;;;;-1:-1:-1;;;;;;24252:16:0;;;;;;:12;:16;;;;;;;;24251:17;24226:42;24222:104;;;24311:3;24301:6;24292;;:15;;;;:::i;:::-;24291:23;;;;:::i;:::-;24285:29;;24222:104;24336:13;24346:3;24336:13;;:::i;:::-;;-1:-1:-1;24364:7:0;;24360:126;;24388:40;24403:4;24417;24424:3;24388:14;:40::i;:::-;24471:3;24443:24;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;24360:126:0;24496:32;24511:4;24517:2;24521:6;24496:14;:32::i;:::-;23110:1426;;;23041:1495;;;:::o;6330:191::-;6404:16;6423:6;;-1:-1:-1;;;;;6440:17:0;;;-1:-1:-1;;;;;;6440:17:0;;;;;;6473:40;;6423:6;;;;;;;6473:40;;6404:16;6473:40;6393:128;6330:191;:::o;24771:304::-;17918:16;:23;;-1:-1:-1;;17918:23:0;;;;;24868:4:::1;-1:-1:-1::0;20533:16:0;;;:7;:16;;;;;;24828:46:::1;;24885:29;24902:11;24885:16;:29::i;:::-;24998:15;::::0;24943:21:::1;::::0;24977:49:::1;::::0;-1:-1:-1;;;;;24998:15:0::1;24943:21:::0;24977:20:::1;:49::i;:::-;-1:-1:-1::0;;25066:1:0::1;25039:24;:28:::0;17964:16;:24;;-1:-1:-1;;17964:24:0;;;24771:304::o;25977:253::-;-1:-1:-1;;;;;26105:15:0;;;;;;:7;:15;;;;;:25;;26124:6;;26105:15;:25;;26124:6;;26105:25;:::i;:::-;;;;-1:-1:-1;;;;;;;26141:18:0;;;;;;:7;:18;;;;;:28;;26163:6;;26141:18;:28;;26163:6;;26141:28;:::i;:::-;;;;;;;;26204:9;-1:-1:-1;;;;;26187:35:0;26196:6;-1:-1:-1;;;;;26187:35:0;;26215:6;26187:35;;;;1761:25:1;;1749:2;1734:18;;1615:177;25203:638:0;25353:16;;;25367:1;25353:16;;;;;;;;25329:21;;25353:16;;;;;;;;;;-1:-1:-1;25353:16:0;25329:40;;25398:4;25380;25385:1;25380:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;25380:23:0;;;-1:-1:-1;;;;;25380:23:0;;;;;25424:4;25414;25419:1;25414:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;25414:14:0;;;-1:-1:-1;;;;;25414:14:0;;;;;25439:62;25456:4;25471:15;25489:11;25439:8;:62::i;:::-;25540:240;;-1:-1:-1;;;25540:240:0;;-1:-1:-1;;;;;25540:15:0;:66;;;;:240;;25621:11;;25647:1;;25691:4;;25718;;25754:15;;25540:240;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25798:35;25815:11;25828:4;25798:35;;;;;;;:::i;28212:218::-;28330:9;28345;-1:-1:-1;;;;;28345:14:0;28367:6;28345:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28329:49;;;28397:4;28389:33;;;;-1:-1:-1;;;28389:33:0;;14896:2:1;28389:33:0;;;14878:21:1;14935:2;14915:18;;;14908:30;-1:-1:-1;;;14954:18:1;;;14947:46;15010:18;;28389:33:0;14694:340:1;28389:33:0;28318:112;28212:218;;:::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;567:173::-;635:20;;-1:-1:-1;;;;;684:31:1;;674:42;;664:70;;730:1;727;720:12;664:70;567:173;;;:::o;745:254::-;813:6;821;874:2;862:9;853:7;849:23;845:32;842:52;;;890:1;887;880:12;842:52;913:29;932:9;913:29;:::i;:::-;903:39;989:2;974:18;;;;961:32;;-1:-1:-1;;;745:254:1:o;1196:180::-;1255:6;1308:2;1296:9;1287:7;1283:23;1279:32;1276:52;;;1324:1;1321;1314:12;1276:52;-1:-1:-1;1347:23:1;;1196:180;-1:-1:-1;1196:180:1:o;1797:328::-;1874:6;1882;1890;1943:2;1931:9;1922:7;1918:23;1914:32;1911:52;;;1959:1;1956;1949:12;1911:52;1982:29;2001:9;1982:29;:::i;:::-;1972:39;;2030:38;2064:2;2053:9;2049:18;2030:38;:::i;:::-;2020:48;;2115:2;2104:9;2100:18;2087:32;2077:42;;1797:328;;;;;:::o;2527:186::-;2586:6;2639:2;2627:9;2618:7;2614:23;2610:32;2607:52;;;2655:1;2652;2645:12;2607:52;2678:29;2697:9;2678:29;:::i;:::-;2668:39;2527:186;-1:-1:-1;;;2527:186:1:o;2942:118::-;3028:5;3021:13;3014:21;3007:5;3004:32;2994:60;;3050:1;3047;3040:12;3065:241;3121:6;3174:2;3162:9;3153:7;3149:23;3145:32;3142:52;;;3190:1;3187;3180:12;3142:52;3229:9;3216:23;3248:28;3270:5;3248:28;:::i;3311:260::-;3379:6;3387;3440:2;3428:9;3419:7;3415:23;3411:32;3408:52;;;3456:1;3453;3446:12;3408:52;3479:29;3498:9;3479:29;:::i;:::-;3469:39;;3527:38;3561:2;3550:9;3546:18;3527:38;:::i;:::-;3517:48;;3311:260;;;;;:::o;3576:315::-;3641:6;3649;3702:2;3690:9;3681:7;3677:23;3673:32;3670:52;;;3718:1;3715;3708:12;3670:52;3741:29;3760:9;3741:29;:::i;:::-;3731:39;;3820:2;3809:9;3805:18;3792:32;3833:28;3855:5;3833:28;:::i;:::-;3880:5;3870:15;;;3576:315;;;;;:::o;4665:127::-;4726:10;4721:3;4717:20;4714:1;4707:31;4757:4;4754:1;4747:15;4781:4;4778:1;4771:15;4797:128;4864:9;;;4885:11;;;4882:37;;;4899:18;;:::i;4930:125::-;4995:9;;;5016:10;;;5013:36;;;5029:18;;:::i;8839:245::-;8906:6;8959:2;8947:9;8938:7;8934:23;8930:32;8927:52;;;8975:1;8972;8965:12;8927:52;9007:9;9001:16;9026:28;9048:5;9026:28;:::i;12645:168::-;12718:9;;;12749;;12766:15;;;12760:22;;12746:37;12736:71;;12787:18;;:::i;12818:217::-;12858:1;12884;12874:132;;12928:10;12923:3;12919:20;12916:1;12909:31;12963:4;12960:1;12953:15;12991:4;12988:1;12981:15;12874:132;-1:-1:-1;13020:9:1;;12818:217::o;13172:127::-;13233:10;13228:3;13224:20;13221:1;13214:31;13264:4;13261:1;13254:15;13288:4;13285:1;13278:15;13304:461;13357:3;13395:5;13389:12;13422:6;13417:3;13410:19;13448:4;13477:2;13472:3;13468:12;13461:19;;13514:2;13507:5;13503:14;13535:1;13545:195;13559:6;13556:1;13553:13;13545:195;;;13624:13;;-1:-1:-1;;;;;13620:39:1;13608:52;;13680:12;;;;13715:15;;;;13656:1;13574:9;13545:195;;;-1:-1:-1;13756:3:1;;13304:461;-1:-1:-1;;;;;13304:461:1:o;13770:582::-;14069:6;14058:9;14051:25;14112:6;14107:2;14096:9;14092:18;14085:34;14155:3;14150:2;14139:9;14135:18;14128:31;14032:4;14176:57;14228:3;14217:9;14213:19;14205:6;14176:57;:::i;:::-;-1:-1:-1;;;;;14269:32:1;;;;14264:2;14249:18;;14242:60;-1:-1:-1;14333:3:1;14318:19;14311:35;14168:65;13770:582;-1:-1:-1;;;13770:582:1:o;14357:332::-;14564:6;14553:9;14546:25;14607:2;14602;14591:9;14587:18;14580:30;14527:4;14627:56;14679:2;14668:9;14664:18;14656:6;14627:56;:::i;:::-;14619:64;14357:332;-1:-1:-1;;;;14357:332:1:o

Swarm Source

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