ETH Price: $2,673.54 (+3.22%)

Token

wAIge (wAIge)
 

Overview

Max Total Supply

1,000,000,000 wAIge

Holders

36

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
wAIge

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-10-26
*/

// 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 Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                0,
                "Address: low-level call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data
    ) internal view returns (bytes memory) {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data
    ) internal returns (bytes memory) {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

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

/**
 * @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 anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

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

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 wAIge is Context, IERC20, Ownable {
    using Address for address;

    //Definition of Wallets for Marketing or team.
    address payable public devOpsWallet =
        payable(0xC6aC0b2A94A92C12A7129E93319707ff9122E565);
    address payable public stakingWallet =
        payable(0xdfB2270f178f5C614806A60722BdCd1Ac6072C0f);

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

    //Loging and Event Information for better troubleshooting.
    event Log(string, uint256);
    event AuditLog(string, address);
    event ExcludeStatus(address, bool);
    event UpdateDevOpsWallet(address);
    event UpdateStakingWallet(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 RewardLiquidityProviders(uint256 tokenAmount);
    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;
    //Token Definition.
    string public constant name = "wAIge";
    string public constant symbol = "wAIge";
    uint8 public constant decimals = 18;
    //Taxes Definition.
    uint public buyFee = 2;
    uint public buyReflectionFee = 3;
    uint256 public sellFee = 3;
    uint public sellReflectionFee = 4;

    uint public totalReflectionsCollected;
    uint public reflectionCollected;
    uint256 public devOpsTokensCollected = 0;

    uint256 public totalDevOpsTokensCollected = 0;

    uint256 public minimumTokensBeforeSwap = 10_000 ether;
    //Trading Controls added for SAFU Requirements
    bool public tradingEnabled;
    //Oracle Price Update, Manual Process.
    uint256 public swapOutput = 0;
    //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
        } else if (block.chainid == 97) {
            currentRouter = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1; // PCS Testnet
        } 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
        } else if (
            block.chainid == 1 || block.chainid == 4 || block.chainid == 5
        ) {
            currentRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; //Mainnet
        } 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;
        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[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
    ) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    //ERC 20 Standard Allowance Function
    function allowance(
        address _owner,
        address spender
    ) public view override returns (uint256) {
        return _allowances[_owner][spender];
    }

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

    //ERC 20 Standard Transfer From
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public 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
    ) public virtual returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] + addedValue
        );
        return true;
    }

    //ERC 20 Standard decrease Allowance
    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public 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"
        );
        //only done for SAFU Contracts.
        require(
            tradingEnabled ||
                _isExcludedFromFees[from] ||
                _isExcludedFromFees[to],
            "Trading not yet enabled!"
        );

        //Adding logic for automatic swap.
        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >=
            minimumTokensBeforeSwap;
        uint fee = 0;
        uint reflectionFee = 0;
        //if any account belongs to _isExcludedFromFees account then remove the fee
        if (
            !inSwapAndLiquify &&
            from != uniswapV2Pair &&
            overMinimumTokenBalance &&
            swapAndLiquifyEnabled
        ) {
            swapAndLiquify();
        }
        if (to == uniswapV2Pair && !_isExcludedFromFees[from]) {
            fee = (sellFee * amount) / 100;
            reflectionFee = (fee * sellReflectionFee) / sellFee;
        }
        if (from == uniswapV2Pair && !_isExcludedFromFees[to]) {
            fee = (buyFee * amount) / 100;
            reflectionFee = (fee * buyReflectionFee) / buyFee;
        }
        amount -= fee;
        if (fee > 0) {
            _tokenTransfer(from, address(this), fee);
            devOpsTokensCollected += fee;
            totalDevOpsTokensCollected += fee;
            if (reflectionFee > 0) {
                totalReflectionsCollected += reflectionFee;
                reflectionCollected += reflectionFee;
            }
        }
        _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() public lockTheSwap {
        uint256 totalTokens = balanceOf(address(this));
        // sendTokens to Staking Wallet
        if (reflectionCollected > 0 && totalTokens >= reflectionCollected) {
            totalTokens -= reflectionCollected;
            _tokenTransfer(address(this), stakingWallet, reflectionCollected);
            reflectionCollected = 0;
        }
        if (totalTokens == 0) return;
        // send ETH to devops wallet
        swapTokensForEth(totalTokens);
        uint ethBalance = address(this).balance;
        transferToAddressETH(devOpsWallet, ethBalance);

        devOpsTokensCollected = 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 isExcludedFromFees(address account) external view returns (bool) {
        return _isExcludedFromFees[account];
    }

    //exclude wallets from fees, this is needed for launch or other contracts.
    function excludeFromFees(address account) external onlyOwner {
        _isExcludedFromFees[account] = true;
        emit ExcludeStatus(account, true);
    }

    //include wallet back in fees.
    function includeInFees(address account) external onlyOwner {
        _isExcludedFromFees[account] = false;
        emit ExcludeStatus(account, false);
    }

    //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 setDevOpsWallet(address _devOpsWallet) external onlyOwner {
        require(_devOpsWallet != address(0), "setdevOpsWallet: ZERO");
        devOpsWallet = payable(_devOpsWallet);
        emit UpdateDevOpsWallet(_devOpsWallet);
    }

    //set a new team wallet.
    function setStakingWallet(address _stakingWallet) external onlyOwner {
        require(_stakingWallet != address(0), "setstakingWallet: ZERO");
        stakingWallet = payable(_stakingWallet);
        emit UpdateStakingWallet(_stakingWallet);
    }

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

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

    function transferToAddressETH(
        address payable recipient,
        uint256 amount
    ) private {
        if (amount == 0) return;
        (bool succ, ) = recipient.call{value: amount}("");
        emit TransferStatus(succ);
    }

    //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
        }(
            swapOutput, // 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(devOpsWallet).call{value: ethBalance}("");
        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(devOpsWallet, _amount);
        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);
    }
}

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":"string","name":"","type":"string"},{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"AuditLog","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":false,"internalType":"string","name":"","type":"string"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Log","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":"tokenAmount","type":"uint256"}],"name":"RewardLiquidityProviders","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":"address","name":"","type":"address"}],"name":"UpdateDevOpsWallet","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":"uint256","name":"","type":"uint256"}],"name":"UpdateSellFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"UpdateStakingWallet","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":"buyReflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"devOpsTokensCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devOpsWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inSwapAndLiquify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"reflectionCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"sellReflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFee","type":"uint256"},{"internalType":"uint256","name":"_reflectionAmount","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devOpsWallet","type":"address"}],"name":"setDevOpsWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellFee","type":"uint256"},{"internalType":"uint256","name":"_reflectionAmount","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingWallet","type":"address"}],"name":"setStakingWallet","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":"stakingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapOutput","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":"totalDevOpsTokensCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReflectionsCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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"}]

60e0604052600180546001600160a01b031990811673c6ac0b2a94a92c12a7129e93319707ff9122e565179091556002805490911673dfb2270f178f5c614806a60722bdcd1ac6072c0f1781556b033b2e3c9fd0803ce8000000600655600755600360088190556009556004600a556000600d819055600e81905569021e19e0c9bab2400000600f556011556012805461ff0019169055348015620000a357600080fd5b50620000af3362000474565b6006543360009081526003602052604081209190915546603803620000ea57507310ed43c718714eb63d5aa57b78b54704e256024e62000248565b466061036200010f575073d99d1c33f9fc3444f8101754abc46c52416550d162000248565b4661a86a036200013557507360ae616a2155ee3d9a68541ba4544862310933d462000248565b466089036200015a575073a5e0829caced8ffdd4de3c43696c57f7d7a678ff62000248565b466117b203620001805750734169db906fcbfb8b12dbd20d98850aee05b7d88962000248565b4660fa03620001a5575073f491e7b69e4244ad4002bc14e878a34207e38c2962000248565b4661a4b103620001cb5750731b02da8cb0d097eb8d57a175b88c7d8b4799750662000248565b4660011480620001db5750466004145b80620001e75750466005145b15620002095750737a250d5630b4cf539739df2c5dacb4c659f2488d62000248565b60405162461bcd60e51b815260206004820152601060248201526f596f75277265206e6f7420426c61646560801b604482015260640160405180910390fd5b6000819050806001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200028c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b29190620004c4565b6001600160a01b031660c0816001600160a01b031681525050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200030a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003309190620004c4565b60c0516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801562000382573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a89190620004c4565b6001600160a01b0390811660a0528116608052600160056000620003d46000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530815260059092529020805490911660011790556200041c3390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6006546040516200046491815260200190565b60405180910390a35050620004f6565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215620004d757600080fd5b81516001600160a01b0381168114620004ef57600080fd5b9392505050565b60805160a05160c051611ed5620005496000396000611a010152600081816104d101528181611691015281816116f1015261178a01526000818161036301528181611a590152611a950152611ed56000f3fe6080604052600436106102765760003560e01c80636ac9a8701161014f578063a9059cbb116100c1578063e122cd551161007a578063e122cd5514610781578063e57f14e114610797578063e6be4a72146107b7578063ecd2cc01146107d7578063f2fde38b146107ed578063fb0ecfa41461080d57600080fd5b8063a9059cbb146106bb578063b29ad50a146106db578063c49b9a80146106f0578063ce831ed514610710578063d2d7ad8314610725578063dd62ed3e1461073b57600080fd5b80638a8c523c116101135780638a8c523c146106285780638da5cb5b1461063d5780638f55833c1461065b57806395d89b41146102bf578063a457c2d71461067b578063a754d3471461069b57600080fd5b80636ac9a8701461059157806370a08231146105b1578063715018a6146105e75780637a416770146105fc57806385141a771461061257600080fd5b80632b14ca56116101e857806349bd5a5e116101ac57806349bd5a5e146104bf5780634a74bb02146104f35780634ada218b146105125780634fbee1931461052c5780635eaa8247146105655780636042f7191461057b57600080fd5b80632b14ca561461042c578063313ce567146104425780633950935114610469578063461d94761461048957806347062402146104a957600080fd5b806316a2f82a1161023a57806316a2f82a1461038557806318160ddd146103a75780631a860c3e146103bc578063220f6696146103dc57806323136371146103f657806323b872dd1461040c57600080fd5b806306ee6ad81461028257806306fdde03146102bf578063095ea7b3146102fd578063161024781461032d5780631694505e1461035157600080fd5b3661027d57005b600080fd5b34801561028e57600080fd5b506002546102a2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102cb57600080fd5b506102f060405180604001604052806005815260200164774149676560d81b81525081565b6040516102b69190611bcb565b34801561030957600080fd5b5061031d610318366004611c35565b61082d565b60405190151581526020016102b6565b34801561033957600080fd5b50610343600c5481565b6040519081526020016102b6565b34801561035d57600080fd5b506102a27f000000000000000000000000000000000000000000000000000000000000000081565b34801561039157600080fd5b506103a56103a0366004611c5f565b610844565b005b3480156103b357600080fd5b50600654610343565b3480156103c857600080fd5b506103a56103d7366004611c5f565b6108aa565b3480156103e857600080fd5b5060125461031d9060ff1681565b34801561040257600080fd5b5061034360085481565b34801561041857600080fd5b5061031d610427366004611c81565b610954565b34801561043857600080fd5b5061034360095481565b34801561044e57600080fd5b50610457601281565b60405160ff90911681526020016102b6565b34801561047557600080fd5b5061031d610484366004611c35565b610a03565b34801561049557600080fd5b506103a56104a4366004611cbd565b610a3a565b3480156104b557600080fd5b5061034360075481565b3480156104cb57600080fd5b506102a27f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ff57600080fd5b5060125461031d90610100900460ff1681565b34801561051e57600080fd5b5060105461031d9060ff1681565b34801561053857600080fd5b5061031d610547366004611c5f565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561057157600080fd5b5061034360115481565b34801561058757600080fd5b50610343600a5481565b34801561059d57600080fd5b506103a56105ac366004611cd6565b610ae0565b3480156105bd57600080fd5b506103436105cc366004611c5f565b6001600160a01b031660009081526003602052604090205490565b3480156105f357600080fd5b506103a5610bc1565b34801561060857600080fd5b50610343600d5481565b34801561061e57600080fd5b506102a261dead81565b34801561063457600080fd5b506103a5610bd5565b34801561064957600080fd5b506000546001600160a01b03166102a2565b34801561066757600080fd5b506103a5610676366004611c5f565b610c84565b34801561068757600080fd5b5061031d610696366004611c35565b610d28565b3480156106a757600080fd5b506001546102a2906001600160a01b031681565b3480156106c757600080fd5b5061031d6106d6366004611c35565b610d5f565b3480156106e757600080fd5b506103a5610d6c565b3480156106fc57600080fd5b506103a561070b366004611d06565b610e18565b34801561071c57600080fd5b506103a5610ebf565b34801561073157600080fd5b50610343600f5481565b34801561074757600080fd5b50610343610756366004611d23565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b34801561078d57600080fd5b50610343600b5481565b3480156107a357600080fd5b506103a56107b2366004611c5f565b610f8c565b3480156107c357600080fd5b506103a56107d2366004611c35565b610fef565b3480156107e357600080fd5b50610343600e5481565b3480156107f957600080fd5b506103a5610808366004611c5f565b61115d565b34801561081957600080fd5b506103a5610828366004611cd6565b6111d6565b600061083a3384846112af565b5060015b92915050565b61084c6113d4565b6001600160a01b0381166000818152600560209081526040808320805460ff191690558051938452908301919091527f09cdf0cfa7a040edd81ed835da9c0da414b3b1bc89788f88ba53288ce596b5fa91015b60405180910390a150565b6108b26113d4565b6001600160a01b0381166109065760405162461bcd60e51b81526020600482015260166024820152757365747374616b696e6757616c6c65743a205a45524f60501b60448201526064015b60405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527fde618dbea217486c1ef5d035b59c9921bffa9e68b2fa51c3375c09adb0a0c8839060200161089f565b6001600160a01b0383166000908152600460209081526040808320338452909152812054828110156109d95760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016108fd565b6109e485858561142e565b6109f885336109f38685611d6c565b6112af565b506001949350505050565b3360008181526004602090815260408083206001600160a01b0387168452909152812054909161083a9185906109f3908690611d7f565b610a426113d4565b68056bc75e2d63100000811015610aab5760405162461bcd60e51b815260206004820152602760248201527f596f75206e65656420746f20656e746572206d6f7265207468616e20313030206044820152663a37b5b2b7399760c91b60648201526084016108fd565b600f8190556040518181527f17339d8f3c3323d3df3b092130f1bedb79d8e20de4d3ff176b316e89be357cbe9060200161089f565b610ae86113d4565b600a821115610b395760405162461bcd60e51b815260206004820181905260248201527f53656c6c204665652063616e6e6f74206265206d6f7265207468616e2031302560448201526064016108fd565b81811115610b7f5760405162461bcd60e51b81526020600482015260136024820152720a4caccd8cac6e8d2dedc40e8dede40d0d2ced606b1b60448201526064016108fd565b6009829055600a8190556040518281527f7d59573ec4acab62b908b5c1cde109eb12273d011506abaa850256636a42d54a906020015b60405180910390a15050565b610bc96113d4565b610bd360006118b9565b565b610bdd6113d4565b60105460ff1615610c305760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642e000000000000000060448201526064016108fd565b6010805460ff191660019081179091556012805461ff0019166101001790556040519081527ff789dd0d6d54bc0d9b7a5955aac4c052f81fb39e63f533a8d4820f6e862c78a39060200160405180910390a1565b610c8c6113d4565b6001600160a01b038116610cda5760405162461bcd60e51b81526020600482015260156024820152747365746465764f707357616c6c65743a205a45524f60581b60448201526064016108fd565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527fdce769d722b2c31674b3b84fa1555e4b669453615df3fab17d0249bbdb3b83929060200161089f565b3360008181526004602090815260408083206001600160a01b0387168452909152812054909161083a9185906109f3908690611d6c565b600061083a33848461142e565b6012805460ff191660011790553060009081526003602052604081205490506000600c54118015610d9f5750600c548110155b15610dd557600c54610db19082611d6c565b600254600c54919250610dcf9130916001600160a01b031690611909565b6000600c555b80600003610de35750610e0c565b610dec816119aa565b6001544790610e04906001600160a01b031682611b36565b50506000600d555b6012805460ff19169055565b610e206113d4565b801515601260019054906101000a900460ff16151503610e765760405162461bcd60e51b815260206004820152601160248201527015985b1d5948185b1c9958591e481cd95d607a1b60448201526064016108fd565b601280548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061089f90831515815260200190565b610ec76113d4565b60015460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610f18576040519150601f19603f3d011682016040523d82523d6000602084013e610f1d565b606091505b505090507fc9946980dc929f521b40f678c5eeae1c213b0c26c005bd48d44905450951166e81604051610f54911515815260200190565b60405180910390a16040518281527ffc3b2917f34bc4fba1516519d275441646d5088542342f58de8eea6a7cb5c2ab90602001610bb5565b610f946113d4565b6001600160a01b038116600081815260056020908152604091829020805460ff191660019081179091558251938452908301527f09cdf0cfa7a040edd81ed835da9c0da414b3b1bc89788f88ba53288ce596b5fa910161089f565b610ff76113d4565b306001600160a01b0383160361106e5760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b60648201526084016108fd565b60015460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905260009184169063a9059cbb906044016020604051808303816000875af11580156110c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e79190611d92565b90507fc9946980dc929f521b40f678c5eeae1c213b0c26c005bd48d44905450951166e8160405161111c911515815260200190565b60405180910390a16040518281527f9717b3559fe85dc5c6941748cdc56fc5ca4e06048d7b836c700c174f78369bef906020015b60405180910390a1505050565b6111656113d4565b6001600160a01b0381166111ca5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108fd565b6111d3816118b9565b50565b6111de6113d4565b600a82111561122f5760405162461bcd60e51b815260206004820152601f60248201527f427579204665652063616e6e6f74206265206d6f7265207468616e203130250060448201526064016108fd565b818111156112755760405162461bcd60e51b81526020600482015260136024820152720a4caccd8cac6e8d2dedc40e8dede40d0d2ced606b1b60448201526064016108fd565b600782905560088190556040518281527fa480a3a15a511fbdc37ae77ae3f490e03ab3688adde11456ce779e6c1e0abaa290602001610bb5565b6001600160a01b0383166113115760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108fd565b6001600160a01b0382166113725760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108fd565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000546001600160a01b03163314610bd35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108fd565b6001600160a01b0383166114925760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108fd565b6001600160a01b0382166114f45760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108fd565b600081116115565760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108fd565b6001600160a01b0383166000908152600360205260409020548111156115cd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108fd565b60105460ff16806115f657506001600160a01b03831660009081526005602052604090205460ff165b8061161957506001600160a01b03821660009081526005602052604090205460ff165b6116655760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c656421000000000000000060448201526064016108fd565b30600090815260036020526040812054600f5460125491929083101591819060ff161580156116c657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b031614155b80156116cf5750825b80156116e25750601254610100900460ff165b156116ef576116ef610d6c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614801561174957506001600160a01b03871660009081526005602052604090205460ff16155b156117885760648560095461175e9190611daf565b6117689190611dc6565b9150600954600a548361177b9190611daf565b6117859190611dc6565b90505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b03161480156117e257506001600160a01b03861660009081526005602052604090205460ff16155b15611821576064856007546117f79190611daf565b6118019190611dc6565b9150600754600854836118149190611daf565b61181e9190611dc6565b90505b61182b8286611d6c565b945081156118a55761183e873084611909565b81600d60008282546118509190611d7f565b9250508190555081600e60008282546118699190611d7f565b909155505080156118a55780600b60008282546118869190611d7f565b9250508190555080600c600082825461189f9190611d7f565b90915550505b6118b0878787611909565b50505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03831660009081526003602052604081208054839290611931908490611d6c565b90915550506001600160a01b0382166000908152600360205260408120805483929061195e908490611d7f565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516113c791815260200190565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106119df576119df611de8565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611a3357611a33611de8565b60200260200101906001600160a01b031690816001600160a01b031681525050611a7e307f0000000000000000000000000000000000000000000000000000000000000000846112af565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790611ad3908590600090869030904290600401611e42565b600060405180830381600087803b158015611aed57600080fd5b505af1158015611b01573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051610bb5929190611e7e565b80600003611b42575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611b8f576040519150601f19603f3d011682016040523d82523d6000602084013e611b94565b606091505b505090507fc9946980dc929f521b40f678c5eeae1c213b0c26c005bd48d44905450951166e81604051611150911515815260200190565b600060208083528351808285015260005b81811015611bf857858101830151858201604001528201611bdc565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611c3057600080fd5b919050565b60008060408385031215611c4857600080fd5b611c5183611c19565b946020939093013593505050565b600060208284031215611c7157600080fd5b611c7a82611c19565b9392505050565b600080600060608486031215611c9657600080fd5b611c9f84611c19565b9250611cad60208501611c19565b9150604084013590509250925092565b600060208284031215611ccf57600080fd5b5035919050565b60008060408385031215611ce957600080fd5b50508035926020909101359150565b80151581146111d357600080fd5b600060208284031215611d1857600080fd5b8135611c7a81611cf8565b60008060408385031215611d3657600080fd5b611d3f83611c19565b9150611d4d60208401611c19565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561083e5761083e611d56565b8082018082111561083e5761083e611d56565b600060208284031215611da457600080fd5b8151611c7a81611cf8565b808202811582820484141761083e5761083e611d56565b600082611de357634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015611e375781516001600160a01b031687529582019590820190600101611e12565b509495945050505050565b85815284602082015260a060408201526000611e6160a0830186611dfe565b6001600160a01b0394909416606083015250608001529392505050565b828152604060208201526000611e976040830184611dfe565b94935050505056fea2646970667358221220f00447377a03cb56245484cb4d69754dc2bbf2286be9f7d417105ce8df9c21ac64736f6c63430008130033

Deployed Bytecode

0x6080604052600436106102765760003560e01c80636ac9a8701161014f578063a9059cbb116100c1578063e122cd551161007a578063e122cd5514610781578063e57f14e114610797578063e6be4a72146107b7578063ecd2cc01146107d7578063f2fde38b146107ed578063fb0ecfa41461080d57600080fd5b8063a9059cbb146106bb578063b29ad50a146106db578063c49b9a80146106f0578063ce831ed514610710578063d2d7ad8314610725578063dd62ed3e1461073b57600080fd5b80638a8c523c116101135780638a8c523c146106285780638da5cb5b1461063d5780638f55833c1461065b57806395d89b41146102bf578063a457c2d71461067b578063a754d3471461069b57600080fd5b80636ac9a8701461059157806370a08231146105b1578063715018a6146105e75780637a416770146105fc57806385141a771461061257600080fd5b80632b14ca56116101e857806349bd5a5e116101ac57806349bd5a5e146104bf5780634a74bb02146104f35780634ada218b146105125780634fbee1931461052c5780635eaa8247146105655780636042f7191461057b57600080fd5b80632b14ca561461042c578063313ce567146104425780633950935114610469578063461d94761461048957806347062402146104a957600080fd5b806316a2f82a1161023a57806316a2f82a1461038557806318160ddd146103a75780631a860c3e146103bc578063220f6696146103dc57806323136371146103f657806323b872dd1461040c57600080fd5b806306ee6ad81461028257806306fdde03146102bf578063095ea7b3146102fd578063161024781461032d5780631694505e1461035157600080fd5b3661027d57005b600080fd5b34801561028e57600080fd5b506002546102a2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102cb57600080fd5b506102f060405180604001604052806005815260200164774149676560d81b81525081565b6040516102b69190611bcb565b34801561030957600080fd5b5061031d610318366004611c35565b61082d565b60405190151581526020016102b6565b34801561033957600080fd5b50610343600c5481565b6040519081526020016102b6565b34801561035d57600080fd5b506102a27f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561039157600080fd5b506103a56103a0366004611c5f565b610844565b005b3480156103b357600080fd5b50600654610343565b3480156103c857600080fd5b506103a56103d7366004611c5f565b6108aa565b3480156103e857600080fd5b5060125461031d9060ff1681565b34801561040257600080fd5b5061034360085481565b34801561041857600080fd5b5061031d610427366004611c81565b610954565b34801561043857600080fd5b5061034360095481565b34801561044e57600080fd5b50610457601281565b60405160ff90911681526020016102b6565b34801561047557600080fd5b5061031d610484366004611c35565b610a03565b34801561049557600080fd5b506103a56104a4366004611cbd565b610a3a565b3480156104b557600080fd5b5061034360075481565b3480156104cb57600080fd5b506102a27f0000000000000000000000000ca9cc2bd7e1c6d40f651a5d05dec015f2b89c8981565b3480156104ff57600080fd5b5060125461031d90610100900460ff1681565b34801561051e57600080fd5b5060105461031d9060ff1681565b34801561053857600080fd5b5061031d610547366004611c5f565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561057157600080fd5b5061034360115481565b34801561058757600080fd5b50610343600a5481565b34801561059d57600080fd5b506103a56105ac366004611cd6565b610ae0565b3480156105bd57600080fd5b506103436105cc366004611c5f565b6001600160a01b031660009081526003602052604090205490565b3480156105f357600080fd5b506103a5610bc1565b34801561060857600080fd5b50610343600d5481565b34801561061e57600080fd5b506102a261dead81565b34801561063457600080fd5b506103a5610bd5565b34801561064957600080fd5b506000546001600160a01b03166102a2565b34801561066757600080fd5b506103a5610676366004611c5f565b610c84565b34801561068757600080fd5b5061031d610696366004611c35565b610d28565b3480156106a757600080fd5b506001546102a2906001600160a01b031681565b3480156106c757600080fd5b5061031d6106d6366004611c35565b610d5f565b3480156106e757600080fd5b506103a5610d6c565b3480156106fc57600080fd5b506103a561070b366004611d06565b610e18565b34801561071c57600080fd5b506103a5610ebf565b34801561073157600080fd5b50610343600f5481565b34801561074757600080fd5b50610343610756366004611d23565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b34801561078d57600080fd5b50610343600b5481565b3480156107a357600080fd5b506103a56107b2366004611c5f565b610f8c565b3480156107c357600080fd5b506103a56107d2366004611c35565b610fef565b3480156107e357600080fd5b50610343600e5481565b3480156107f957600080fd5b506103a5610808366004611c5f565b61115d565b34801561081957600080fd5b506103a5610828366004611cd6565b6111d6565b600061083a3384846112af565b5060015b92915050565b61084c6113d4565b6001600160a01b0381166000818152600560209081526040808320805460ff191690558051938452908301919091527f09cdf0cfa7a040edd81ed835da9c0da414b3b1bc89788f88ba53288ce596b5fa91015b60405180910390a150565b6108b26113d4565b6001600160a01b0381166109065760405162461bcd60e51b81526020600482015260166024820152757365747374616b696e6757616c6c65743a205a45524f60501b60448201526064015b60405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527fde618dbea217486c1ef5d035b59c9921bffa9e68b2fa51c3375c09adb0a0c8839060200161089f565b6001600160a01b0383166000908152600460209081526040808320338452909152812054828110156109d95760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016108fd565b6109e485858561142e565b6109f885336109f38685611d6c565b6112af565b506001949350505050565b3360008181526004602090815260408083206001600160a01b0387168452909152812054909161083a9185906109f3908690611d7f565b610a426113d4565b68056bc75e2d63100000811015610aab5760405162461bcd60e51b815260206004820152602760248201527f596f75206e65656420746f20656e746572206d6f7265207468616e20313030206044820152663a37b5b2b7399760c91b60648201526084016108fd565b600f8190556040518181527f17339d8f3c3323d3df3b092130f1bedb79d8e20de4d3ff176b316e89be357cbe9060200161089f565b610ae86113d4565b600a821115610b395760405162461bcd60e51b815260206004820181905260248201527f53656c6c204665652063616e6e6f74206265206d6f7265207468616e2031302560448201526064016108fd565b81811115610b7f5760405162461bcd60e51b81526020600482015260136024820152720a4caccd8cac6e8d2dedc40e8dede40d0d2ced606b1b60448201526064016108fd565b6009829055600a8190556040518281527f7d59573ec4acab62b908b5c1cde109eb12273d011506abaa850256636a42d54a906020015b60405180910390a15050565b610bc96113d4565b610bd360006118b9565b565b610bdd6113d4565b60105460ff1615610c305760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642e000000000000000060448201526064016108fd565b6010805460ff191660019081179091556012805461ff0019166101001790556040519081527ff789dd0d6d54bc0d9b7a5955aac4c052f81fb39e63f533a8d4820f6e862c78a39060200160405180910390a1565b610c8c6113d4565b6001600160a01b038116610cda5760405162461bcd60e51b81526020600482015260156024820152747365746465764f707357616c6c65743a205a45524f60581b60448201526064016108fd565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527fdce769d722b2c31674b3b84fa1555e4b669453615df3fab17d0249bbdb3b83929060200161089f565b3360008181526004602090815260408083206001600160a01b0387168452909152812054909161083a9185906109f3908690611d6c565b600061083a33848461142e565b6012805460ff191660011790553060009081526003602052604081205490506000600c54118015610d9f5750600c548110155b15610dd557600c54610db19082611d6c565b600254600c54919250610dcf9130916001600160a01b031690611909565b6000600c555b80600003610de35750610e0c565b610dec816119aa565b6001544790610e04906001600160a01b031682611b36565b50506000600d555b6012805460ff19169055565b610e206113d4565b801515601260019054906101000a900460ff16151503610e765760405162461bcd60e51b815260206004820152601160248201527015985b1d5948185b1c9958591e481cd95d607a1b60448201526064016108fd565b601280548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061089f90831515815260200190565b610ec76113d4565b60015460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610f18576040519150601f19603f3d011682016040523d82523d6000602084013e610f1d565b606091505b505090507fc9946980dc929f521b40f678c5eeae1c213b0c26c005bd48d44905450951166e81604051610f54911515815260200190565b60405180910390a16040518281527ffc3b2917f34bc4fba1516519d275441646d5088542342f58de8eea6a7cb5c2ab90602001610bb5565b610f946113d4565b6001600160a01b038116600081815260056020908152604091829020805460ff191660019081179091558251938452908301527f09cdf0cfa7a040edd81ed835da9c0da414b3b1bc89788f88ba53288ce596b5fa910161089f565b610ff76113d4565b306001600160a01b0383160361106e5760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b60648201526084016108fd565b60015460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905260009184169063a9059cbb906044016020604051808303816000875af11580156110c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e79190611d92565b90507fc9946980dc929f521b40f678c5eeae1c213b0c26c005bd48d44905450951166e8160405161111c911515815260200190565b60405180910390a16040518281527f9717b3559fe85dc5c6941748cdc56fc5ca4e06048d7b836c700c174f78369bef906020015b60405180910390a1505050565b6111656113d4565b6001600160a01b0381166111ca5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108fd565b6111d3816118b9565b50565b6111de6113d4565b600a82111561122f5760405162461bcd60e51b815260206004820152601f60248201527f427579204665652063616e6e6f74206265206d6f7265207468616e203130250060448201526064016108fd565b818111156112755760405162461bcd60e51b81526020600482015260136024820152720a4caccd8cac6e8d2dedc40e8dede40d0d2ced606b1b60448201526064016108fd565b600782905560088190556040518281527fa480a3a15a511fbdc37ae77ae3f490e03ab3688adde11456ce779e6c1e0abaa290602001610bb5565b6001600160a01b0383166113115760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108fd565b6001600160a01b0382166113725760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108fd565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000546001600160a01b03163314610bd35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108fd565b6001600160a01b0383166114925760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108fd565b6001600160a01b0382166114f45760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108fd565b600081116115565760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108fd565b6001600160a01b0383166000908152600360205260409020548111156115cd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108fd565b60105460ff16806115f657506001600160a01b03831660009081526005602052604090205460ff165b8061161957506001600160a01b03821660009081526005602052604090205460ff165b6116655760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c656421000000000000000060448201526064016108fd565b30600090815260036020526040812054600f5460125491929083101591819060ff161580156116c657507f0000000000000000000000000ca9cc2bd7e1c6d40f651a5d05dec015f2b89c896001600160a01b0316876001600160a01b031614155b80156116cf5750825b80156116e25750601254610100900460ff165b156116ef576116ef610d6c565b7f0000000000000000000000000ca9cc2bd7e1c6d40f651a5d05dec015f2b89c896001600160a01b0316866001600160a01b031614801561174957506001600160a01b03871660009081526005602052604090205460ff16155b156117885760648560095461175e9190611daf565b6117689190611dc6565b9150600954600a548361177b9190611daf565b6117859190611dc6565b90505b7f0000000000000000000000000ca9cc2bd7e1c6d40f651a5d05dec015f2b89c896001600160a01b0316876001600160a01b03161480156117e257506001600160a01b03861660009081526005602052604090205460ff16155b15611821576064856007546117f79190611daf565b6118019190611dc6565b9150600754600854836118149190611daf565b61181e9190611dc6565b90505b61182b8286611d6c565b945081156118a55761183e873084611909565b81600d60008282546118509190611d7f565b9250508190555081600e60008282546118699190611d7f565b909155505080156118a55780600b60008282546118869190611d7f565b9250508190555080600c600082825461189f9190611d7f565b90915550505b6118b0878787611909565b50505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03831660009081526003602052604081208054839290611931908490611d6c565b90915550506001600160a01b0382166000908152600360205260408120805483929061195e908490611d7f565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516113c791815260200190565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106119df576119df611de8565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611a3357611a33611de8565b60200260200101906001600160a01b031690816001600160a01b031681525050611a7e307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846112af565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790611ad3908590600090869030904290600401611e42565b600060405180830381600087803b158015611aed57600080fd5b505af1158015611b01573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051610bb5929190611e7e565b80600003611b42575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611b8f576040519150601f19603f3d011682016040523d82523d6000602084013e611b94565b606091505b505090507fc9946980dc929f521b40f678c5eeae1c213b0c26c005bd48d44905450951166e81604051611150911515815260200190565b600060208083528351808285015260005b81811015611bf857858101830151858201604001528201611bdc565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611c3057600080fd5b919050565b60008060408385031215611c4857600080fd5b611c5183611c19565b946020939093013593505050565b600060208284031215611c7157600080fd5b611c7a82611c19565b9392505050565b600080600060608486031215611c9657600080fd5b611c9f84611c19565b9250611cad60208501611c19565b9150604084013590509250925092565b600060208284031215611ccf57600080fd5b5035919050565b60008060408385031215611ce957600080fd5b50508035926020909101359150565b80151581146111d357600080fd5b600060208284031215611d1857600080fd5b8135611c7a81611cf8565b60008060408385031215611d3657600080fd5b611d3f83611c19565b9150611d4d60208401611c19565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561083e5761083e611d56565b8082018082111561083e5761083e611d56565b600060208284031215611da457600080fd5b8151611c7a81611cf8565b808202811582820484141761083e5761083e611d56565b600082611de357634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015611e375781516001600160a01b031687529582019590820190600101611e12565b509495945050505050565b85815284602082015260a060408201526000611e6160a0830186611dfe565b6001600160a01b0394909416606083015250608001529392505050565b828152604060208201526000611e976040830184611dfe565b94935050505056fea2646970667358221220f00447377a03cb56245484cb4d69754dc2bbf2286be9f7d417105ce8df9c21ac64736f6c63430008130033

Deployed Bytecode Sourcemap

22897:16325:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23138:99;;;;;;;;;;-1:-1:-1;23138:99:0;;;;-1:-1:-1;;;;;23138:99:0;;;;;;-1:-1:-1;;;;;194:32:1;;;176:51;;164:2;149:18;23138:99:0;;;;;;;;24571:37;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24571:37:0;;;;;;;;;;;;:::i;28463:186::-;;;;;;;;;;-1:-1:-1;28463:186:0;;;;;:::i;:::-;;:::i;:::-;;;1393:14:1;;1386:22;1368:41;;1356:2;1341:18;28463:186:0;1228:187:1;24915:31:0;;;;;;;;;;;;;;;;;;;1566:25:1;;;1554:2;1539:18;24915:31:0;1420:177:1;25319:51:0;;;;;;;;;;;;;;;34873:159;;;;;;;;;;-1:-1:-1;34873:159:0;;;;;:::i;:::-;;:::i;:::-;;27733:95;;;;;;;;;;-1:-1:-1;27813:7:0;;27733:95;;36017:252;;;;;;;;;;-1:-1:-1;36017:252:0;;;;;:::i;:::-;;:::i;25509:28::-;;;;;;;;;;-1:-1:-1;25509:28:0;;;;;;;;24757:32;;;;;;;;;;;;;;;;28694:478;;;;;;;;;;-1:-1:-1;28694:478:0;;;;;:::i;:::-;;:::i;24796:26::-;;;;;;;;;;;;;;;;24661:35;;;;;;;;;;;;24694:2;24661:35;;;;;2533:4:1;2521:17;;;2503:36;;2491:2;2476:18;24661:35:0;2361:184:1;29222:290:0;;;;;;;;;;-1:-1:-1;29222:290:0;;;;;:::i;:::-;;:::i;35077:360::-;;;;;;;;;;-1:-1:-1;35077:360:0;;;;;:::i;:::-;;:::i;24728:22::-;;;;;;;;;;;;;;;;25377:38;;;;;;;;;;;;;;;25544:41;;;;;;;;;;-1:-1:-1;25544:41:0;;;;;;;;;;;25168:26;;;;;;;;;;-1:-1:-1;25168:26:0;;;;;;;;34454:128;;;;;;;;;;-1:-1:-1;34454:128:0;;;;;:::i;:::-;-1:-1:-1;;;;;34546:28:0;34522:4;34546:28;;;:19;:28;;;;;;;;;34454:128;25245:29;;;;;;;;;;;;;;;;24829:33;;;;;;;;;;;;;;;;36647:372;;;;;;;;;;-1:-1:-1;36647:372:0;;;;;:::i;:::-;;:::i;27836:117::-;;;;;;;;;;-1:-1:-1;27836:117:0;;;;;:::i;:::-;-1:-1:-1;;;;;27929:16:0;27902:7;27929:16;;;:7;:16;;;;;;;27836:117;13017:103;;;;;;;;;;;;;:::i;24953:40::-;;;;;;;;;;;;;;;;23283:88;;;;;;;;;;;;23329:42;23283:88;;38997:222;;;;;;;;;;;;;:::i;12369:87::-;;;;;;;;;;-1:-1:-1;12415:7:0;12442:6;-1:-1:-1;;;;;12442:6:0;12369:87;;35735:244;;;;;;;;;;-1:-1:-1;35735:244:0;;;;;:::i;:::-;;:::i;29562:300::-;;;;;;;;;;-1:-1:-1;29562:300:0;;;;;:::i;:::-;;:::i;23033:98::-;;;;;;;;;;-1:-1:-1;23033:98:0;;;;-1:-1:-1;;;;;23033:98:0;;;28003:192;;;;;;;;;;-1:-1:-1;28003:192:0;;;;;:::i;:::-;;:::i;32622:669::-;;;;;;;;;;;;;:::i;35445:247::-;;;;;;;;;;-1:-1:-1;35445:247:0;;;;;:::i;:::-;;:::i;38183:263::-;;;;;;;;;;;;;:::i;25056:53::-;;;;;;;;;;;;;;;;28245:170;;;;;;;;;;-1:-1:-1;28245:170:0;;;;;:::i;:::-;-1:-1:-1;;;;;28379:19:0;;;28352:7;28379:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;28245:170;24871:37;;;;;;;;;;;;;;;;34670:159;;;;;;;;;;-1:-1:-1;34670:159:0;;;;;:::i;:::-;;:::i;38523:424::-;;;;;;;;;;-1:-1:-1;38523:424:0;;;;;:::i;:::-;;:::i;25002:45::-;;;;;;;;;;;;;;;;13275:238;;;;;;;;;;-1:-1:-1;13275:238:0;;;;;:::i;:::-;;:::i;36277:362::-;;;;;;;;;;-1:-1:-1;36277:362:0;;;;;:::i;:::-;;:::i;28463:186::-;28563:4;28580:39;180:10;28603:7;28612:6;28580:8;:39::i;:::-;-1:-1:-1;28637:4:0;28463:186;;;;;:::o;34873:159::-;12255:13;:11;:13::i;:::-;-1:-1:-1;;;;;34943:28:0;::::1;34974:5;34943:28:::0;;;:19:::1;:28;::::0;;;;;;;:36;;-1:-1:-1;;34943:36:0::1;::::0;;34995:29;;3998:51:1;;;4065:18;;;4058:50;;;;34995:29:0::1;::::0;3971:18:1;34995:29:0::1;;;;;;;;34873:159:::0;:::o;36017:252::-;12255:13;:11;:13::i;:::-;-1:-1:-1;;;;;36105:28:0;::::1;36097:63;;;::::0;-1:-1:-1;;;36097:63:0;;4321:2:1;36097:63:0::1;::::0;::::1;4303:21:1::0;4360:2;4340:18;;;4333:30;-1:-1:-1;;;4379:18:1;;;4372:52;4441:18;;36097:63:0::1;;;;;;;;;36171:13;:39:::0;;-1:-1:-1;;;;;;36171:39:0::1;-1:-1:-1::0;;;;;36171:39:0;::::1;::::0;;::::1;::::0;;;36226:35:::1;::::0;176:51:1;;;36226:35:0::1;::::0;164:2:1;149:18;36226:35:0::1;14:219:1::0;28694:478:0;-1:-1:-1;;;;;28867:19:0;;28826:4;28867:19;;;:11;:19;;;;;;;;180:10;28867:33;;;;;;;;28933:26;;;;28911:116;;;;-1:-1:-1;;;28911:116:0;;4672:2:1;28911:116:0;;;4654:21:1;4711:2;4691:18;;;4684:30;4750:34;4730:18;;;4723:62;-1:-1:-1;;;4801:18:1;;;4794:38;4849:19;;28911:116:0;4470:404:1;28911:116:0;29038:36;29048:6;29056:9;29067:6;29038:9;:36::i;:::-;29085:57;29094:6;180:10;29116:25;29135:6;29116:16;:25;:::i;:::-;29085:8;:57::i;:::-;-1:-1:-1;29160:4:0;;28694:478;-1:-1:-1;;;;28694:478:0:o;29222:290::-;180:10;29335:4;29424:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;29424:34:0;;;;;;;;;;29335:4;;29352:130;;29402:7;;29424:47;;29461:10;;29424:47;:::i;35077:360::-;12255:13;:11;:13::i;:::-;35232:9:::1;35204:24;:37;;35182:126;;;::::0;-1:-1:-1;;;35182:126:0;;5476:2:1;35182:126:0::1;::::0;::::1;5458:21:1::0;5515:2;5495:18;;;5488:30;5554:34;5534:18;;;5527:62;-1:-1:-1;;;5605:18:1;;;5598:37;5652:19;;35182:126:0::1;5274:403:1::0;35182:126:0::1;35319:23;:50:::0;;;35385:44:::1;::::0;1566:25:1;;;35385:44:0::1;::::0;1554:2:1;1539:18;35385:44:0::1;1420:177:1::0;36647:372:0;12255:13;:11;:13::i;:::-;36784:2:::1;36772:8;:14;;36764:59;;;::::0;-1:-1:-1;;;36764:59:0;;5884:2:1;36764:59:0::1;::::0;::::1;5866:21:1::0;;;5903:18;;;5896:30;5962:34;5942:18;;;5935:62;6014:18;;36764:59:0::1;5682:356:1::0;36764:59:0::1;36863:8;36842:17;:29;;36834:61;;;::::0;-1:-1:-1;;;36834:61:0;;6245:2:1;36834:61:0::1;::::0;::::1;6227:21:1::0;6284:2;6264:18;;;6257:30;-1:-1:-1;;;6303:18:1;;;6296:49;6362:18;;36834:61:0::1;6043:343:1::0;36834:61:0::1;36906:7;:18:::0;;;36935:17:::1;:37:::0;;;36988:23:::1;::::0;1566:25:1;;;36988:23:0::1;::::0;1554:2:1;1539:18;36988:23:0::1;;;;;;;;36647:372:::0;;:::o;13017:103::-;12255:13;:11;:13::i;:::-;13082:30:::1;13109:1;13082:18;:30::i;:::-;13017:103::o:0;38997:222::-;12255:13;:11;:13::i;:::-;39061:14:::1;::::0;::::1;;39060:15;39052:52;;;::::0;-1:-1:-1;;;39052:52:0;;6593:2:1;39052:52:0::1;::::0;::::1;6575:21:1::0;6632:2;6612:18;;;6605:30;6671:26;6651:18;;;6644:54;6715:18;;39052:52:0::1;6391:348:1::0;39052:52:0::1;39115:14;:21:::0;;-1:-1:-1;;39115:21:0::1;39132:4;39115:21:::0;;::::1;::::0;;;39147::::1;:28:::0;;-1:-1:-1;;39147:28:0::1;39115:21;39147:28;::::0;;39191:20:::1;::::0;1368:41:1;;;39191:20:0::1;::::0;1356:2:1;1341:18;39191:20:0::1;;;;;;;38997:222::o:0;35735:244::-;12255:13;:11;:13::i;:::-;-1:-1:-1;;;;;35821:27:0;::::1;35813:61;;;::::0;-1:-1:-1;;;35813:61:0;;6946:2:1;35813:61:0::1;::::0;::::1;6928:21:1::0;6985:2;6965:18;;;6958:30;-1:-1:-1;;;7004:18:1;;;6997:51;7065:18;;35813:61:0::1;6744:345:1::0;35813:61:0::1;35885:12;:37:::0;;-1:-1:-1;;;;;;35885:37:0::1;-1:-1:-1::0;;;;;35885:37:0;::::1;::::0;;::::1;::::0;;;35938:33:::1;::::0;176:51:1;;;35938:33:0::1;::::0;164:2:1;149:18;35938:33:0::1;14:219:1::0;29562:300:0;180:10;29680:4;29769:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;29769:34:0;;;;;;;;;;29680:4;;29697:135;;29747:7;;29769:52;;29806:15;;29769:52;:::i;28003:192::-;28106:4;28123:42;180:10;28147:9;28158:6;28123:9;:42::i;32622:669::-;25628:16;:23;;-1:-1:-1;;25628:23:0;25647:4;25628:23;;;32718:4:::1;-1:-1:-1::0;27929:16:0;;;:7;:16;;;;;;32678:46:::1;;32802:1;32780:19;;:23;:61;;;;;32822:19;;32807:11;:34;;32780:61;32776:246;;;32873:19;::::0;32858:34:::1;::::0;;::::1;:::i;:::-;32937:13;::::0;32952:19:::1;::::0;32858:34;;-1:-1:-1;32907:65:0::1;::::0;32930:4:::1;::::0;-1:-1:-1;;;;;32937:13:0::1;::::0;32907:14:::1;:65::i;:::-;33009:1;32987:19;:23:::0;32776:246:::1;33036:11;33051:1;33036:16:::0;33032:29:::1;;33054:7;;;33032:29;33109;33126:11;33109:16;:29::i;:::-;33220:12;::::0;33167:21:::1;::::0;33199:46:::1;::::0;-1:-1:-1;;;;;33220:12:0::1;33167:21:::0;33199:20:::1;:46::i;:::-;-1:-1:-1::0;;33282:1:0::1;33258:21;:25:::0;25662:1:::1;25674:16:::0;:24;;-1:-1:-1;;25674:24:0;;;32622:669::o;35445:247::-;12255:13;:11;:13::i;:::-;35557:8:::1;35532:33;;:21;;;;;;;;;;;:33;;::::0;35524:63:::1;;;::::0;-1:-1:-1;;;35524:63:0;;7296:2:1;35524:63:0::1;::::0;::::1;7278:21:1::0;7335:2;7315:18;;;7308:30;-1:-1:-1;;;7354:18:1;;;7347:47;7411:18;;35524:63:0::1;7094:341:1::0;35524:63:0::1;35598:21;:32:::0;;;::::1;;;;-1:-1:-1::0;;35598:32:0;;::::1;;::::0;;35646:38:::1;::::0;::::1;::::0;::::1;::::0;35622:8;1393:14:1;1386:22;1368:41;;1356:2;1341:18;;1228:187;38183:263:0;12255:13;:11;:13::i;:::-;38321:12:::1;::::0;38313:49:::1;::::0;38265:21:::1;::::0;38247:15:::1;::::0;-1:-1:-1;;;;;38321:12:0;;::::1;::::0;38265:21;;38247:15;38313:49;38247:15;38313:49;38265:21;38321:12;38313:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38297:65;;;38378:20;38393:4;38378:20;;;;1393:14:1::0;1386:22;1368:41;;1356:2;1341:18;;1228:187;38378:20:0::1;;;;;;;;38414:24;::::0;1566:25:1;;;38414:24:0::1;::::0;1554:2:1;1539:18;38414:24:0::1;1420:177:1::0;34670:159:0;12255:13;:11;:13::i;:::-;-1:-1:-1;;;;;34742:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:35;;-1:-1:-1;;34742:35:0::1;34773:4;34742:35:::0;;::::1;::::0;;;34793:28;;3998:51:1;;;4065:18;;;4058:50;34793:28:0::1;::::0;3971:18:1;34793:28:0::1;3830:284:1::0;38523:424:0;12255:13;:11;:13::i;:::-;38700:4:::1;-1:-1:-1::0;;;;;38675:30:0;::::1;::::0;38653:134:::1;;;::::0;-1:-1:-1;;;38653:134:0;;7852:2:1;38653:134:0::1;::::0;::::1;7834:21:1::0;7891:2;7871:18;;;7864:30;7930:34;7910:18;;;7903:62;-1:-1:-1;;;7981:18:1;;;7974:52;8043:19;;38653:134:0::1;7650:418:1::0;38653:134:0::1;38841:12;::::0;38810:53:::1;::::0;-1:-1:-1;;;38810:53:0;;-1:-1:-1;;;;;38841:12:0;;::::1;38810:53;::::0;::::1;8255:51:1::0;8322:18;;;8315:34;;;38798:9:0::1;::::0;38810:30;::::1;::::0;::::1;::::0;8228:18:1;;38810:53:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38798:65;;38879:20;38894:4;38879:20;;;;1393:14:1::0;1386:22;1368:41;;1356:2;1341:18;;1228:187;38879:20:0::1;;;;;;;;38915:24;::::0;1566:25:1;;;38915:24:0::1;::::0;1554:2:1;1539:18;38915:24:0::1;;;;;;;;38642:305;38523:424:::0;;:::o;13275:238::-;12255:13;:11;:13::i;:::-;-1:-1:-1;;;;;13378:22:0;::::1;13356:110;;;::::0;-1:-1:-1;;;13356:110:0;;8812:2:1;13356:110:0::1;::::0;::::1;8794:21:1::0;8851:2;8831:18;;;8824:30;8890:34;8870:18;;;8863:62;-1:-1:-1;;;8941:18:1;;;8934:36;8987:19;;13356:110:0::1;8610:402:1::0;13356:110:0::1;13477:28;13496:8;13477:18;:28::i;:::-;13275:238:::0;:::o;36277:362::-;12255:13;:11;:13::i;:::-;36411:2:::1;36400:7;:13;;36392:57;;;::::0;-1:-1:-1;;;36392:57:0;;9219:2:1;36392:57:0::1;::::0;::::1;9201:21:1::0;9258:2;9238:18;;;9231:30;9297:33;9277:18;;;9270:61;9348:18;;36392:57:0::1;9017:355:1::0;36392:57:0::1;36489:7;36468:17;:28;;36460:60;;;::::0;-1:-1:-1;;;36460:60:0;;6245:2:1;36460:60:0::1;::::0;::::1;6227:21:1::0;6284:2;6264:18;;;6257:30;-1:-1:-1;;;6303:18:1;;;6296:49;6362:18;;36460:60:0::1;6043:343:1::0;36460:60:0::1;36531:6;:16:::0;;;36558::::1;:36:::0;;;36610:21:::1;::::0;1566:25:1;;;36610:21:0::1;::::0;1554:2:1;1539:18;36610:21:0::1;1420:177:1::0;29894:341:0;-1:-1:-1;;;;;29988:20:0;;29980:69;;;;-1:-1:-1;;;29980:69:0;;9579:2:1;29980:69:0;;;9561:21:1;9618:2;9598:18;;;9591:30;9657:34;9637:18;;;9630:62;-1:-1:-1;;;9708:18:1;;;9701:34;9752:19;;29980:69:0;9377:400:1;29980:69:0;-1:-1:-1;;;;;30068:21:0;;30060:68;;;;-1:-1:-1;;;30060:68:0;;9984:2:1;30060:68:0;;;9966:21:1;10023:2;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;-1:-1:-1;;;10113:18:1;;;10106:32;10155:19;;30060:68:0;9782:398:1;30060:68:0;-1:-1:-1;;;;;30141:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;30194:33;;1566:25:1;;;30194:33:0;;1539:18:1;30194:33:0;;;;;;;;29894:341;;;:::o;12534:132::-;12415:7;12442:6;-1:-1:-1;;;;;12442:6:0;180:10;12598:23;12590:68;;;;-1:-1:-1;;;12590:68:0;;10387:2:1;12590:68:0;;;10369:21:1;;;10406:18;;;10399:30;10465:34;10445:18;;;10438:62;10517:18;;12590:68:0;10185:356:1;30368:2019:0;-1:-1:-1;;;;;30456:18:0;;30448:68;;;;-1:-1:-1;;;30448:68:0;;10748:2:1;30448:68:0;;;10730:21:1;10787:2;10767:18;;;10760:30;10826:34;10806:18;;;10799:62;-1:-1:-1;;;10877:18:1;;;10870:35;10922:19;;30448:68:0;10546:401:1;30448:68:0;-1:-1:-1;;;;;30535:16:0;;30527:64;;;;-1:-1:-1;;;30527:64:0;;11154:2:1;30527:64:0;;;11136:21:1;11193:2;11173:18;;;11166:30;11232:34;11212:18;;;11205:62;-1:-1:-1;;;11283:18:1;;;11276:33;11326:19;;30527:64:0;10952:399:1;30527:64:0;30619:1;30610:6;:10;30602:64;;;;-1:-1:-1;;;30602:64:0;;11558:2:1;30602:64:0;;;11540:21:1;11597:2;11577:18;;;11570:30;11636:34;11616:18;;;11609:62;-1:-1:-1;;;11687:18:1;;;11680:39;11736:19;;30602:64:0;11356:405:1;30602:64:0;-1:-1:-1;;;;;30699:13:0;;;;;;:7;:13;;;;;;:23;-1:-1:-1;30699:23:0;30677:111;;;;-1:-1:-1;;;30677:111:0;;11968:2:1;30677:111:0;;;11950:21:1;12007:2;11987:18;;;11980:30;12046:34;12026:18;;;12019:62;-1:-1:-1;;;12097:18:1;;;12090:36;12143:19;;30677:111:0;11766:402:1;30677:111:0;30862:14;;;;;:60;;-1:-1:-1;;;;;;30897:25:0;;;;;;:19;:25;;;;;;;;30862:60;:104;;;-1:-1:-1;;;;;;30943:23:0;;;;;;:19;:23;;;;;;;;30862:104;30840:178;;;;-1:-1:-1;;;30840:178:0;;12375:2:1;30840:178:0;;;12357:21:1;12414:2;12394:18;;;12387:30;12453:26;12433:18;;;12426:54;12497:18;;30840:178:0;12173:348:1;30840:178:0;31124:4;31075:28;27929:16;;;:7;:16;;;;;;31209:23;;31403:16;;27929;;31172:60;;;;;31075:28;;31403:16;;31402:17;:55;;;;;31444:13;-1:-1:-1;;;;;31436:21:0;:4;-1:-1:-1;;;;;31436:21:0;;;31402:55;:95;;;;;31474:23;31402:95;:133;;;;-1:-1:-1;31514:21:0;;;;;;;31402:133;31384:206;;;31562:16;:14;:16::i;:::-;31610:13;-1:-1:-1;;;;;31604:19:0;:2;-1:-1:-1;;;;;31604:19:0;;:49;;;;-1:-1:-1;;;;;;31628:25:0;;;;;;:19;:25;;;;;;;;31627:26;31604:49;31600:178;;;31697:3;31687:6;31677:7;;:16;;;;:::i;:::-;31676:24;;;;:::i;:::-;31670:30;;31759:7;;31738:17;;31732:3;:23;;;;:::i;:::-;31731:35;;;;:::i;:::-;31715:51;;31600:178;31800:13;-1:-1:-1;;;;;31792:21:0;:4;-1:-1:-1;;;;;31792:21:0;;:49;;;;-1:-1:-1;;;;;;31818:23:0;;;;;;:19;:23;;;;;;;;31817:24;31792:49;31788:175;;;31884:3;31874:6;31865;;:15;;;;:::i;:::-;31864:23;;;;:::i;:::-;31858:29;;31945:6;;31925:16;;31919:3;:22;;;;:::i;:::-;31918:33;;;;:::i;:::-;31902:49;;31788:175;31973:13;31983:3;31973:13;;:::i;:::-;;-1:-1:-1;32001:7:0;;31997:340;;32025:40;32040:4;32054;32061:3;32025:14;:40::i;:::-;32105:3;32080:21;;:28;;;;;;;:::i;:::-;;;;;;;;32153:3;32123:26;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;32175:17:0;;32171:155;;32242:13;32213:25;;:42;;;;;;;:::i;:::-;;;;;;;;32297:13;32274:19;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;32171:155:0;32347:32;32362:4;32368:2;32372:6;32347:14;:32::i;:::-;30437:1950;;;;30368:2019;;;:::o;13673:191::-;13747:16;13766:6;;-1:-1:-1;;;;;13783:17:0;;;-1:-1:-1;;;;;;13783:17:0;;;;;;13816:40;;13766:6;;;;;;;13816:40;;13747:16;13816:40;13736:128;13673:191;:::o;34193:253::-;-1:-1:-1;;;;;34321:15:0;;;;;;:7;:15;;;;;:25;;34340:6;;34321:15;:25;;34340:6;;34321:25;:::i;:::-;;;;-1:-1:-1;;;;;;;34357:18:0;;;;;;:7;:18;;;;;:28;;34379:6;;34357:18;:28;;34379:6;;34357:28;:::i;:::-;;;;;;;;34420:9;-1:-1:-1;;;;;34403:35:0;34412:6;-1:-1:-1;;;;;34403:35:0;;34431:6;34403:35;;;;1566:25:1;;1554:2;1539:18;;1420:177;33419:638:0;33569:16;;;33583:1;33569:16;;;;;;;;33545:21;;33569:16;;;;;;;;;;-1:-1:-1;33569:16:0;33545:40;;33614:4;33596;33601:1;33596:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;33596:23:0;;;-1:-1:-1;;;;;33596:23:0;;;;;33640:4;33630;33635:1;33630:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;33630:14:0;;;-1:-1:-1;;;;;33630:14:0;;;;;33655:62;33672:4;33687:15;33705:11;33655:8;:62::i;:::-;33756:240;;-1:-1:-1;;;33756:240:0;;-1:-1:-1;;;;;33756:15:0;:66;;;;:240;;33837:11;;33863:1;;33907:4;;33934;;33970:15;;33756:240;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34014:35;34031:11;34044:4;34014:35;;;;;;;:::i;37027:244::-;37148:6;37158:1;37148:11;37144:24;;37027:244;;:::o;37144:24::-;37179:9;37194;-1:-1:-1;;;;;37194:14:0;37216:6;37194:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37178:49;;;37243:20;37258:4;37243:20;;;;1393:14:1;1386:22;1368:41;;1356:2;1341:18;;1228:187;238:548;350:4;379:2;408;397:9;390:21;440:6;434:13;483:6;478:2;467:9;463:18;456:34;508:1;518:140;532:6;529:1;526:13;518:140;;;627:14;;;623:23;;617:30;593:17;;;612:2;589:26;582:66;547:10;;518:140;;;522:3;707:1;702:2;693:6;682:9;678:22;674:31;667:42;777:2;770;766:7;761:2;753:6;749:15;745:29;734:9;730:45;726:54;718:62;;;;238:548;;;;:::o;791:173::-;859:20;;-1:-1:-1;;;;;908:31:1;;898:42;;888:70;;954:1;951;944:12;888:70;791:173;;;:::o;969:254::-;1037:6;1045;1098:2;1086:9;1077:7;1073:23;1069:32;1066:52;;;1114:1;1111;1104:12;1066:52;1137:29;1156:9;1137:29;:::i;:::-;1127:39;1213:2;1198:18;;;;1185:32;;-1:-1:-1;;;969:254:1:o;1837:186::-;1896:6;1949:2;1937:9;1928:7;1924:23;1920:32;1917:52;;;1965:1;1962;1955:12;1917:52;1988:29;2007:9;1988:29;:::i;:::-;1978:39;1837:186;-1:-1:-1;;;1837:186:1:o;2028:328::-;2105:6;2113;2121;2174:2;2162:9;2153:7;2149:23;2145:32;2142:52;;;2190:1;2187;2180:12;2142:52;2213:29;2232:9;2213:29;:::i;:::-;2203:39;;2261:38;2295:2;2284:9;2280:18;2261:38;:::i;:::-;2251:48;;2346:2;2335:9;2331:18;2318:32;2308:42;;2028:328;;;;;:::o;2550:180::-;2609:6;2662:2;2650:9;2641:7;2637:23;2633:32;2630:52;;;2678:1;2675;2668:12;2630:52;-1:-1:-1;2701:23:1;;2550:180;-1:-1:-1;2550:180:1:o;2943:248::-;3011:6;3019;3072:2;3060:9;3051:7;3047:23;3043:32;3040:52;;;3088:1;3085;3078:12;3040:52;-1:-1:-1;;3111:23:1;;;3181:2;3166:18;;;3153:32;;-1:-1:-1;2943:248:1:o;3196:118::-;3282:5;3275:13;3268:21;3261:5;3258:32;3248:60;;3304:1;3301;3294:12;3319:241;3375:6;3428:2;3416:9;3407:7;3403:23;3399:32;3396:52;;;3444:1;3441;3434:12;3396:52;3483:9;3470:23;3502:28;3524:5;3502:28;:::i;3565:260::-;3633:6;3641;3694:2;3682:9;3673:7;3669:23;3665:32;3662:52;;;3710:1;3707;3700:12;3662:52;3733:29;3752:9;3733:29;:::i;:::-;3723:39;;3781:38;3815:2;3804:9;3800:18;3781:38;:::i;:::-;3771:48;;3565:260;;;;;:::o;4879:127::-;4940:10;4935:3;4931:20;4928:1;4921:31;4971:4;4968:1;4961:15;4995:4;4992:1;4985:15;5011:128;5078:9;;;5099:11;;;5096:37;;;5113:18;;:::i;5144:125::-;5209:9;;;5230:10;;;5227:36;;;5243:18;;:::i;8360:245::-;8427:6;8480:2;8468:9;8459:7;8455:23;8451:32;8448:52;;;8496:1;8493;8486:12;8448:52;8528:9;8522:16;8547:28;8569:5;8547:28;:::i;12526:168::-;12599:9;;;12630;;12647:15;;;12641:22;;12627:37;12617:71;;12668:18;;:::i;12699:217::-;12739:1;12765;12755:132;;12809:10;12804:3;12800:20;12797:1;12790:31;12844:4;12841:1;12834:15;12872:4;12869:1;12862:15;12755:132;-1:-1:-1;12901:9:1;;12699:217::o;13053:127::-;13114:10;13109:3;13105:20;13102:1;13095:31;13145:4;13142:1;13135:15;13169:4;13166:1;13159:15;13185:461;13238:3;13276:5;13270:12;13303:6;13298:3;13291:19;13329:4;13358:2;13353:3;13349:12;13342:19;;13395:2;13388:5;13384:14;13416:1;13426:195;13440:6;13437:1;13434:13;13426:195;;;13505:13;;-1:-1:-1;;;;;13501:39:1;13489:52;;13561:12;;;;13596:15;;;;13537:1;13455:9;13426:195;;;-1:-1:-1;13637:3:1;;13185:461;-1:-1:-1;;;;;13185:461:1:o;13651:582::-;13950:6;13939:9;13932:25;13993:6;13988:2;13977:9;13973:18;13966:34;14036:3;14031:2;14020:9;14016:18;14009:31;13913:4;14057:57;14109:3;14098:9;14094:19;14086:6;14057:57;:::i;:::-;-1:-1:-1;;;;;14150:32:1;;;;14145:2;14130:18;;14123:60;-1:-1:-1;14214:3:1;14199:19;14192:35;14049:65;13651:582;-1:-1:-1;;;13651:582:1:o;14238:332::-;14445:6;14434:9;14427:25;14488:2;14483;14472:9;14468:18;14461:30;14408:4;14508:56;14560:2;14549:9;14545:18;14537:6;14508:56;:::i;:::-;14500:64;14238:332;-1:-1:-1;;;;14238:332:1:o

Swarm Source

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