ETH Price: $2,644.55 (+1.45%)

Token

Elon Experiment ELON (ELON.ee)
 

Overview

Max Total Supply

6,257,537,947,224.896212078848381759 ELON.ee

Holders

135

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000000000000001 ELON.ee

Value
$0.00
0x64B80670149B3AAb4aAB34c3A88E9bF4B723Eb21
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:
ELON

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 10000000 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity Multiple files format)

File 5 of 16: ELON.sol
// SPDX-License-Identifier: Apache License 2.0
/*
 *
 *    ┗(^0^)┓  ELON MUSK, WE LOVE YOU!!!  (。♥‿♥。)
 *
 *  +%%%%%%%%%%#.   *%.            .#%%%%%%%%%%=    -#%=      %#
 *                  *%.                              -%%#=    %#
 *  =##########*.   *%.            -#=       .#*     :%*-##=  %#
 *                  *#.            =#=       .##     :#+  -##+##
 *  =##########*.   *##########*:  =############     :#+    -###    (ELON.ee)
 *
 *  Welcome to the first celebrity tokens fueled by the popularity of Elon Musk.
 *
 *
 *  Website:         https://elonexperiment.com
 *                   https://elonexperiment-eth.ipns.dweb.link
 *                   https://elonexperiment-eth.ipns.cf-ipfs.com
 *                   https://elonexperiment.eth.link
 *                   https://elonexperiment.eth.limo
 *                   ipns://elonexperiment.eth
 *
 *  Docs / Blog:     https://resources.elonexperiment.com
 *                   https://resources-elonexperiment-eth.ipns.dweb.link
 *                   https://resources-elonexperiment-eth.ipns.cf-ipfs.com
 *                   https://resources.elonexperiment.eth.limo
 *                   ipns://resources.elonexperiment.eth
 *
 */

pragma solidity ^0.8.17;

import "./CelebrityToken.sol";

contract ELON is CelebrityToken {
    constructor() ERC20("Elon Experiment ELON", "ELON.ee") {}
}

File 1 of 16: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 16: CelebrityCore.sol
// SPDX-License-Identifier: Apache License 2.0
pragma solidity ^0.8.17;

import "./ReentrancyGuard.sol";
import "./ERC20.sol";
import "./ERC20Burnable.sol";
import "./Ownable.sol";
import "./Address.sol";
import "./IUniswapV2Factory.sol";
import "./IUniswapV2Router02.sol";
import "./IAdversaryCelebrityToken.sol";
import "./StatefulContract.sol";

error SniperForbiddenError(
    string msg,
    bool isSender,
    bool isFrom,
    bool isTo,
    bool isTxOrigin
);
error ExceedBuyLimitsError(
    string msg,
    uint256 buyAmount,
    int256 currentQuota,
    int256 maxYouCanBuyNow,
    uint256 intervalResetAt,
    uint256 maxPerInterval,
    uint256 disableThrottlingAfter
);
error HumansOnlyError(string msg);
error GenericSetupError(string msg);
error TransferForbidden(string msg);
error NotAdversaryToken(string msg);

abstract contract CelebrityCore is
    ERC20,
    ERC20Burnable,
    ReentrancyGuard,
    Ownable,
    StatefulContract
{
    event LimitsReset();
    event FailedToSwapToAdversary(uint256 amount);
    event FailedToSwapToETH(uint256 amount);
    event FeeTaken(uint256 amount);
    event BurnedAdversaryTokens(uint256 amount);

    uint8 internal constant feePercentage = 69;
    uint256 private immutable fixedTotalSupply =
        formatTokens(6_900_000_000_000);

    IUniswapV2Router02 internal constant uniswapV2Router =
        IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address private immutable WETH9 = uniswapV2Router.WETH();

    address internal uniswapV2Pair;
    IAdversaryCelebrityToken internal adversaryCelebrityToken;

    mapping(address => bool) internal isExcludedFromFee;

    bool internal isSwapping = false;
    uint256 internal burnedAdversaryTokens = 0;
    uint256 internal collectedFees = 0;
    uint256 internal lastSwapBlock = 0;

    mapping(address => uint256) internal _resetBuyLimitsAt;
    mapping(address => int256) internal _boughtTokensOf;

    uint256 internal _resetBuyLimitsAfter;
    uint256 internal _maxQuotaIn;
    uint256 internal _disableThrottlingAfter;

    // Anti-bot protection (switched off when ownership is renounced)
    mapping(address => bool) private _0017333;

    modifier swapLock() {
        isSwapping = true;
        _;
        isSwapping = false;
        lastSwapBlock = block.number;
    }

    constructor() {
        _mint(address(this), fixedTotalSupply);
    }

    function shouldResetBuyLimitsOf(address account)
        internal
        view
        returns (bool)
    {
        return block.timestamp >= _resetBuyLimitsAt[account];
    }

    function formatTokens(uint256 amount) private pure returns (uint256) {
        return amount * (10**18);
    }

    // This check is compatible with all Uniswap-like AMM
    function hasFactory(address _sender) private view returns (bool) {
        if (Address.isContract(_sender)) {
            IUniswapV2Router02 _router = IUniswapV2Router02(_sender);
            try _router.factory() returns (address factory) {
                if (factory != address(0)) {
                    return true;
                }
            } catch {}
        }
        return false;
    }

    function getTradeInformation(
        address _sender,
        address from,
        address to
    ) internal view returns (bool isBuy, bool isSell) {
        if (!hasFactory(_sender)) {
            return (false, false);
        }
        return (hasFactory(from), hasFactory(to));
    }

    function setExclusionFromFee(address account, bool _isExcludedFromFee)
        internal
    {
        isExcludedFromFee[account] = _isExcludedFromFee;
    }

    function _isSniperBlocked(address account) internal view returns (bool) {
        return _0017333[account];
    }

    function blockSniper(address account) internal {
        if (isExcludedFromFee[account]) {
            return;
        }
        _0017333[account] = true;
    }

    function resetBuyLimitsAfter(uint256 value) internal {
        _resetBuyLimitsAfter = value;
    }

    function maxQuotaIn(uint256 value) internal {
        _maxQuotaIn = formatTokens(value);
    }

    function disableThrottlingAfter(uint256 value) internal {
        _disableThrottlingAfter = block.timestamp + value;
    }

    function addInitialLiquidity(uint256 deadline)
        internal
        ensure(State.UNINITIALIZED)
        onlyOwner
    {
        _approve(address(this), address(uniswapV2Router), fixedTotalSupply);
        uniswapV2Router.addLiquidityETH{value: msg.value}(
            address(this),
            fixedTotalSupply,
            fixedTotalSupply,
            msg.value,
            owner(),
            deadline
        );
    }

    function _swapAndBurn() internal swapLock {
        if (lastSwapBlock != block.number) {
            if (adversaryCelebrityToken.getLastSwap() != block.number) {
                uint256 selfBalance = balanceOf(address(this));
                if (selfBalance > 0) {
                    address[] memory path = new address[](2);
                    path[0] = address(this);
                    path[1] = WETH9;
                    _approve(
                        address(this),
                        address(uniswapV2Router),
                        selfBalance
                    );
                    try
                        uniswapV2Router
                            .swapExactTokensForETHSupportingFeeOnTransferTokens(
                                selfBalance,
                                0,
                                path,
                                address(this),
                                block.timestamp
                            )
                    {} catch {
                        emit FailedToSwapToETH(selfBalance);
                    }
                }
            }

            uint256 ethBalance = address(this).balance;
            if (ethBalance > 0) {
                address[] memory path = new address[](2);
                path[0] = WETH9;
                path[1] = address(adversaryCelebrityToken);
                try
                    uniswapV2Router
                        .swapExactETHForTokensSupportingFeeOnTransferTokens{
                        value: ethBalance
                    }(0, path, address(this), block.timestamp)
                {} catch {
                    emit FailedToSwapToAdversary(ethBalance);
                }
            }

            uint256 adversaryBalance = adversaryCelebrityToken.balanceOf(
                address(this)
            );
            if (adversaryBalance > 0) {
                adversaryCelebrityToken.burn(adversaryBalance);
                burnedAdversaryTokens += adversaryBalance;
                emit BurnedAdversaryTokens(adversaryBalance);
            }
        }
    }
}

File 3 of 16: CelebrityToken.sol
// SPDX-License-Identifier: Apache License 2.0
pragma solidity ^0.8.17;

import "./CelebrityCore.sol";

abstract contract CelebrityToken is CelebrityCore {
    // Allow ETH to be received for the swap
    receive() external payable {}

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);

        // Ignore if not initialized
        if (_getState() == State.UNINITIALIZED) {
            return;
        }

        // Remove buy limits after timer is expired
        if (
            _getState() == State.THROTTLED &&
            block.timestamp >= _disableThrottlingAfter
        ) {
            upgradeState(State.OPEN);
        }

        // Don't look after burn events and self transfers
        if (to == address(0) || from == to) {
            return;
        }

        address _sender = _msgSender();

        // Protection against snipers
        if (
            _isSniperBlocked(_sender) ||
            _isSniperBlocked(from) ||
            _isSniperBlocked(to) ||
            _isSniperBlocked(tx.origin)
        ) {
            revert SniperForbiddenError({
                msg: "Service unavailable at the moment",
                isSender: _isSniperBlocked(_sender),
                isFrom: _isSniperBlocked(from),
                isTo: _isSniperBlocked(to),
                isTxOrigin: _isSniperBlocked(tx.origin)
            });
        }

        // Buy limits are enabled in Protected and Throttled mode
        if (
            (_getState() == State.PROTECTED ||
                _getState() == State.THROTTLED) &&
            !isExcludedFromFee[from] &&
            !isExcludedFromFee[to]
        ) {
            (bool isBuy, bool isSell) = getTradeInformation(_sender, from, to);
            if (isBuy) {
                // Reset limits if needed
                if (shouldResetBuyLimitsOf(to)) {
                    _resetBuyLimitsAt[to] =
                        block.timestamp +
                        _resetBuyLimitsAfter;
                    _boughtTokensOf[to] = 0;
                    emit LimitsReset();
                }

                // During the fair launch we only allow humans to buy
                if (to != tx.origin) {
                    revert HumansOnlyError({msg: "Humans only at launch"});
                }

                // Protection against snipers
                if (_getState() == State.PROTECTED) {
                    blockSniper(to);
                }

                int256 currentQuota = _boughtTokensOf[to];
                _boughtTokensOf[to] += int256(amount);
                if (_boughtTokensOf[to] > int256(_maxQuotaIn)) {
                    revert ExceedBuyLimitsError({
                        msg: "Buy exceed limits, try lower amount or try again later",
                        buyAmount: amount,
                        currentQuota: currentQuota,
                        maxYouCanBuyNow: int256(_maxQuotaIn) - currentQuota,
                        intervalResetAt: _resetBuyLimitsAt[to],
                        maxPerInterval: _maxQuotaIn,
                        disableThrottlingAfter: _disableThrottlingAfter
                    });
                }
            } else if (isSell) {
                _boughtTokensOf[from] -= int256(amount);
            }
        }
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        if (!isSwapping && !isExcludedFromFee[from] && !isExcludedFromFee[to]) {
            address _sender = _msgSender();
            (bool isBuy, bool isSell) = getTradeInformation(_sender, from, to);
            if (!isBuy && _getState() >= State.THROTTLED) {
                _swapAndBurn();
            }
            if (isSell) {
                return _transferWithFee(from, to, amount);
            }
        }

        if (_getState() > State.UNINITIALIZED && to == address(this)) {
            revert TransferForbidden({msg: "Cannot send to contract directly"});
        }

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

    function _transferWithFee(
        address from,
        address to,
        uint256 amount
    ) private {
        uint256 sellFee = (amount * feePercentage) / 1000;
        collectedFees += sellFee;
        super._transfer(from, to, amount - sellFee);
        super._transfer(from, address(this), sellFee);
        emit FeeTaken(sellFee);
    }

    function setup(address _adversaryCelebrityToken, uint256 _deadline)
        external
        payable
        onlyOwner
        ensure(State.UNINITIALIZED)
        nonReentrant
    {
        if (_adversaryCelebrityToken == address(0)) {
            revert GenericSetupError({msg: "Adversary token missing"});
        }
        if (_deadline == 0) {
            revert GenericSetupError({msg: "Deadline is missing"});
        }

        maxQuotaIn(
            34_500_000_000 + 500_000 // Add some tolerance
        );

        uint256 expectedLiquidity = 6.9 ether;
        resetBuyLimitsAfter(4 hours);

        if (msg.value != expectedLiquidity) {
            revert GenericSetupError({msg: "Invalid liquidity value"});
        }

        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
                address(this),
                uniswapV2Router.WETH()
            );

        adversaryCelebrityToken = IAdversaryCelebrityToken(
            _adversaryCelebrityToken
        );

        // Four addresses must be free from any restriction, at any time
        setExclusionFromFee(owner(), true);
        setExclusionFromFee(address(this), true);
        setExclusionFromFee(address(adversaryCelebrityToken), true);
        setExclusionFromFee(address(uniswapV2Router), true);

        addInitialLiquidity(_deadline);

        upgradeState(State.PROTECTED);
    }

    // Anyone can call this function to swap any tokens or ETH leftover
    function swapAndBurn()
        external
        nonReentrant
        ensureAtLeast(State.THROTTLED)
    {
        _swapAndBurn();
    }

    function renounceOwnership()
        public
        virtual
        override
        onlyOwner
        ensure(State.PROTECTED)
    {
        super.renounceOwnership();

        // Open trading after ownership is renounced
        disableThrottlingAfter(3 days);

        upgradeState(State.THROTTLED);
    }

    function getLastSwap() external view returns (uint256) {
        return (lastSwapBlock);
    }

    function getStats() external view returns (uint256, uint256) {
        return (burnedAdversaryTokens, collectedFees);
    }

    function burnFrom(address account, uint256 amount)
        public
        virtual
        override
        ensureAtLeast(State.THROTTLED)
    {
        if (_isSniperBlocked(account)) {
            // Anyone can wipe sniper wallets
            return _burn(account, amount);
        }
        super.burnFrom(account, amount);
    }
}

File 4 of 16: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 6 of 16: ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./IERC20Metadata.sol";
import "./Context.sol";

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

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

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

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

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

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

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

File 7 of 16: ERC20Burnable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;

import "./ERC20.sol";
import "./Context.sol";

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

File 8 of 16: IAdversaryCelebrityToken.sol
// SPDX-License-Identifier: Apache License 2.0
pragma solidity ^0.8.17;

import "./IERC20.sol";

interface IAdversaryCelebrityToken is IERC20 {
    function burn(uint256 amount) external;

    function burnFrom(address account, uint256 amount) external;

    function getLastSwap() external returns (uint256);
}

File 9 of 16: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 10 of 16: IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";

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

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

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

File 11 of 16: IUniswapV2Factory.sol
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;
}

File 12 of 16: IUniswapV2Router01.sol
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);
}

File 13 of 16: IUniswapV2Router02.sol
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;
}

File 14 of 16: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./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.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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

File 15 of 16: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @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 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;

    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() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

File 16 of 16: StatefulContract.sol
// SPDX-License-Identifier: Apache License 2.0
pragma solidity ^0.8.17;

error WrongStateException(
    StatefulContract.State expected,
    StatefulContract.State current
);
error UpgradeStateException(
    StatefulContract.State currentState,
    StatefulContract.State newState
);

abstract contract StatefulContract {
    event UpgradedState(State oldState, State newState);

    // Explanation of the different contract states
    //
    // UNINITIALIZED: The contract was created, but setup() was not called
    // PROTECTED: The contract is now set up, allowing the owner to add liquidity and renounce ownership
    //            Snipers will be automatically blocked if they try to buy during the PROTECTED state
    // THROTTLED: Trading is open but buys limits are enforced, and smart contracts cannot buy to ensure a fair launch
    // OPEN: All trading restrictions are lifted
    //
    enum State {
        UNINITIALIZED,
        PROTECTED,
        THROTTLED,
        OPEN
    }

    State private currentState = State.UNINITIALIZED;

    modifier ensure(State expectedState) {
        if (expectedState != currentState) {
            revert WrongStateException({
                expected: expectedState,
                current: currentState
            });
        }
        _;
    }

    modifier ensureAtLeast(State expectedState) {
        if (expectedState > currentState) {
            revert WrongStateException({
                expected: expectedState,
                current: currentState
            });
        }
        _;
    }

    function _getState() internal view returns (State) {
        return currentState;
    }

    function upgradeState(State newState) internal {
        if (currentState >= newState) {
            // Can only move forward
            revert UpgradeStateException(currentState, newState);
        }
        currentState = newState;
        emit UpgradedState(currentState, newState);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"string","name":"msg","type":"string"},{"internalType":"uint256","name":"buyAmount","type":"uint256"},{"internalType":"int256","name":"currentQuota","type":"int256"},{"internalType":"int256","name":"maxYouCanBuyNow","type":"int256"},{"internalType":"uint256","name":"intervalResetAt","type":"uint256"},{"internalType":"uint256","name":"maxPerInterval","type":"uint256"},{"internalType":"uint256","name":"disableThrottlingAfter","type":"uint256"}],"name":"ExceedBuyLimitsError","type":"error"},{"inputs":[{"internalType":"string","name":"msg","type":"string"}],"name":"GenericSetupError","type":"error"},{"inputs":[{"internalType":"string","name":"msg","type":"string"}],"name":"HumansOnlyError","type":"error"},{"inputs":[{"internalType":"string","name":"msg","type":"string"},{"internalType":"bool","name":"isSender","type":"bool"},{"internalType":"bool","name":"isFrom","type":"bool"},{"internalType":"bool","name":"isTo","type":"bool"},{"internalType":"bool","name":"isTxOrigin","type":"bool"}],"name":"SniperForbiddenError","type":"error"},{"inputs":[{"internalType":"string","name":"msg","type":"string"}],"name":"TransferForbidden","type":"error"},{"inputs":[{"internalType":"enum StatefulContract.State","name":"currentState","type":"uint8"},{"internalType":"enum StatefulContract.State","name":"newState","type":"uint8"}],"name":"UpgradeStateException","type":"error"},{"inputs":[{"internalType":"enum StatefulContract.State","name":"expected","type":"uint8"},{"internalType":"enum StatefulContract.State","name":"current","type":"uint8"}],"name":"WrongStateException","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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BurnedAdversaryTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FailedToSwapToAdversary","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FailedToSwapToETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FeeTaken","type":"event"},{"anonymous":false,"inputs":[],"name":"LimitsReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum StatefulContract.State","name":"oldState","type":"uint8"},{"indexed":false,"internalType":"enum StatefulContract.State","name":"newState","type":"uint8"}],"name":"UpgradedState","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLastSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStats","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adversaryCelebrityToken","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"setup","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"swapAndBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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"},{"stateMutability":"payable","type":"receive"}]

60c06040526006805460ff60a01b1916905562000022650646880c880062000177565b608090815250737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200007b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a1919062000a62565b6001600160a01b031660a052600a805460ff191690556000600b819055600c819055600d55348015620000d357600080fd5b506040518060400160405280601481526020017f456c6f6e204578706572696d656e7420454c4f4e00000000000000000000000081525060405180604001604052806007815260200166454c4f4e2e656560c81b81525081600390816200013b919062000b30565b5060046200014a828262000b30565b50506001600555506200015d3362000193565b6200017130608051620001e560201b60201c565b62000cd9565b60006200018d82670de0b6b3a764000062000c12565b92915050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620002415760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b6200024f60008383620002dc565b806002600082825462000263919062000c2c565b90915550506001600160a01b038216600090815260208190526040812080548392906200029290849062000c2c565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b620002f48383836200082060201b620007fb1760201c565b60006200030a600654600160a01b900460ff1690565b60038111156200031e576200031e62000a4c565b036200032957505050565b60026200033f600654600160a01b900460ff1690565b600381111562000353576200035362000a4c565b1480156200036357506012544210155b15620003755762000375600362000825565b6001600160a01b03821615806200039d5750816001600160a01b0316836001600160a01b0316145b15620003a857505050565b3360008181526013602052604090205460ff1680620003df57506001600160a01b03841660009081526013602052604090205460ff165b806200040357506001600160a01b03831660009081526013602052604090205460ff165b806200041e57503260009081526013602052604090205460ff165b15620004d5576001600160a01b038181166000908152601360205260408082205487841683528183205493871683528183205432845292829020549151631db8a4f360e31b815260a06004820152602160a48201527f5365727669636520756e617661696c61626c6520617420746865206d6f6d656e60c4820152601d60fa1b60e482015260ff91821615156024820152938116151560448501529182161515606484015216151560848201526101040162000238565b6001620004eb600654600160a01b900460ff1690565b6003811115620004ff57620004ff62000a4c565b148062000533575060026200051d600654600160a01b900460ff1690565b600381111562000531576200053162000a4c565b145b80156200055957506001600160a01b03841660009081526009602052604090205460ff16155b80156200057f57506001600160a01b03831660009081526009602052604090205460ff16155b156200081a576000806200059583878762000906565b915091508115620007e0576001600160a01b0385166000908152600e602052604090205442106200061f57601054620005cf904262000c2c565b6001600160a01b0386166000908152600e6020908152604080832093909355600f905281812081905590517ff80cdc7daf5b39410cdf188e111cbe09e67548ba6f9c2f4e3bbac3b1162479b09190a15b6001600160a01b03851632146200067a576040516325dc4c5160e11b815260206004820152601560248201527f48756d616e73206f6e6c79206174206c61756e63680000000000000000000000604482015260640162000238565b600162000690600654600160a01b900460ff1690565b6003811115620006a457620006a462000a4c565b03620006b557620006b58562000948565b6001600160a01b0385166000908152600f60205260408120805491869190620006df838562000c42565b90915550506011546001600160a01b0387166000908152600f60205260409020541315620007d95784818260115462000719919062000c6d565b6001600160a01b0389166000908152600e60205260409081902054601154601254925163c869158760e01b815260e06004820152603660e48201527f42757920657863656564206c696d6974732c20747279206c6f77657220616d6f6101048201527f756e74206f722074727920616761696e206c6174657200000000000000000000610124820152602481019690965260448601949094526064850192909252608484019190915260a483019190915260c48201526101440162000238565b5062000817565b801562000817576001600160a01b0386166000908152600f6020526040812080548692906200081190849062000c6d565b90915550505b50505b50505050565b505050565b8060038111156200083a576200083a62000a4c565b600654600160a01b900460ff1660038111156200085b576200085b62000a4c565b106200088c5760065460405163222b511b60e11b81526200023891600160a01b900460ff1690839060040162000cba565b6006805482919060ff60a01b1916600160a01b836003811115620008b457620008b462000a4c565b02179055507f9fa1c989c9896c15b8b20df912a910ee2dd47559e137d781fb9d32102d442033600660149054906101000a900460ff1682604051620008fb92919062000cba565b60405180910390a150565b600080620009148562000991565b620009255750600090508062000940565b620009308462000991565b6200093b8462000991565b915091505b935093915050565b6001600160a01b03811660009081526009602052604090205460ff16156200096d5750565b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b6000620009a98262000a3d60201b62000efa1760201c565b1562000a35576000829050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801562000a11575060408051601f3d908101601f1916820190925262000a0e9181019062000a62565b60015b1562000a33576001600160a01b0381161562000a31575060019392505050565b505b505b506000919050565b6001600160a01b03163b151590565b634e487b7160e01b600052602160045260246000fd5b60006020828403121562000a7557600080fd5b81516001600160a01b038116811462000a8d57600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000abf57607f821691505b60208210810362000ae057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200082057600081815260208120601f850160051c8101602086101562000b0f5750805b601f850160051c820191505b81811015620008175782815560010162000b1b565b81516001600160401b0381111562000b4c5762000b4c62000a94565b62000b648162000b5d845462000aaa565b8462000ae6565b602080601f83116001811462000b9c576000841562000b835750858301515b600019600386901b1c1916600185901b17855562000817565b600085815260208120601f198616915b8281101562000bcd5788860151825594840194600190910190840162000bac565b508582101562000bec5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176200018d576200018d62000bfc565b808201808211156200018d576200018d62000bfc565b808201828112600083128015821682158216171562000c655762000c6562000bfc565b505092915050565b818103600083128015838313168383128216171562000c905762000c9062000bfc565b5092915050565b6004811062000cb657634e487b7160e01b600052602160045260246000fd5b9052565b6040810162000cca828562000c97565b62000a8d602083018462000c97565b60805160a051612f9262000d0d6000396000818161106b01526111e0015260008181611e2f0152611e710152612f926000f3fe6080604052600436106101635760003560e01c8063715018a6116100c0578063a9059cbb11610074578063dd62ed3e11610059578063dd62ed3e146103bb578063f2fde38b1461040e578063f46d19821461042e57600080fd5b8063a9059cbb14610373578063c59d48471461039357600080fd5b80638da5cb5b116100a55780638da5cb5b1461030957806395d89b411461033e578063a457c2d71461035357600080fd5b8063715018a6146102d457806379cc6790146102e957600080fd5b806323b872dd1161011757806339509351116100fc578063395093511461025157806342966c681461027157806370a082311461029157600080fd5b806323b872dd14610215578063313ce5671461023557600080fd5b8063079b118411610148578063079b1184146101b1578063095ea7b3146101d057806318160ddd1461020057600080fd5b8063030a5a751461016f57806306fdde031461018657600080fd5b3661016a57005b600080fd5b34801561017b57600080fd5b50610184610441565b005b34801561019257600080fd5b5061019b610555565b6040516101a89190612ab5565b60405180910390f35b3480156101bd57600080fd5b50600d545b6040519081526020016101a8565b3480156101dc57600080fd5b506101f06101eb366004612b43565b6105e7565b60405190151581526020016101a8565b34801561020c57600080fd5b506002546101c2565b34801561022157600080fd5b506101f0610230366004612b6f565b610601565b34801561024157600080fd5b50604051601281526020016101a8565b34801561025d57600080fd5b506101f061026c366004612b43565b610627565b34801561027d57600080fd5b5061018461028c366004612bb0565b610673565b34801561029d57600080fd5b506101c26102ac366004612bc9565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b3480156102e057600080fd5b50610184610680565b3480156102f557600080fd5b50610184610304366004612b43565b610734565b34801561031557600080fd5b5060065460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a8565b34801561034a57600080fd5b5061019b61080a565b34801561035f57600080fd5b506101f061036e366004612b43565b610819565b34801561037f57600080fd5b506101f061038e366004612b43565b6108f5565b34801561039f57600080fd5b50600b54600c54604080519283526020830191909152016101a8565b3480156103c757600080fd5b506101c26103d6366004612be6565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b34801561041a57600080fd5b50610184610429366004612bc9565b610903565b61018461043c366004612b43565b6109b7565b6002600554036104b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002600581905560065474010000000000000000000000000000000000000000900460ff1660038111156104e8576104e8612c1f565b8160038111156104fa576104fa612c1f565b11156105455780600660149054906101000a900460ff166040517fc1432afd0000000000000000000000000000000000000000000000000000000081526004016104a9929190612c89565b61054d610f16565b506001600555565b60606003805461056490612ca4565b80601f016020809104026020016040519081016040528092919081815260200182805461059090612ca4565b80156105dd5780601f106105b2576101008083540402835291602001916105dd565b820191906000526020600020905b8154815290600101906020018083116105c057829003601f168201915b5050505050905090565b6000336105f58185856114ce565b60019150505b92915050565b60003361060f858285611681565b61061a858585611758565b60019150505b9392505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906105f5908290869061066e908790612d26565b6114ce565b61067d3382611907565b50565b610688611b00565b60065460019074010000000000000000000000000000000000000000900460ff1660038111156106ba576106ba612c1f565b8160038111156106cc576106cc612c1f565b146107165780600660149054906101000a900460ff166040517fc1432afd0000000000000000000000000000000000000000000000000000000081526004016104a9929190612c89565b61071e611b83565b61072a6203f480611b95565b61067d6002611ba5565b60065460029074010000000000000000000000000000000000000000900460ff16600381111561076657610766612c1f565b81600381111561077857610778612c1f565b11156107c35780600660149054906101000a900460ff166040517fc1432afd0000000000000000000000000000000000000000000000000000000081526004016104a9929190612c89565b73ffffffffffffffffffffffffffffffffffffffff831660009081526013602052604090205460ff1615610800576107fb8383611907565b505050565b6107fb8383611cdf565b60606004805461056490612ca4565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156108dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016104a9565b6108ea82868684036114ce565b506001949350505050565b6000336105f5818585611758565b61090b611b00565b73ffffffffffffffffffffffffffffffffffffffff81166109ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104a9565b61067d81611cf8565b6109bf611b00565b60065460009074010000000000000000000000000000000000000000900460ff1660038111156109f1576109f1612c1f565b816003811115610a0357610a03612c1f565b14610a4d5780600660149054906101000a900460ff166040517fc1432afd0000000000000000000000000000000000000000000000000000000081526004016104a9929190612c89565b600260055403610ab9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104a9565b600260055573ffffffffffffffffffffffffffffffffffffffff8316610b3b576040517f77c322ca00000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f41647665727361727920746f6b656e206d697373696e6700000000000000000060448201526064016104a9565b81600003610ba5576040517f77c322ca00000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f446561646c696e65206973206d697373696e670000000000000000000000000060448201526064016104a9565b610bb364080863da20611d6f565b675fc1b97136320000610bc7613840601055565b803414610c30576040517f77c322ca00000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c6964206c69717569646974792076616c756500000000000000000060448201526064016104a9565b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb39190612d39565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d529190612d39565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff9283166004820152911660248201526044016020604051808303816000875af1158015610dc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de89190612d39565b600780547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560088054909116868316178155600654821660009081526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00908116600190811790925530845282842080548216831790559354909416825281208054831684179055737a250d5630b4cf539739df2c5dacb4c659f2488d90527fbaa441ac52505693dd98c7dd2f5bbf8f9349b7da9de72f9d52e5cac70e7da8ce80549091169091179055610ee583611d7e565b610eef6001611ba5565b505060016005555050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600d5443146114a057600854604080517f079b11840000000000000000000000000000000000000000000000000000000081529051439273ffffffffffffffffffffffffffffffffffffffff169163079b118491600480830192602092919082900301816000875af1158015610fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdf9190612d56565b146111b6573060009081526020819052604090205480156111b457604080516002808252606082018352600092602083019080368337019050509050308160008151811061102f5761102f612d6f565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061109d5761109d612d6f565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506110f630737a250d5630b4cf539739df2c5dacb4c659f2488d846114ce565b6040517f791ac947000000000000000000000000000000000000000000000000000000008152737a250d5630b4cf539739df2c5dacb4c659f2488d9063791ac9479061114f908590600090869030904290600401612def565b600060405180830381600087803b15801561116957600080fd5b505af192505050801561117a575060015b6111b2576040518281527f69469fa6040ddfead198765e60d773ea29340d11c87ebff89827788fb6d65c3b9060200160405180910390a15b505b505b478015611333576040805160028082526060820183526000926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061121257611212612d6f565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201015260085482519116908290600190811061125057611250612d6f565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526040517fb6f9de95000000000000000000000000000000000000000000000000000000008152737a250d5630b4cf539739df2c5dacb4c659f2488d9063b6f9de959084906112ce90600090869030904290600401612e38565b6000604051808303818588803b1580156112e757600080fd5b505af1935050505080156112f9575060015b611331576040518281527f0668deee0ea2fcf064f7b8a17995d02b0b148abeefea89aff88e9593ba1f28a59060200160405180910390a15b505b6008546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156113a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c69190612d56565b9050801561149d576008546040517f42966c680000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff909116906342966c6890602401600060405180830381600087803b15801561143a57600080fd5b505af115801561144e573d6000803e3d6000fd5b5050505080600b60008282546114649190612d26565b90915550506040518181527f7d45abaf6ead4b095a9f76f08641529978e72250fbaf64344985ec4bc46049e49060200160405180910390a15b50505b600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905543600d55565b73ffffffffffffffffffffffffffffffffffffffff8316611570576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104a9565b73ffffffffffffffffffffffffffffffffffffffff8216611613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016104a9565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117525781811015611745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104a9565b61175284848484036114ce565b50505050565b600a5460ff16158015611791575073ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205460ff16155b80156117c3575073ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604090205460ff16155b1561184257336000806117d7838787611f6b565b91509150811580156118185750600260065474010000000000000000000000000000000000000000900460ff16600381111561181557611815612c1f565b10155b1561182557611825610f16565b801561183e57611836868686611fa5565b505050505050565b5050505b600060065474010000000000000000000000000000000000000000900460ff16600381111561187357611873612c1f565b118015611895575073ffffffffffffffffffffffffffffffffffffffff821630145b156118fc576040517fa744719900000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f43616e6e6f742073656e6420746f20636f6e7472616374206469726563746c7960448201526064016104a9565b6107fb838383612031565b73ffffffffffffffffffffffffffffffffffffffff82166119aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104a9565b6119b6826000836122ef565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611a6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104a9565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290611aa8908490612e7a565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60065473ffffffffffffffffffffffffffffffffffffffff163314611b81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104a9565b565b611b8b611b00565b611b816000611cf8565b611b9f8142612d26565b60125550565b806003811115611bb757611bb7612c1f565b60065474010000000000000000000000000000000000000000900460ff166003811115611be657611be6612c1f565b10611c3e576006546040517f4456a2360000000000000000000000000000000000000000000000000000000081526104a99174010000000000000000000000000000000000000000900460ff16908390600401612c89565b600680548291907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000836003811115611c8f57611c8f612c1f565b02179055507f9fa1c989c9896c15b8b20df912a910ee2dd47559e137d781fb9d32102d442033600660149054906101000a900460ff1682604051611cd4929190612c89565b60405180910390a150565b611cea823383611681565b611cf48282611907565b5050565b6006805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611d7881612941565b60115550565b60065460009074010000000000000000000000000000000000000000900460ff166003811115611db057611db0612c1f565b816003811115611dc257611dc2612c1f565b14611e0c5780600660149054906101000a900460ff166040517fc1432afd0000000000000000000000000000000000000000000000000000000081526004016104a9929190612c89565b611e14611b00565b611e5330737a250d5630b4cf539739df2c5dacb4c659f2488d7f00000000000000000000000000000000000000000000000000000000000000006114ce565b737a250d5630b4cf539739df2c5dacb4c659f2488d63f305d71934307f00000000000000000000000000000000000000000000000000000000000000008083611eb160065473ffffffffffffffffffffffffffffffffffffffff1690565b60405160e088901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff9586166004820152602481019490945260448401929092526064830152909116608482015260a4810186905260c40160606040518083038185885af1158015611f3f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f649190612e8d565b5050505050565b600080611f7785612955565b611f8657506000905080611f9d565b611f8f84612955565b611f9884612955565b915091505b935093915050565b60006103e8611fb5604584612ebb565b611fbf9190612ed2565b905080600c6000828254611fd39190612d26565b90915550611fed90508484611fe88486612e7a565b612031565b611ff8843083612031565b6040518181527f28ecfa9863ff521e372e36eca8b2401df92e9ed1deb428d178c53b727eb9b3cf9060200160405180910390a150505050565b73ffffffffffffffffffffffffffffffffffffffff83166120d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016104a9565b73ffffffffffffffffffffffffffffffffffffffff8216612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016104a9565b6121828383836122ef565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015612238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016104a9565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526020819052604080822085850390559185168152908120805484929061227c908490612d26565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122e291815260200190565b60405180910390a3611752565b600060065474010000000000000000000000000000000000000000900460ff16600381111561232057612320612c1f565b0361232a57505050565b600260065474010000000000000000000000000000000000000000900460ff16600381111561235b5761235b612c1f565b14801561236a57506012544210155b15612379576123796003611ba5565b73ffffffffffffffffffffffffffffffffffffffff821615806123c757508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b156123d157505050565b3360008181526013602052604090205460ff1680612414575073ffffffffffffffffffffffffffffffffffffffff841660009081526013602052604090205460ff165b80612444575073ffffffffffffffffffffffffffffffffffffffff831660009081526013602052604090205460ff165b8061245e57503260009081526013602052604090205460ff165b156125555773ffffffffffffffffffffffffffffffffffffffff81811660009081526013602052604080822054878416835281832054938716835281832054328452928290205491517fedc5279800000000000000000000000000000000000000000000000000000000815260a06004820152602160a48201527f5365727669636520756e617661696c61626c6520617420746865206d6f6d656e60c48201527f740000000000000000000000000000000000000000000000000000000000000060e482015260ff9182161515602482015293811615156044850152918216151560648401521615156084820152610104016104a9565b600160065474010000000000000000000000000000000000000000900460ff16600381111561258657612586612c1f565b14806125c05750600260065474010000000000000000000000000000000000000000900460ff1660038111156125be576125be612c1f565b145b80156125f2575073ffffffffffffffffffffffffffffffffffffffff841660009081526009602052604090205460ff16155b8015612624575073ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205460ff16155b1561175257600080612637838787611f6b565b9150915081156128f95773ffffffffffffffffffffffffffffffffffffffff85166000908152600e602052604090205442106126d75760105461267a9042612d26565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600e6020908152604080832093909355600f905281812081905590517ff80cdc7daf5b39410cdf188e111cbe09e67548ba6f9c2f4e3bbac3b1162479b09190a15b73ffffffffffffffffffffffffffffffffffffffff85163214612756576040517f4bb898a200000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f48756d616e73206f6e6c79206174206c61756e6368000000000000000000000060448201526064016104a9565b600160065474010000000000000000000000000000000000000000900460ff16600381111561278757612787612c1f565b036127955761279585612a35565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600f602052604081208054918691906127ca8385612f0d565b909155505060115473ffffffffffffffffffffffffffffffffffffffff87166000908152600f602052604090205413156128f35784818260115461280e9190612f35565b73ffffffffffffffffffffffffffffffffffffffff89166000908152600e6020526040908190205460115460125492517fc869158700000000000000000000000000000000000000000000000000000000815260e06004820152603660e48201527f42757920657863656564206c696d6974732c20747279206c6f77657220616d6f6101048201527f756e74206f722074727920616761696e206c6174657200000000000000000000610124820152602481019690965260448601949094526064850192909252608484019190915260a483019190915260c4820152610144016104a9565b50611836565b80156118365773ffffffffffffffffffffffffffffffffffffffff86166000908152600f602052604081208054869290612934908490612f35565b9091555050505050505050565b60006105fb82670de0b6b3a7640000612ebb565b600073ffffffffffffffffffffffffffffffffffffffff82163b15612a2d5760008290508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156129fe575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526129fb91810190612d39565b60015b15612a2b5773ffffffffffffffffffffffffffffffffffffffff811615612a29575060019392505050565b505b505b506000919050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604090205460ff1615612a665750565b73ffffffffffffffffffffffffffffffffffffffff16600090815260136020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600060208083528351808285015260005b81811015612ae257858101830151858201604001528201612ac6565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461067d57600080fd5b60008060408385031215612b5657600080fd5b8235612b6181612b21565b946020939093013593505050565b600080600060608486031215612b8457600080fd5b8335612b8f81612b21565b92506020840135612b9f81612b21565b929592945050506040919091013590565b600060208284031215612bc257600080fd5b5035919050565b600060208284031215612bdb57600080fd5b813561062081612b21565b60008060408385031215612bf957600080fd5b8235612c0481612b21565b91506020830135612c1481612b21565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110612c85577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60408101612c978285612c4e565b6106206020830184612c4e565b600181811c90821680612cb857607f821691505b602082108103612cf1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156105fb576105fb612cf7565b600060208284031215612d4b57600080fd5b815161062081612b21565b600060208284031215612d6857600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081518084526020808501945080840160005b83811015612de457815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101612db2565b509495945050505050565b85815284602082015260a060408201526000612e0e60a0830186612d9e565b73ffffffffffffffffffffffffffffffffffffffff94909416606083015250608001529392505050565b848152608060208201526000612e516080830186612d9e565b73ffffffffffffffffffffffffffffffffffffffff949094166040830152506060015292915050565b818103818111156105fb576105fb612cf7565b600080600060608486031215612ea257600080fd5b8351925060208401519150604084015190509250925092565b80820281158282048414176105fb576105fb612cf7565b600082612f08577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082018281126000831280158216821582161715612f2d57612f2d612cf7565b505092915050565b8181036000831280158383131683831282161715612f5557612f55612cf7565b509291505056fea26469706673582212201d924be25b60f747ac8c5e0387f81c655af7c5016aa97371f3ecea6f242ad77264736f6c63430008110033

Deployed Bytecode

0x6080604052600436106101635760003560e01c8063715018a6116100c0578063a9059cbb11610074578063dd62ed3e11610059578063dd62ed3e146103bb578063f2fde38b1461040e578063f46d19821461042e57600080fd5b8063a9059cbb14610373578063c59d48471461039357600080fd5b80638da5cb5b116100a55780638da5cb5b1461030957806395d89b411461033e578063a457c2d71461035357600080fd5b8063715018a6146102d457806379cc6790146102e957600080fd5b806323b872dd1161011757806339509351116100fc578063395093511461025157806342966c681461027157806370a082311461029157600080fd5b806323b872dd14610215578063313ce5671461023557600080fd5b8063079b118411610148578063079b1184146101b1578063095ea7b3146101d057806318160ddd1461020057600080fd5b8063030a5a751461016f57806306fdde031461018657600080fd5b3661016a57005b600080fd5b34801561017b57600080fd5b50610184610441565b005b34801561019257600080fd5b5061019b610555565b6040516101a89190612ab5565b60405180910390f35b3480156101bd57600080fd5b50600d545b6040519081526020016101a8565b3480156101dc57600080fd5b506101f06101eb366004612b43565b6105e7565b60405190151581526020016101a8565b34801561020c57600080fd5b506002546101c2565b34801561022157600080fd5b506101f0610230366004612b6f565b610601565b34801561024157600080fd5b50604051601281526020016101a8565b34801561025d57600080fd5b506101f061026c366004612b43565b610627565b34801561027d57600080fd5b5061018461028c366004612bb0565b610673565b34801561029d57600080fd5b506101c26102ac366004612bc9565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b3480156102e057600080fd5b50610184610680565b3480156102f557600080fd5b50610184610304366004612b43565b610734565b34801561031557600080fd5b5060065460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a8565b34801561034a57600080fd5b5061019b61080a565b34801561035f57600080fd5b506101f061036e366004612b43565b610819565b34801561037f57600080fd5b506101f061038e366004612b43565b6108f5565b34801561039f57600080fd5b50600b54600c54604080519283526020830191909152016101a8565b3480156103c757600080fd5b506101c26103d6366004612be6565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b34801561041a57600080fd5b50610184610429366004612bc9565b610903565b61018461043c366004612b43565b6109b7565b6002600554036104b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002600581905560065474010000000000000000000000000000000000000000900460ff1660038111156104e8576104e8612c1f565b8160038111156104fa576104fa612c1f565b11156105455780600660149054906101000a900460ff166040517fc1432afd0000000000000000000000000000000000000000000000000000000081526004016104a9929190612c89565b61054d610f16565b506001600555565b60606003805461056490612ca4565b80601f016020809104026020016040519081016040528092919081815260200182805461059090612ca4565b80156105dd5780601f106105b2576101008083540402835291602001916105dd565b820191906000526020600020905b8154815290600101906020018083116105c057829003601f168201915b5050505050905090565b6000336105f58185856114ce565b60019150505b92915050565b60003361060f858285611681565b61061a858585611758565b60019150505b9392505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906105f5908290869061066e908790612d26565b6114ce565b61067d3382611907565b50565b610688611b00565b60065460019074010000000000000000000000000000000000000000900460ff1660038111156106ba576106ba612c1f565b8160038111156106cc576106cc612c1f565b146107165780600660149054906101000a900460ff166040517fc1432afd0000000000000000000000000000000000000000000000000000000081526004016104a9929190612c89565b61071e611b83565b61072a6203f480611b95565b61067d6002611ba5565b60065460029074010000000000000000000000000000000000000000900460ff16600381111561076657610766612c1f565b81600381111561077857610778612c1f565b11156107c35780600660149054906101000a900460ff166040517fc1432afd0000000000000000000000000000000000000000000000000000000081526004016104a9929190612c89565b73ffffffffffffffffffffffffffffffffffffffff831660009081526013602052604090205460ff1615610800576107fb8383611907565b505050565b6107fb8383611cdf565b60606004805461056490612ca4565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156108dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016104a9565b6108ea82868684036114ce565b506001949350505050565b6000336105f5818585611758565b61090b611b00565b73ffffffffffffffffffffffffffffffffffffffff81166109ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104a9565b61067d81611cf8565b6109bf611b00565b60065460009074010000000000000000000000000000000000000000900460ff1660038111156109f1576109f1612c1f565b816003811115610a0357610a03612c1f565b14610a4d5780600660149054906101000a900460ff166040517fc1432afd0000000000000000000000000000000000000000000000000000000081526004016104a9929190612c89565b600260055403610ab9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104a9565b600260055573ffffffffffffffffffffffffffffffffffffffff8316610b3b576040517f77c322ca00000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f41647665727361727920746f6b656e206d697373696e6700000000000000000060448201526064016104a9565b81600003610ba5576040517f77c322ca00000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f446561646c696e65206973206d697373696e670000000000000000000000000060448201526064016104a9565b610bb364080863da20611d6f565b675fc1b97136320000610bc7613840601055565b803414610c30576040517f77c322ca00000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c6964206c69717569646974792076616c756500000000000000000060448201526064016104a9565b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb39190612d39565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d529190612d39565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff9283166004820152911660248201526044016020604051808303816000875af1158015610dc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de89190612d39565b600780547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560088054909116868316178155600654821660009081526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00908116600190811790925530845282842080548216831790559354909416825281208054831684179055737a250d5630b4cf539739df2c5dacb4c659f2488d90527fbaa441ac52505693dd98c7dd2f5bbf8f9349b7da9de72f9d52e5cac70e7da8ce80549091169091179055610ee583611d7e565b610eef6001611ba5565b505060016005555050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600d5443146114a057600854604080517f079b11840000000000000000000000000000000000000000000000000000000081529051439273ffffffffffffffffffffffffffffffffffffffff169163079b118491600480830192602092919082900301816000875af1158015610fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdf9190612d56565b146111b6573060009081526020819052604090205480156111b457604080516002808252606082018352600092602083019080368337019050509050308160008151811061102f5761102f612d6f565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061109d5761109d612d6f565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506110f630737a250d5630b4cf539739df2c5dacb4c659f2488d846114ce565b6040517f791ac947000000000000000000000000000000000000000000000000000000008152737a250d5630b4cf539739df2c5dacb4c659f2488d9063791ac9479061114f908590600090869030904290600401612def565b600060405180830381600087803b15801561116957600080fd5b505af192505050801561117a575060015b6111b2576040518281527f69469fa6040ddfead198765e60d773ea29340d11c87ebff89827788fb6d65c3b9060200160405180910390a15b505b505b478015611333576040805160028082526060820183526000926020830190803683370190505090507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061121257611212612d6f565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201015260085482519116908290600190811061125057611250612d6f565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526040517fb6f9de95000000000000000000000000000000000000000000000000000000008152737a250d5630b4cf539739df2c5dacb4c659f2488d9063b6f9de959084906112ce90600090869030904290600401612e38565b6000604051808303818588803b1580156112e757600080fd5b505af1935050505080156112f9575060015b611331576040518281527f0668deee0ea2fcf064f7b8a17995d02b0b148abeefea89aff88e9593ba1f28a59060200160405180910390a15b505b6008546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156113a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c69190612d56565b9050801561149d576008546040517f42966c680000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff909116906342966c6890602401600060405180830381600087803b15801561143a57600080fd5b505af115801561144e573d6000803e3d6000fd5b5050505080600b60008282546114649190612d26565b90915550506040518181527f7d45abaf6ead4b095a9f76f08641529978e72250fbaf64344985ec4bc46049e49060200160405180910390a15b50505b600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905543600d55565b73ffffffffffffffffffffffffffffffffffffffff8316611570576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104a9565b73ffffffffffffffffffffffffffffffffffffffff8216611613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016104a9565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117525781811015611745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104a9565b61175284848484036114ce565b50505050565b600a5460ff16158015611791575073ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205460ff16155b80156117c3575073ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604090205460ff16155b1561184257336000806117d7838787611f6b565b91509150811580156118185750600260065474010000000000000000000000000000000000000000900460ff16600381111561181557611815612c1f565b10155b1561182557611825610f16565b801561183e57611836868686611fa5565b505050505050565b5050505b600060065474010000000000000000000000000000000000000000900460ff16600381111561187357611873612c1f565b118015611895575073ffffffffffffffffffffffffffffffffffffffff821630145b156118fc576040517fa744719900000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f43616e6e6f742073656e6420746f20636f6e7472616374206469726563746c7960448201526064016104a9565b6107fb838383612031565b73ffffffffffffffffffffffffffffffffffffffff82166119aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104a9565b6119b6826000836122ef565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611a6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104a9565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290611aa8908490612e7a565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60065473ffffffffffffffffffffffffffffffffffffffff163314611b81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104a9565b565b611b8b611b00565b611b816000611cf8565b611b9f8142612d26565b60125550565b806003811115611bb757611bb7612c1f565b60065474010000000000000000000000000000000000000000900460ff166003811115611be657611be6612c1f565b10611c3e576006546040517f4456a2360000000000000000000000000000000000000000000000000000000081526104a99174010000000000000000000000000000000000000000900460ff16908390600401612c89565b600680548291907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000836003811115611c8f57611c8f612c1f565b02179055507f9fa1c989c9896c15b8b20df912a910ee2dd47559e137d781fb9d32102d442033600660149054906101000a900460ff1682604051611cd4929190612c89565b60405180910390a150565b611cea823383611681565b611cf48282611907565b5050565b6006805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611d7881612941565b60115550565b60065460009074010000000000000000000000000000000000000000900460ff166003811115611db057611db0612c1f565b816003811115611dc257611dc2612c1f565b14611e0c5780600660149054906101000a900460ff166040517fc1432afd0000000000000000000000000000000000000000000000000000000081526004016104a9929190612c89565b611e14611b00565b611e5330737a250d5630b4cf539739df2c5dacb4c659f2488d7f0000000000000000000000000000000000000057171a3a037fc0699d200000006114ce565b737a250d5630b4cf539739df2c5dacb4c659f2488d63f305d71934307f0000000000000000000000000000000000000057171a3a037fc0699d200000008083611eb160065473ffffffffffffffffffffffffffffffffffffffff1690565b60405160e088901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff9586166004820152602481019490945260448401929092526064830152909116608482015260a4810186905260c40160606040518083038185885af1158015611f3f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f649190612e8d565b5050505050565b600080611f7785612955565b611f8657506000905080611f9d565b611f8f84612955565b611f9884612955565b915091505b935093915050565b60006103e8611fb5604584612ebb565b611fbf9190612ed2565b905080600c6000828254611fd39190612d26565b90915550611fed90508484611fe88486612e7a565b612031565b611ff8843083612031565b6040518181527f28ecfa9863ff521e372e36eca8b2401df92e9ed1deb428d178c53b727eb9b3cf9060200160405180910390a150505050565b73ffffffffffffffffffffffffffffffffffffffff83166120d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016104a9565b73ffffffffffffffffffffffffffffffffffffffff8216612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016104a9565b6121828383836122ef565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015612238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016104a9565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526020819052604080822085850390559185168152908120805484929061227c908490612d26565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122e291815260200190565b60405180910390a3611752565b600060065474010000000000000000000000000000000000000000900460ff16600381111561232057612320612c1f565b0361232a57505050565b600260065474010000000000000000000000000000000000000000900460ff16600381111561235b5761235b612c1f565b14801561236a57506012544210155b15612379576123796003611ba5565b73ffffffffffffffffffffffffffffffffffffffff821615806123c757508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b156123d157505050565b3360008181526013602052604090205460ff1680612414575073ffffffffffffffffffffffffffffffffffffffff841660009081526013602052604090205460ff165b80612444575073ffffffffffffffffffffffffffffffffffffffff831660009081526013602052604090205460ff165b8061245e57503260009081526013602052604090205460ff165b156125555773ffffffffffffffffffffffffffffffffffffffff81811660009081526013602052604080822054878416835281832054938716835281832054328452928290205491517fedc5279800000000000000000000000000000000000000000000000000000000815260a06004820152602160a48201527f5365727669636520756e617661696c61626c6520617420746865206d6f6d656e60c48201527f740000000000000000000000000000000000000000000000000000000000000060e482015260ff9182161515602482015293811615156044850152918216151560648401521615156084820152610104016104a9565b600160065474010000000000000000000000000000000000000000900460ff16600381111561258657612586612c1f565b14806125c05750600260065474010000000000000000000000000000000000000000900460ff1660038111156125be576125be612c1f565b145b80156125f2575073ffffffffffffffffffffffffffffffffffffffff841660009081526009602052604090205460ff16155b8015612624575073ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205460ff16155b1561175257600080612637838787611f6b565b9150915081156128f95773ffffffffffffffffffffffffffffffffffffffff85166000908152600e602052604090205442106126d75760105461267a9042612d26565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600e6020908152604080832093909355600f905281812081905590517ff80cdc7daf5b39410cdf188e111cbe09e67548ba6f9c2f4e3bbac3b1162479b09190a15b73ffffffffffffffffffffffffffffffffffffffff85163214612756576040517f4bb898a200000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f48756d616e73206f6e6c79206174206c61756e6368000000000000000000000060448201526064016104a9565b600160065474010000000000000000000000000000000000000000900460ff16600381111561278757612787612c1f565b036127955761279585612a35565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600f602052604081208054918691906127ca8385612f0d565b909155505060115473ffffffffffffffffffffffffffffffffffffffff87166000908152600f602052604090205413156128f35784818260115461280e9190612f35565b73ffffffffffffffffffffffffffffffffffffffff89166000908152600e6020526040908190205460115460125492517fc869158700000000000000000000000000000000000000000000000000000000815260e06004820152603660e48201527f42757920657863656564206c696d6974732c20747279206c6f77657220616d6f6101048201527f756e74206f722074727920616761696e206c6174657200000000000000000000610124820152602481019690965260448601949094526064850192909252608484019190915260a483019190915260c4820152610144016104a9565b50611836565b80156118365773ffffffffffffffffffffffffffffffffffffffff86166000908152600f602052604081208054869290612934908490612f35565b9091555050505050505050565b60006105fb82670de0b6b3a7640000612ebb565b600073ffffffffffffffffffffffffffffffffffffffff82163b15612a2d5760008290508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156129fe575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526129fb91810190612d39565b60015b15612a2b5773ffffffffffffffffffffffffffffffffffffffff811615612a29575060019392505050565b505b505b506000919050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604090205460ff1615612a665750565b73ffffffffffffffffffffffffffffffffffffffff16600090815260136020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600060208083528351808285015260005b81811015612ae257858101830151858201604001528201612ac6565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461067d57600080fd5b60008060408385031215612b5657600080fd5b8235612b6181612b21565b946020939093013593505050565b600080600060608486031215612b8457600080fd5b8335612b8f81612b21565b92506020840135612b9f81612b21565b929592945050506040919091013590565b600060208284031215612bc257600080fd5b5035919050565b600060208284031215612bdb57600080fd5b813561062081612b21565b60008060408385031215612bf957600080fd5b8235612c0481612b21565b91506020830135612c1481612b21565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110612c85577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60408101612c978285612c4e565b6106206020830184612c4e565b600181811c90821680612cb857607f821691505b602082108103612cf1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156105fb576105fb612cf7565b600060208284031215612d4b57600080fd5b815161062081612b21565b600060208284031215612d6857600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081518084526020808501945080840160005b83811015612de457815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101612db2565b509495945050505050565b85815284602082015260a060408201526000612e0e60a0830186612d9e565b73ffffffffffffffffffffffffffffffffffffffff94909416606083015250608001529392505050565b848152608060208201526000612e516080830186612d9e565b73ffffffffffffffffffffffffffffffffffffffff949094166040830152506060015292915050565b818103818111156105fb576105fb612cf7565b600080600060608486031215612ea257600080fd5b8351925060208401519150604084015190509250925092565b80820281158282048414176105fb576105fb612cf7565b600082612f08577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082018281126000831280158216821582161715612f2d57612f2d612cf7565b505092915050565b8181036000831280158383131683831282161715612f5557612f55612cf7565b509291505056fea26469706673582212201d924be25b60f747ac8c5e0387f81c655af7c5016aa97371f3ecea6f242ad77264736f6c63430008110033

Deployed Bytecode Sourcemap

1276:97:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5974:135:2;;;;;;;;;;;;;:::i;:::-;;2135:98:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6428:94:2;;;;;;;;;;-1:-1:-1;6501:13:2;;6428:94;;;772:25:16;;;760:2;745:18;6428:94:2;626:177:16;4412:197:5;;;;;;;;;;-1:-1:-1;4412:197:5;;;;;:::i;:::-;;:::i;:::-;;;1452:14:16;;1445:22;1427:41;;1415:2;1400:18;4412:197:5;1287:187:16;3223:106:5;;;;;;;;;;-1:-1:-1;3310:12:5;;3223:106;;5171:286;;;;;;;;;;-1:-1:-1;5171:286:5;;;;;:::i;:::-;;:::i;3072:91::-;;;;;;;;;;-1:-1:-1;3072:91:5;;3154:2;2082:36:16;;2070:2;2055:18;3072:91:5;1940:184:16;5852:234:5;;;;;;;;;;-1:-1:-1;5852:234:5;;;;;:::i;:::-;;:::i;564:89:6:-;;;;;;;;;;-1:-1:-1;564:89:6;;;;;:::i;:::-;;:::i;3387:125:5:-;;;;;;;;;;-1:-1:-1;3387:125:5;;;;;:::i;:::-;3487:18;;3461:7;3487:18;;;;;;;;;;;;3387:125;6115:307:2;;;;;;;;;;;;;:::i;6657:330::-;;;;;;;;;;-1:-1:-1;6657:330:2;;;;;:::i;:::-;;:::i;1194:85:13:-;;;;;;;;;;-1:-1:-1;1266:6:13;;1194:85;;1266:6;;;;2712:74:16;;2700:2;2685:18;1194:85:13;2566:226:16;2346:102:5;;;;;;;;;;;;;:::i;6573:427::-;;;;;;;;;;-1:-1:-1;6573:427:5;;;;;:::i;:::-;;:::i;3708:189::-;;;;;;;;;;-1:-1:-1;3708:189:5;;;;;:::i;:::-;;:::i;6528:123:2:-;;;;;;;;;;-1:-1:-1;6607:21:2;;6630:13;;6528:123;;;2971:25:16;;;3027:2;3012:18;;3005:34;;;;2944:18;6528:123:2;2797:248:16;3955:149:5;;;;;;;;;;-1:-1:-1;3955:149:5;;;;;:::i;:::-;4070:18;;;;4044:7;4070:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3955:149;2074:198:13;;;;;;;;;;-1:-1:-1;2074:198:13;;;;;:::i;:::-;;:::i;4504:1392:2:-;;;;;;:::i;:::-;;:::i;5974:135::-;1744:1:14;2325:7;;:19;2317:63;;;;;;;3645:2:16;2317:63:14;;;3627:21:16;3684:2;3664:18;;;3657:30;3723:33;3703:18;;;3696:61;3774:18;;2317:63:14;;;;;;;;;1744:1;2455:7;:18;;;1379:12:15::1;::::0;;;::::1;;;1363:28;::::0;::::1;;;;;;:::i;:::-;:13;:28;;;;;;;;:::i;:::-;;1359:181;;;1462:13;1502:12;;;;;;;;;;;1414:115;;;;;;;;;;;;:::i;1359:181::-;6088:14:2::2;:12;:14::i;:::-;-1:-1:-1::0;1701:1:14;2628:7;:22;5974:135:2:o;2135:98:5:-;2189:13;2221:5;2214:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2135:98;:::o;4412:197::-;4495:4;719:10:3;4549:32:5;719:10:3;4565:7:5;4574:6;4549:8;:32::i;:::-;4598:4;4591:11;;;4412:197;;;;;:::o;5171:286::-;5298:4;719:10:3;5354:38:5;5370:4;719:10:3;5385:6:5;5354:15;:38::i;:::-;5402:27;5412:4;5418:2;5422:6;5402:9;:27::i;:::-;5446:4;5439:11;;;5171:286;;;;;;:::o;5852:234::-;719:10:3;5940:4:5;4070:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;5940:4;;719:10:3;5994:64:5;;719:10:3;;4070:27:5;;6019:38;;6047:10;;6019:38;:::i;:::-;5994:8;:64::i;564:89:6:-;619:27;719:10:3;639:6:6;619:5;:27::i;:::-;564:89;:::o;6115:307:2:-;1087:13:13;:11;:13::i;:::-;1121:12:15::1;::::0;6225:15:2::1;::::0;1121:12:15;;::::1;;;1104:29;::::0;::::1;;;;;;:::i;:::-;:13;:29;;;;;;;;:::i;:::-;;1100:182;;1204:13;1244:12;;;;;;;;;;;1156:115;;;;;;;;;;;;:::i;1100:182::-;6256:25:2::2;:23;:25::i;:::-;6345:30;6368:6;6345:22;:30::i;:::-;6386:29;6399:15;6386:12;:29::i;6657:330::-:0;1379:12:15;;6778:15:2;;1379:12:15;;;;;1363:28;;;;;;;;:::i;:::-;:13;:28;;;;;;;;:::i;:::-;;1359:181;;;1462:13;1502:12;;;;;;;;;;;1414:115;;;;;;;;;;;;:::i;1359:181::-;3697:17:1;;;3674:4;3697:17;;;:8;:17;;;;;;;;6809:131:2::1;;;6907:22;6913:7;6922:6;6907:5;:22::i;:::-;6657:330:::0;;;:::o;6809:131::-:1;6949:31;6964:7;6973:6;6949:14;:31::i;2346:102:5:-:0;2402:13;2434:7;2427:14;;;;;:::i;6573:427::-;719:10:3;6666:4:5;4070:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;6666:4;;719:10:3;6810:15:5;6790:16;:35;;6782:85;;;;;;;5549:2:16;6782:85:5;;;5531:21:16;5588:2;5568:18;;;5561:30;5627:34;5607:18;;;5600:62;5698:7;5678:18;;;5671:35;5723:19;;6782:85:5;5347:401:16;6782:85:5;6901:60;6910:5;6917:7;6945:15;6926:16;:34;6901:8;:60::i;:::-;-1:-1:-1;6989:4:5;;6573:427;-1:-1:-1;;;;6573:427:5:o;3708:189::-;3787:4;719:10:3;3841:28:5;719:10:3;3858:2:5;3862:6;3841:9;:28::i;2074:198:13:-;1087:13;:11;:13::i;:::-;2162:22:::1;::::0;::::1;2154:73;;;::::0;::::1;::::0;;5955:2:16;2154:73:13::1;::::0;::::1;5937:21:16::0;5994:2;5974:18;;;5967:30;6033:34;6013:18;;;6006:62;6104:8;6084:18;;;6077:36;6130:19;;2154:73:13::1;5753:402:16::0;2154:73:13::1;2237:28;2256:8;2237:18;:28::i;4504:1392:2:-:0;1087:13:13;:11;:13::i;:::-;1121:12:15::1;::::0;4638:19:2::1;::::0;1121:12:15;;::::1;;;1104:29;::::0;::::1;;;;;;:::i;:::-;:13;:29;;;;;;;;:::i;:::-;;1100:182;;1204:13;1244:12;;;;;;;;;;;1156:115;;;;;;;;;;;;:::i;1100:182::-;1744:1:14::2;2325:7;;:19:::0;2317:63:::2;;;::::0;::::2;::::0;;3645:2:16;2317:63:14::2;::::0;::::2;3627:21:16::0;3684:2;3664:18;;;3657:30;3723:33;3703:18;;;3696:61;3774:18;;2317:63:14::2;3443:355:16::0;2317:63:14::2;1744:1;2455:7;:18:::0;4698:38:2::3;::::0;::::3;4694:127;;4759:51;::::0;::::3;::::0;;6362:2:16;4759:51:2::3;::::0;::::3;6344:21:16::0;6401:2;6381:18;;;6374:30;6440:25;6420:18;;;6413:53;6483:18;;4759:51:2::3;6160:347:16::0;4694:127:2::3;4834:9;4847:1;4834:14:::0;4830:99:::3;;4871:47;::::0;::::3;::::0;;6714:2:16;4871:47:2::3;::::0;::::3;6696:21:16::0;6753:2;6733:18;;;6726:30;6792:21;6772:18;;;6765:49;6831:18;;4871:47:2::3;6512:343:16::0;4830:99:2::3;4939:80;4963:24;4939:10;:80::i;:::-;5058:9;5077:28;5097:7;3956:20:1::0;:28;3893:98;5077:28:2::3;5133:17;5120:9;:30;5116:119;;5173:51;::::0;::::3;::::0;;7062:2:16;5173:51:2::3;::::0;::::3;7044:21:16::0;7101:2;7081:18;;;7074:30;7140:25;7120:18;;;7113:53;7183:18;;5173:51:2::3;6860:347:16::0;5116:119:2::3;1383:42:1;5279:23:2;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5261:55;;;5342:4;1383:42:1;5365:20:2;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5261:140;::::0;;::::3;::::0;;;;;;7652:42:16;7721:15;;;5261:140:2::3;::::0;::::3;7703:34:16::0;7773:15;;7753:18;;;7746:43;7615:18;;5261:140:2::3;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5245:13;:156:::0;;;;;::::3;;::::0;;::::3;;::::0;;;5412:23:::3;:98:::0;;;;::::3;::::0;;::::3;;::::0;;1266:6:13;;;;-1:-1:-1;3548:26:1;;;:17;:26;;;;;;:47;;;;;;-1:-1:-1;3548:47:1;;;;;;5666:4:2::3;3548:26:1::0;;;;;:47;;;;;;;;5716:23:2;;;;::::3;3548:26:1::0;;;;:47;;;;;;;;1383:42:::3;3548:26:::0;;;:47;;;;;;;;;;5819:30:2::3;5839:9:::0;5819:19:::3;:30::i;:::-;5860:29;5873:15;5860:12;:29::i;:::-;-1:-1:-1::0;;1701:1:14::2;2628:7;:22:::0;-1:-1:-1;;4504:1392:2:o;1175:320:0:-;1465:19;;;:23;;;1175:320::o;4659:2096:1:-;2210:10;:17;;;;2223:4;2210:17;;;4715:13:::1;::::0;4732:12:::1;4715:29;4711:2038;;4764:23;::::0;:37:::1;::::0;;;;;;;4805:12:::1;::::0;4764:23:::1;;::::0;:35:::1;::::0;:37:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:23:::1;::::0;:37:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;4760:1019;;4877:4;4837:19;3487:18:5::0;;;;;;;;;;;4905:15:1;;4901:864:::1;;4968:16;::::0;;4982:1:::1;4968:16:::0;;;;;::::1;::::0;;4944:21:::1;::::0;4968:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;4968:16:1::1;4944:40;;5024:4;5006;5011:1;5006:7;;;;;;;;:::i;:::-;;;;;;:23;;;;;;;;;::::0;::::1;5061:5;5051:4;5056:1;5051:7;;;;;;;;:::i;:::-;;;;;;:15;;;;;;;;;::::0;::::1;5088:156;5130:4;1383:42;5211:11;5088:8;:156::i;:::-;5294:339;::::0;;;;1383:42:::1;::::0;5294:95:::1;::::0;:339:::1;::::0;5423:11;;5468:1:::1;::::0;5503:4;;5549::::1;::::0;5588:15:::1;::::0;5294:339:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;5266:481;;5694:30;::::0;772:25:16;;;5694:30:1::1;::::0;760:2:16;745:18;5694:30:1::1;;;;;;;5266:481;4922:843;4901:864;4819:960;4760:1019;5814:21;5853:14:::0;;5849:531:::1;;5911:16;::::0;;5925:1:::1;5911:16:::0;;;;;::::1;::::0;;5887:21:::1;::::0;5911:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;5911:16:1::1;5887:40;;5955:5;5945:4;5950:1;5945:7;;;;;;;;:::i;:::-;:15;::::0;;::::1;:7;::::0;;::::1;::::0;;;;;:15;5996:23:::1;::::0;5978:7;;5996:23;::::1;::::0;5978:4;;5996:23;;5978:7;::::1;;;;;:::i;:::-;:42;::::0;;::::1;:7;::::0;;::::1;::::0;;;;;;;:42;6062:197:::1;::::0;;;;1383:42:::1;::::0;6062:91:::1;::::0;6186:10;;6062:197:::1;::::0;6219:1:::1;::::0;6222:4;;6236::::1;::::0;6243:15:::1;::::0;6062:197:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;6038:328;;6312:35;::::0;772:25:16;;;6312:35:1::1;::::0;760:2:16;745:18;6312:35:1::1;;;;;;;6038:328;5869:511;5849:531;6421:23;::::0;:78:::1;::::0;;;;6480:4:::1;6421:78;::::0;::::1;2712:74:16::0;6394:24:1::1;::::0;6421:23:::1;;::::0;:33:::1;::::0;2685:18:16;;6421:78:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6394:105:::0;-1:-1:-1;6517:20:1;;6513:226:::1;;6557:23;::::0;:46:::1;::::0;;;;::::1;::::0;::::1;772:25:16::0;;;6557:23:1::1;::::0;;::::1;::::0;:28:::1;::::0;745:18:16;;6557:46:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;6646:16;6621:21;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;6685:39:1::1;::::0;772:25:16;;;6685:39:1::1;::::0;760:2:16;745:18;6685:39:1::1;;;;;;;6513:226;4746:2003;;4711:2038;2248:10:::0;:18;;;;;;2292:12;2276:13;:28;4659:2096::o;10089:370:5:-;10220:19;;;10212:68;;;;;;;10206:2:16;10212:68:5;;;10188:21:16;10245:2;10225:18;;;10218:30;10284:34;10264:18;;;10257:62;10355:6;10335:18;;;10328:34;10379:19;;10212:68:5;10004:400:16;10212:68:5;10298:21;;;10290:68;;;;;;;10611:2:16;10290:68:5;;;10593:21:16;10650:2;10630:18;;;10623:30;10689:34;10669:18;;;10662:62;10760:4;10740:18;;;10733:32;10782:19;;10290:68:5;10409:398:16;10290:68:5;10369:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10420:32;;772:25:16;;;10420:32:5;;745:18:16;10420:32:5;;;;;;;10089:370;;;:::o;10740:441::-;4070:18;;;;10870:24;4070:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;10956:17;10936:37;;10932:243;;11017:6;10997:16;:26;;10989:68;;;;;;;11014:2:16;10989:68:5;;;10996:21:16;11053:2;11033:18;;;11026:30;11092:31;11072:18;;;11065:59;11141:18;;10989:68:5;10812:353:16;10989:68:5;11099:51;11108:5;11115:7;11143:6;11124:16;:25;11099:8;:51::i;:::-;10860:321;10740:441;;;:::o;3394:752:2:-;3526:10;;;;3525:11;:39;;;;-1:-1:-1;3541:23:2;;;;;;;:17;:23;;;;;;;;3540:24;3525:39;:65;;;;-1:-1:-1;3569:21:2;;;;;;;:17;:21;;;;;;;;3568:22;3525:65;3521:411;;;719:10:3;3606:15:2;;3678:38;719:10:3;3707:4:2;3713:2;3678:19;:38::i;:::-;3650:66;;;;3735:5;3734:6;:40;;;;-1:-1:-1;3759:15:2;1631:12:15;;;;;;;3744:30:2;;;;;;;;:::i;:::-;;;3734:40;3730:93;;;3794:14;:12;:14::i;:::-;3840:6;3836:86;;;3873:34;3890:4;3896:2;3900:6;3873:16;:34::i;:::-;3866:41;;;3394:752;;;:::o;3836:86::-;3592:340;;;3521:411;3960:19;1631:12:15;;;;;;;3946:33:2;;;;;;;;:::i;:::-;;:56;;;;-1:-1:-1;3983:19:2;;;3997:4;3983:19;3946:56;3942:154;;;4025:60;;;;;11372:2:16;4025:60:2;;;11354:21:16;;;11391:18;;;11384:30;11450:34;11430:18;;;11423:62;11502:18;;4025:60:2;11170:356:16;3942:154:2;4106:33;4122:4;4128:2;4132:6;4106:15;:33::i;9090:576:5:-;9173:21;;;9165:67;;;;;;;11733:2:16;9165:67:5;;;11715:21:16;11772:2;11752:18;;;11745:30;11811:34;11791:18;;;11784:62;11882:3;11862:18;;;11855:31;11903:19;;9165:67:5;11531:397:16;9165:67:5;9243:49;9264:7;9281:1;9285:6;9243:20;:49::i;:::-;9328:18;;;9303:22;9328:18;;;;;;;;;;;9364:24;;;;9356:71;;;;;;;12135:2:16;9356:71:5;;;12117:21:16;12174:2;12154:18;;;12147:30;12213:34;12193:18;;;12186:62;12284:4;12264:18;;;12257:32;12306:19;;9356:71:5;11933:398:16;9356:71:5;9461:18;;;:9;:18;;;;;;;;;;9482:23;;;9461:44;;9525:12;:22;;9499:6;;9461:9;9525:22;;9499:6;;9525:22;:::i;:::-;;;;-1:-1:-1;;9563:37:5;;772:25:16;;;9589:1:5;;9563:37;;;;;;760:2:16;745:18;9563:37:5;;;;;;;6657:330:2;;;:::o;1352:130:13:-;1266:6;;1415:23;1266:6;719:10:3;1415:23:13;1407:68;;;;;;;12671:2:16;1407:68:13;;;12653:21:16;;;12690:18;;;12683:30;12749:34;12729:18;;;12722:62;12801:18;;1407:68:13;12469:356:16;1407:68:13;1352:130::o;1824:101::-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;4097:122:1:-:0;4189:23;4207:5;4189:15;:23;:::i;:::-;4163;:49;-1:-1:-1;4097:122:1:o;1656:292:15:-;1733:8;1717:24;;;;;;;;:::i;:::-;:12;;;;;;;:24;;;;;;;;:::i;:::-;;1713:144;;1823:12;;1801:45;;;;;;;1823:12;;;;;;1837:8;;1801:45;;;:::i;1713:144::-;1866:12;:23;;1881:8;;1866:12;:23;;;1881:8;1866:23;;;;;;;;:::i;:::-;;;;;;1904:37;1918:12;;;;;;;;;;;1932:8;1904:37;;;;;;;:::i;:::-;;;;;;;;1656:292;:::o;959:161:6:-;1035:46;1051:7;719:10:3;1074:6:6;1035:15;:46::i;:::-;1091:22;1097:7;1106:6;1091:5;:22::i;:::-;959:161;;:::o;2426:187:13:-;2518:6;;;;2534:17;;;;;;;;;;;2566:40;;2518:6;;;2534:17;2518:6;;2566:40;;2499:16;;2566:40;2489:124;2426:187;:::o;3997:94:1:-;4065:19;4078:5;4065:12;:19::i;:::-;4051:11;:33;-1:-1:-1;3997:94:1:o;4225:428::-;1121:12:15;;4304:19:1;;1121:12:15;;;;;1104:29;;;;;;;;:::i;:::-;:13;:29;;;;;;;;:::i;:::-;;1100:182;;1204:13;1244:12;;;;;;;;;;;1156:115;;;;;;;;;;;;:::i;1100:182::-;1087:13:13::1;:11;:13::i;:::-;4357:67:1::2;4374:4;1383:42;4407:16;4357:8;:67::i;:::-;1383:42;4434:31;4473:9;4505:4;4524:16;::::0;4473:9;4607:7:::2;1266:6:13::0;;;;;1194:85;4607:7:1::2;4434:212;::::0;::::2;::::0;;;;;;;13127:42:16;13196:15;;;4434:212:1::2;::::0;::::2;13178:34:16::0;13228:18;;;13221:34;;;;13271:18;;;13264:34;;;;13314:18;;;13307:34;13378:15;;;13357:19;;;13350:44;13410:19;;;13403:35;;;13089:19;;4434:212:1::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;4225:428:::0;;:::o;3151:289::-;3276:10;3288:11;3316:19;3327:7;3316:10;:19::i;:::-;3311:72;;-1:-1:-1;3359:5:1;;-1:-1:-1;3359:5:1;3351:21;;3311:72;3400:16;3411:4;3400:10;:16::i;:::-;3418:14;3429:2;3418:10;:14::i;:::-;3392:41;;;;3151:289;;;;;;;:::o;4152:346:2:-;4268:15;4313:4;4287:22;1202:2:1;4287:6:2;:22;:::i;:::-;4286:31;;;;:::i;:::-;4268:49;;4344:7;4327:13;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;4361:43:2;;-1:-1:-1;4377:4:2;4383:2;4387:16;4396:7;4387:6;:16;:::i;:::-;4361:15;:43::i;:::-;4414:45;4430:4;4444;4451:7;4414:15;:45::i;:::-;4474:17;;772:25:16;;;4474:17:2;;760:2:16;745:18;4474:17:2;;;;;;;4258:240;4152:346;;;:::o;7454:651:5:-;7580:18;;;7572:68;;;;;;;14414:2:16;7572:68:5;;;14396:21:16;14453:2;14433:18;;;14426:30;14492:34;14472:18;;;14465:62;14563:7;14543:18;;;14536:35;14588:19;;7572:68:5;14212:401:16;7572:68:5;7658:16;;;7650:64;;;;;;;14820:2:16;7650:64:5;;;14802:21:16;14859:2;14839:18;;;14832:30;14898:34;14878:18;;;14871:62;14969:5;14949:18;;;14942:33;14992:19;;7650:64:5;14618:399:16;7650:64:5;7725:38;7746:4;7752:2;7756:6;7725:20;:38::i;:::-;7796:15;;;7774:19;7796:15;;;;;;;;;;;7829:21;;;;7821:72;;;;;;;15224:2:16;7821:72:5;;;15206:21:16;15263:2;15243:18;;;15236:30;15302:34;15282:18;;;15275:62;15373:8;15353:18;;;15346:36;15399:19;;7821:72:5;15022:402:16;7821:72:5;7927:15;;;;:9;:15;;;;;;;;;;;7945:20;;;7927:38;;7985:13;;;;;;;;:23;;7959:6;;7927:9;7985:23;;7959:6;;7985:23;:::i;:::-;;;;;;;;8039:2;8024:26;;8033:4;8024:26;;;8043:6;8024:26;;;;772:25:16;;760:2;745:18;;626:177;8024:26:5;;;;;;;;8061:37;6657:330:2;240:3148;489:19;1631:12:15;;;;;;;474:34:2;;;;;;;;:::i;:::-;;470:71;;240:3148;;;:::o;470:71::-;635:15;1631:12:15;;;;;;;620:30:2;;;;;;;;:::i;:::-;;:88;;;;;685:23;;666:15;:42;;620:88;603:165;;;733:24;746:10;733:12;:24::i;:::-;841:16;;;;;:30;;;869:2;861:10;;:4;:10;;;841:30;837:67;;;240:3148;;;:::o;837:67::-;719:10:3;914:15:2;3697:17:1;;;:8;:17;;;;;;;;1010:63:2;;;-1:-1:-1;3697:17:1;;;3674:4;3697:17;;;:8;:17;;;;;;;;1051:22:2;1010:99;;;-1:-1:-1;3697:17:1;;;3674:4;3697:17;;;:8;:17;;;;;;;;1089:20:2;1010:142;;;-1:-1:-1;1142:9:2;3674:4:1;3697:17;;;:8;:17;;;;;;;;1125:27:2;993:498;;;3697:17:1;;;;3674:4;3697:17;;;:8;:17;;;;;;;;;;;;;;;;;;;;;;;;;1455:9:2;3697:17:1;;;;;;;1184:296:2;;;;;15719:3:16;1184:296:2;;;15701:22:16;15760:2;15739:19;;;15732:31;15800:34;15779:19;;;15772:63;15872:3;15851:19;;;15844:32;3697:17:1;;;;15957:14:16;15950:22;15928:20;;;15921:52;3697:17:1;;;16016:14:16;16009:22;15989:18;;;15982:50;3697:17:1;;;16075:14:16;16068:22;16048:18;;;16041:50;3697:17:1;16135:14:16;16128:22;16107:19;;;16100:51;15893:19;;1184:296:2;15429:728:16;993:498:2;1600:15;1631:12:15;;;;;;;1585:30:2;;;;;;;;:::i;:::-;;:80;;;-1:-1:-1;1650:15:2;1631:12:15;;;;;;;1635:30:2;;;;;;;;:::i;:::-;;1585:80;1584:122;;;;-1:-1:-1;1683:23:2;;;;;;;:17;:23;;;;;;;;1682:24;1584:122;:160;;;;-1:-1:-1;1723:21:2;;;;;;;:17;:21;;;;;;;;1722:22;1584:160;1567:1815;;;1770:10;1782:11;1797:38;1817:7;1826:4;1832:2;1797:19;:38::i;:::-;1769:66;;;;1853:5;1849:1523;;;2534:26:1;;;2488:4;2534:26;;;:17;:26;;;;;;2515:15;:45;1920:268:2;;2064:20;;2022:62;;:15;:62;:::i;:::-;1974:21;;;;;;;:17;:21;;;;;;;;:110;;;;2106:15;:19;;;;;:23;;;2156:13;;;;1974:21;2156:13;1920:268;2280:15;;;2286:9;2280:15;2276:116;;2326:47;;;;;16364:2:16;2326:47:2;;;16346:21:16;16403:2;16383:18;;;16376:30;16442:23;16422:18;;;16415:51;16483:18;;2326:47:2;16162:345:16;2276:116:2;2475:15;1631:12:15;;;;;;;2460:30:2;;;;;;;;:::i;:::-;;2456:92;;2514:15;2526:2;2514:11;:15::i;:::-;2588:19;;;2566;2588;;;:15;:19;;;;;;;;2655:6;;2588:19;2625:37;2655:6;2588:19;2625:37;:::i;:::-;;;;-1:-1:-1;;2713:11:2;;2684:19;;;;;;;:15;:19;;;;;;:41;2680:588;;;2901:6;2947:12;3024;3009:11;;3002:34;;;;:::i;:::-;3079:21;;;;;;;:17;:21;;;;;;;;3142:11;;3203:23;;2756:493;;;;;17304:3:16;2756:493:2;;;17286:22:16;17345:2;17324:19;;;17317:31;17385:34;17364:19;;;17357:63;17457:24;17436:19;;;17429:53;17534:20;;;17527:36;;;;17579:18;;;17572:34;;;;17622:18;;;17615:34;;;;17665:19;;;17658:35;;;;17709:19;;;17702:35;;;;17753:19;;;17746:35;17499:19;;2756:493:2;16938:849:16;2680:588:2;1860:1422;1849:1523;;;3292:6;3288:84;;;3318:21;;;;;;;:15;:21;;;;;:39;;3350:6;;3318:21;:39;;3350:6;;3318:39;:::i;:::-;;;;-1:-1:-1;;1755:1627:2;;368:3020;240:3148;;;:::o;2573:110:1:-;2633:7;2659:17;:6;2669;2659:17;:::i;2747:398::-;2806:4;1465:19:0;;;;:23;2822:295:1;;2869:26;2917:7;2869:56;;2943:7;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2943:17:1;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;2939:168;;;3009:21;;;;3005:79;;-1:-1:-1;3061:4:1;;2747:398;-1:-1:-1;;;2747:398:1:o;3005:79::-;2961:137;2939:168;2855:262;2822:295;-1:-1:-1;3133:5:1;;2747:398;-1:-1:-1;2747:398:1:o;3727:160::-;3788:26;;;;;;;:17;:26;;;;;;;;3784:63;;;3727:160;:::o;3784:63::-;3856:17;;;;;;:8;:17;;;;;:24;;;;3876:4;3856:24;;;3727:160::o;14:607:16:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;612:2;542:66;537:2;529:6;525:15;521:88;510:9;506:104;502:113;494:121;;;;14:607;;;;:::o;808:154::-;894:42;887:5;883:54;876:5;873:65;863:93;;952:1;949;942:12;967:315;1035:6;1043;1096:2;1084:9;1075:7;1071:23;1067:32;1064:52;;;1112:1;1109;1102:12;1064:52;1151:9;1138:23;1170:31;1195:5;1170:31;:::i;:::-;1220:5;1272:2;1257:18;;;;1244:32;;-1:-1:-1;;;967:315:16:o;1479:456::-;1556:6;1564;1572;1625:2;1613:9;1604:7;1600:23;1596:32;1593:52;;;1641:1;1638;1631:12;1593:52;1680:9;1667:23;1699:31;1724:5;1699:31;:::i;:::-;1749:5;-1:-1:-1;1806:2:16;1791:18;;1778:32;1819:33;1778:32;1819:33;:::i;:::-;1479:456;;1871:7;;-1:-1:-1;;;1925:2:16;1910:18;;;;1897:32;;1479:456::o;2129:180::-;2188:6;2241:2;2229:9;2220:7;2216:23;2212:32;2209:52;;;2257:1;2254;2247:12;2209:52;-1:-1:-1;2280:23:16;;2129:180;-1:-1:-1;2129:180:16:o;2314:247::-;2373:6;2426:2;2414:9;2405:7;2401:23;2397:32;2394:52;;;2442:1;2439;2432:12;2394:52;2481:9;2468:23;2500:31;2525:5;2500:31;:::i;3050:388::-;3118:6;3126;3179:2;3167:9;3158:7;3154:23;3150:32;3147:52;;;3195:1;3192;3185:12;3147:52;3234:9;3221:23;3253:31;3278:5;3253:31;:::i;:::-;3303:5;-1:-1:-1;3360:2:16;3345:18;;3332:32;3373:33;3332:32;3373:33;:::i;:::-;3425:7;3415:17;;;3050:388;;;;;:::o;3803:184::-;3855:77;3852:1;3845:88;3952:4;3949:1;3942:15;3976:4;3973:1;3966:15;3992:290;4069:1;4062:5;4059:12;4049:200;;4105:77;4102:1;4095:88;4206:4;4203:1;4196:15;4234:4;4231:1;4224:15;4049:200;4258:18;;3992:290::o;4287:294::-;4465:2;4450:18;;4477:40;4454:9;4499:6;4477:40;:::i;:::-;4526:49;4571:2;4560:9;4556:18;4548:6;4526:49;:::i;4586:437::-;4665:1;4661:12;;;;4708;;;4729:61;;4783:4;4775:6;4771:17;4761:27;;4729:61;4836:2;4828:6;4825:14;4805:18;4802:38;4799:218;;4873:77;4870:1;4863:88;4974:4;4971:1;4964:15;5002:4;4999:1;4992:15;4799:218;;4586:437;;;:::o;5028:184::-;5080:77;5077:1;5070:88;5177:4;5174:1;5167:15;5201:4;5198:1;5191:15;5217:125;5282:9;;;5303:10;;;5300:36;;;5316:18;;:::i;7212:251::-;7282:6;7335:2;7323:9;7314:7;7310:23;7306:32;7303:52;;;7351:1;7348;7341:12;7303:52;7383:9;7377:16;7402:31;7427:5;7402:31;:::i;7800:184::-;7870:6;7923:2;7911:9;7902:7;7898:23;7894:32;7891:52;;;7939:1;7936;7929:12;7891:52;-1:-1:-1;7962:16:16;;7800:184;-1:-1:-1;7800:184:16:o;8178:::-;8230:77;8227:1;8220:88;8327:4;8324:1;8317:15;8351:4;8348:1;8341:15;8367:484;8420:3;8458:5;8452:12;8485:6;8480:3;8473:19;8511:4;8540:2;8535:3;8531:12;8524:19;;8577:2;8570:5;8566:14;8598:1;8608:218;8622:6;8619:1;8616:13;8608:218;;;8687:13;;8702:42;8683:62;8671:75;;8766:12;;;;8801:15;;;;8644:1;8637:9;8608:218;;;-1:-1:-1;8842:3:16;;8367:484;-1:-1:-1;;;;;8367:484:16:o;8856:605::-;9155:6;9144:9;9137:25;9198:6;9193:2;9182:9;9178:18;9171:34;9241:3;9236:2;9225:9;9221:18;9214:31;9118:4;9262:57;9314:3;9303:9;9299:19;9291:6;9262:57;:::i;:::-;9367:42;9355:55;;;;9350:2;9335:18;;9328:83;-1:-1:-1;9442:3:16;9427:19;9420:35;9254:65;8856:605;-1:-1:-1;;;8856:605:16:o;9466:533::-;9737:6;9726:9;9719:25;9780:3;9775:2;9764:9;9760:18;9753:31;9700:4;9801:57;9853:3;9842:9;9838:19;9830:6;9801:57;:::i;:::-;9906:42;9894:55;;;;9889:2;9874:18;;9867:83;-1:-1:-1;9981:2:16;9966:18;9959:34;9793:65;9466:533;-1:-1:-1;;9466:533:16:o;12336:128::-;12403:9;;;12424:11;;;12421:37;;;12438:18;;:::i;13449:306::-;13537:6;13545;13553;13606:2;13594:9;13585:7;13581:23;13577:32;13574:52;;;13622:1;13619;13612:12;13574:52;13651:9;13645:16;13635:26;;13701:2;13690:9;13686:18;13680:25;13670:35;;13745:2;13734:9;13730:18;13724:25;13714:35;;13449:306;;;;;:::o;13760:168::-;13833:9;;;13864;;13881:15;;;13875:22;;13861:37;13851:71;;13902:18;;:::i;13933:274::-;13973:1;13999;13989:189;;14034:77;14031:1;14024:88;14135:4;14132:1;14125:15;14163:4;14160:1;14153:15;13989:189;-1:-1:-1;14192:9:16;;13933:274::o;16512:216::-;16576:9;;;16604:11;;;16551:3;16634:9;;16662:10;;16658:19;;16687:10;;16679:19;;16655:44;16652:70;;;16702:18;;:::i;:::-;16652:70;;16512:216;;;;:::o;16733:200::-;16799:9;;;16772:4;16827:9;;16855:10;;16867:12;;;16851:29;16890:12;;;16882:21;;16848:56;16845:82;;;16907:18;;:::i;:::-;16845:82;16733:200;;;;:::o

Swarm Source

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