ETH Price: $3,449.41 (-4.57%)
 

Overview

Max Total Supply

23,255,363.483913741548737285 FRIENDO

Holders

3,486

Transfers

-
12 (0%)

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

FRIENDO is a revolutionary new Base meta designed specifically for a fresh clientele.

Contract Source Code Verified (Exact Match)

Contract Name:
Friendo

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at basescan.org on 2024-07-13
*/

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


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @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 value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;


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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

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

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

// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;





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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * 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 returns (string memory) {
        return _name;
    }

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * 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 `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

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

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

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

        emit Transfer(from, to, value);
    }

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.20;



/**
 * @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 a `value` amount of tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 value) public virtual {
        _burn(_msgSender(), value);
    }

    /**
     * @dev Destroys a `value` amount of 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
     * `value`.
     */
    function burnFrom(address account, uint256 value) public virtual {
        _spendAllowance(account, _msgSender(), value);
        _burn(account, value);
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


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

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

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

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

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

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

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

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)

pragma solidity ^0.8.20;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error AddressInsufficientBalance(address account);

    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedInnerCall();

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

        (bool success, ) = recipient.call{value: amount}("");
        if (!success) {
            revert FailedInnerCall();
        }
    }

    /**
     * @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 or custom error, it is bubbled
     * up by this function (like regular Solidity function calls). However, if
     * the call reverted with no returned reason, this function reverts with a
     * {FailedInnerCall} error.
     *
     * 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.
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    /**
     * @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`.
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

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

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
     * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
     * unsuccessful call.
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
     * revert reason or with a default {FailedInnerCall} error.
     */
    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.9.0) (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() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

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

// File: contracts/interfaces/IBotRegistry.sol


pragma solidity ^0.8.0;

interface IBotRegistry {
    function botRegistry(address addr) external view returns (bool);
    function updateBotRegistry(address addr, bool status) external;
    function bulkUpdateBotRegistry(address[] memory accounts, bool status) external;
}
// File: contracts/tokens/Friendo.sol


pragma solidity ^0.8.20;







// Set token name
contract Friendo is ERC20, ERC20Burnable, Ownable, ReentrancyGuard {
    using Address for address payable;

    // Events
    event TradingEnabled(uint256 blockNumber);
    event PresaleActive(bool active, uint256 blockNumber);
    event TokenPurchase(address indexed buyer, uint256 ethAmount, uint256 tokenAmount);
    event RouterUpdated(address newRouterAddress);
    event WalletUpdated(string walletType, address newWalletAddress);
    event SniperProtectionUpdated(bool status);
    event FrontrunProtectionUpdated(bool status);
    event MinTxBlocksUpdated(uint256 blocks);
    event MaxWalletBalanceUpdated(uint256 balance);
    event BotRegistryUpdated(address indexed newAddress);
    event ProtectionExemptionsUpdated(address indexed addr, bool status);

    // Interfaces
    IBotRegistry public botRegistry; // External blacklist for anti-bot shenanigans

    // System Operation
    bool private publicTradingEnabled; // Allows accounts to purchase token without being flagged as a sniper
    bool private frontrunProtection; // Auto blacklists frontrunning bots
    bool private sniperProtection; // Auto blacklists snipers
    bool public presaleActive; // Does the contract accept ETH as part of a presale round?
    bool private inPresaleTx = false; // Disables trade protections for presale transactions

    // Modifiers
    // check if presale is active
    modifier onlyPresaleActive() {
        require(presaleActive, "Presale is not active");
        _;
    }

    // Struct for team wallets
    struct TeamWallets {
        address marketing;
        address dev;
        address liquidity;
        address burn;
    }

    TeamWallets public teamWallets;

    // Operation whitelist
    mapping(address => bool) public protectionExemption; // Allows specific team wallets to bypass limits such as max wallet size
    mapping(address => uint256) public purchaseRegistry; // Tracks accounts receiving tokens for frontrun protection
    uint256 public minTxBlocks; // Minimum blocks between purchase/sell transactions
    uint256 public maxWalletBalance;

    // Presale tracking
    mapping(address => uint256) public tokensPurchased;

    struct PresaleAllocations {
        uint256 purchaser;
        uint256 marketing;
        uint256 dev;
        uint256 liquidity;
        uint256 burn;
    }

    PresaleAllocations public presaleAllocations;

    uint256 public constant presaleTokenPrice = 10**6; // 0.000001 ETH/token
    uint256 public immutable maxPresaleTokenBuy;
    uint256 public immutable minPresaleTokenBuy;
    uint256 public immutable maxTokenSupply;

    // Define token settings
    constructor(
        address _marketingWallet,
        address _devWallet,
        address _liquidityWallet,
        address _burnWallet
    ) Ownable(msg.sender) ERC20("Friendo", "FRIENDO") {
        maxTokenSupply = 50000000 * 10 ** decimals();
        // Initial max wallet size
        maxWalletBalance = 1500000 * 10 ** decimals();
        // Presale min/max buys
        maxPresaleTokenBuy = 750000 * 10 ** decimals();
        minPresaleTokenBuy = 5000 * 10 ** decimals();

        // Bot/malicious user mitigation
        sniperProtection = true;
        frontrunProtection = true;
        minTxBlocks = 4; // Blocks between transfer/sell

        // Set Team Wallets
        teamWallets.marketing = _marketingWallet;
        teamWallets.dev = _devWallet;
        teamWallets.liquidity = _liquidityWallet;
        teamWallets.burn = _burnWallet;

        // Protection Exemptions
        protectionExemption[address(this)] = true;
        protectionExemption[msg.sender] = true;
        protectionExemption[teamWallets.marketing] = true;
        protectionExemption[teamWallets.dev] = true;
        protectionExemption[teamWallets.liquidity] = true;
        protectionExemption[teamWallets.burn] = true;

        // Initialize presale allocations
        presaleAllocations = PresaleAllocations({
            purchaser: 30,
            marketing: 10,
            dev: 5,
            liquidity: 35,
            burn: 20
        });

        // Mint tokens to contract and deployer for presale/initial liquidity
        uint256 totalSupply = maxTokenSupply;
        uint256 purchaserTokens = (totalSupply * presaleAllocations.purchaser) / 100;
        uint256 marketingTokens = (totalSupply * presaleAllocations.marketing) / 100;
        uint256 devTokens = (totalSupply * presaleAllocations.dev) / 100;
        uint256 liquidityTokens = (totalSupply * presaleAllocations.liquidity) / 100;
        uint256 burnTokens = (totalSupply * presaleAllocations.burn) / 100;

        _mint(address(this), purchaserTokens);
        _mint(teamWallets.marketing, marketingTokens);
        _mint(teamWallets.dev, devTokens);
        _mint(teamWallets.liquidity, liquidityTokens);
        _mint(teamWallets.burn, burnTokens);

    }

    // USER FUNCTIONS
    function _update(
        address sender,
        address recipient,
        uint256 amount
    ) internal override {
        require(amount > 0, "You attempt to throw 0 tokens but wrench your shoulder from the effort.");
        require(!isRegistered(sender) && !isRegistered(tx.origin), "Your account is not permitted to transfer tokens. If you wish to appeal, contact the team on Telegram.");
        require(protectionExemption[recipient] || presaleActive || publicTradingEnabled, "Trading is not enabled for the public. Please try again later.");
        
        // Prevent the burn wallet from transferring tokens to any address other than the zero address
        if (sender == teamWallets.burn) {
            require(recipient == address(0), "Burn wallet can only burn tokens");
        }

        // Max wallet balance logic
        if (!protectionExemption[recipient] && maxWalletBalance > 0) {
            uint256 newBalance = balanceOf(recipient) + amount;
            require(newBalance <= maxWalletBalance, "Amount exceeds max wallet balance");
        }
        
        if (!inPresaleTx) { // Bypass all protections when inside a presale transaction
            // Catch snipers. Note: This will catch *any* non-exempted buys until trading is enabled. Beware collateral damage
            // Used for stealth launches and to auto blacklist bots that try to snipe before a token is live
            if (sniperProtection && !publicTradingEnabled) {
                require(tokensPurchased[recipient] == 0, "Please wait until the presale is completed before or transferring tokens.");
                require(tokensPurchased[sender] == 0, "Please wait until the presale is completed before transferring tokens.");
                if (!protectionExemption[recipient]) { // Not exempted
                    _registerBot(recipient); // Blacklists account receiving tokens (commonly a MEV treasury contract)
                    _registerBot(tx.origin); // Blacklists operator (common with MEV bots)
                }
            }

            // Logic to detect or blacklist frontrunning bots
            if ( frontrunProtection ) {
                // If an account receives and sends tokens in a short window we assume they are a bot and add them to the bot registry 
                // Note: If the bot requires a minAmountOut (uniswap) or equivalent the tx will revert and won't be saved.
                // Adds token recipient/holder to purchase registry if not authorized

                if (!protectionExemption[recipient]) // 1. If the recipient is not exempted
                    purchaseRegistry[recipient] = block.number;
                
                if (!protectionExemption[sender]) { // 2. Sender not exempted
                    // If this sender has received tokens within the minTxBlocks period and is attempting to transfer
                    if (block.number - purchaseRegistry[sender] < minTxBlocks) {
                        _registerBot(sender); // Blacklists account sending tokens (commonly a MEV treasury contract)
                        _registerBot(tx.origin); // Blacklists operator (common with MEV bots)
                        return; // Attempted frontrun sells fail to transfer tokens
                    }
                }
            }
        }
        // Transfer the tokens. No taxes, no funny logic.
        super._update(sender, recipient, amount);
    }

    // END USER FUNCTIONS

    // INTERNAL FUNCTIONS
    function isRegistered(address addr) internal view returns (bool) {
        if (address(botRegistry) != address(0)) { // We have defined the address
            return botRegistry.botRegistry(addr);
        } else
            return false; // If we haven't defined it, nobody is a bot!
    }

    // Adds a bot to the registry. Accounts can be removed directly from the registry if needed
    function _registerBot(address addr) internal {
        if (address(botRegistry) != address(0)) { // We have defined the address
            // This contract must be a manager on the registry otherwise this will fail
            botRegistry.updateBotRegistry(addr, true);
        }
    }

    // END INTERNAL FUNCTIONS

    // ADMIN TOOLS
    // Enable trading. Cannot be used to disable trading
    function enableTrading() external onlyOwner {
        require(!publicTradingEnabled, "Trading is already enabled");
        publicTradingEnabled = true;
        sniperProtection = false;
        emit TradingEnabled(block.number);
    }
    // Enable presale.
    function startPresale() external onlyOwner {
        require(!presaleActive, "Presale is already active");
        presaleActive = true;
        emit PresaleActive(true, block.number);
    }
    function endPresale() external onlyOwner onlyPresaleActive() { // WARNING: This will burn all tokens held by the contract!
        presaleActive = false;
        emit PresaleActive(false, block.number);
        // Burn remaining tokens after presale concludes
        uint256 tokenBalance = balanceOf(address(this));
        _burn(address(this), tokenBalance);
    }

    // Enable/disable sniper protection
    function updateSniperProtection(bool status) external onlyOwner {
        require(sniperProtection != status, "Protection already set");
        sniperProtection = status;
        emit SniperProtectionUpdated(status);
    }
    // Enable/disable frontrun protection
    function updateFrontrunProtection(bool status) external onlyOwner {
        require(frontrunProtection != status, "Protection already set");
        frontrunProtection = status;
        emit FrontrunProtectionUpdated(status);
    }
    // Update minimum blocks between purchase/sell transactions
    function updateMinTxBlocks(uint256 blocks) external onlyOwner {
        require(blocks < 75, "Longer periods aren't really frontunning, are they?");
        minTxBlocks = blocks;
        emit MinTxBlocksUpdated(blocks);
    }
    // Define the bot registry
    function setBotRegistry(address addr) external onlyOwner {
        botRegistry = IBotRegistry(addr); // Can be changed to other a different registry later
        emit BotRegistryUpdated(addr);
    }
    // Set max wallet balance. Set 0 to disable.
    function setMaxWalletBalance(uint256 balance) external onlyOwner {
        maxWalletBalance = balance;
        emit MaxWalletBalanceUpdated(balance);
    }
    // Set protection exemptions
    function setProtectionExemption(address addr, bool status) external onlyOwner {
        protectionExemption[addr] = status;
        emit ProtectionExemptionsUpdated(addr, status);
    }

    // Note: Burn wallet is defined at deployment and cannot be changed
    function updateTeamWallet(string memory walletType, address newWallet) external onlyOwner {
        if (keccak256(abi.encodePacked(walletType)) == keccak256(abi.encodePacked("marketing"))) {
            protectionExemption[teamWallets.marketing] = false;
            teamWallets.marketing = newWallet;
            protectionExemption[newWallet] = true;
        } else if (keccak256(abi.encodePacked(walletType)) == keccak256(abi.encodePacked("dev"))) {
            protectionExemption[teamWallets.dev] = false;
            teamWallets.dev = newWallet;
            protectionExemption[newWallet] = true;
        } else if (keccak256(abi.encodePacked(walletType)) == keccak256(abi.encodePacked("liquidity"))) {
            protectionExemption[teamWallets.liquidity] = false;
            teamWallets.liquidity = newWallet;
            protectionExemption[newWallet] = true;
        } else {
            revert("Invalid wallet type");
        }
        emit WalletUpdated(walletType, newWallet);
    }

    /** Emergency withdraw for ETH left in contract **/
    function rescueNative(uint256 amount) external onlyOwner nonReentrant {
        require(!presaleActive, "Sorry, unable to rug presale participants, politely get lost.");
        payable(owner()).transfer(amount);
    }

    // END ADMIN TOOLS

    // Handle funds deposited into the contract during/after the presale
    receive() external payable onlyPresaleActive() nonReentrant {
        uint256 ethAmount = msg.value;
        uint256 tokenAmount = ethAmount * presaleTokenPrice;

        require(tokenAmount >= minPresaleTokenBuy, "Purchase amount is below the minimum purchase amount");

        // Calculate the maximum token amount the buyer can purchase
        uint256 maxTokensPurchasable = maxPresaleTokenBuy - tokensPurchased[msg.sender];

        // Ensure the purchase does not exceed the max presale buy limit for the user
        require(maxTokensPurchasable > 0, "Purchase exceeds maximum presale amount");

        // If tokenAmount exceeds max buy limit, adjust and send change back
        if (tokenAmount > maxTokensPurchasable) {
            // Calculate the excess token amount and convert it back to ETH
            uint256 excessEthAmount = (tokenAmount - maxTokensPurchasable) / presaleTokenPrice;

            // Adjust the tokenAmount to the max buy limit
            tokenAmount = maxTokensPurchasable;

            // Send the excess ETH back to the buyer
            (bool success, ) = msg.sender.call{value: excessEthAmount}("");
            require(success, "User transfer failed");

            // Adjust the ethAmount to the actual amount used for the purchase
            ethAmount -= excessEthAmount;
        }

        // Ensure the contract has enough tokens to distribute
        require(balanceOf(address(this)) >= tokenAmount, "Not enough tokens in contract");

        // Emit event
        emit TokenPurchase(msg.sender, ethAmount, tokenAmount);

        inPresaleTx = true;

        // Transfer the full token amount to the purchaser
        super._transfer(address(this), msg.sender, tokenAmount);
        tokensPurchased[msg.sender] += tokenAmount;

        inPresaleTx = false;

        // Transfer 10% of the ETH balance to the marketing wallet
        uint256 marketingEthAmount = ethAmount / 10;
        (bool successMarketing, ) = teamWallets.marketing.call{value: marketingEthAmount}("");
        require(successMarketing, "Transfer to marketing wallet failed");

        // Transfer the rest to the liquidity wallet
        uint256 remainingEthAmount = ethAmount - marketingEthAmount;
        (bool successLiquidity, ) = teamWallets.liquidity.call{value: remainingEthAmount}("");
        require(successLiquidity, "Transfer to liquidity wallet failed");
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"address","name":"_devWallet","type":"address"},{"internalType":"address","name":"_liquidityWallet","type":"address"},{"internalType":"address","name":"_burnWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"BotRegistryUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"FrontrunProtectionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"MaxWalletBalanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blocks","type":"uint256"}],"name":"MinTxBlocksUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"active","type":"bool"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"PresaleActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"ProtectionExemptionsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newRouterAddress","type":"address"}],"name":"RouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"SniperProtectionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"TokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"TradingEnabled","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":"string","name":"walletType","type":"string"},{"indexed":false,"internalType":"address","name":"newWalletAddress","type":"address"}],"name":"WalletUpdated","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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"botRegistry","outputs":[{"internalType":"contract IBotRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxPresaleTokenBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minPresaleTokenBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTxBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleAllocations","outputs":[{"internalType":"uint256","name":"purchaser","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"dev","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"protectionExemption","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"purchaseRegistry","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setBotRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"setMaxWalletBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setProtectionExemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamWallets","outputs":[{"internalType":"address","name":"marketing","type":"address"},{"internalType":"address","name":"dev","type":"address"},{"internalType":"address","name":"liquidity","type":"address"},{"internalType":"address","name":"burn","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokensPurchased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"value","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":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateFrontrunProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"name":"updateMinTxBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateSniperProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"walletType","type":"string"},{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateTeamWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040526007805460ff60c01b191690553480156200001d575f80fd5b506040516200341638038062003416833981016040819052620000409162000c12565b3360405180604001604052806007815260200166467269656e646f60c81b81525060405180604001604052806007815260200166465249454e444f60c81b815250816003908162000092919062000d0b565b506004620000a1828262000d0b565b5050506001600160a01b038116620000d357604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b620000de81620003b3565b506001600655620000f26012600a62000ee0565b62000102906302faf08062000ef7565b60c052620001136012600a62000ee0565b62000122906216e36062000ef7565b600f55620001336012600a62000ee0565b6200014290620b71b062000ef7565b608052620001536012600a62000ee0565b620001619061138862000ef7565b60a09081526007805461ffff60a81b191661010160a81b1790556004600e55600880546001600160a01b03199081166001600160a01b03888116919091178355600980548316888316178155600a80548416888416178155600b8054909416878416178455305f908152600c60209081526040808320805460ff199081166001908117909255338552828520805482168317905598548716845281842080548a16821790559454861683528083208054891686179055835486168352808320805489168617905595549094168152848120805490961690921790945582519485018352601e80865291850184905260059285018390526023606086018190526014608096909601869052601183905560129490945560139290925591835560159290925560c051919060649062000299908462000ef7565b620002a5919062000f11565b90505f606460116001015484620002bd919062000ef7565b620002c9919062000f11565b90505f606460116002015485620002e1919062000ef7565b620002ed919062000f11565b90505f60646011600301548662000305919062000ef7565b62000311919062000f11565b90505f60646011600401548762000329919062000ef7565b62000335919062000f11565b905062000343308662000404565b6008546200035b906001600160a01b03168562000404565b60095462000373906001600160a01b03168462000404565b600a546200038b906001600160a01b03168362000404565b600b54620003a3906001600160a01b03168262000404565b5050505050505050505062000f7e565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382166200042f5760405163ec442f0560e01b81525f6004820152602401620000ca565b6200043c5f838362000440565b5050565b5f8111620004c75760405162461bcd60e51b815260206004820152604760248201527f596f7520617474656d707420746f207468726f77203020746f6b656e7320627560448201527f74207772656e636820796f75722073686f756c6465722066726f6d207468652060648201526632b33337b93a1760c91b608482015260a401620000ca565b620004d283620009be565b158015620004e85750620004e632620009be565b155b620005915760405162461bcd60e51b815260206004820152606660248201527f596f7572206163636f756e74206973206e6f74207065726d697474656420746f60448201527f207472616e7366657220746f6b656e732e20496620796f75207769736820746f60648201527f2061707065616c2c20636f6e7461637420746865207465616d206f6e2054656c60848201526532b3b930b69760d11b60a482015260c401620000ca565b6001600160a01b0382165f908152600c602052604090205460ff1680620005c15750600754600160b81b900460ff165b80620005d65750600754600160a01b900460ff165b6200064a5760405162461bcd60e51b815260206004820152603e60248201527f54726164696e67206973206e6f7420656e61626c656420666f7220746865207060448201527f75626c69632e20506c656173652074727920616761696e206c617465722e00006064820152608401620000ca565b600b546001600160a01b0390811690841603620006ba576001600160a01b03821615620006ba5760405162461bcd60e51b815260206004820181905260248201527f4275726e2077616c6c65742063616e206f6e6c79206275726e20746f6b656e736044820152606401620000ca565b6001600160a01b0382165f908152600c602052604090205460ff16158015620006e457505f600f54115b1562000771576001600160a01b0382165f908152602081905260408120546200070f90839062000f31565b9050600f548111156200076f5760405162461bcd60e51b815260206004820152602160248201527f416d6f756e742065786365656473206d61782077616c6c65742062616c616e636044820152606560f81b6064820152608401620000ca565b505b600754600160c01b900460ff16620009b157600754600160b01b900460ff168015620007a75750600754600160a01b900460ff16155b15620008fa576001600160a01b0382165f90815260106020526040902054156200083a5760405162461bcd60e51b815260206004820152604960248201525f80516020620033f683398151915260448201527f20636f6d706c65746564206265666f7265206f72207472616e7366657272696e60648201526833903a37b5b2b7399760b91b608482015260a401620000ca565b6001600160a01b0383165f9081526010602052604090205415620008c45760405162461bcd60e51b815260206004820152604660248201525f80516020620033f683398151915260448201527f20636f6d706c65746564206265666f7265207472616e7366657272696e67207460648201526537b5b2b7399760d11b608482015260a401620000ca565b6001600160a01b0382165f908152600c602052604090205460ff16620008fa57620008ef8262000a53565b620008fa3262000a53565b600754600160a81b900460ff1615620009b1576001600160a01b0382165f908152600c602052604090205460ff1662000948576001600160a01b0382165f908152600d602052604090204390555b6001600160a01b0383165f908152600c602052604090205460ff16620009b157600e546001600160a01b0384165f908152600d60205260409020546200098f904362000f47565b1015620009b157620009a18362000a53565b620009ac3262000a53565b505050565b620009ac83838362000acc565b6007545f906001600160a01b03161562000a47576007546040516320bae1cb60e01b81526001600160a01b038481166004830152909116906320bae1cb90602401602060405180830381865afa15801562000a1b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000a41919062000f5d565b92915050565b505f919050565b919050565b6007546001600160a01b03161562000ac957600754604051635082b36560e11b81526001600160a01b038381166004830152600160248301529091169063a10566ca906044015f604051808303815f87803b15801562000ab1575f80fd5b505af115801562000ac4573d5f803e3d5ffd5b505050505b50565b6001600160a01b03831662000afa578060025f82825462000aee919062000f31565b9091555062000b6c9050565b6001600160a01b0383165f908152602081905260409020548181101562000b4e5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000ca565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821662000b8a5760028054829003905562000ba8565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000bee91815260200190565b60405180910390a3505050565b80516001600160a01b038116811462000a4e575f80fd5b5f805f806080858703121562000c26575f80fd5b62000c318562000bfb565b935062000c416020860162000bfb565b925062000c516040860162000bfb565b915062000c616060860162000bfb565b905092959194509250565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168062000c9557607f821691505b60208210810362000cb457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620009ac575f81815260208120601f850160051c8101602086101562000ce25750805b601f850160051c820191505b8181101562000d035782815560010162000cee565b505050505050565b81516001600160401b0381111562000d275762000d2762000c6c565b62000d3f8162000d38845462000c80565b8462000cba565b602080601f83116001811462000d75575f841562000d5d5750858301515b5f19600386901b1c1916600185901b17855562000d03565b5f85815260208120601f198616915b8281101562000da55788860151825594840194600190910190840162000d84565b508582101562000dc357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b600181815b8085111562000e2757815f190482111562000e0b5762000e0b62000dd3565b8085161562000e1957918102915b93841c939080029062000dec565b509250929050565b5f8262000e3f5750600162000a41565b8162000e4d57505f62000a41565b816001811462000e66576002811462000e715762000e91565b600191505062000a41565b60ff84111562000e855762000e8562000dd3565b50506001821b62000a41565b5060208310610133831016604e8410600b841016171562000eb6575081810a62000a41565b62000ec2838362000de7565b805f190482111562000ed85762000ed862000dd3565b029392505050565b5f62000ef060ff84168362000e2f565b9392505050565b808202811582820484141762000a415762000a4162000dd3565b5f8262000f2c57634e487b7160e01b5f52601260045260245ffd5b500490565b8082018082111562000a415762000a4162000dd3565b8181038181111562000a415762000a4162000dd3565b5f6020828403121562000f6e575f80fd5b8151801515811462000ef0575f80fd5b60805160a05160c05161243f62000fb75f395f6109bf01525f8181610296015261098c01525f8181610336015261083a015261243f5ff3fe608060405260043610610220575f3560e01c806353135ca01161011e5780639096c74a116100a8578063bbde77c11161006d578063bbde77c114610bcc578063c424e77714610be1578063dd62ed3e14610c00578063f2fde38b14610c44578063ffb91e0a14610c63575f80fd5b80639096c74a14610b0a57806393777fb314610b6f57806395d89b4114610b85578063a43be57b14610b99578063a9059cbb14610bad575f80fd5b80638604a7a3116100ee5780638604a7a314610a68578063871991fe14610a875780638a8c523c14610aa65780638d88968614610aba5780638da5cb5b14610ad9575f80fd5b806353135ca0146109e157806370a0823114610a01578063715018a614610a3557806379cc679014610a49575f80fd5b8063264b584c116101aa5780633a9e00de1161016f5780633a9e00de1461091e57806342966c681461093d578063454aa6691461095c5780634b05631a1461097b57806350f7c204146109ae575f80fd5b8063264b584c1461082957806328e9bff81461085c5780632ad92740146108aa5780632b0fcbd3146108d5578063313ce56714610903575f80fd5b80630de6b510116101f05780630de6b5101461078d57806318160ddd146107b857806319039bc5146107cc57806323b872dd146107eb578063247202001461080a575f80fd5b806304c98b2b146106fd57806306fdde0314610711578063095ea7b31461073b5780630c9e36ea1461076a575f80fd5b366106f957600754600160b81b900460ff1661027b5760405162461bcd60e51b815260206004820152601560248201527450726573616c65206973206e6f742061637469766560581b60448201526064015b60405180910390fd5b610283610c82565b345f610292620f4240836120b4565b90507f00000000000000000000000000000000000000000000000000000000000000008110156103215760405162461bcd60e51b815260206004820152603460248201527f507572636861736520616d6f756e742069732062656c6f7720746865206d696e6044820152731a5b5d5b481c1d5c98da185cd948185b5bdd5b9d60621b6064820152608401610272565b335f9081526010602052604081205461035a907f00000000000000000000000000000000000000000000000000000000000000006120cb565b90505f81116103bb5760405162461bcd60e51b815260206004820152602760248201527f50757263686173652065786365656473206d6178696d756d2070726573616c6560448201526608185b5bdd5b9d60ca1b6064820152608401610272565b80821115610486575f620f42406103d283856120cb565b6103dc91906120de565b90508192505f336001600160a01b0316826040515f6040518083038185875af1925050503d805f811461042a576040519150601f19603f3d011682016040523d82523d5f602084013e61042f565b606091505b50509050806104775760405162461bcd60e51b8152602060048201526014602482015273155cd95c881d1c985b9cd9995c8819985a5b195960621b6044820152606401610272565b61048182866120cb565b945050505b305f908152602081905260409020548211156104e45760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420656e6f75676820746f6b656e7320696e20636f6e74726163740000006044820152606401610272565b604080518481526020810184905233917fcd60aa75dea3072fbc07ae6d7d856b5dc5f4eee88854f5b4abf7b680ef8bc50f910160405180910390a26007805460ff60c01b1916600160c01b17905561053d303384610cdb565b335f908152601060205260408120805484929061055b9084906120fd565b90915550506007805460ff60c01b191690555f610579600a856120de565b6008546040519192505f916001600160a01b039091169083908381818185875af1925050503d805f81146105c8576040519150601f19603f3d011682016040523d82523d5f602084013e6105cd565b606091505b505090508061062a5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657220746f206d61726b6574696e672077616c6c6574206661696044820152621b195960ea1b6064820152608401610272565b5f61063583876120cb565b600a546040519192505f916001600160a01b039091169083908381818185875af1925050503d805f8114610684576040519150601f19603f3d011682016040523d82523d5f602084013e610689565b606091505b50509050806106e65760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657220746f206c69717569646974792077616c6c6574206661696044820152621b195960ea1b6064820152608401610272565b505050505050506106f76001600655565b005b5f80fd5b348015610708575f80fd5b506106f7610d3d565b34801561071c575f80fd5b50610725610dee565b604051610732919061215d565b60405180910390f35b348015610746575f80fd5b5061075a61075536600461218c565b610e7e565b6040519015158152602001610732565b348015610775575f80fd5b5061077f600e5481565b604051908152602001610732565b348015610798575f80fd5b5061077f6107a73660046121b4565b600d6020525f908152604090205481565b3480156107c3575f80fd5b5060025461077f565b3480156107d7575f80fd5b506106f76107e63660046121b4565b610e97565b3480156107f6575f80fd5b5061075a6108053660046121cd565b610ee8565b348015610815575f80fd5b506106f7610824366004612213565b610f0b565b348015610834575f80fd5b5061077f7f000000000000000000000000000000000000000000000000000000000000000081565b348015610867575f80fd5b50601154601254601354601454601554610882949392919085565b604080519586526020860194909452928401919091526060830152608082015260a001610732565b3480156108b5575f80fd5b5061077f6108c43660046121b4565b60106020525f908152604090205481565b3480156108e0575f80fd5b5061075a6108ef3660046121b4565b600c6020525f908152604090205460ff1681565b34801561090e575f80fd5b5060405160128152602001610732565b348015610929575f80fd5b506106f761093836600461222e565b610fc6565b348015610948575f80fd5b506106f761095736600461222e565b611003565b348015610967575f80fd5b506106f761097636600461222e565b611010565b348015610986575f80fd5b5061077f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156109b9575f80fd5b5061077f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156109ec575f80fd5b5060075461075a90600160b81b900460ff1681565b348015610a0c575f80fd5b5061077f610a1b3660046121b4565b6001600160a01b03165f9081526020819052604090205490565b348015610a40575f80fd5b506106f76110e2565b348015610a54575f80fd5b506106f7610a6336600461218c565b6110f5565b348015610a73575f80fd5b506106f7610a82366004612245565b61110e565b348015610a92575f80fd5b506106f7610aa1366004612213565b611174565b348015610ab1575f80fd5b506106f7611224565b348015610ac5575f80fd5b506106f7610ad436600461228e565b6112cd565b348015610ae4575f80fd5b506005546001600160a01b03165b6040516001600160a01b039091168152602001610732565b348015610b15575f80fd5b50600854600954600a54600b54610b3c936001600160a01b03908116938116928116911684565b604080516001600160a01b0395861681529385166020850152918416918301919091529091166060820152608001610732565b348015610b7a575f80fd5b5061077f620f424081565b348015610b90575f80fd5b50610725611548565b348015610ba4575f80fd5b506106f7611557565b348015610bb8575f80fd5b5061075a610bc736600461218c565b61160f565b348015610bd7575f80fd5b5061077f600f5481565b348015610bec575f80fd5b506106f7610bfb36600461222e565b61161c565b348015610c0b575f80fd5b5061077f610c1a36600461234a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610c4f575f80fd5b506106f7610c5e3660046121b4565b6116c5565b348015610c6e575f80fd5b50600754610af2906001600160a01b031681565b600260065403610cd45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610272565b6002600655565b6001600160a01b038316610d0457604051634b637e8f60e11b81525f6004820152602401610272565b6001600160a01b038216610d2d5760405163ec442f0560e01b81525f6004820152602401610272565b610d388383836116ff565b505050565b610d45611c6e565b600754600160b81b900460ff1615610d9f5760405162461bcd60e51b815260206004820152601960248201527f50726573616c6520697320616c726561647920616374697665000000000000006044820152606401610272565b6007805460ff60b81b1916600160b81b17905560408051600181524360208201527f9e7d5daffa70916f9d5f93a82ad2f4f647d1fd1e8cab2bec96e63c08c525dddf91015b60405180910390a1565b606060038054610dfd90612372565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2990612372565b8015610e745780601f10610e4b57610100808354040283529160200191610e74565b820191905f5260205f20905b815481529060010190602001808311610e5757829003601f168201915b5050505050905090565b5f33610e8b818585611c9b565b60019150505b92915050565b610e9f611c6e565b600780546001600160a01b0319166001600160a01b0383169081179091556040517f50eb9d1204f72dee53ed51b16a30cbb3006c4b4f40f6a8e155aa156cd36012d1905f90a250565b5f33610ef5858285611ca8565b610f00858585610cdb565b506001949350505050565b610f13611c6e565b801515600760159054906101000a900460ff16151503610f6e5760405162461bcd60e51b8152602060048201526016602482015275141c9bdd1958dd1a5bdb88185b1c9958591e481cd95d60521b6044820152606401610272565b60078054821515600160a81b0260ff60a81b199091161790556040517f44c5a649344ca7ee61235a9662e420f716cc79c2df4017d564058cff8cb2426d90610fbb90831515815260200190565b60405180910390a150565b610fce611c6e565b600f8190556040518181527f9cbd2e55e2abf49d29273c1b9fb343c2828844b2aec156cfe2aec98ae1b72a9990602001610fbb565b61100d3382611d23565b50565b611018611c6e565b611020610c82565b600754600160b81b900460ff16156110a05760405162461bcd60e51b815260206004820152603d60248201527f536f7272792c20756e61626c6520746f207275672070726573616c652070617260448201527f7469636970616e74732c20706f6c6974656c7920676574206c6f73742e0000006064820152608401610272565b6005546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156110d7573d5f803e3d5ffd5b5061100d6001600655565b6110ea611c6e565b6110f35f611d57565b565b611100823383611ca8565b61110a8282611d23565b5050565b611116611c6e565b6001600160a01b0382165f818152600c6020908152604091829020805460ff191685151590811790915591519182527fc806c194a3eb9274156152edad33805a931094d9a21c2da5067e54c0c2f54e3a910160405180910390a25050565b61117c611c6e565b801515600760169054906101000a900460ff161515036111d75760405162461bcd60e51b8152602060048201526016602482015275141c9bdd1958dd1a5bdb88185b1c9958591e481cd95d60521b6044820152606401610272565b60078054821515600160b01b0260ff60b01b199091161790556040517f4a7fb70d20ad44a83abc4e7285599bfd95695b9b5056076ac00ff8fc79c2815090610fbb90831515815260200190565b61122c611c6e565b600754600160a01b900460ff16156112865760405162461bcd60e51b815260206004820152601a60248201527f54726164696e6720697320616c726561647920656e61626c65640000000000006044820152606401610272565b6007805462ff00ff60a01b1916600160a01b1790556040517fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e92390610de49043815260200190565b6112d5611c6e565b604051686d61726b6574696e6760b81b6020820152602901604051602081830303815290604052805190602001208260405160200161131491906123aa565b604051602081830303815290604052805190602001200361137f57600880546001600160a01b039081165f908152600c6020526040808220805460ff1990811690915584546001600160a01b031916938616938417909455918152208054909116600117905561150b565b604051623232bb60e91b602082015260230160405160208183030381529060405280519060200120826040516020016113b891906123aa565b604051602081830303815290604052805190602001200361142357600980546001600160a01b039081165f908152600c6020526040808220805460ff1990811690915584546001600160a01b031916938616938417909455918152208054909116600117905561150b565b604051686c697175696469747960b81b6020820152602901604051602081830303815290604052805190602001208260405160200161146291906123aa565b60405160208183030381529060405280519060200120036114cd57600a80546001600160a01b039081165f908152600c6020526040808220805460ff1990811690915584546001600160a01b031916938616938417909455918152208054909116600117905561150b565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c69642077616c6c6574207479706560681b6044820152606401610272565b7f6ff3a4003b90be84595beb5f6acb9d54f88bd3e6dd4887ca67e53dc9645465ea828260405161153c9291906123c5565b60405180910390a15050565b606060048054610dfd90612372565b61155f611c6e565b600754600160b81b900460ff166115b05760405162461bcd60e51b815260206004820152601560248201527450726573616c65206973206e6f742061637469766560581b6044820152606401610272565b6007805460ff60b81b19169055604080515f81524360208201527f9e7d5daffa70916f9d5f93a82ad2f4f647d1fd1e8cab2bec96e63c08c525dddf910160405180910390a1305f818152602081905260409020549061100d9082611d23565b5f33610e8b818585610cdb565b611624611c6e565b604b81106116905760405162461bcd60e51b815260206004820152603360248201527f4c6f6e67657220706572696f6473206172656e2774207265616c6c792066726f6044820152726e74756e6e696e672c2061726520746865793f60681b6064820152608401610272565b600e8190556040518181527f745fbe03bd837eee236eeef9eed394293f741be6ed7ad97e14f4289e3283eb1f90602001610fbb565b6116cd611c6e565b6001600160a01b0381166116f657604051631e4fbdf760e01b81525f6004820152602401610272565b61100d81611d57565b5f81116117845760405162461bcd60e51b815260206004820152604760248201527f596f7520617474656d707420746f207468726f77203020746f6b656e7320627560448201527f74207772656e636820796f75722073686f756c6465722066726f6d207468652060648201526632b33337b93a1760c91b608482015260a401610272565b61178d83611da8565b1580156117a0575061179e32611da8565b155b6118475760405162461bcd60e51b815260206004820152606660248201527f596f7572206163636f756e74206973206e6f74207065726d697474656420746f60448201527f207472616e7366657220746f6b656e732e20496620796f75207769736820746f60648201527f2061707065616c2c20636f6e7461637420746865207465616d206f6e2054656c60848201526532b3b930b69760d11b60a482015260c401610272565b6001600160a01b0382165f908152600c602052604090205460ff16806118765750600754600160b81b900460ff165b8061188a5750600754600160a01b900460ff165b6118fc5760405162461bcd60e51b815260206004820152603e60248201527f54726164696e67206973206e6f7420656e61626c656420666f7220746865207060448201527f75626c69632e20506c656173652074727920616761696e206c617465722e00006064820152608401610272565b600b546001600160a01b0390811690841603611969576001600160a01b038216156119695760405162461bcd60e51b815260206004820181905260248201527f4275726e2077616c6c65742063616e206f6e6c79206275726e20746f6b656e736044820152606401610272565b6001600160a01b0382165f908152600c602052604090205460ff1615801561199257505f600f54115b15611a1a576001600160a01b0382165f908152602081905260408120546119ba9083906120fd565b9050600f54811115611a185760405162461bcd60e51b815260206004820152602160248201527f416d6f756e742065786365656473206d61782077616c6c65742062616c616e636044820152606560f81b6064820152608401610272565b505b600754600160c01b900460ff16611c6357600754600160b01b900460ff168015611a4e5750600754600160a01b900460ff16155b15611bbb576001600160a01b0382165f9081526010602052604090205415611af05760405162461bcd60e51b815260206004820152604960248201527f506c65617365207761697420756e74696c207468652070726573616c6520697360448201527f20636f6d706c65746564206265666f7265206f72207472616e7366657272696e60648201526833903a37b5b2b7399760b91b608482015260a401610272565b6001600160a01b0383165f9081526010602052604090205415611b8a5760405162461bcd60e51b815260206004820152604660248201527f506c65617365207761697420756e74696c207468652070726573616c6520697360448201527f20636f6d706c65746564206265666f7265207472616e7366657272696e67207460648201526537b5b2b7399760d11b608482015260a401610272565b6001600160a01b0382165f908152600c602052604090205460ff16611bbb57611bb282611e33565b611bbb32611e33565b600754600160a81b900460ff1615611c63576001600160a01b0382165f908152600c602052604090205460ff16611c07576001600160a01b0382165f908152600d602052604090204390555b6001600160a01b0383165f908152600c602052604090205460ff16611c6357600e546001600160a01b0384165f908152600d6020526040902054611c4b90436120cb565b1015611c6357611c5a83611e33565b610d3832611e33565b610d38838383611ea8565b6005546001600160a01b031633146110f35760405163118cdaa760e01b8152336004820152602401610272565b610d388383836001611fce565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114611d1d5781811015611d0f57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610272565b611d1d84848484035f611fce565b50505050565b6001600160a01b038216611d4c57604051634b637e8f60e11b81525f6004820152602401610272565b61110a825f836116ff565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6007545f906001600160a01b031615611e27576007546040516320bae1cb60e01b81526001600160a01b038481166004830152909116906320bae1cb90602401602060405180830381865afa158015611e03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9191906123ee565b505f919050565b919050565b6007546001600160a01b03161561100d57600754604051635082b36560e11b81526001600160a01b038381166004830152600160248301529091169063a10566ca906044015f604051808303815f87803b158015611e8f575f80fd5b505af1158015611ea1573d5f803e3d5ffd5b5050505050565b6001600160a01b038316611ed2578060025f828254611ec791906120fd565b90915550611f429050565b6001600160a01b0383165f9081526020819052604090205481811015611f245760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610272565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611f5e57600280548290039055611f7c565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611fc191815260200190565b60405180910390a3505050565b6001600160a01b038416611ff75760405163e602df0560e01b81525f6004820152602401610272565b6001600160a01b03831661202057604051634a1406b160e11b81525f6004820152602401610272565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015611d1d57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161209291815260200190565b60405180910390a350505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610e9157610e916120a0565b81810381811115610e9157610e916120a0565b5f826120f857634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610e9157610e916120a0565b5f5b8381101561212a578181015183820152602001612112565b50505f910152565b5f8151808452612149816020860160208601612110565b601f01601f19169290920160200192915050565b602081525f61216f6020830184612132565b9392505050565b80356001600160a01b0381168114611e2e575f80fd5b5f806040838503121561219d575f80fd5b6121a683612176565b946020939093013593505050565b5f602082840312156121c4575f80fd5b61216f82612176565b5f805f606084860312156121df575f80fd5b6121e884612176565b92506121f660208501612176565b9150604084013590509250925092565b801515811461100d575f80fd5b5f60208284031215612223575f80fd5b813561216f81612206565b5f6020828403121561223e575f80fd5b5035919050565b5f8060408385031215612256575f80fd5b61225f83612176565b9150602083013561226f81612206565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561229f575f80fd5b823567ffffffffffffffff808211156122b6575f80fd5b818501915085601f8301126122c9575f80fd5b8135818111156122db576122db61227a565b604051601f8201601f19908116603f011681019083821181831017156123035761230361227a565b8160405282815288602084870101111561231b575f80fd5b826020860160208301375f60208483010152809650505050505061234160208401612176565b90509250929050565b5f806040838503121561235b575f80fd5b61236483612176565b915061234160208401612176565b600181811c9082168061238657607f821691505b6020821081036123a457634e487b7160e01b5f52602260045260245ffd5b50919050565b5f82516123bb818460208701612110565b9190910192915050565b604081525f6123d76040830185612132565b905060018060a01b03831660208301529392505050565b5f602082840312156123fe575f80fd5b815161216f8161220656fea26469706673582212206adf9cf8241a4258cdd4abdd1264f5b6b213831859e3b188bb6847686d3b686b64736f6c63430008140033506c65617365207761697420756e74696c207468652070726573616c652069730000000000000000000000001dfcfea7c4bae85f942d643aa89fecdb47a319ad000000000000000000000000cb963a3e3146a4c41b7c1123db0cc0acd3ddfec3000000000000000000000000e5e304a273372a779482f44a0d0afca0fe3fb8f7000000000000000000000000f8096165f36ea70a6c0045467c1a63756ca2fce0

Deployed Bytecode

0x608060405260043610610220575f3560e01c806353135ca01161011e5780639096c74a116100a8578063bbde77c11161006d578063bbde77c114610bcc578063c424e77714610be1578063dd62ed3e14610c00578063f2fde38b14610c44578063ffb91e0a14610c63575f80fd5b80639096c74a14610b0a57806393777fb314610b6f57806395d89b4114610b85578063a43be57b14610b99578063a9059cbb14610bad575f80fd5b80638604a7a3116100ee5780638604a7a314610a68578063871991fe14610a875780638a8c523c14610aa65780638d88968614610aba5780638da5cb5b14610ad9575f80fd5b806353135ca0146109e157806370a0823114610a01578063715018a614610a3557806379cc679014610a49575f80fd5b8063264b584c116101aa5780633a9e00de1161016f5780633a9e00de1461091e57806342966c681461093d578063454aa6691461095c5780634b05631a1461097b57806350f7c204146109ae575f80fd5b8063264b584c1461082957806328e9bff81461085c5780632ad92740146108aa5780632b0fcbd3146108d5578063313ce56714610903575f80fd5b80630de6b510116101f05780630de6b5101461078d57806318160ddd146107b857806319039bc5146107cc57806323b872dd146107eb578063247202001461080a575f80fd5b806304c98b2b146106fd57806306fdde0314610711578063095ea7b31461073b5780630c9e36ea1461076a575f80fd5b366106f957600754600160b81b900460ff1661027b5760405162461bcd60e51b815260206004820152601560248201527450726573616c65206973206e6f742061637469766560581b60448201526064015b60405180910390fd5b610283610c82565b345f610292620f4240836120b4565b90507f00000000000000000000000000000000000000000000010f0cf064dd592000008110156103215760405162461bcd60e51b815260206004820152603460248201527f507572636861736520616d6f756e742069732062656c6f7720746865206d696e6044820152731a5b5d5b481c1d5c98da185cd948185b5bdd5b9d60621b6064820152608401610272565b335f9081526010602052604081205461035a907f000000000000000000000000000000000000000000009ed194db19b238c000006120cb565b90505f81116103bb5760405162461bcd60e51b815260206004820152602760248201527f50757263686173652065786365656473206d6178696d756d2070726573616c6560448201526608185b5bdd5b9d60ca1b6064820152608401610272565b80821115610486575f620f42406103d283856120cb565b6103dc91906120de565b90508192505f336001600160a01b0316826040515f6040518083038185875af1925050503d805f811461042a576040519150601f19603f3d011682016040523d82523d5f602084013e61042f565b606091505b50509050806104775760405162461bcd60e51b8152602060048201526014602482015273155cd95c881d1c985b9cd9995c8819985a5b195960621b6044820152606401610272565b61048182866120cb565b945050505b305f908152602081905260409020548211156104e45760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420656e6f75676820746f6b656e7320696e20636f6e74726163740000006044820152606401610272565b604080518481526020810184905233917fcd60aa75dea3072fbc07ae6d7d856b5dc5f4eee88854f5b4abf7b680ef8bc50f910160405180910390a26007805460ff60c01b1916600160c01b17905561053d303384610cdb565b335f908152601060205260408120805484929061055b9084906120fd565b90915550506007805460ff60c01b191690555f610579600a856120de565b6008546040519192505f916001600160a01b039091169083908381818185875af1925050503d805f81146105c8576040519150601f19603f3d011682016040523d82523d5f602084013e6105cd565b606091505b505090508061062a5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657220746f206d61726b6574696e672077616c6c6574206661696044820152621b195960ea1b6064820152608401610272565b5f61063583876120cb565b600a546040519192505f916001600160a01b039091169083908381818185875af1925050503d805f8114610684576040519150601f19603f3d011682016040523d82523d5f602084013e610689565b606091505b50509050806106e65760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657220746f206c69717569646974792077616c6c6574206661696044820152621b195960ea1b6064820152608401610272565b505050505050506106f76001600655565b005b5f80fd5b348015610708575f80fd5b506106f7610d3d565b34801561071c575f80fd5b50610725610dee565b604051610732919061215d565b60405180910390f35b348015610746575f80fd5b5061075a61075536600461218c565b610e7e565b6040519015158152602001610732565b348015610775575f80fd5b5061077f600e5481565b604051908152602001610732565b348015610798575f80fd5b5061077f6107a73660046121b4565b600d6020525f908152604090205481565b3480156107c3575f80fd5b5060025461077f565b3480156107d7575f80fd5b506106f76107e63660046121b4565b610e97565b3480156107f6575f80fd5b5061075a6108053660046121cd565b610ee8565b348015610815575f80fd5b506106f7610824366004612213565b610f0b565b348015610834575f80fd5b5061077f7f000000000000000000000000000000000000000000009ed194db19b238c0000081565b348015610867575f80fd5b50601154601254601354601454601554610882949392919085565b604080519586526020860194909452928401919091526060830152608082015260a001610732565b3480156108b5575f80fd5b5061077f6108c43660046121b4565b60106020525f908152604090205481565b3480156108e0575f80fd5b5061075a6108ef3660046121b4565b600c6020525f908152604090205460ff1681565b34801561090e575f80fd5b5060405160128152602001610732565b348015610929575f80fd5b506106f761093836600461222e565b610fc6565b348015610948575f80fd5b506106f761095736600461222e565b611003565b348015610967575f80fd5b506106f761097636600461222e565b611010565b348015610986575f80fd5b5061077f7f00000000000000000000000000000000000000000000010f0cf064dd5920000081565b3480156109b9575f80fd5b5061077f7f000000000000000000000000000000000000000000295be96e6406697200000081565b3480156109ec575f80fd5b5060075461075a90600160b81b900460ff1681565b348015610a0c575f80fd5b5061077f610a1b3660046121b4565b6001600160a01b03165f9081526020819052604090205490565b348015610a40575f80fd5b506106f76110e2565b348015610a54575f80fd5b506106f7610a6336600461218c565b6110f5565b348015610a73575f80fd5b506106f7610a82366004612245565b61110e565b348015610a92575f80fd5b506106f7610aa1366004612213565b611174565b348015610ab1575f80fd5b506106f7611224565b348015610ac5575f80fd5b506106f7610ad436600461228e565b6112cd565b348015610ae4575f80fd5b506005546001600160a01b03165b6040516001600160a01b039091168152602001610732565b348015610b15575f80fd5b50600854600954600a54600b54610b3c936001600160a01b03908116938116928116911684565b604080516001600160a01b0395861681529385166020850152918416918301919091529091166060820152608001610732565b348015610b7a575f80fd5b5061077f620f424081565b348015610b90575f80fd5b50610725611548565b348015610ba4575f80fd5b506106f7611557565b348015610bb8575f80fd5b5061075a610bc736600461218c565b61160f565b348015610bd7575f80fd5b5061077f600f5481565b348015610bec575f80fd5b506106f7610bfb36600461222e565b61161c565b348015610c0b575f80fd5b5061077f610c1a36600461234a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610c4f575f80fd5b506106f7610c5e3660046121b4565b6116c5565b348015610c6e575f80fd5b50600754610af2906001600160a01b031681565b600260065403610cd45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610272565b6002600655565b6001600160a01b038316610d0457604051634b637e8f60e11b81525f6004820152602401610272565b6001600160a01b038216610d2d5760405163ec442f0560e01b81525f6004820152602401610272565b610d388383836116ff565b505050565b610d45611c6e565b600754600160b81b900460ff1615610d9f5760405162461bcd60e51b815260206004820152601960248201527f50726573616c6520697320616c726561647920616374697665000000000000006044820152606401610272565b6007805460ff60b81b1916600160b81b17905560408051600181524360208201527f9e7d5daffa70916f9d5f93a82ad2f4f647d1fd1e8cab2bec96e63c08c525dddf91015b60405180910390a1565b606060038054610dfd90612372565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2990612372565b8015610e745780601f10610e4b57610100808354040283529160200191610e74565b820191905f5260205f20905b815481529060010190602001808311610e5757829003601f168201915b5050505050905090565b5f33610e8b818585611c9b565b60019150505b92915050565b610e9f611c6e565b600780546001600160a01b0319166001600160a01b0383169081179091556040517f50eb9d1204f72dee53ed51b16a30cbb3006c4b4f40f6a8e155aa156cd36012d1905f90a250565b5f33610ef5858285611ca8565b610f00858585610cdb565b506001949350505050565b610f13611c6e565b801515600760159054906101000a900460ff16151503610f6e5760405162461bcd60e51b8152602060048201526016602482015275141c9bdd1958dd1a5bdb88185b1c9958591e481cd95d60521b6044820152606401610272565b60078054821515600160a81b0260ff60a81b199091161790556040517f44c5a649344ca7ee61235a9662e420f716cc79c2df4017d564058cff8cb2426d90610fbb90831515815260200190565b60405180910390a150565b610fce611c6e565b600f8190556040518181527f9cbd2e55e2abf49d29273c1b9fb343c2828844b2aec156cfe2aec98ae1b72a9990602001610fbb565b61100d3382611d23565b50565b611018611c6e565b611020610c82565b600754600160b81b900460ff16156110a05760405162461bcd60e51b815260206004820152603d60248201527f536f7272792c20756e61626c6520746f207275672070726573616c652070617260448201527f7469636970616e74732c20706f6c6974656c7920676574206c6f73742e0000006064820152608401610272565b6005546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156110d7573d5f803e3d5ffd5b5061100d6001600655565b6110ea611c6e565b6110f35f611d57565b565b611100823383611ca8565b61110a8282611d23565b5050565b611116611c6e565b6001600160a01b0382165f818152600c6020908152604091829020805460ff191685151590811790915591519182527fc806c194a3eb9274156152edad33805a931094d9a21c2da5067e54c0c2f54e3a910160405180910390a25050565b61117c611c6e565b801515600760169054906101000a900460ff161515036111d75760405162461bcd60e51b8152602060048201526016602482015275141c9bdd1958dd1a5bdb88185b1c9958591e481cd95d60521b6044820152606401610272565b60078054821515600160b01b0260ff60b01b199091161790556040517f4a7fb70d20ad44a83abc4e7285599bfd95695b9b5056076ac00ff8fc79c2815090610fbb90831515815260200190565b61122c611c6e565b600754600160a01b900460ff16156112865760405162461bcd60e51b815260206004820152601a60248201527f54726164696e6720697320616c726561647920656e61626c65640000000000006044820152606401610272565b6007805462ff00ff60a01b1916600160a01b1790556040517fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e92390610de49043815260200190565b6112d5611c6e565b604051686d61726b6574696e6760b81b6020820152602901604051602081830303815290604052805190602001208260405160200161131491906123aa565b604051602081830303815290604052805190602001200361137f57600880546001600160a01b039081165f908152600c6020526040808220805460ff1990811690915584546001600160a01b031916938616938417909455918152208054909116600117905561150b565b604051623232bb60e91b602082015260230160405160208183030381529060405280519060200120826040516020016113b891906123aa565b604051602081830303815290604052805190602001200361142357600980546001600160a01b039081165f908152600c6020526040808220805460ff1990811690915584546001600160a01b031916938616938417909455918152208054909116600117905561150b565b604051686c697175696469747960b81b6020820152602901604051602081830303815290604052805190602001208260405160200161146291906123aa565b60405160208183030381529060405280519060200120036114cd57600a80546001600160a01b039081165f908152600c6020526040808220805460ff1990811690915584546001600160a01b031916938616938417909455918152208054909116600117905561150b565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c69642077616c6c6574207479706560681b6044820152606401610272565b7f6ff3a4003b90be84595beb5f6acb9d54f88bd3e6dd4887ca67e53dc9645465ea828260405161153c9291906123c5565b60405180910390a15050565b606060048054610dfd90612372565b61155f611c6e565b600754600160b81b900460ff166115b05760405162461bcd60e51b815260206004820152601560248201527450726573616c65206973206e6f742061637469766560581b6044820152606401610272565b6007805460ff60b81b19169055604080515f81524360208201527f9e7d5daffa70916f9d5f93a82ad2f4f647d1fd1e8cab2bec96e63c08c525dddf910160405180910390a1305f818152602081905260409020549061100d9082611d23565b5f33610e8b818585610cdb565b611624611c6e565b604b81106116905760405162461bcd60e51b815260206004820152603360248201527f4c6f6e67657220706572696f6473206172656e2774207265616c6c792066726f6044820152726e74756e6e696e672c2061726520746865793f60681b6064820152608401610272565b600e8190556040518181527f745fbe03bd837eee236eeef9eed394293f741be6ed7ad97e14f4289e3283eb1f90602001610fbb565b6116cd611c6e565b6001600160a01b0381166116f657604051631e4fbdf760e01b81525f6004820152602401610272565b61100d81611d57565b5f81116117845760405162461bcd60e51b815260206004820152604760248201527f596f7520617474656d707420746f207468726f77203020746f6b656e7320627560448201527f74207772656e636820796f75722073686f756c6465722066726f6d207468652060648201526632b33337b93a1760c91b608482015260a401610272565b61178d83611da8565b1580156117a0575061179e32611da8565b155b6118475760405162461bcd60e51b815260206004820152606660248201527f596f7572206163636f756e74206973206e6f74207065726d697474656420746f60448201527f207472616e7366657220746f6b656e732e20496620796f75207769736820746f60648201527f2061707065616c2c20636f6e7461637420746865207465616d206f6e2054656c60848201526532b3b930b69760d11b60a482015260c401610272565b6001600160a01b0382165f908152600c602052604090205460ff16806118765750600754600160b81b900460ff165b8061188a5750600754600160a01b900460ff165b6118fc5760405162461bcd60e51b815260206004820152603e60248201527f54726164696e67206973206e6f7420656e61626c656420666f7220746865207060448201527f75626c69632e20506c656173652074727920616761696e206c617465722e00006064820152608401610272565b600b546001600160a01b0390811690841603611969576001600160a01b038216156119695760405162461bcd60e51b815260206004820181905260248201527f4275726e2077616c6c65742063616e206f6e6c79206275726e20746f6b656e736044820152606401610272565b6001600160a01b0382165f908152600c602052604090205460ff1615801561199257505f600f54115b15611a1a576001600160a01b0382165f908152602081905260408120546119ba9083906120fd565b9050600f54811115611a185760405162461bcd60e51b815260206004820152602160248201527f416d6f756e742065786365656473206d61782077616c6c65742062616c616e636044820152606560f81b6064820152608401610272565b505b600754600160c01b900460ff16611c6357600754600160b01b900460ff168015611a4e5750600754600160a01b900460ff16155b15611bbb576001600160a01b0382165f9081526010602052604090205415611af05760405162461bcd60e51b815260206004820152604960248201527f506c65617365207761697420756e74696c207468652070726573616c6520697360448201527f20636f6d706c65746564206265666f7265206f72207472616e7366657272696e60648201526833903a37b5b2b7399760b91b608482015260a401610272565b6001600160a01b0383165f9081526010602052604090205415611b8a5760405162461bcd60e51b815260206004820152604660248201527f506c65617365207761697420756e74696c207468652070726573616c6520697360448201527f20636f6d706c65746564206265666f7265207472616e7366657272696e67207460648201526537b5b2b7399760d11b608482015260a401610272565b6001600160a01b0382165f908152600c602052604090205460ff16611bbb57611bb282611e33565b611bbb32611e33565b600754600160a81b900460ff1615611c63576001600160a01b0382165f908152600c602052604090205460ff16611c07576001600160a01b0382165f908152600d602052604090204390555b6001600160a01b0383165f908152600c602052604090205460ff16611c6357600e546001600160a01b0384165f908152600d6020526040902054611c4b90436120cb565b1015611c6357611c5a83611e33565b610d3832611e33565b610d38838383611ea8565b6005546001600160a01b031633146110f35760405163118cdaa760e01b8152336004820152602401610272565b610d388383836001611fce565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114611d1d5781811015611d0f57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610272565b611d1d84848484035f611fce565b50505050565b6001600160a01b038216611d4c57604051634b637e8f60e11b81525f6004820152602401610272565b61110a825f836116ff565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6007545f906001600160a01b031615611e27576007546040516320bae1cb60e01b81526001600160a01b038481166004830152909116906320bae1cb90602401602060405180830381865afa158015611e03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9191906123ee565b505f919050565b919050565b6007546001600160a01b03161561100d57600754604051635082b36560e11b81526001600160a01b038381166004830152600160248301529091169063a10566ca906044015f604051808303815f87803b158015611e8f575f80fd5b505af1158015611ea1573d5f803e3d5ffd5b5050505050565b6001600160a01b038316611ed2578060025f828254611ec791906120fd565b90915550611f429050565b6001600160a01b0383165f9081526020819052604090205481811015611f245760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610272565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611f5e57600280548290039055611f7c565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611fc191815260200190565b60405180910390a3505050565b6001600160a01b038416611ff75760405163e602df0560e01b81525f6004820152602401610272565b6001600160a01b03831661202057604051634a1406b160e11b81525f6004820152602401610272565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015611d1d57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161209291815260200190565b60405180910390a350505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610e9157610e916120a0565b81810381811115610e9157610e916120a0565b5f826120f857634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610e9157610e916120a0565b5f5b8381101561212a578181015183820152602001612112565b50505f910152565b5f8151808452612149816020860160208601612110565b601f01601f19169290920160200192915050565b602081525f61216f6020830184612132565b9392505050565b80356001600160a01b0381168114611e2e575f80fd5b5f806040838503121561219d575f80fd5b6121a683612176565b946020939093013593505050565b5f602082840312156121c4575f80fd5b61216f82612176565b5f805f606084860312156121df575f80fd5b6121e884612176565b92506121f660208501612176565b9150604084013590509250925092565b801515811461100d575f80fd5b5f60208284031215612223575f80fd5b813561216f81612206565b5f6020828403121561223e575f80fd5b5035919050565b5f8060408385031215612256575f80fd5b61225f83612176565b9150602083013561226f81612206565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561229f575f80fd5b823567ffffffffffffffff808211156122b6575f80fd5b818501915085601f8301126122c9575f80fd5b8135818111156122db576122db61227a565b604051601f8201601f19908116603f011681019083821181831017156123035761230361227a565b8160405282815288602084870101111561231b575f80fd5b826020860160208301375f60208483010152809650505050505061234160208401612176565b90509250929050565b5f806040838503121561235b575f80fd5b61236483612176565b915061234160208401612176565b600181811c9082168061238657607f821691505b6020821081036123a457634e487b7160e01b5f52602260045260245ffd5b50919050565b5f82516123bb818460208701612110565b9190910192915050565b604081525f6123d76040830185612132565b905060018060a01b03831660208301529392505050565b5f602082840312156123fe575f80fd5b815161216f8161220656fea26469706673582212206adf9cf8241a4258cdd4abdd1264f5b6b213831859e3b188bb6847686d3b686b64736f6c63430008140033

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

0000000000000000000000001dfcfea7c4bae85f942d643aa89fecdb47a319ad000000000000000000000000cb963a3e3146a4c41b7c1123db0cc0acd3ddfec3000000000000000000000000e5e304a273372a779482f44a0d0afca0fe3fb8f7000000000000000000000000f8096165f36ea70a6c0045467c1a63756ca2fce0

-----Decoded View---------------
Arg [0] : _marketingWallet (address): 0x1dfcFea7C4BAe85f942D643AA89FeCdB47a319Ad
Arg [1] : _devWallet (address): 0xcb963A3E3146a4C41B7C1123db0cc0acd3DDfeC3
Arg [2] : _liquidityWallet (address): 0xe5e304a273372a779482f44a0D0AFCA0Fe3Fb8f7
Arg [3] : _burnWallet (address): 0xF8096165f36EA70a6C0045467C1A63756cA2fCE0

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000001dfcfea7c4bae85f942d643aa89fecdb47a319ad
Arg [1] : 000000000000000000000000cb963a3e3146a4c41b7c1123db0cc0acd3ddfec3
Arg [2] : 000000000000000000000000e5e304a273372a779482f44a0d0afca0fe3fb8f7
Arg [3] : 000000000000000000000000f8096165f36ea70a6c0045467c1a63756ca2fce0


Deployed Bytecode Sourcemap

37110:15666:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38566:13;;-1:-1:-1;;;38566:13:0;;;;38558:47;;;;-1:-1:-1;;;38558:47:0;;216:2:1;38558:47:0;;;198:21:1;255:2;235:18;;;228:30;-1:-1:-1;;;274:18:1;;;267:51;335:18;;38558:47:0;;;;;;;;;35780:21:::1;:19;:21::i;:::-;50421:9:::2;50401:17;50463:29;39595:5;50421:9:::0;50463:29:::2;:::i;:::-;50441:51;;50528:18;50513:11;:33;;50505:98;;;::::0;-1:-1:-1;;;50505:98:0;;871:2:1;50505:98:0::2;::::0;::::2;853:21:1::0;910:2;890:18;;;883:30;949:34;929:18;;;922:62;-1:-1:-1;;;1000:18:1;;;993:50;1060:19;;50505:98:0::2;669:416:1::0;50505:98:0::2;50754:10;50686:28;50738:27:::0;;;:15:::2;:27;::::0;;;;;50717:48:::2;::::0;:18:::2;:48;:::i;:::-;50686:79;;50896:1;50873:20;:24;50865:76;;;::::0;-1:-1:-1;;;50865:76:0;;1425:2:1;50865:76:0::2;::::0;::::2;1407:21:1::0;1464:2;1444:18;;;1437:30;1503:34;1483:18;;;1476:62;-1:-1:-1;;;1554:18:1;;;1547:37;1601:19;;50865:76:0::2;1223:403:1::0;50865:76:0::2;51050:20;51036:11;:34;51032:650;;;51164:23;39595:5;51191:34;51205:20:::0;51191:11;:34:::2;:::i;:::-;51190:56;;;;:::i;:::-;51164:82;;51337:20;51323:34;;51429:12;51447:10;-1:-1:-1::0;;;;;51447:15:0::2;51470;51447:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51428:62;;;51513:7;51505:40;;;::::0;-1:-1:-1;;;51505:40:0;;2265:2:1;51505:40:0::2;::::0;::::2;2247:21:1::0;2304:2;2284:18;;;2277:30;-1:-1:-1;;;2323:18:1;;;2316:50;2383:18;;51505:40:0::2;2063:344:1::0;51505:40:0::2;51642:28;51655:15:::0;51642:28;::::2;:::i;:::-;;;51072:610;;51032:650;51784:4;14626:7:::0;14653:18;;;;;;;;;;;51794:11;-1:-1:-1;51766:39:0::2;51758:81;;;::::0;-1:-1:-1;;;51758:81:0;;2614:2:1;51758:81:0::2;::::0;::::2;2596:21:1::0;2653:2;2633:18;;;2626:30;2692:31;2672:18;;;2665:59;2741:18;;51758:81:0::2;2412:353:1::0;51758:81:0::2;51880:49;::::0;;2944:25:1;;;3000:2;2985:18;;2978:34;;;51894:10:0::2;::::0;51880:49:::2;::::0;2917:18:1;51880:49:0::2;;;;;;;51942:11;:18:::0;;-1:-1:-1;;;;51942:18:0::2;-1:-1:-1::0;;;51942:18:0::2;::::0;;52033:55:::2;52057:4;52064:10;52076:11:::0;52033:15:::2;:55::i;:::-;52115:10;52099:27;::::0;;;:15:::2;:27;::::0;;;;:42;;52130:11;;52099:27;:42:::2;::::0;52130:11;;52099:42:::2;:::i;:::-;::::0;;;-1:-1:-1;;52154:11:0::2;:19:::0;;-1:-1:-1;;;;52154:19:0::2;::::0;;52168:5:::2;52283:14;52295:2;52283:9:::0;:14:::2;:::i;:::-;52336:11;:21:::0;:57:::2;::::0;52254:43;;-1:-1:-1;52309:21:0::2;::::0;-1:-1:-1;;;;;52336:21:0;;::::2;::::0;52254:43;;52309:21;52336:57;52309:21;52336:57;52254:43;52336:21;:57:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52308:85;;;52412:16;52404:64;;;::::0;-1:-1:-1;;;52404:64:0;;3355:2:1;52404:64:0::2;::::0;::::2;3337:21:1::0;3394:2;3374:18;;;3367:30;3433:34;3413:18;;;3406:62;-1:-1:-1;;;3484:18:1;;;3477:33;3527:19;;52404:64:0::2;3153:399:1::0;52404:64:0::2;52535:26;52564:30;52576:18:::0;52564:9;:30:::2;:::i;:::-;52633:21:::0;;:57:::2;::::0;52535:59;;-1:-1:-1;52606:21:0::2;::::0;-1:-1:-1;;;;;52633:21:0;;::::2;::::0;52535:59;;52606:21;52633:57;52606:21;52633:57;52535:59;52633:21;:57:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52605:85;;;52709:16;52701:64;;;::::0;-1:-1:-1;;;52701:64:0;;3759:2:1;52701:64:0::2;::::0;::::2;3741:21:1::0;3798:2;3778:18;;;3771:30;3837:34;3817:18;;;3810:62;-1:-1:-1;;;3888:18:1;;;3881:33;3931:19;;52701:64:0::2;3557:399:1::0;52701:64:0::2;50390:2383;;;;;;;35824:20:::1;35218:1:::0;36344:7;:22;36161:213;35824:20:::1;37110:15666:::0;;;;;46727:194;;;;;;;;;;;;;:::i;13297:91::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15590:190;;;;;;;;;;-1:-1:-1;15590:190:0;;;;;:::i;:::-;;:::i;:::-;;;5319:14:1;;5312:22;5294:41;;5282:2;5267:18;15590:190:0;5154:187:1;39117:26:0;;;;;;;;;;;;;;;;;;;5492:25:1;;;5480:2;5465:18;39117:26:0;5346:177:1;38999:51:0;;;;;;;;;;-1:-1:-1;38999:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;14399:99;;;;;;;;;;-1:-1:-1;14478:12:0;;14399:99;;48197:202;;;;;;;;;;-1:-1:-1;48197:202:0;;;;;:::i;:::-;;:::i;16358:249::-;;;;;;;;;;-1:-1:-1;16358:249:0;;;;;:::i;:::-;;:::i;47624:235::-;;;;;;;;;;-1:-1:-1;47624:235:0;;;;;:::i;:::-;;:::i;39629:43::-;;;;;;;;;;;;;;;39498:44;;;;;;;;;;-1:-1:-1;39498:44:0;;;;;;;;;;;;;;;;;;;;;;6680:25:1;;;6736:2;6721:18;;6714:34;;;;6764:18;;;6757:34;;;;6822:2;6807:18;;6800:34;6865:3;6850:19;;6843:35;6667:3;6652:19;39498:44:0;6421:463:1;39268:50:0;;;;;;;;;;-1:-1:-1;39268:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;38868:51;;;;;;;;;;-1:-1:-1;38868:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;14250:84;;;;;;;;;;-1:-1:-1;14250:84:0;;14324:2;7031:36:1;;7019:2;7004:18;14250:84:0;6889:184:1;48455:158:0;;;;;;;;;;-1:-1:-1;48455:158:0;;;;;:::i;:::-;;:::i;23222:89::-;;;;;;;;;;-1:-1:-1;23222:89:0;;;;;:::i;:::-;;:::i;50001:221::-;;;;;;;;;;-1:-1:-1;50001:221:0;;;;;:::i;:::-;;:::i;39679:43::-;;;;;;;;;;;;;;;39729:39;;;;;;;;;;;;;;;38277:25;;;;;;;;;;-1:-1:-1;38277:25:0;;;;-1:-1:-1;;;38277:25:0;;;;;;14561:118;;;;;;;;;;-1:-1:-1;14561:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;14653:18:0;14626:7;14653:18;;;;;;;;;;;;14561:118;26153:103;;;;;;;;;;;;;:::i;23640:161::-;;;;;;;;;;-1:-1:-1;23640:161:0;;;;;:::i;:::-;;:::i;48653:188::-;;;;;;;;;;-1:-1:-1;48653:188:0;;;;;:::i;:::-;;:::i;47348:227::-;;;;;;;;;;-1:-1:-1;47348:227:0;;;;;:::i;:::-;;:::i;46457:240::-;;;;;;;;;;;;;:::i;48922:1014::-;;;;;;;;;;-1:-1:-1;48922:1014:0;;;;;:::i;:::-;;:::i;25478:87::-;;;;;;;;;;-1:-1:-1;25551:6:0;;-1:-1:-1;;;;;25551:6:0;25478:87;;;-1:-1:-1;;;;;8890:32:1;;;8872:51;;8860:2;8845:18;25478:87:0;8726:203:1;38801:30:0;;;;;;;;;;-1:-1:-1;38801:30:0;;;;;;;;;;-1:-1:-1;;;;;38801:30:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9221:15:1;;;9203:34;;9273:15;;;9268:2;9253:18;;9246:43;9325:15;;;9305:18;;;9298:43;;;;9377:15;;;9372:2;9357:18;;9350:43;9152:3;9137:19;38801:30:0;8934:465:1;39551:49:0;;;;;;;;;;;;39595:5;39551:49;;13507:95;;;;;;;;;;;;;:::i;46927:372::-;;;;;;;;;;;;;:::i;14884:182::-;;;;;;;;;;-1:-1:-1;14884:182:0;;;;;:::i;:::-;;:::i;39203:31::-;;;;;;;;;;;;;;;;47930:229;;;;;;;;;;-1:-1:-1;47930:229:0;;;;;:::i;:::-;;:::i;15129:142::-;;;;;;;;;;-1:-1:-1;15129:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;15236:18:0;;;15209:7;15236:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;15129:142;26411:220;;;;;;;;;;-1:-1:-1;26411:220:0;;;;;:::i;:::-;;:::i;37916:31::-;;;;;;;;;;-1:-1:-1;37916:31:0;;;;-1:-1:-1;;;;;37916:31:0;;;35860:293;35262:1;35994:7;;:19;35986:63;;;;-1:-1:-1;;;35986:63:0;;10100:2:1;35986:63:0;;;10082:21:1;10139:2;10119:18;;;10112:30;10178:33;10158:18;;;10151:61;10229:18;;35986:63:0;9898:355:1;35986:63:0;35262:1;36127:7;:18;35860:293::o;16992:308::-;-1:-1:-1;;;;;17076:18:0;;17072:88;;17118:30;;-1:-1:-1;;;17118:30:0;;17145:1;17118:30;;;8872:51:1;8845:18;;17118:30:0;8726:203:1;17072:88:0;-1:-1:-1;;;;;17174:16:0;;17170:88;;17214:32;;-1:-1:-1;;;17214:32:0;;17243:1;17214:32;;;8872:51:1;8845:18;;17214:32:0;8726:203:1;17170:88:0;17268:24;17276:4;17282:2;17286:5;17268:7;:24::i;:::-;16992:308;;;:::o;46727:194::-;25364:13;:11;:13::i;:::-;46790::::1;::::0;-1:-1:-1;;;46790:13:0;::::1;;;46789:14;46781:52;;;::::0;-1:-1:-1;;;46781:52:0;;10460:2:1;46781:52:0::1;::::0;::::1;10442:21:1::0;10499:2;10479:18;;;10472:30;10538:27;10518:18;;;10511:55;10583:18;;46781:52:0::1;10258:349:1::0;46781:52:0::1;46844:13;:20:::0;;-1:-1:-1;;;;46844:20:0::1;-1:-1:-1::0;;;46844:20:0::1;::::0;;46880:33:::1;::::0;;-1:-1:-1;10780:41:1;;46900:12:0::1;10852:2:1::0;10837:18;;10830:34;46880:33:0::1;::::0;10753:18:1;46880:33:0::1;;;;;;;;46727:194::o:0;13297:91::-;13342:13;13375:5;13368:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13297:91;:::o;15590:190::-;15663:4;4382:10;15719:31;4382:10;15735:7;15744:5;15719:8;:31::i;:::-;15768:4;15761:11;;;15590:190;;;;;:::o;48197:202::-;25364:13;:11;:13::i;:::-;48265:11:::1;:32:::0;;-1:-1:-1;;;;;;48265:32:0::1;-1:-1:-1::0;;;;;48265:32:0;::::1;::::0;;::::1;::::0;;;48367:24:::1;::::0;::::1;::::0;-1:-1:-1;;48367:24:0::1;48197:202:::0;:::o;16358:249::-;16445:4;4382:10;16503:37;16519:4;4382:10;16534:5;16503:15;:37::i;:::-;16551:26;16561:4;16567:2;16571:5;16551:9;:26::i;:::-;-1:-1:-1;16595:4:0;;16358:249;-1:-1:-1;;;;16358:249:0:o;47624:235::-;25364:13;:11;:13::i;:::-;47731:6:::1;47709:28;;:18;;;;;;;;;;;:28;;::::0;47701:63:::1;;;::::0;-1:-1:-1;;;47701:63:0;;11462:2:1;47701:63:0::1;::::0;::::1;11444:21:1::0;11501:2;11481:18;;;11474:30;-1:-1:-1;;;11520:18:1;;;11513:52;11582:18;;47701:63:0::1;11260:346:1::0;47701:63:0::1;47775:18;:27:::0;;;::::1;;-1:-1:-1::0;;;47775:27:0::1;-1:-1:-1::0;;;;47775:27:0;;::::1;;::::0;;47818:33:::1;::::0;::::1;::::0;::::1;::::0;47796:6;5319:14:1;5312:22;5294:41;;5282:2;5267:18;;5154:187;47818:33:0::1;;;;;;;;47624:235:::0;:::o;48455:158::-;25364:13;:11;:13::i;:::-;48531:16:::1;:26:::0;;;48573:32:::1;::::0;5492:25:1;;;48573:32:0::1;::::0;5480:2:1;5465:18;48573:32:0::1;5346:177:1::0;23222:89:0;23277:26;4382:10;23297:5;23277;:26::i;:::-;23222:89;:::o;50001:221::-;25364:13;:11;:13::i;:::-;35780:21:::1;:19;:21::i;:::-;50091:13:::2;::::0;-1:-1:-1;;;50091:13:0;::::2;;;50090:14;50082:88;;;::::0;-1:-1:-1;;;50082:88:0;;11813:2:1;50082:88:0::2;::::0;::::2;11795:21:1::0;11852:2;11832:18;;;11825:30;11891:34;11871:18;;;11864:62;11962:31;11942:18;;;11935:59;12011:19;;50082:88:0::2;11611:425:1::0;50082:88:0::2;25551:6:::0;;50181:33:::2;::::0;-1:-1:-1;;;;;25551:6:0;;;;50181:33;::::2;;;::::0;50207:6;;50181:33:::2;::::0;;;50207:6;25551;50181:33;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;35824:20:::1;35218:1:::0;36344:7;:22;36161:213;26153:103;25364:13;:11;:13::i;:::-;26218:30:::1;26245:1;26218:18;:30::i;:::-;26153:103::o:0;23640:161::-;23716:45;23732:7;4382:10;23755:5;23716:15;:45::i;:::-;23772:21;23778:7;23787:5;23772;:21::i;:::-;23640:161;;:::o;48653:188::-;25364:13;:11;:13::i;:::-;-1:-1:-1;;;;;48742:25:0;::::1;;::::0;;;:19:::1;:25;::::0;;;;;;;;:34;;-1:-1:-1;;48742:34:0::1;::::0;::::1;;::::0;;::::1;::::0;;;48792:41;;5294::1;;;48792::0::1;::::0;5267:18:1;48792:41:0::1;;;;;;;48653:188:::0;;:::o;47348:227::-;25364:13;:11;:13::i;:::-;47451:6:::1;47431:26;;:16;;;;;;;;;;;:26;;::::0;47423:61:::1;;;::::0;-1:-1:-1;;;47423:61:0;;11462:2:1;47423:61:0::1;::::0;::::1;11444:21:1::0;11501:2;11481:18;;;11474:30;-1:-1:-1;;;11520:18:1;;;11513:52;11582:18;;47423:61:0::1;11260:346:1::0;47423:61:0::1;47495:16;:25:::0;;;::::1;;-1:-1:-1::0;;;47495:25:0::1;-1:-1:-1::0;;;;47495:25:0;;::::1;;::::0;;47536:31:::1;::::0;::::1;::::0;::::1;::::0;47514:6;5319:14:1;5312:22;5294:41;;5282:2;5267:18;;5154:187;46457:240:0;25364:13;:11;:13::i;:::-;46521:20:::1;::::0;-1:-1:-1;;;46521:20:0;::::1;;;46520:21;46512:60;;;::::0;-1:-1:-1;;;46512:60:0;;12243:2:1;46512:60:0::1;::::0;::::1;12225:21:1::0;12282:2;12262:18;;;12255:30;12321:28;12301:18;;;12294:56;12367:18;;46512:60:0::1;12041:350:1::0;46512:60:0::1;46583:20;:27:::0;;-1:-1:-1;;;;46621:24:0;-1:-1:-1;;;46621:24:0;;;46661:28:::1;::::0;::::1;::::0;::::1;::::0;46676:12:::1;5492:25:1::0;;5480:2;5465:18;;5346:177;48922:1014:0;25364:13;:11;:13::i;:::-;49080:29:::1;::::0;-1:-1:-1;;;49080:29:0::1;::::0;::::1;12598:24:1::0;12638:11;;49080:29:0::1;;;;;;;;;;;;49070:40;;;;;;49054:10;49037:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;49027:39;;;;;;:83:::0;49023:854:::1;;49147:11;:21:::0;;-1:-1:-1;;;;;49147:21:0;;::::1;49172:5;49127:42:::0;;;:19:::1;:42;::::0;;;;;:50;;-1:-1:-1;;49127:50:0;;::::1;::::0;;;49192:33;;-1:-1:-1;;;;;;49192:33:0::1;::::0;;::::1;::::0;;::::1;::::0;;;49240:30;;;;:37;;;;::::1;-1:-1:-1::0;49240:37:0::1;::::0;;49023:854:::1;;;49352:23;::::0;-1:-1:-1;;;49352:23:0::1;::::0;::::1;13156:18:1::0;13190:11;;49352:23:0::1;;;;;;;;;;;;49342:34;;;;;;49326:10;49309:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;49299:39;;;;;;:77:::0;49295:582:::1;;49413:15:::0;;;-1:-1:-1;;;;;49413:15:0;;::::1;49432:5;49393:36:::0;;;:19:::1;:36;::::0;;;;;:44;;-1:-1:-1;;49393:44:0;;::::1;::::0;;;49452:27;;-1:-1:-1;;;;;;49452:27:0::1;::::0;;::::1;::::0;;::::1;::::0;;;49494:30;;;;:37;;;;::::1;-1:-1:-1::0;49494:37:0::1;::::0;;49295:582:::1;;;49606:29;::::0;-1:-1:-1;;;49606:29:0::1;::::0;::::1;13414:24:1::0;13454:11;;49606:29:0::1;;;;;;;;;;;;49596:40;;;;;;49580:10;49563:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;49553:39;;;;;;:83:::0;49549:328:::1;;49673:21:::0;;;-1:-1:-1;;;;;49673:21:0;;::::1;49698:5;49653:42:::0;;;:19:::1;:42;::::0;;;;;:50;;-1:-1:-1;;49653:50:0;;::::1;::::0;;;49718:33;;-1:-1:-1;;;;;;49718:33:0::1;::::0;;::::1;::::0;;::::1;::::0;;;49766:30;;;;:37;;;;::::1;-1:-1:-1::0;49766:37:0::1;::::0;;49549:328:::1;;;49836:29;::::0;-1:-1:-1;;;49836:29:0;;13678:2:1;49836:29:0::1;::::0;::::1;13660:21:1::0;13717:2;13697:18;;;13690:30;-1:-1:-1;;;13736:18:1;;;13729:49;13795:18;;49836:29:0::1;13476:343:1::0;49549:328:0::1;49892:36;49906:10;49918:9;49892:36;;;;;;;:::i;:::-;;;;;;;;48922:1014:::0;;:::o;13507:95::-;13554:13;13587:7;13580:14;;;;;:::i;46927:372::-;25364:13;:11;:13::i;:::-;38566::::1;::::0;-1:-1:-1;;;38566:13:0;::::1;;;38558:47;;;::::0;-1:-1:-1;;;38558:47:0;;216:2:1;38558:47:0::1;::::0;::::1;198:21:1::0;255:2;235:18;;;228:30;-1:-1:-1;;;274:18:1;;;267:51;335:18;;38558:47:0::1;14:345:1::0;38558:47:0::1;47059:13:::2;:21:::0;;-1:-1:-1;;;;47059:21:0::2;::::0;;47096:34:::2;::::0;;-1:-1:-1;10780:41:1;;47117:12:0::2;10852:2:1::0;10837:18;;10830:34;47096::0::2;::::0;10753:18:1;47096:34:0::2;;;;;;;47240:4;47199:20;14653:18:::0;;;;;;;;;;;;47257:34:::2;::::0;14653:18;47257:5:::2;:34::i;14884:182::-:0;14953:4;4382:10;15009:27;4382:10;15026:2;15030:5;15009:9;:27::i;47930:229::-;25364:13;:11;:13::i;:::-;48020:2:::1;48011:6;:11;48003:75;;;::::0;-1:-1:-1;;;48003:75:0;;14348:2:1;48003:75:0::1;::::0;::::1;14330:21:1::0;14387:2;14367:18;;;14360:30;14426:34;14406:18;;;14399:62;-1:-1:-1;;;14477:18:1;;;14470:49;14536:19;;48003:75:0::1;14146:415:1::0;48003:75:0::1;48089:11;:20:::0;;;48125:26:::1;::::0;5492:25:1;;;48125:26:0::1;::::0;5480:2:1;5465:18;48125:26:0::1;5346:177:1::0;26411:220:0;25364:13;:11;:13::i;:::-;-1:-1:-1;;;;;26496:22:0;::::1;26492:93;;26542:31;::::0;-1:-1:-1;;;26542:31:0;;26570:1:::1;26542:31;::::0;::::1;8872:51:1::0;8845:18;;26542:31:0::1;8726:203:1::0;26492:93:0::1;26595:28;26614:8;26595:18;:28::i;42116:3467::-:0;42264:1;42255:6;:10;42247:94;;;;-1:-1:-1;;;42247:94:0;;14768:2:1;42247:94:0;;;14750:21:1;14807:2;14787:18;;;14780:30;14846:34;14826:18;;;14819:62;14917:34;14897:18;;;14890:62;-1:-1:-1;;;14968:19:1;;;14961:38;15016:19;;42247:94:0;14566:475:1;42247:94:0;42361:20;42374:6;42361:12;:20::i;:::-;42360:21;:49;;;;;42386:23;42399:9;42386:12;:23::i;:::-;42385:24;42360:49;42352:164;;;;-1:-1:-1;;;42352:164:0;;15248:2:1;42352:164:0;;;15230:21:1;15287:3;15267:18;;;15260:31;15327:34;15307:18;;;15300:62;15398:34;15378:18;;;15371:62;15470:34;15449:19;;;15442:63;-1:-1:-1;;;15521:19:1;;;15514:37;15568:19;;42352:164:0;15046:547:1;42352:164:0;-1:-1:-1;;;;;42535:30:0;;;;;;:19;:30;;;;;;;;;:47;;-1:-1:-1;42569:13:0;;-1:-1:-1;;;42569:13:0;;;;42535:47;:71;;;-1:-1:-1;42586:20:0;;-1:-1:-1;;;42586:20:0;;;;42535:71;42527:146;;;;-1:-1:-1;;;42527:146:0;;15800:2:1;42527:146:0;;;15782:21:1;15839:2;15819:18;;;15812:30;15878:34;15858:18;;;15851:62;15949:32;15929:18;;;15922:60;15999:19;;42527:146:0;15598:426:1;42527:146:0;42812:16;;-1:-1:-1;;;;;42812:16:0;;;42802:26;;;;42798:127;;-1:-1:-1;;;;;42853:23:0;;;42845:68;;;;-1:-1:-1;;;42845:68:0;;16231:2:1;42845:68:0;;;16213:21:1;;;16250:18;;;16243:30;16309:34;16289:18;;;16282:62;16361:18;;42845:68:0;16029:356:1;42845:68:0;-1:-1:-1;;;;;42979:30:0;;;;;;:19;:30;;;;;;;;42978:31;:55;;;;;43032:1;43013:16;;:20;42978:55;42974:229;;;-1:-1:-1;;;;;14653:18:0;;43050;14653;;;;;;;;;;;43071:29;;43094:6;;43071:29;:::i;:::-;43050:50;;43137:16;;43123:10;:30;;43115:76;;;;-1:-1:-1;;;43115:76:0;;16592:2:1;43115:76:0;;;16574:21:1;16631:2;16611:18;;;16604:30;16670:34;16650:18;;;16643:62;-1:-1:-1;;;16721:18:1;;;16714:31;16762:19;;43115:76:0;16390:397:1;43115:76:0;43035:168;42974:229;43228:11;;-1:-1:-1;;;43228:11:0;;;;43223:2243;;43558:16;;-1:-1:-1;;;43558:16:0;;;;:41;;;;-1:-1:-1;43579:20:0;;-1:-1:-1;;;43579:20:0;;;;43578:21;43558:41;43554:632;;;-1:-1:-1;;;;;43628:26:0;;;;;;:15;:26;;;;;;:31;43620:117;;;;-1:-1:-1;;;43620:117:0;;16994:2:1;43620:117:0;;;16976:21:1;17033:2;17013:18;;;17006:30;17072:34;17052:18;;;17045:62;17143:34;17123:18;;;17116:62;-1:-1:-1;;;17194:19:1;;;17187:40;17244:19;;43620:117:0;16792:477:1;43620:117:0;-1:-1:-1;;;;;43764:23:0;;;;;;:15;:23;;;;;;:28;43756:111;;;;-1:-1:-1;;;43756:111:0;;17476:2:1;43756:111:0;;;17458:21:1;17515:2;17495:18;;;17488:30;17554:34;17534:18;;;17527:62;17625:34;17605:18;;;17598:62;-1:-1:-1;;;17676:19:1;;;17669:37;17723:19;;43756:111:0;17274:474:1;43756:111:0;-1:-1:-1;;;;;43891:30:0;;;;;;:19;:30;;;;;;;;43886:285;;43962:23;43975:9;43962:12;:23::i;:::-;44082;44095:9;44082:12;:23::i;:::-;44270:18;;-1:-1:-1;;;44270:18:0;;;;44265:1190;;;-1:-1:-1;;;;;44665:30:0;;;;;;:19;:30;;;;;;;;44660:139;;-1:-1:-1;;;;;44757:27:0;;;;;;:16;:27;;;;;44787:12;44757:42;;44660:139;-1:-1:-1;;;;;44841:27:0;;;;;;:19;:27;;;;;;;;44836:604;;45084:11;;-1:-1:-1;;;;;45057:24:0;;;;;;:16;:24;;;;;;45042:39;;:12;:39;:::i;:::-;:53;45038:383;;;45124:20;45137:6;45124:12;:20::i;:::-;45243:23;45256:9;45243:12;:23::i;45038:383::-;45535:40;45549:6;45557:9;45568:6;45535:13;:40::i;25643:166::-;25551:6;;-1:-1:-1;;;;;25551:6:0;4382:10;25703:23;25699:103;;25750:40;;-1:-1:-1;;;25750:40:0;;4382:10;25750:40;;;8872:51:1;8845:18;;25750:40:0;8726:203:1;20417:130:0;20502:37;20511:5;20518:7;20527:5;20534:4;20502:8;:37::i;22133:487::-;-1:-1:-1;;;;;15236:18:0;;;22233:24;15236:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;22300:37:0;;22296:317;;22377:5;22358:16;:24;22354:132;;;22410:60;;-1:-1:-1;;;22410:60:0;;-1:-1:-1;;;;;17973:32:1;;22410:60:0;;;17955:51:1;18022:18;;;18015:34;;;18065:18;;;18058:34;;;17928:18;;22410:60:0;17753:345:1;22354:132:0;22529:57;22538:5;22545:7;22573:5;22554:16;:24;22580:5;22529:8;:57::i;:::-;22222:398;22133:487;;;:::o;19653:211::-;-1:-1:-1;;;;;19724:21:0;;19720:91;;19769:30;;-1:-1:-1;;;19769:30:0;;19796:1;19769:30;;;8872:51:1;8845:18;;19769:30:0;8726:203:1;19720:91:0;19821:35;19829:7;19846:1;19850:5;19821:7;:35::i;26791:191::-;26884:6;;;-1:-1:-1;;;;;26901:17:0;;;-1:-1:-1;;;;;;26901:17:0;;;;;;;26934:40;;26884:6;;;26901:17;26884:6;;26934:40;;26865:16;;26934:40;26854:128;26791:191;:::o;45647:295::-;45735:11;;45706:4;;-1:-1:-1;;;;;45735:11:0;45727:34;45723:165;;45816:11;;:29;;-1:-1:-1;;;45816:29:0;;-1:-1:-1;;;;;8890:32:1;;;45816:29:0;;;8872:51:1;45816:11:0;;;;:23;;8845:18:1;;45816:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;45723:165::-;-1:-1:-1;45883:5:0;;45647:295;-1:-1:-1;45647:295:0:o;45723:165::-;45647:295;;;:::o;46047:291::-;46115:11;;-1:-1:-1;;;;;46115:11:0;46107:34;46103:228;;46278:11;;:41;;-1:-1:-1;;;46278:41:0;;-1:-1:-1;;;;;18539:32:1;;;46278:41:0;;;18521:51:1;46278:11:0;18588:18:1;;;18581:50;46278:11:0;;;;:29;;18494:18:1;;46278:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46047:291;:::o;17624:1135::-;-1:-1:-1;;;;;17714:18:0;;17710:552;;17868:5;17852:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;17710:552:0;;-1:-1:-1;17710:552:0;;-1:-1:-1;;;;;17928:15:0;;17906:19;17928:15;;;;;;;;;;;17962:19;;;17958:117;;;18009:50;;-1:-1:-1;;;18009:50:0;;-1:-1:-1;;;;;17973:32:1;;18009:50:0;;;17955:51:1;18022:18;;;18015:34;;;18065:18;;;18058:34;;;17928:18;;18009:50:0;17753:345:1;17958:117:0;-1:-1:-1;;;;;18198:15:0;;:9;:15;;;;;;;;;;18216:19;;;;18198:37;;17710:552;-1:-1:-1;;;;;18278:16:0;;18274:435;;18444:12;:21;;;;;;;18274:435;;;-1:-1:-1;;;;;18660:13:0;;:9;:13;;;;;;;;;;:22;;;;;;18274:435;18741:2;-1:-1:-1;;;;;18726:25:0;18735:4;-1:-1:-1;;;;;18726:25:0;;18745:5;18726:25;;;;5492::1;;5480:2;5465:18;;5346:177;18726:25:0;;;;;;;;17624:1135;;;:::o;21398:443::-;-1:-1:-1;;;;;21511:19:0;;21507:91;;21554:32;;-1:-1:-1;;;21554:32:0;;21583:1;21554:32;;;8872:51:1;8845:18;;21554:32:0;8726:203:1;21507:91:0;-1:-1:-1;;;;;21612:21:0;;21608:92;;21657:31;;-1:-1:-1;;;21657:31:0;;21685:1;21657:31;;;8872:51:1;8845:18;;21657:31:0;8726:203:1;21608:92:0;-1:-1:-1;;;;;21710:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;21756:78;;;;21807:7;-1:-1:-1;;;;;21791:31:0;21800:5;-1:-1:-1;;;;;21791:31:0;;21816:5;21791:31;;;;5492:25:1;;5480:2;5465:18;;5346:177;21791:31:0;;;;;;;;21398:443;;;;:::o;364:127:1:-;425:10;420:3;416:20;413:1;406:31;456:4;453:1;446:15;480:4;477:1;470:15;496:168;569:9;;;600;;617:15;;;611:22;;597:37;587:71;;638:18;;:::i;1090:128::-;1157:9;;;1178:11;;;1175:37;;;1192:18;;:::i;1631:217::-;1671:1;1697;1687:132;;1741:10;1736:3;1732:20;1729:1;1722:31;1776:4;1773:1;1766:15;1804:4;1801:1;1794:15;1687:132;-1:-1:-1;1833:9:1;;1631:217::o;3023:125::-;3088:9;;;3109:10;;;3106:36;;;3122:18;;:::i;3961:250::-;4046:1;4056:113;4070:6;4067:1;4064:13;4056:113;;;4146:11;;;4140:18;4127:11;;;4120:39;4092:2;4085:10;4056:113;;;-1:-1:-1;;4203:1:1;4185:16;;4178:27;3961:250::o;4216:271::-;4258:3;4296:5;4290:12;4323:6;4318:3;4311:19;4339:76;4408:6;4401:4;4396:3;4392:14;4385:4;4378:5;4374:16;4339:76;:::i;:::-;4469:2;4448:15;-1:-1:-1;;4444:29:1;4435:39;;;;4476:4;4431:50;;4216:271;-1:-1:-1;;4216:271:1:o;4492:220::-;4641:2;4630:9;4623:21;4604:4;4661:45;4702:2;4691:9;4687:18;4679:6;4661:45;:::i;:::-;4653:53;4492:220;-1:-1:-1;;;4492:220:1:o;4717:173::-;4785:20;;-1:-1:-1;;;;;4834:31:1;;4824:42;;4814:70;;4880:1;4877;4870:12;4895:254;4963:6;4971;5024:2;5012:9;5003:7;4999:23;4995:32;4992:52;;;5040:1;5037;5030:12;4992:52;5063:29;5082:9;5063:29;:::i;:::-;5053:39;5139:2;5124:18;;;;5111:32;;-1:-1:-1;;;4895:254:1:o;5528:186::-;5587:6;5640:2;5628:9;5619:7;5615:23;5611:32;5608:52;;;5656:1;5653;5646:12;5608:52;5679:29;5698:9;5679:29;:::i;5719:328::-;5796:6;5804;5812;5865:2;5853:9;5844:7;5840:23;5836:32;5833:52;;;5881:1;5878;5871:12;5833:52;5904:29;5923:9;5904:29;:::i;:::-;5894:39;;5952:38;5986:2;5975:9;5971:18;5952:38;:::i;:::-;5942:48;;6037:2;6026:9;6022:18;6009:32;5999:42;;5719:328;;;;;:::o;6052:118::-;6138:5;6131:13;6124:21;6117:5;6114:32;6104:60;;6160:1;6157;6150:12;6175:241;6231:6;6284:2;6272:9;6263:7;6259:23;6255:32;6252:52;;;6300:1;6297;6290:12;6252:52;6339:9;6326:23;6358:28;6380:5;6358:28;:::i;7078:180::-;7137:6;7190:2;7178:9;7169:7;7165:23;7161:32;7158:52;;;7206:1;7203;7196:12;7158:52;-1:-1:-1;7229:23:1;;7078:180;-1:-1:-1;7078:180:1:o;7263:315::-;7328:6;7336;7389:2;7377:9;7368:7;7364:23;7360:32;7357:52;;;7405:1;7402;7395:12;7357:52;7428:29;7447:9;7428:29;:::i;:::-;7418:39;;7507:2;7496:9;7492:18;7479:32;7520:28;7542:5;7520:28;:::i;:::-;7567:5;7557:15;;;7263:315;;;;;:::o;7583:127::-;7644:10;7639:3;7635:20;7632:1;7625:31;7675:4;7672:1;7665:15;7699:4;7696:1;7689:15;7715:1006;7793:6;7801;7854:2;7842:9;7833:7;7829:23;7825:32;7822:52;;;7870:1;7867;7860:12;7822:52;7910:9;7897:23;7939:18;7980:2;7972:6;7969:14;7966:34;;;7996:1;7993;7986:12;7966:34;8034:6;8023:9;8019:22;8009:32;;8079:7;8072:4;8068:2;8064:13;8060:27;8050:55;;8101:1;8098;8091:12;8050:55;8137:2;8124:16;8159:2;8155;8152:10;8149:36;;;8165:18;;:::i;:::-;8240:2;8234:9;8208:2;8294:13;;-1:-1:-1;;8290:22:1;;;8314:2;8286:31;8282:40;8270:53;;;8338:18;;;8358:22;;;8335:46;8332:72;;;8384:18;;:::i;:::-;8424:10;8420:2;8413:22;8459:2;8451:6;8444:18;8501:7;8494:4;8489:2;8485;8481:11;8477:22;8474:35;8471:55;;;8522:1;8519;8512:12;8471:55;8582:2;8575:4;8571:2;8567:13;8560:4;8552:6;8548:17;8535:50;8629:1;8622:4;8617:2;8609:6;8605:15;8601:26;8594:37;8650:6;8640:16;;;;;;;8675:40;8709:4;8698:9;8694:20;8675:40;:::i;:::-;8665:50;;7715:1006;;;;;:::o;9404:260::-;9472:6;9480;9533:2;9521:9;9512:7;9508:23;9504:32;9501:52;;;9549:1;9546;9539:12;9501:52;9572:29;9591:9;9572:29;:::i;:::-;9562:39;;9620:38;9654:2;9643:9;9639:18;9620:38;:::i;10875:380::-;10954:1;10950:12;;;;10997;;;11018:61;;11072:4;11064:6;11060:17;11050:27;;11018:61;11125:2;11117:6;11114:14;11094:18;11091:38;11088:161;;11171:10;11166:3;11162:20;11159:1;11152:31;11206:4;11203:1;11196:15;11234:4;11231:1;11224:15;11088:161;;10875:380;;;:::o;12660:289::-;12791:3;12829:6;12823:13;12845:66;12904:6;12899:3;12892:4;12884:6;12880:17;12845:66;:::i;:::-;12927:16;;;;;12660:289;-1:-1:-1;;12660:289:1:o;13824:317::-;14001:2;13990:9;13983:21;13964:4;14021:45;14062:2;14051:9;14047:18;14039:6;14021:45;:::i;:::-;14013:53;;14131:1;14127;14122:3;14118:11;14114:19;14106:6;14102:32;14097:2;14086:9;14082:18;14075:60;13824:317;;;;;:::o;18103:245::-;18170:6;18223:2;18211:9;18202:7;18198:23;18194:32;18191:52;;;18239:1;18236;18229:12;18191:52;18271:9;18265:16;18290:28;18312:5;18290:28;:::i

Swarm Source

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