ETH Price: $2,231.63 (-5.26%)
Gas: 0.66 Gwei
 

Overview

Max Total Supply

1,000,000 DONOT

Holders

4

Transfers

-
0

Market

Onchain Market Cap

-

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

Compiler Version
v0.8.30+commit.73712a01

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol";

contract DONOT is ERC20, Ownable, ReentrancyGuard {
    uint256 public constant MAX_TAX_FEE = 4;
    uint256 public constant swapTokensAtAmount = 5_000 * 1e18;

    uint256 public tokensForTeam;
    uint256 public taxFee = 4;
    address public teamWallet;
    bool public feesEnabled = true;
    bool public tradingOpen = false;

    bool public sniperProtectionEnabled = false;
    uint256 public sniperBlocks = 50;
    uint256 public sniperTax = 99;
    uint256 public launchBlock;

    IUniswapV2Router02 public uniswapRouter;
    address public uniswapPair;

    uint256 private immutable _totalSupplyCap;
    bool private swapping;

    mapping(address => uint256) public lastBuyBlock;
    mapping(address => uint256) public lastTxBlock;
    mapping(address => bool) public isExcludedFromFee;

    event TradingOpened();
    event SniperProtectionEnabled(uint256 blocks, uint256 tax);
    event TeamPaid(uint256 ethGained);

    constructor(address teamWallet_) ERC20("PlzDontBuyThis", "DONOT") Ownable(msg.sender) {
        isExcludedFromFee[msg.sender] = true;
        isExcludedFromFee[address(this)] = true;

        uint256 total = 1_000_000 * 1e18;
        _totalSupplyCap = total;
        teamWallet = teamWallet_;

        uint256 deployerShare = total;

        _mint(msg.sender, deployerShare);
    }

    function setRouter(address router) external onlyOwner nonReentrant {
        uniswapRouter = IUniswapV2Router02(router);
        uniswapPair = IUniswapV2Factory(uniswapRouter.factory()).createPair(
            address(this),
            uniswapRouter.WETH()
        );
        isExcludedFromFee[router] = true;
    }

    function excludeFromFee(address addr, bool exempt) external onlyOwner {
        isExcludedFromFee[addr] = exempt;
    }

    function openTrading() external onlyOwner {
        require(!tradingOpen, "open");
        tradingOpen = true;
        emit TradingOpened();
    }

    function enableSniperProtection(uint256 blocks_, uint256 tax_)
        external
        onlyOwner
    {
        require(!sniperProtectionEnabled, "on");
        require(tax_ <= 99, "too high");
        sniperBlocks = blocks_;
        sniperTax = tax_;
        launchBlock = block.number;
        sniperProtectionEnabled = true;
        emit SniperProtectionEnabled(blocks_, tax_);
    }

    function burn(uint256 amount) external {
        _burn(msg.sender, amount);
    }

    function periodicBurn(uint256 amount) external onlyOwner {
        _burn(address(this), amount);
    }

    function transfer(address to, uint256 amount)
        public
        override
        returns (bool)
    {
        _applyFeesAndTransfer(msg.sender, to, amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public override returns (bool) {
        _spendAllowance(from, msg.sender, amount);
        _applyFeesAndTransfer(from, to, amount);
        return true;
    }

    function _applyFeesAndTransfer(
        address from,
        address to,
        uint256 amount
    ) internal {
        if (!tradingOpen) {
            require(
                from == address(0) ||
                    to == address(0) ||
                    from == owner() ||
                    to == owner() ||
                    from == address(this) ||
                    to == address(this),
                "closed"
            );
        }

        bool takeFee = feesEnabled &&
            !swapping &&
            !isExcludedFromFee[from] &&
            !isExcludedFromFee[to];

        if (takeFee) {
            require(block.number > lastTxBlock[from], "1 tx/blk sender");
            require(block.number > lastTxBlock[to], "1 tx/blk recipient");
            lastTxBlock[from] = lastTxBlock[to] = block.number;

            if (from == uniswapPair) lastBuyBlock[to] = block.number;
            else if (to == uniswapPair)
                require(block.number > lastBuyBlock[from], "same-blk sell");
        }

        uint256 feeAmount = 0;
        if (takeFee) {
            uint256 rate = taxFee;
            if (
                sniperProtectionEnabled &&
                from == uniswapPair &&
                block.number <= launchBlock + sniperBlocks
            ) rate = sniperTax;

            feeAmount = (amount * rate) / 100;
            if (feeAmount > 0) {
                tokensForTeam += feeAmount;
                super._transfer(from, address(this), feeAmount);
            }
            amount -= feeAmount;
        }

        super._transfer(from, to, amount);

        if (
            !swapping &&
            to == uniswapPair &&
            from == uniswapPair &&
            tokensForTeam >= swapTokensAtAmount
        ) {
            _swapBack();
        }
    }

    function _swapBack() private nonReentrant {
        swapping = true;
        uint256 totalTokens = tokensForTeam;
        if (totalTokens > 0) {
            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = uniswapRouter.WETH();

            _approve(address(this), address(uniswapRouter), totalTokens);
            uint256 startETH = address(this).balance;

            uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
                totalTokens,
                0,
                path,
                address(this),
                block.timestamp
            );

            uint256 ethGained = address(this).balance - startETH;
            if (ethGained > 0) {
                payable(teamWallet).transfer(ethGained);
                emit TeamPaid(ethGained);
            }
            tokensForTeam = 0;
        }
        swapping = false;
    }

    function getTokensForTeam() external view returns (uint256) {
        return tokensForTeam;
    }

    function editteamtokens() external {
        tokensForTeam = swapTokensAtAmount;
    }

    function swapBackForTests() external onlyOwner returns (bool) {
        _swapBack();
        return true;
    }

    receive() external payable {}
}

pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

pragma solidity >=0.5.0;

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

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

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

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

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

pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
 * consider using {ReentrancyGuardTransient} instead.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // Any calls to nonReentrant after this point will fail
        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     *
     * ```solidity
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner`'s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance < type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

pragma solidity >=0.6.2;

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

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC-20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC-1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC-20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

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

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

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

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

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

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

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

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

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "remappings": []
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"teamWallet_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blocks","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tax","type":"uint256"}],"name":"SniperProtectionEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ethGained","type":"uint256"}],"name":"TeamPaid","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"editteamtokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocks_","type":"uint256"},{"internalType":"uint256","name":"tax_","type":"uint256"}],"name":"enableSniperProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokensForTeam","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastBuyBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastTxBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchBlock","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":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"periodicBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sniperBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sniperProtectionEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sniperTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapBackForTests","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTeam","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":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a060405260046008556001600960146101000a81548160ff0219169083151502179055505f600960156101000a81548160ff0219169083151502179055505f600960166101000a81548160ff0219169083151502179055506032600a556063600b5534801561006d575f5ffd5b5060405161399a38038061399a833981810160405281019061008f9190610681565b336040518060400160405280600e81526020017f506c7a446f6e74427579546869730000000000000000000000000000000000008152506040518060400160405280600581526020017f444f4e4f54000000000000000000000000000000000000000000000000000000815250816003908161010b91906108e9565b50806004908161011b91906108e9565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361018e575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161018591906109c7565b60405180910390fd5b61019d816102c260201b60201c565b506001600681905550600160115f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160115f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f69d3c21bcecceda1000000905080608081815250508160095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f8190506102ba338261038560201b60201c565b505050610a9d565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036103f5575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016103ec91906109c7565b60405180910390fd5b6104065f838361040a60201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361045a578060025f82825461044e9190610a0d565b92505081905550610528565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156104e3578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016104da93929190610a4f565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361056f578060025f82825403925050819055506105b9565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106169190610a84565b60405180910390a3505050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61065082610627565b9050919050565b61066081610646565b811461066a575f5ffd5b50565b5f8151905061067b81610657565b92915050565b5f6020828403121561069657610695610623565b5b5f6106a38482850161066d565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061072757607f821691505b60208210810361073a576107396106e3565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261079c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610761565b6107a68683610761565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6107ea6107e56107e0846107be565b6107c7565b6107be565b9050919050565b5f819050919050565b610803836107d0565b61081761080f826107f1565b84845461076d565b825550505050565b5f5f905090565b61082e61081f565b6108398184846107fa565b505050565b5b8181101561085c576108515f82610826565b60018101905061083f565b5050565b601f8211156108a15761087281610740565b61087b84610752565b8101602085101561088a578190505b61089e61089685610752565b83018261083e565b50505b505050565b5f82821c905092915050565b5f6108c15f19846008026108a6565b1980831691505092915050565b5f6108d983836108b2565b9150826002028217905092915050565b6108f2826106ac565b67ffffffffffffffff81111561090b5761090a6106b6565b5b6109158254610710565b610920828285610860565b5f60209050601f831160018114610951575f841561093f578287015190505b61094985826108ce565b8655506109b0565b601f19841661095f86610740565b5f5b8281101561098657848901518255600182019150602085019450602081019050610961565b868310156109a3578489015161099f601f8916826108b2565b8355505b6001600288020188555050505b505050505050565b6109c181610646565b82525050565b5f6020820190506109da5f8301846109b8565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610a17826107be565b9150610a22836107be565b9250828201905080821115610a3a57610a396109e0565b5b92915050565b610a49816107be565b82525050565b5f606082019050610a625f8301866109b8565b610a6f6020830185610a40565b610a7c6040830184610a40565b949350505050565b5f602082019050610a975f830184610a40565b92915050565b608051612ee8610ab25f395f5050612ee85ff3fe60806040526004361061021d575f3560e01c806395d89b4111610122578063c9567bf9116100aa578063e2f456051161006e578063e2f45605146107b2578063f1f5cd91146107dc578063f2fde38b14610806578063fde83a341461082e578063ffb54a991461085857610224565b8063c9567bf9146106d2578063ceb88a16146106e8578063d00efb2f14610724578063dd62ed3e1461074e578063df8408fe1461078a57610224565b8063a64e4f8a116100f1578063a64e4f8a146105f0578063a9059cbb1461061a578063a98adcc914610656578063c0d7865514610680578063c816841b146106a857610224565b806395d89b411461054a578063963472f914610574578063a071dcf41461059e578063a1fb8ec8146105c857610224565b806342966c68116101a557806370a082311161017457806370a082311461047c578063715018a6146104b8578063735de9f7146104ce5780638da5cb5b146104f85780639252558d1461052257610224565b806342966c68146103c45780634761bea9146103ec5780635342acb414610416578063599270441461045257610224565b806323b872dd116101ec57806323b872dd146102e2578063313ce5671461031e578063328920dd1461034857806332b7cc431461035e57806337b28bfd1461038857610224565b806306fdde0314610228578063095ea7b314610252578063143f75071461028e57806318160ddd146102b857610224565b3661022457005b5f5ffd5b348015610233575f5ffd5b5061023c610882565b6040516102499190612444565b60405180910390f35b34801561025d575f5ffd5b50610278600480360381019061027391906124f5565b610912565b604051610285919061254d565b60405180910390f35b348015610299575f5ffd5b506102a2610934565b6040516102af919061254d565b60405180910390f35b3480156102c3575f5ffd5b506102cc61094c565b6040516102d99190612575565b60405180910390f35b3480156102ed575f5ffd5b506103086004803603810190610303919061258e565b610955565b604051610315919061254d565b60405180910390f35b348015610329575f5ffd5b50610332610977565b60405161033f91906125f9565b60405180910390f35b348015610353575f5ffd5b5061035c61097f565b005b348015610369575f5ffd5b50610372610992565b60405161037f9190612575565b60405180910390f35b348015610393575f5ffd5b506103ae60048036038101906103a99190612612565b610998565b6040516103bb9190612575565b60405180910390f35b3480156103cf575f5ffd5b506103ea60048036038101906103e5919061263d565b6109ad565b005b3480156103f7575f5ffd5b506104006109ba565b60405161040d9190612575565b60405180910390f35b348015610421575f5ffd5b5061043c60048036038101906104379190612612565b6109bf565b604051610449919061254d565b60405180910390f35b34801561045d575f5ffd5b506104666109dc565b6040516104739190612677565b60405180910390f35b348015610487575f5ffd5b506104a2600480360381019061049d9190612612565b610a01565b6040516104af9190612575565b60405180910390f35b3480156104c3575f5ffd5b506104cc610a46565b005b3480156104d9575f5ffd5b506104e2610a59565b6040516104ef91906126eb565b60405180910390f35b348015610503575f5ffd5b5061050c610a7e565b6040516105199190612677565b60405180910390f35b34801561052d575f5ffd5b5061054860048036038101906105439190612704565b610aa6565b005b348015610555575f5ffd5b5061055e610baf565b60405161056b9190612444565b60405180910390f35b34801561057f575f5ffd5b50610588610c3f565b604051610595919061254d565b60405180910390f35b3480156105a9575f5ffd5b506105b2610c52565b6040516105bf9190612575565b60405180910390f35b3480156105d3575f5ffd5b506105ee60048036038101906105e9919061263d565b610c58565b005b3480156105fb575f5ffd5b50610604610c6d565b604051610611919061254d565b60405180910390f35b348015610625575f5ffd5b50610640600480360381019061063b91906124f5565b610c80565b60405161064d919061254d565b60405180910390f35b348015610661575f5ffd5b5061066a610c96565b6040516106779190612575565b60405180910390f35b34801561068b575f5ffd5b506106a660048036038101906106a19190612612565b610c9f565b005b3480156106b3575f5ffd5b506106bc610f23565b6040516106c99190612677565b60405180910390f35b3480156106dd575f5ffd5b506106e6610f48565b005b3480156106f3575f5ffd5b5061070e60048036038101906107099190612612565b610fe9565b60405161071b9190612575565b60405180910390f35b34801561072f575f5ffd5b50610738610ffe565b6040516107459190612575565b60405180910390f35b348015610759575f5ffd5b50610774600480360381019061076f9190612742565b611004565b6040516107819190612575565b60405180910390f35b348015610795575f5ffd5b506107b060048036038101906107ab91906127aa565b611086565b005b3480156107bd575f5ffd5b506107c66110e6565b6040516107d39190612575565b60405180910390f35b3480156107e7575f5ffd5b506107f06110f4565b6040516107fd9190612575565b60405180910390f35b348015610811575f5ffd5b5061082c60048036038101906108279190612612565b6110fa565b005b348015610839575f5ffd5b5061084261117e565b60405161084f9190612575565b60405180910390f35b348015610863575f5ffd5b5061086c611184565b604051610879919061254d565b60405180910390f35b60606003805461089190612815565b80601f01602080910402602001604051908101604052809291908181526020018280546108bd90612815565b80156109085780601f106108df57610100808354040283529160200191610908565b820191905f5260205f20905b8154815290600101906020018083116108eb57829003601f168201915b5050505050905090565b5f5f61091c611197565b905061092981858561119e565b600191505092915050565b5f61093d6111b0565b610945611237565b6001905090565b5f600254905090565b5f610961843384611582565b61096c848484611615565b600190509392505050565b5f6012905090565b69010f0cf064dd59200000600781905550565b600a5481565b600f602052805f5260405f205f915090505481565b6109b73382611d6a565b50565b600481565b6011602052805f5260405f205f915054906101000a900460ff1681565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610a4e6111b0565b610a575f611de9565b565b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610aae6111b0565b600960169054906101000a900460ff1615610afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af59061288f565b60405180910390fd5b6063811115610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b39906128f7565b60405180910390fd5b81600a8190555080600b8190555043600c819055506001600960166101000a81548160ff0219169083151502179055507fc7945ab2162ec955967df39d8600c94cc9cb3602ca412f03c83c46e561fff7a88282604051610ba3929190612915565b60405180910390a15050565b606060048054610bbe90612815565b80601f0160208091040260200160405190810160405280929190818152602001828054610bea90612815565b8015610c355780601f10610c0c57610100808354040283529160200191610c35565b820191905f5260205f20905b815481529060010190602001808311610c1857829003601f168201915b5050505050905090565b600960169054906101000a900460ff1681565b60085481565b610c606111b0565b610c6a3082611d6a565b50565b600960149054906101000a900460ff1681565b5f610c8c338484611615565b6001905092915050565b5f600754905090565b610ca76111b0565b610caf611eac565b80600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d59573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7d9190612950565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e03573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e279190612950565b6040518363ffffffff1660e01b8152600401610e4492919061297b565b6020604051808303815f875af1158015610e60573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e849190612950565b600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160115f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610f20611ef2565b50565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f506111b0565b600960159054906101000a900460ff1615610fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f97906129ec565b60405180910390fd5b6001600960156101000a81548160ff0219169083151502179055507fea4359d5c4b8f0945a64ab9c37fe830b3407d45e0e6e6f84275977a570457d6f60405160405180910390a1565b6010602052805f5260405f205f915090505481565b600c5481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b61108e6111b0565b8060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b69010f0cf064dd5920000081565b600b5481565b6111026111b0565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611172575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016111699190612677565b60405180910390fd5b61117b81611de9565b50565b60075481565b600960159054906101000a900460ff1681565b5f33905090565b6111ab8383836001611efc565b505050565b6111b8611197565b73ffffffffffffffffffffffffffffffffffffffff166111d6610a7e565b73ffffffffffffffffffffffffffffffffffffffff1614611235576111f9611197565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161122c9190612677565b60405180910390fd5b565b61123f611eac565b6001600e60146101000a81548160ff0219169083151502179055505f60075490505f81111561155d575f600267ffffffffffffffff81111561128457611283612a0a565b5b6040519080825280602002602001820160405280156112b25781602001602082028036833780820191505090505b50905030815f815181106112c9576112c8612a37565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113919190612950565b816001815181106113a5576113a4612a37565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061140b30600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461119e565b5f479050600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947845f8530426040518663ffffffff1660e01b8152600401611471959493929190612b54565b5f604051808303815f87803b158015611488575f5ffd5b505af115801561149a573d5f5f3e3d5ffd5b505050505f81476114ab9190612bd9565b90505f8111156115525760095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611519573d5f5f3e3d5ffd5b507f077b83d9b94807a9e84496b9ae74ea763443543dd3ee0efce98b4927c1489120816040516115499190612575565b60405180910390a15b5f6007819055505050505b5f600e60146101000a81548160ff02191690831515021790555050611580611ef2565b565b5f61158d8484611004565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81101561160f5781811015611600578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016115f793929190612c0c565b60405180910390fd5b61160e84848484035f611efc565b5b50505050565b600960159054906101000a900460ff166117b4575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061168e57505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806116cb575061169c610a7e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8061170857506116d9610a7e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b8061173e57503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8061177457503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117aa90612c8b565b60405180910390fd5b5b5f600960149054906101000a900460ff1680156117de5750600e60149054906101000a900460ff16155b8015611831575060115f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015611884575060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b90508015611b7d5760105f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054431161190b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190290612cf3565b60405180910390fd5b60105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054431161198a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198190612d5b565b60405180910390fd5b4360105f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905560105f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611aa75743600f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550611b7c565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b7b57600f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20544311611b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7190612dc3565b60405180910390fd5b5b5b5b5f5f90508115611c71575f6008549050600960169054906101000a900460ff168015611bf55750600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b8015611c105750600a54600c54611c0c9190612de1565b4311155b15611c1b57600b5490505b60648185611c299190612e14565b611c339190612e82565b91505f821115611c61578160075f828254611c4e9190612de1565b92505081905550611c608630846120cb565b5b8184611c6d9190612bd9565b9350505b611c7c8585856120cb565b600e60149054906101000a900460ff16158015611ce55750600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b8015611d3d5750600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b8015611d55575069010f0cf064dd5920000060075410155b15611d6357611d62611237565b5b5050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dda575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611dd19190612677565b60405180910390fd5b611de5825f836121bb565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600260065403611ee8576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600681905550565b6001600681905550565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f6c575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611f639190612677565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fdc575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611fd39190612677565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156120c5578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516120bc9190612575565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361213b575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016121329190612677565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121ab575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016121a29190612677565b60405180910390fd5b6121b68383836121bb565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361220b578060025f8282546121ff9190612de1565b925050819055506122d9565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612294578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161228b93929190612c0c565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612320578060025f828254039250508190555061236a565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516123c79190612575565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612416826123d4565b61242081856123de565b93506124308185602086016123ee565b612439816123fc565b840191505092915050565b5f6020820190508181035f83015261245c818461240c565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61249182612468565b9050919050565b6124a181612487565b81146124ab575f5ffd5b50565b5f813590506124bc81612498565b92915050565b5f819050919050565b6124d4816124c2565b81146124de575f5ffd5b50565b5f813590506124ef816124cb565b92915050565b5f5f6040838503121561250b5761250a612464565b5b5f612518858286016124ae565b9250506020612529858286016124e1565b9150509250929050565b5f8115159050919050565b61254781612533565b82525050565b5f6020820190506125605f83018461253e565b92915050565b61256f816124c2565b82525050565b5f6020820190506125885f830184612566565b92915050565b5f5f5f606084860312156125a5576125a4612464565b5b5f6125b2868287016124ae565b93505060206125c3868287016124ae565b92505060406125d4868287016124e1565b9150509250925092565b5f60ff82169050919050565b6125f3816125de565b82525050565b5f60208201905061260c5f8301846125ea565b92915050565b5f6020828403121561262757612626612464565b5b5f612634848285016124ae565b91505092915050565b5f6020828403121561265257612651612464565b5b5f61265f848285016124e1565b91505092915050565b61267181612487565b82525050565b5f60208201905061268a5f830184612668565b92915050565b5f819050919050565b5f6126b36126ae6126a984612468565b612690565b612468565b9050919050565b5f6126c482612699565b9050919050565b5f6126d5826126ba565b9050919050565b6126e5816126cb565b82525050565b5f6020820190506126fe5f8301846126dc565b92915050565b5f5f6040838503121561271a57612719612464565b5b5f612727858286016124e1565b9250506020612738858286016124e1565b9150509250929050565b5f5f6040838503121561275857612757612464565b5b5f612765858286016124ae565b9250506020612776858286016124ae565b9150509250929050565b61278981612533565b8114612793575f5ffd5b50565b5f813590506127a481612780565b92915050565b5f5f604083850312156127c0576127bf612464565b5b5f6127cd858286016124ae565b92505060206127de85828601612796565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061282c57607f821691505b60208210810361283f5761283e6127e8565b5b50919050565b7f6f6e0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6128796002836123de565b915061288482612845565b602082019050919050565b5f6020820190508181035f8301526128a68161286d565b9050919050565b7f746f6f20686967680000000000000000000000000000000000000000000000005f82015250565b5f6128e16008836123de565b91506128ec826128ad565b602082019050919050565b5f6020820190508181035f83015261290e816128d5565b9050919050565b5f6040820190506129285f830185612566565b6129356020830184612566565b9392505050565b5f8151905061294a81612498565b92915050565b5f6020828403121561296557612964612464565b5b5f6129728482850161293c565b91505092915050565b5f60408201905061298e5f830185612668565b61299b6020830184612668565b9392505050565b7f6f70656e000000000000000000000000000000000000000000000000000000005f82015250565b5f6129d66004836123de565b91506129e1826129a2565b602082019050919050565b5f6020820190508181035f830152612a03816129ca565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f612a87612a82612a7d84612a64565b612690565b6124c2565b9050919050565b612a9781612a6d565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612acf81612487565b82525050565b5f612ae08383612ac6565b60208301905092915050565b5f602082019050919050565b5f612b0282612a9d565b612b0c8185612aa7565b9350612b1783612ab7565b805f5b83811015612b47578151612b2e8882612ad5565b9750612b3983612aec565b925050600181019050612b1a565b5085935050505092915050565b5f60a082019050612b675f830188612566565b612b746020830187612a8e565b8181036040830152612b868186612af8565b9050612b956060830185612668565b612ba26080830184612566565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612be3826124c2565b9150612bee836124c2565b9250828203905081811115612c0657612c05612bac565b5b92915050565b5f606082019050612c1f5f830186612668565b612c2c6020830185612566565b612c396040830184612566565b949350505050565b7f636c6f73656400000000000000000000000000000000000000000000000000005f82015250565b5f612c756006836123de565b9150612c8082612c41565b602082019050919050565b5f6020820190508181035f830152612ca281612c69565b9050919050565b7f312074782f626c6b2073656e64657200000000000000000000000000000000005f82015250565b5f612cdd600f836123de565b9150612ce882612ca9565b602082019050919050565b5f6020820190508181035f830152612d0a81612cd1565b9050919050565b7f312074782f626c6b20726563697069656e7400000000000000000000000000005f82015250565b5f612d456012836123de565b9150612d5082612d11565b602082019050919050565b5f6020820190508181035f830152612d7281612d39565b9050919050565b7f73616d652d626c6b2073656c6c000000000000000000000000000000000000005f82015250565b5f612dad600d836123de565b9150612db882612d79565b602082019050919050565b5f6020820190508181035f830152612dda81612da1565b9050919050565b5f612deb826124c2565b9150612df6836124c2565b9250828201905080821115612e0e57612e0d612bac565b5b92915050565b5f612e1e826124c2565b9150612e29836124c2565b9250828202612e37816124c2565b91508282048414831517612e4e57612e4d612bac565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612e8c826124c2565b9150612e97836124c2565b925082612ea757612ea6612e55565b5b82820490509291505056fea2646970667358221220995c05122d5b6386ad8d909edf37bbe29acb8990897eb4e26f03c0b514daf55264736f6c634300081e0033000000000000000000000000e884984d41604c873cb5c0d1d0edda53fd7c1466

Deployed Bytecode

0x60806040526004361061021d575f3560e01c806395d89b4111610122578063c9567bf9116100aa578063e2f456051161006e578063e2f45605146107b2578063f1f5cd91146107dc578063f2fde38b14610806578063fde83a341461082e578063ffb54a991461085857610224565b8063c9567bf9146106d2578063ceb88a16146106e8578063d00efb2f14610724578063dd62ed3e1461074e578063df8408fe1461078a57610224565b8063a64e4f8a116100f1578063a64e4f8a146105f0578063a9059cbb1461061a578063a98adcc914610656578063c0d7865514610680578063c816841b146106a857610224565b806395d89b411461054a578063963472f914610574578063a071dcf41461059e578063a1fb8ec8146105c857610224565b806342966c68116101a557806370a082311161017457806370a082311461047c578063715018a6146104b8578063735de9f7146104ce5780638da5cb5b146104f85780639252558d1461052257610224565b806342966c68146103c45780634761bea9146103ec5780635342acb414610416578063599270441461045257610224565b806323b872dd116101ec57806323b872dd146102e2578063313ce5671461031e578063328920dd1461034857806332b7cc431461035e57806337b28bfd1461038857610224565b806306fdde0314610228578063095ea7b314610252578063143f75071461028e57806318160ddd146102b857610224565b3661022457005b5f5ffd5b348015610233575f5ffd5b5061023c610882565b6040516102499190612444565b60405180910390f35b34801561025d575f5ffd5b50610278600480360381019061027391906124f5565b610912565b604051610285919061254d565b60405180910390f35b348015610299575f5ffd5b506102a2610934565b6040516102af919061254d565b60405180910390f35b3480156102c3575f5ffd5b506102cc61094c565b6040516102d99190612575565b60405180910390f35b3480156102ed575f5ffd5b506103086004803603810190610303919061258e565b610955565b604051610315919061254d565b60405180910390f35b348015610329575f5ffd5b50610332610977565b60405161033f91906125f9565b60405180910390f35b348015610353575f5ffd5b5061035c61097f565b005b348015610369575f5ffd5b50610372610992565b60405161037f9190612575565b60405180910390f35b348015610393575f5ffd5b506103ae60048036038101906103a99190612612565b610998565b6040516103bb9190612575565b60405180910390f35b3480156103cf575f5ffd5b506103ea60048036038101906103e5919061263d565b6109ad565b005b3480156103f7575f5ffd5b506104006109ba565b60405161040d9190612575565b60405180910390f35b348015610421575f5ffd5b5061043c60048036038101906104379190612612565b6109bf565b604051610449919061254d565b60405180910390f35b34801561045d575f5ffd5b506104666109dc565b6040516104739190612677565b60405180910390f35b348015610487575f5ffd5b506104a2600480360381019061049d9190612612565b610a01565b6040516104af9190612575565b60405180910390f35b3480156104c3575f5ffd5b506104cc610a46565b005b3480156104d9575f5ffd5b506104e2610a59565b6040516104ef91906126eb565b60405180910390f35b348015610503575f5ffd5b5061050c610a7e565b6040516105199190612677565b60405180910390f35b34801561052d575f5ffd5b5061054860048036038101906105439190612704565b610aa6565b005b348015610555575f5ffd5b5061055e610baf565b60405161056b9190612444565b60405180910390f35b34801561057f575f5ffd5b50610588610c3f565b604051610595919061254d565b60405180910390f35b3480156105a9575f5ffd5b506105b2610c52565b6040516105bf9190612575565b60405180910390f35b3480156105d3575f5ffd5b506105ee60048036038101906105e9919061263d565b610c58565b005b3480156105fb575f5ffd5b50610604610c6d565b604051610611919061254d565b60405180910390f35b348015610625575f5ffd5b50610640600480360381019061063b91906124f5565b610c80565b60405161064d919061254d565b60405180910390f35b348015610661575f5ffd5b5061066a610c96565b6040516106779190612575565b60405180910390f35b34801561068b575f5ffd5b506106a660048036038101906106a19190612612565b610c9f565b005b3480156106b3575f5ffd5b506106bc610f23565b6040516106c99190612677565b60405180910390f35b3480156106dd575f5ffd5b506106e6610f48565b005b3480156106f3575f5ffd5b5061070e60048036038101906107099190612612565b610fe9565b60405161071b9190612575565b60405180910390f35b34801561072f575f5ffd5b50610738610ffe565b6040516107459190612575565b60405180910390f35b348015610759575f5ffd5b50610774600480360381019061076f9190612742565b611004565b6040516107819190612575565b60405180910390f35b348015610795575f5ffd5b506107b060048036038101906107ab91906127aa565b611086565b005b3480156107bd575f5ffd5b506107c66110e6565b6040516107d39190612575565b60405180910390f35b3480156107e7575f5ffd5b506107f06110f4565b6040516107fd9190612575565b60405180910390f35b348015610811575f5ffd5b5061082c60048036038101906108279190612612565b6110fa565b005b348015610839575f5ffd5b5061084261117e565b60405161084f9190612575565b60405180910390f35b348015610863575f5ffd5b5061086c611184565b604051610879919061254d565b60405180910390f35b60606003805461089190612815565b80601f01602080910402602001604051908101604052809291908181526020018280546108bd90612815565b80156109085780601f106108df57610100808354040283529160200191610908565b820191905f5260205f20905b8154815290600101906020018083116108eb57829003601f168201915b5050505050905090565b5f5f61091c611197565b905061092981858561119e565b600191505092915050565b5f61093d6111b0565b610945611237565b6001905090565b5f600254905090565b5f610961843384611582565b61096c848484611615565b600190509392505050565b5f6012905090565b69010f0cf064dd59200000600781905550565b600a5481565b600f602052805f5260405f205f915090505481565b6109b73382611d6a565b50565b600481565b6011602052805f5260405f205f915054906101000a900460ff1681565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610a4e6111b0565b610a575f611de9565b565b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610aae6111b0565b600960169054906101000a900460ff1615610afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af59061288f565b60405180910390fd5b6063811115610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b39906128f7565b60405180910390fd5b81600a8190555080600b8190555043600c819055506001600960166101000a81548160ff0219169083151502179055507fc7945ab2162ec955967df39d8600c94cc9cb3602ca412f03c83c46e561fff7a88282604051610ba3929190612915565b60405180910390a15050565b606060048054610bbe90612815565b80601f0160208091040260200160405190810160405280929190818152602001828054610bea90612815565b8015610c355780601f10610c0c57610100808354040283529160200191610c35565b820191905f5260205f20905b815481529060010190602001808311610c1857829003601f168201915b5050505050905090565b600960169054906101000a900460ff1681565b60085481565b610c606111b0565b610c6a3082611d6a565b50565b600960149054906101000a900460ff1681565b5f610c8c338484611615565b6001905092915050565b5f600754905090565b610ca76111b0565b610caf611eac565b80600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d59573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7d9190612950565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e03573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e279190612950565b6040518363ffffffff1660e01b8152600401610e4492919061297b565b6020604051808303815f875af1158015610e60573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e849190612950565b600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160115f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610f20611ef2565b50565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f506111b0565b600960159054906101000a900460ff1615610fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f97906129ec565b60405180910390fd5b6001600960156101000a81548160ff0219169083151502179055507fea4359d5c4b8f0945a64ab9c37fe830b3407d45e0e6e6f84275977a570457d6f60405160405180910390a1565b6010602052805f5260405f205f915090505481565b600c5481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b61108e6111b0565b8060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b69010f0cf064dd5920000081565b600b5481565b6111026111b0565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611172575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016111699190612677565b60405180910390fd5b61117b81611de9565b50565b60075481565b600960159054906101000a900460ff1681565b5f33905090565b6111ab8383836001611efc565b505050565b6111b8611197565b73ffffffffffffffffffffffffffffffffffffffff166111d6610a7e565b73ffffffffffffffffffffffffffffffffffffffff1614611235576111f9611197565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161122c9190612677565b60405180910390fd5b565b61123f611eac565b6001600e60146101000a81548160ff0219169083151502179055505f60075490505f81111561155d575f600267ffffffffffffffff81111561128457611283612a0a565b5b6040519080825280602002602001820160405280156112b25781602001602082028036833780820191505090505b50905030815f815181106112c9576112c8612a37565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113919190612950565b816001815181106113a5576113a4612a37565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061140b30600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461119e565b5f479050600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947845f8530426040518663ffffffff1660e01b8152600401611471959493929190612b54565b5f604051808303815f87803b158015611488575f5ffd5b505af115801561149a573d5f5f3e3d5ffd5b505050505f81476114ab9190612bd9565b90505f8111156115525760095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611519573d5f5f3e3d5ffd5b507f077b83d9b94807a9e84496b9ae74ea763443543dd3ee0efce98b4927c1489120816040516115499190612575565b60405180910390a15b5f6007819055505050505b5f600e60146101000a81548160ff02191690831515021790555050611580611ef2565b565b5f61158d8484611004565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81101561160f5781811015611600578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016115f793929190612c0c565b60405180910390fd5b61160e84848484035f611efc565b5b50505050565b600960159054906101000a900460ff166117b4575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061168e57505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806116cb575061169c610a7e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8061170857506116d9610a7e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b8061173e57503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8061177457503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117aa90612c8b565b60405180910390fd5b5b5f600960149054906101000a900460ff1680156117de5750600e60149054906101000a900460ff16155b8015611831575060115f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015611884575060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b90508015611b7d5760105f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054431161190b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190290612cf3565b60405180910390fd5b60105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054431161198a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198190612d5b565b60405180910390fd5b4360105f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905560105f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611aa75743600f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550611b7c565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b7b57600f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20544311611b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7190612dc3565b60405180910390fd5b5b5b5b5f5f90508115611c71575f6008549050600960169054906101000a900460ff168015611bf55750600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b8015611c105750600a54600c54611c0c9190612de1565b4311155b15611c1b57600b5490505b60648185611c299190612e14565b611c339190612e82565b91505f821115611c61578160075f828254611c4e9190612de1565b92505081905550611c608630846120cb565b5b8184611c6d9190612bd9565b9350505b611c7c8585856120cb565b600e60149054906101000a900460ff16158015611ce55750600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b8015611d3d5750600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b8015611d55575069010f0cf064dd5920000060075410155b15611d6357611d62611237565b5b5050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dda575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611dd19190612677565b60405180910390fd5b611de5825f836121bb565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600260065403611ee8576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600681905550565b6001600681905550565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f6c575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611f639190612677565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fdc575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611fd39190612677565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156120c5578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516120bc9190612575565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361213b575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016121329190612677565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121ab575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016121a29190612677565b60405180910390fd5b6121b68383836121bb565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361220b578060025f8282546121ff9190612de1565b925050819055506122d9565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612294578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161228b93929190612c0c565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612320578060025f828254039250508190555061236a565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516123c79190612575565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612416826123d4565b61242081856123de565b93506124308185602086016123ee565b612439816123fc565b840191505092915050565b5f6020820190508181035f83015261245c818461240c565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61249182612468565b9050919050565b6124a181612487565b81146124ab575f5ffd5b50565b5f813590506124bc81612498565b92915050565b5f819050919050565b6124d4816124c2565b81146124de575f5ffd5b50565b5f813590506124ef816124cb565b92915050565b5f5f6040838503121561250b5761250a612464565b5b5f612518858286016124ae565b9250506020612529858286016124e1565b9150509250929050565b5f8115159050919050565b61254781612533565b82525050565b5f6020820190506125605f83018461253e565b92915050565b61256f816124c2565b82525050565b5f6020820190506125885f830184612566565b92915050565b5f5f5f606084860312156125a5576125a4612464565b5b5f6125b2868287016124ae565b93505060206125c3868287016124ae565b92505060406125d4868287016124e1565b9150509250925092565b5f60ff82169050919050565b6125f3816125de565b82525050565b5f60208201905061260c5f8301846125ea565b92915050565b5f6020828403121561262757612626612464565b5b5f612634848285016124ae565b91505092915050565b5f6020828403121561265257612651612464565b5b5f61265f848285016124e1565b91505092915050565b61267181612487565b82525050565b5f60208201905061268a5f830184612668565b92915050565b5f819050919050565b5f6126b36126ae6126a984612468565b612690565b612468565b9050919050565b5f6126c482612699565b9050919050565b5f6126d5826126ba565b9050919050565b6126e5816126cb565b82525050565b5f6020820190506126fe5f8301846126dc565b92915050565b5f5f6040838503121561271a57612719612464565b5b5f612727858286016124e1565b9250506020612738858286016124e1565b9150509250929050565b5f5f6040838503121561275857612757612464565b5b5f612765858286016124ae565b9250506020612776858286016124ae565b9150509250929050565b61278981612533565b8114612793575f5ffd5b50565b5f813590506127a481612780565b92915050565b5f5f604083850312156127c0576127bf612464565b5b5f6127cd858286016124ae565b92505060206127de85828601612796565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061282c57607f821691505b60208210810361283f5761283e6127e8565b5b50919050565b7f6f6e0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6128796002836123de565b915061288482612845565b602082019050919050565b5f6020820190508181035f8301526128a68161286d565b9050919050565b7f746f6f20686967680000000000000000000000000000000000000000000000005f82015250565b5f6128e16008836123de565b91506128ec826128ad565b602082019050919050565b5f6020820190508181035f83015261290e816128d5565b9050919050565b5f6040820190506129285f830185612566565b6129356020830184612566565b9392505050565b5f8151905061294a81612498565b92915050565b5f6020828403121561296557612964612464565b5b5f6129728482850161293c565b91505092915050565b5f60408201905061298e5f830185612668565b61299b6020830184612668565b9392505050565b7f6f70656e000000000000000000000000000000000000000000000000000000005f82015250565b5f6129d66004836123de565b91506129e1826129a2565b602082019050919050565b5f6020820190508181035f830152612a03816129ca565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f612a87612a82612a7d84612a64565b612690565b6124c2565b9050919050565b612a9781612a6d565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612acf81612487565b82525050565b5f612ae08383612ac6565b60208301905092915050565b5f602082019050919050565b5f612b0282612a9d565b612b0c8185612aa7565b9350612b1783612ab7565b805f5b83811015612b47578151612b2e8882612ad5565b9750612b3983612aec565b925050600181019050612b1a565b5085935050505092915050565b5f60a082019050612b675f830188612566565b612b746020830187612a8e565b8181036040830152612b868186612af8565b9050612b956060830185612668565b612ba26080830184612566565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612be3826124c2565b9150612bee836124c2565b9250828203905081811115612c0657612c05612bac565b5b92915050565b5f606082019050612c1f5f830186612668565b612c2c6020830185612566565b612c396040830184612566565b949350505050565b7f636c6f73656400000000000000000000000000000000000000000000000000005f82015250565b5f612c756006836123de565b9150612c8082612c41565b602082019050919050565b5f6020820190508181035f830152612ca281612c69565b9050919050565b7f312074782f626c6b2073656e64657200000000000000000000000000000000005f82015250565b5f612cdd600f836123de565b9150612ce882612ca9565b602082019050919050565b5f6020820190508181035f830152612d0a81612cd1565b9050919050565b7f312074782f626c6b20726563697069656e7400000000000000000000000000005f82015250565b5f612d456012836123de565b9150612d5082612d11565b602082019050919050565b5f6020820190508181035f830152612d7281612d39565b9050919050565b7f73616d652d626c6b2073656c6c000000000000000000000000000000000000005f82015250565b5f612dad600d836123de565b9150612db882612d79565b602082019050919050565b5f6020820190508181035f830152612dda81612da1565b9050919050565b5f612deb826124c2565b9150612df6836124c2565b9250828201905080821115612e0e57612e0d612bac565b5b92915050565b5f612e1e826124c2565b9150612e29836124c2565b9250828202612e37816124c2565b91508282048414831517612e4e57612e4d612bac565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612e8c826124c2565b9150612e97836124c2565b925082612ea757612ea6612e55565b5b82820490509291505056fea2646970667358221220995c05122d5b6386ad8d909edf37bbe29acb8990897eb4e26f03c0b514daf55264736f6c634300081e0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000e884984d41604c873cb5c0d1d0edda53fd7c1466

-----Decoded View---------------
Arg [0] : teamWallet_ (address): 0xe884984d41604c873cB5c0d1D0edDA53fd7c1466

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000e884984d41604c873cb5c0d1d0edda53fd7c1466


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.