ETH Price: $3,464.83 (+4.11%)

Token

Invest Club Global (ICG)
 

Overview

Max Total Supply

900,000,000,000 ICG

Holders

2,078

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
108 ICG

Value
$0.00
0x2d89034424db22c9c555f14692a181b22b17e42c
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
InvestClubGlobal

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-31
*/

// 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/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/utils/Pausable.sol


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

pragma solidity ^0.8.20;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    bool private _paused;

    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    /**
     * @dev The operation failed because the contract is paused.
     */
    error EnforcedPause();

    /**
     * @dev The operation failed because the contract is not paused.
     */
    error ExpectedPause();

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        if (paused()) {
            revert EnforcedPause();
        }
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        if (!paused()) {
            revert ExpectedPause();
        }
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// 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/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/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 virtual {
        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/ERC20Pausable.sol


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

pragma solidity ^0.8.20;



/**
 * @dev ERC20 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 *
 * IMPORTANT: This contract does not include public pause and unpause functions. In
 * addition to inheriting this contract, you must define both functions, invoking the
 * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate
 * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will
 * make the contract pause mechanism of the contract unreachable, and thus unusable.
 */
abstract contract ERC20Pausable is ERC20, Pausable {
    /**
     * @dev See {ERC20-_update}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _update(address from, address to, uint256 value) internal virtual override whenNotPaused {
        super._update(from, to, value);
    }
}

// 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: InvestClubGlobal.sol


//********************************** IGC Coin and Telegram link **********************************//
    //******************** * ** * https://t.me/+DRsGYQl6gu41NjJk * ** * ********************//

//********************************** IGC Telegram Project **********************************//
    //******************* * ** * https://t.me/investclubGlobal_ENG * ** * ****************//

//********************************** IGC Coin Website **********************************//
    //****************** * ** * https://investclubglobal.com * ** * ****************//

pragma solidity ^0.8.20;





/**
 * @title InvestClubGlobal
 * @dev Extends ERC20, ERC20Burnable, ERC20Pausable, Ownable contracts to create the Invest Club Global token.
 */

contract InvestClubGlobal is ERC20, ERC20Burnable, ERC20Pausable, Ownable {
    // State variables
    address public marketingWallet;
    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWalletAmount;

    uint256 public totalBuyTax = 5;
    uint256 public totalSellTax = 5;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => bool) public isBlackListed;

    // Events.
    event AddressBlacklisted(address indexed account, bool isBlacklisted);
    event AddressWhitelisted(address indexed account, bool isWhitelisted);
    event AddressExcludedFromFees(address indexed account, bool isExcluded);
    event MarketingWalletUpdated(address indexed newWallet);
    event BuyTaxesUpdated(uint256 newBuyTaxPercent);
    event SellTaxesUpdated(uint256 newSellTaxPercent);
    event AutomatedMarketMakerPairSet(address indexed pair, bool value);

    /**
     * @dev Constructor function to initialize the Invest Club Global token.
     */

    constructor()
        Ownable(0xdc472E460f93F62CB67665F4c3B795e56104911d)
        ERC20("Invest Club Global", "ICG")
    {
        marketingWallet = 0xF2552a8740cEbD3e68fb88947a0d518EF6301ff4;
        _mint(owner(), 900000000000 * (10**18)); // 900 billion
    }

    /**
     * @dev Fallback function to receive Ether.
     */

    receive() external payable {}

    /**
     * @dev Internal function to update transfers considering ERC20Pausable overrides.
     */

    function _update(
        address from,
        address to,
        uint256 value
    ) internal override(ERC20, ERC20Pausable) {
        super._update(from, to, value);
    }

    /**
     * @dev Update the maximum wallet amount based on the percentage of the total supply.
     */

    function updateMaxWalletAmount(uint256 maxWalletPercent) public onlyOwner {
        require(maxWalletPercent > 0, "Inavlid Percentage");
        maxWalletAmount = (totalSupply() * maxWalletPercent) / 100;
    }

    /**
     * @dev Set maximum buy and sell amounts based on the percentage of the total supply.
     */

    function setMaxBuyAndSell(uint256 maxBuyPercent, uint256 maxSellPercent)
        public
        whenNotPaused
        onlyOwner
    {
        require(maxBuyPercent > 0 && maxSellPercent > 0, "Invalid Percentage");
        maxBuyAmount = (totalSupply() * maxBuyPercent) / 100;
        maxSellAmount = (totalSupply() * maxSellPercent) / 100;
    }

    /**
     * @dev Blacklists an address, preventing it from performing transfers.
     * @param account The address to be blacklisted.
     */
    function blackListAddress(address account) external onlyOwner {
        require(account != address(0), "Invalid Address");
        isBlackListed[account] = true;
        emit AddressBlacklisted(account, true);
    }

    /**
     * @dev Whitelists an address, allowing it to perform transfers after being blacklisted.
     * @param account The address to be whitelisted.
     */
    function whiteListAddress(address account)
        external
        whenNotPaused
        onlyOwner
    {
        require(account != address(0), "Invalid Address");
        isBlackListed[account] = false;
        emit AddressWhitelisted(account, false);
    }

    /**
     * @dev Excludes or includes an address from fee deductions.
     * @param account The address to be excluded/included from fees.
     * @param excluded Boolean indicating whether the address should be excluded (true) or included (false) from fees.
     */
    function excludeFromFees(address account, bool excluded)
        public
        whenNotPaused
        onlyOwner
    {
        require(
            _isExcludedFromFees[account] != excluded,
            "Account is already the value of 'excluded'"
        );
        _isExcludedFromFees[account] = excluded;
        emit AddressExcludedFromFees(account, excluded);
    }

    /**
     * @dev Sets the marketing wallet address to receive fee deductions.
     * @param newWallet The new address for receiving marketing fees.
     */
    function setMarketingWallet(address newWallet)
        public
        whenNotPaused
        onlyOwner
    {
        require(newWallet != address(0), "Invalid Address");
        marketingWallet = newWallet;
        emit MarketingWalletUpdated(newWallet);
    }

    /**
     * @dev Sets the percentage of buy taxes to be deducted from transactions.
     * @param buyTaxPercent The new percentage of buy taxes.
     */
    function setBuyTaxes(uint256 buyTaxPercent) public whenNotPaused onlyOwner {
        require(buyTaxPercent > 0, "Min buyTax is 1 Percentage");
        totalBuyTax = buyTaxPercent;
        emit BuyTaxesUpdated(buyTaxPercent);
    }

    /**
     * @dev Sets the percentage of sell taxes to be deducted from transactions.
     * @param sellTaxPercent The new percentage of sell taxes.
     */
    function setSellTaxes(uint256 sellTaxPercent)
        public
        whenNotPaused
        onlyOwner
    {
        require(sellTaxPercent > 0, "Min sellTax is 1 Percentage");
        totalSellTax = sellTaxPercent;
        emit SellTaxesUpdated(sellTaxPercent);
    }

    /**
     * @dev Sets an automated market maker pair and its value (true/false).
     * @param newPair The address of the new pair to be set.
     * @param value The boolean value indicating whether the pair should be set or unset.
     */
    function setAutomatedMarketMakerPair(address newPair, bool value)
        external
        whenNotPaused
        onlyOwner
    {
        _setAutomatedMarketMakerPair(newPair, value);
        emit AutomatedMarketMakerPairSet(newPair, value);
    }

    /**
     * @dev Sets an automated market maker pair and its value (true/false) privately.
     * @param newPair The address of the new pair to be set.
     * @param value The boolean value indicating whether the pair should be set or unset.
     */
    function _setAutomatedMarketMakerPair(address newPair, bool value) private {
        require(
            automatedMarketMakerPairs[newPair] != value,
            "Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[newPair] = value;
    }

    /**
     * @dev Checks if an address is excluded from fee deductions.
     * @param account The address to check for exclusion from fees.
     * @return A boolean indicating if the address is excluded from fees.
     */
    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    /**
     * @dev Internal transfer function with additional logic to handle fees.
     */

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(!isBlackListed[from] && !isBlackListed[to], "User blacklisted");

        if (automatedMarketMakerPairs[to]) {
            require(amount <= maxSellAmount, "You are exceeding maxSellAmount");
        } else if (automatedMarketMakerPairs[from]) {
            require(amount <= maxBuyAmount, "You are exceeding maxBuyAmount");
            require(
                amount + balanceOf(to) <= maxWalletAmount,
                "Unable to exceed Max Wallet"
            );
        }

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        bool takeFee;

        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        if (
            !automatedMarketMakerPairs[to] && !automatedMarketMakerPairs[from]
        ) {
            takeFee = false;
        }

        if (takeFee) {
            uint256 feeAmt;
            if (automatedMarketMakerPairs[to]) {
                feeAmt = (amount * totalSellTax) / 100;
            } else if (automatedMarketMakerPairs[from]) {
                feeAmt = (amount * totalBuyTax) / 100;
            }
            amount = amount - feeAmt;
            super._transfer(from, marketingWallet, feeAmt);
        }
        super._transfer(from, to, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"AddressBlacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"AddressExcludedFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isWhitelisted","type":"bool"}],"name":"AddressWhitelisted","type":"event"},{"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":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"AutomatedMarketMakerPairSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newBuyTaxPercent","type":"uint256"}],"name":"BuyTaxesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"MarketingWalletUpdated","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSellTaxPercent","type":"uint256"}],"name":"SellTaxesUpdated","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":"address","name":"account","type":"address"}],"name":"Unpaused","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"blackListAddress","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlackListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyTaxPercent","type":"uint256"}],"name":"setBuyTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBuyPercent","type":"uint256"},{"internalType":"uint256","name":"maxSellPercent","type":"uint256"}],"name":"setMaxBuyAndSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellTaxPercent","type":"uint256"}],"name":"setSellTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellTax","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":"uint256","name":"maxWalletPercent","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"whiteListAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526005600a556005600b553480156200001a575f80fd5b5073dc472e460f93f62cb67665f4c3b795e56104911d6040518060400160405280601281526020017f496e7665737420436c756220476c6f62616c00000000000000000000000000008152506040518060400160405280600381526020017f49434700000000000000000000000000000000000000000000000000000000008152508160039081620000ad919062000887565b508060049081620000bf919062000887565b5050505f60055f6101000a81548160ff0219169083151502179055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200014e575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620001459190620009ae565b60405180910390fd5b6200015f81620001e860201b60201c565b5073f2552a8740cebd3e68fb88947a0d518ef6301ff460065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001e2620001c8620002ad60201b60201c565b6c0b5c0e8d21d902d61fa0000000620002d660201b60201c565b62000a97565b5f600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000349575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401620003409190620009ae565b60405180910390fd5b6200035c5f83836200036060201b60201c565b5050565b620003738383836200037860201b60201c565b505050565b62000388620003a060201b60201c565b6200039b838383620003ea60201b60201c565b505050565b620003b06200060e60201b60201c565b15620003e8576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036200043e578060025f828254620004319190620009f6565b925050819055506200050f565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015620004ca578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401620004c19392919062000a41565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000558578060025f8282540392505081905550620005a2565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000601919062000a7c565b60405180910390a3505050565b5f60055f9054906101000a900460ff16905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200069f57607f821691505b602082108103620006b557620006b46200065a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620007197fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620006dc565b620007258683620006dc565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6200076f6200076962000763846200073d565b62000746565b6200073d565b9050919050565b5f819050919050565b6200078a836200074f565b620007a2620007998262000776565b848454620006e8565b825550505050565b5f90565b620007b8620007aa565b620007c58184846200077f565b505050565b5b81811015620007ec57620007e05f82620007ae565b600181019050620007cb565b5050565b601f8211156200083b576200080581620006bb565b6200081084620006cd565b8101602085101562000820578190505b620008386200082f85620006cd565b830182620007ca565b50505b505050565b5f82821c905092915050565b5f6200085d5f198460080262000840565b1980831691505092915050565b5f6200087783836200084c565b9150826002028217905092915050565b620008928262000623565b67ffffffffffffffff811115620008ae57620008ad6200062d565b5b620008ba825462000687565b620008c7828285620007f0565b5f60209050601f831160018114620008fd575f8415620008e8578287015190505b620008f485826200086a565b86555062000963565b601f1984166200090d86620006bb565b5f5b8281101562000936578489015182556001820191506020850194506020810190506200090f565b8683101562000956578489015162000952601f8916826200084c565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000996826200096b565b9050919050565b620009a8816200098a565b82525050565b5f602082019050620009c35f8301846200099d565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62000a02826200073d565b915062000a0f836200073d565b925082820190508082111562000a2a5762000a29620009c9565b5b92915050565b62000a3b816200073d565b82525050565b5f60608201905062000a565f8301866200099d565b62000a65602083018562000a30565b62000a74604083018462000a30565b949350505050565b5f60208201905062000a915f83018462000a30565b92915050565b612d4a8062000aa55f395ff3fe6080604052600436106101f1575f3560e01c806375f0a8741161010c578063a9059cbb1161009f578063c18bc1951161006e578063c18bc195146106da578063cf52a7b214610702578063dd62ed3e1461072a578063e47d606014610766578063f2fde38b146107a2576101f8565b8063a9059cbb14610610578063aa4bde281461064c578063b62496f514610676578063c0246668146106b2576101f8565b80638da5cb5b116100db5780638da5cb5b1461056c57806395d89b41146105965780639a7a23d6146105c0578063a3ca847d146105e8576101f8565b806375f0a874146104c857806379b447bd146104f257806379cc67901461051a57806388e765ff14610542576101f8565b806342966c68116101845780635d098b38116101535780635d098b381461042457806366d602ae1461044c57806370a0823114610476578063715018a6146104b2576101f8565b806342966c681461036c57806346469afb146103945780634fbee193146103be5780635c975abb146103fa576101f8565b80631bff7898116101c05780631bff7898146102b457806323b872dd146102de578063313ce5671461031a5780633b0e013314610344576101f8565b806306fdde03146101fc5780630940bbc714610226578063095ea7b31461024e57806318160ddd1461028a576101f8565b366101f857005b5f80fd5b348015610207575f80fd5b506102106107ca565b60405161021d9190612241565b60405180910390f35b348015610231575f80fd5b5061024c60048036038101906102479190612298565b61085a565b005b348015610259575f80fd5b50610274600480360381019061026f919061231d565b6108ed565b6040516102819190612375565b60405180910390f35b348015610295575f80fd5b5061029e61090f565b6040516102ab919061239d565b60405180910390f35b3480156102bf575f80fd5b506102c8610918565b6040516102d5919061239d565b60405180910390f35b3480156102e9575f80fd5b5061030460048036038101906102ff91906123b6565b61091e565b6040516103119190612375565b60405180910390f35b348015610325575f80fd5b5061032e61094c565b60405161033b9190612421565b60405180910390f35b34801561034f575f80fd5b5061036a6004803603810190610365919061243a565b610954565b005b348015610377575f80fd5b50610392600480360381019061038d9190612298565b610a71565b005b34801561039f575f80fd5b506103a8610a85565b6040516103b5919061239d565b60405180910390f35b3480156103c9575f80fd5b506103e460048036038101906103df919061243a565b610a8b565b6040516103f19190612375565b60405180910390f35b348015610405575f80fd5b5061040e610add565b60405161041b9190612375565b60405180910390f35b34801561042f575f80fd5b5061044a6004803603810190610445919061243a565b610af2565b005b348015610457575f80fd5b50610460610bf6565b60405161046d919061239d565b60405180910390f35b348015610481575f80fd5b5061049c6004803603810190610497919061243a565b610bfc565b6040516104a9919061239d565b60405180910390f35b3480156104bd575f80fd5b506104c6610c41565b005b3480156104d3575f80fd5b506104dc610c54565b6040516104e99190612474565b60405180910390f35b3480156104fd575f80fd5b506105186004803603810190610513919061248d565b610c79565b005b348015610525575f80fd5b50610540600480360381019061053b919061231d565b610d24565b005b34801561054d575f80fd5b50610556610d44565b604051610563919061239d565b60405180910390f35b348015610577575f80fd5b50610580610d4a565b60405161058d9190612474565b60405180910390f35b3480156105a1575f80fd5b506105aa610d73565b6040516105b79190612241565b60405180910390f35b3480156105cb575f80fd5b506105e660048036038101906105e191906124f5565b610e03565b005b3480156105f3575f80fd5b5061060e60048036038101906106099190612298565b610e6f565b005b34801561061b575f80fd5b506106366004803603810190610631919061231d565b610f02565b6040516106439190612375565b60405180910390f35b348015610657575f80fd5b50610660610f24565b60405161066d919061239d565b60405180910390f35b348015610681575f80fd5b5061069c6004803603810190610697919061243a565b610f2a565b6040516106a99190612375565b60405180910390f35b3480156106bd575f80fd5b506106d860048036038101906106d391906124f5565b610f47565b005b3480156106e5575f80fd5b5061070060048036038101906106fb9190612298565b61108c565b005b34801561070d575f80fd5b506107286004803603810190610723919061243a565b6110fe565b005b348015610735575f80fd5b50610750600480360381019061074b9190612533565b611221565b60405161075d919061239d565b60405180910390f35b348015610771575f80fd5b5061078c6004803603810190610787919061243a565b6112a3565b6040516107999190612375565b60405180910390f35b3480156107ad575f80fd5b506107c860048036038101906107c3919061243a565b6112c0565b005b6060600380546107d99061259e565b80601f01602080910402602001604051908101604052809291908181526020018280546108059061259e565b80156108505780601f1061082757610100808354040283529160200191610850565b820191905f5260205f20905b81548152906001019060200180831161083357829003601f168201915b5050505050905090565b610862611344565b61086a611385565b5f81116108ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a390612618565b60405180910390fd5b80600b819055507f9ec62aa876eec7cbe6ac95ce611b3e94d9f32e694b235ee884d0998f5ff111c4816040516108e2919061239d565b60405180910390a150565b5f806108f761140c565b9050610904818585611413565b600191505092915050565b5f600254905090565b600b5481565b5f8061092861140c565b9050610935858285611425565b6109408585856114b7565b60019150509392505050565b5f6012905090565b61095c611385565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c190612680565b60405180910390fd5b6001600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f97b7af35c8c05eca90f543eb78b16fdf2664d3e6c9a907286f310647d9813b716001604051610a669190612375565b60405180910390a250565b610a82610a7c61140c565b82611a8c565b50565b600a5481565b5f600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f60055f9054906101000a900460ff16905090565b610afa611344565b610b02611385565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6790612680565b60405180910390fd5b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fbf86feedee5b30c30a8243bd21deebb704d141478d39b1be04fe5ee739f214e760405160405180910390a250565b60085481565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610c49611385565b610c525f611b0b565b565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c81611344565b610c89611385565b5f82118015610c9757505f81115b610cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccd906126e8565b60405180910390fd5b606482610ce161090f565b610ceb9190612733565b610cf591906127a1565b600781905550606481610d0661090f565b610d109190612733565b610d1a91906127a1565b6008819055505050565b610d3682610d3061140c565b83611425565b610d408282611a8c565b5050565b60075481565b5f600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610d829061259e565b80601f0160208091040260200160405190810160405280929190818152602001828054610dae9061259e565b8015610df95780601f10610dd057610100808354040283529160200191610df9565b820191905f5260205f20905b815481529060010190602001808311610ddc57829003601f168201915b5050505050905090565b610e0b611344565b610e13611385565b610e1d8282611bd0565b8173ffffffffffffffffffffffffffffffffffffffff167f167fec55059eb0be5a803ca151d74e2f1df0223b4482c9eb80a57be642be0bf582604051610e639190612375565b60405180910390a25050565b610e77611344565b610e7f611385565b5f8111610ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb89061281b565b60405180910390fd5b80600a819055507f4996f5d01949abbe5db474cf3d527992a819addf57e873a4f9ef6a08cb3eecdf81604051610ef7919061239d565b60405180910390a150565b5f80610f0c61140c565b9050610f198185856114b7565b600191505092915050565b60095481565b600d602052805f5260405f205f915054906101000a900460ff1681565b610f4f611344565b610f57611385565b801515600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503610fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdd906128a9565b60405180910390fd5b80600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f43e5678c2fcaa42d15df6505520f417a1fbf973324cb2f7c106ebdbd662d0c3d826040516110809190612375565b60405180910390a25050565b611094611385565b5f81116110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90612911565b60405180910390fd5b6064816110e161090f565b6110eb9190612733565b6110f591906127a1565b60098190555050565b611106611344565b61110e611385565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361117c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117390612680565b60405180910390fd5b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167faf367c7d20ce5b2ab6da56afd0c9c39b00ba995263c60292a3e1ee3781fd48855f6040516112169190612375565b60405180910390a250565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b600e602052805f5260405f205f915054906101000a900460ff1681565b6112c8611385565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611338575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161132f9190612474565b60405180910390fd5b61134181611b0b565b50565b61134c610add565b15611383576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61138d61140c565b73ffffffffffffffffffffffffffffffffffffffff166113ab610d4a565b73ffffffffffffffffffffffffffffffffffffffff161461140a576113ce61140c565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016114019190612474565b60405180910390fd5b565b5f33905090565b6114208383836001611cb7565b505050565b5f6114308484611221565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146114b157818110156114a2578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016114999392919061292f565b60405180910390fd5b6114b084848484035f611cb7565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c906129d4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a90612a62565b60405180910390fd5b600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156116315750600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b611670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166790612aca565b60405180910390fd5b600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561170957600854811115611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb90612b32565b60405180910390fd5b6117f7565b600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156117f65760075481111561179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490612b9a565b60405180910390fd5b6009546117a983610bfc565b826117b49190612bb8565b11156117f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ec90612c35565b60405180910390fd5b5b5b5f810361180e5761180983835f611e86565b611a87565b5f600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806118aa5750600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b156118b3575f90505b600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156119515750600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561195a575f90505b8015611a7a575f600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156119d1576064600b54846119c09190612733565b6119ca91906127a1565b9050611a3e565b600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611a3d576064600a5484611a309190612733565b611a3a91906127a1565b90505b5b8083611a4a9190612c53565b9250611a788560065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611e86565b505b611a85848484611e86565b505b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611afc575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611af39190612474565b60405180910390fd5b611b07825f83611f76565b5050565b5f600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b801515600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5690612cf6565b60405180910390fd5b80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611d27575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611d1e9190612474565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d97575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611d8e9190612474565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611e80578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611e77919061239d565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ef6575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611eed9190612474565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f66575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611f5d9190612474565b60405180910390fd5b611f71838383611f76565b505050565b611f81838383611f86565b505050565b611f8e611344565b611f99838383611f9e565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fee578060025f828254611fe29190612bb8565b925050819055506120bc565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612077578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161206e9392919061292f565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612103578060025f828254039250508190555061214d565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516121aa919061239d565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156121ee5780820151818401526020810190506121d3565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612213826121b7565b61221d81856121c1565b935061222d8185602086016121d1565b612236816121f9565b840191505092915050565b5f6020820190508181035f8301526122598184612209565b905092915050565b5f80fd5b5f819050919050565b61227781612265565b8114612281575f80fd5b50565b5f813590506122928161226e565b92915050565b5f602082840312156122ad576122ac612261565b5b5f6122ba84828501612284565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6122ec826122c3565b9050919050565b6122fc816122e2565b8114612306575f80fd5b50565b5f81359050612317816122f3565b92915050565b5f806040838503121561233357612332612261565b5b5f61234085828601612309565b925050602061235185828601612284565b9150509250929050565b5f8115159050919050565b61236f8161235b565b82525050565b5f6020820190506123885f830184612366565b92915050565b61239781612265565b82525050565b5f6020820190506123b05f83018461238e565b92915050565b5f805f606084860312156123cd576123cc612261565b5b5f6123da86828701612309565b93505060206123eb86828701612309565b92505060406123fc86828701612284565b9150509250925092565b5f60ff82169050919050565b61241b81612406565b82525050565b5f6020820190506124345f830184612412565b92915050565b5f6020828403121561244f5761244e612261565b5b5f61245c84828501612309565b91505092915050565b61246e816122e2565b82525050565b5f6020820190506124875f830184612465565b92915050565b5f80604083850312156124a3576124a2612261565b5b5f6124b085828601612284565b92505060206124c185828601612284565b9150509250929050565b6124d48161235b565b81146124de575f80fd5b50565b5f813590506124ef816124cb565b92915050565b5f806040838503121561250b5761250a612261565b5b5f61251885828601612309565b9250506020612529858286016124e1565b9150509250929050565b5f806040838503121561254957612548612261565b5b5f61255685828601612309565b925050602061256785828601612309565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806125b557607f821691505b6020821081036125c8576125c7612571565b5b50919050565b7f4d696e2073656c6c54617820697320312050657263656e7461676500000000005f82015250565b5f612602601b836121c1565b915061260d826125ce565b602082019050919050565b5f6020820190508181035f83015261262f816125f6565b9050919050565b7f496e76616c6964204164647265737300000000000000000000000000000000005f82015250565b5f61266a600f836121c1565b915061267582612636565b602082019050919050565b5f6020820190508181035f8301526126978161265e565b9050919050565b7f496e76616c69642050657263656e7461676500000000000000000000000000005f82015250565b5f6126d26012836121c1565b91506126dd8261269e565b602082019050919050565b5f6020820190508181035f8301526126ff816126c6565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61273d82612265565b915061274883612265565b925082820261275681612265565b9150828204841483151761276d5761276c612706565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6127ab82612265565b91506127b683612265565b9250826127c6576127c5612774565b5b828204905092915050565b7f4d696e2062757954617820697320312050657263656e746167650000000000005f82015250565b5f612805601a836121c1565b9150612810826127d1565b602082019050919050565b5f6020820190508181035f830152612832816127f9565b9050919050565b7f4163636f756e7420697320616c7265616479207468652076616c7565206f66205f8201527f276578636c756465642700000000000000000000000000000000000000000000602082015250565b5f612893602a836121c1565b915061289e82612839565b604082019050919050565b5f6020820190508181035f8301526128c081612887565b9050919050565b7f496e61766c69642050657263656e7461676500000000000000000000000000005f82015250565b5f6128fb6012836121c1565b9150612906826128c7565b602082019050919050565b5f6020820190508181035f830152612928816128ef565b9050919050565b5f6060820190506129425f830186612465565b61294f602083018561238e565b61295c604083018461238e565b949350505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6129be6025836121c1565b91506129c982612964565b604082019050919050565b5f6020820190508181035f8301526129eb816129b2565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612a4c6023836121c1565b9150612a57826129f2565b604082019050919050565b5f6020820190508181035f830152612a7981612a40565b9050919050565b7f5573657220626c61636b6c6973746564000000000000000000000000000000005f82015250565b5f612ab46010836121c1565b9150612abf82612a80565b602082019050919050565b5f6020820190508181035f830152612ae181612aa8565b9050919050565b7f596f752061726520657863656564696e67206d617853656c6c416d6f756e74005f82015250565b5f612b1c601f836121c1565b9150612b2782612ae8565b602082019050919050565b5f6020820190508181035f830152612b4981612b10565b9050919050565b7f596f752061726520657863656564696e67206d6178427579416d6f756e7400005f82015250565b5f612b84601e836121c1565b9150612b8f82612b50565b602082019050919050565b5f6020820190508181035f830152612bb181612b78565b9050919050565b5f612bc282612265565b9150612bcd83612265565b9250828201905080821115612be557612be4612706565b5b92915050565b7f556e61626c6520746f20657863656564204d61782057616c6c657400000000005f82015250565b5f612c1f601b836121c1565b9150612c2a82612beb565b602082019050919050565b5f6020820190508181035f830152612c4c81612c13565b9050919050565b5f612c5d82612265565b9150612c6883612265565b9250828203905081811115612c8057612c7f612706565b5b92915050565b7f4175746f6d61746564206d61726b6574206d616b6572207061697220697320615f8201527f6c72656164792073657420746f20746861742076616c75650000000000000000602082015250565b5f612ce06038836121c1565b9150612ceb82612c86565b604082019050919050565b5f6020820190508181035f830152612d0d81612cd4565b905091905056fea2646970667358221220b5fb8c56447e31f97c69a223ab2bf89c562516dd7c52d907ad403f6e95b3287b64736f6c63430008140033

Deployed Bytecode

0x6080604052600436106101f1575f3560e01c806375f0a8741161010c578063a9059cbb1161009f578063c18bc1951161006e578063c18bc195146106da578063cf52a7b214610702578063dd62ed3e1461072a578063e47d606014610766578063f2fde38b146107a2576101f8565b8063a9059cbb14610610578063aa4bde281461064c578063b62496f514610676578063c0246668146106b2576101f8565b80638da5cb5b116100db5780638da5cb5b1461056c57806395d89b41146105965780639a7a23d6146105c0578063a3ca847d146105e8576101f8565b806375f0a874146104c857806379b447bd146104f257806379cc67901461051a57806388e765ff14610542576101f8565b806342966c68116101845780635d098b38116101535780635d098b381461042457806366d602ae1461044c57806370a0823114610476578063715018a6146104b2576101f8565b806342966c681461036c57806346469afb146103945780634fbee193146103be5780635c975abb146103fa576101f8565b80631bff7898116101c05780631bff7898146102b457806323b872dd146102de578063313ce5671461031a5780633b0e013314610344576101f8565b806306fdde03146101fc5780630940bbc714610226578063095ea7b31461024e57806318160ddd1461028a576101f8565b366101f857005b5f80fd5b348015610207575f80fd5b506102106107ca565b60405161021d9190612241565b60405180910390f35b348015610231575f80fd5b5061024c60048036038101906102479190612298565b61085a565b005b348015610259575f80fd5b50610274600480360381019061026f919061231d565b6108ed565b6040516102819190612375565b60405180910390f35b348015610295575f80fd5b5061029e61090f565b6040516102ab919061239d565b60405180910390f35b3480156102bf575f80fd5b506102c8610918565b6040516102d5919061239d565b60405180910390f35b3480156102e9575f80fd5b5061030460048036038101906102ff91906123b6565b61091e565b6040516103119190612375565b60405180910390f35b348015610325575f80fd5b5061032e61094c565b60405161033b9190612421565b60405180910390f35b34801561034f575f80fd5b5061036a6004803603810190610365919061243a565b610954565b005b348015610377575f80fd5b50610392600480360381019061038d9190612298565b610a71565b005b34801561039f575f80fd5b506103a8610a85565b6040516103b5919061239d565b60405180910390f35b3480156103c9575f80fd5b506103e460048036038101906103df919061243a565b610a8b565b6040516103f19190612375565b60405180910390f35b348015610405575f80fd5b5061040e610add565b60405161041b9190612375565b60405180910390f35b34801561042f575f80fd5b5061044a6004803603810190610445919061243a565b610af2565b005b348015610457575f80fd5b50610460610bf6565b60405161046d919061239d565b60405180910390f35b348015610481575f80fd5b5061049c6004803603810190610497919061243a565b610bfc565b6040516104a9919061239d565b60405180910390f35b3480156104bd575f80fd5b506104c6610c41565b005b3480156104d3575f80fd5b506104dc610c54565b6040516104e99190612474565b60405180910390f35b3480156104fd575f80fd5b506105186004803603810190610513919061248d565b610c79565b005b348015610525575f80fd5b50610540600480360381019061053b919061231d565b610d24565b005b34801561054d575f80fd5b50610556610d44565b604051610563919061239d565b60405180910390f35b348015610577575f80fd5b50610580610d4a565b60405161058d9190612474565b60405180910390f35b3480156105a1575f80fd5b506105aa610d73565b6040516105b79190612241565b60405180910390f35b3480156105cb575f80fd5b506105e660048036038101906105e191906124f5565b610e03565b005b3480156105f3575f80fd5b5061060e60048036038101906106099190612298565b610e6f565b005b34801561061b575f80fd5b506106366004803603810190610631919061231d565b610f02565b6040516106439190612375565b60405180910390f35b348015610657575f80fd5b50610660610f24565b60405161066d919061239d565b60405180910390f35b348015610681575f80fd5b5061069c6004803603810190610697919061243a565b610f2a565b6040516106a99190612375565b60405180910390f35b3480156106bd575f80fd5b506106d860048036038101906106d391906124f5565b610f47565b005b3480156106e5575f80fd5b5061070060048036038101906106fb9190612298565b61108c565b005b34801561070d575f80fd5b506107286004803603810190610723919061243a565b6110fe565b005b348015610735575f80fd5b50610750600480360381019061074b9190612533565b611221565b60405161075d919061239d565b60405180910390f35b348015610771575f80fd5b5061078c6004803603810190610787919061243a565b6112a3565b6040516107999190612375565b60405180910390f35b3480156107ad575f80fd5b506107c860048036038101906107c3919061243a565b6112c0565b005b6060600380546107d99061259e565b80601f01602080910402602001604051908101604052809291908181526020018280546108059061259e565b80156108505780601f1061082757610100808354040283529160200191610850565b820191905f5260205f20905b81548152906001019060200180831161083357829003601f168201915b5050505050905090565b610862611344565b61086a611385565b5f81116108ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a390612618565b60405180910390fd5b80600b819055507f9ec62aa876eec7cbe6ac95ce611b3e94d9f32e694b235ee884d0998f5ff111c4816040516108e2919061239d565b60405180910390a150565b5f806108f761140c565b9050610904818585611413565b600191505092915050565b5f600254905090565b600b5481565b5f8061092861140c565b9050610935858285611425565b6109408585856114b7565b60019150509392505050565b5f6012905090565b61095c611385565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c190612680565b60405180910390fd5b6001600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f97b7af35c8c05eca90f543eb78b16fdf2664d3e6c9a907286f310647d9813b716001604051610a669190612375565b60405180910390a250565b610a82610a7c61140c565b82611a8c565b50565b600a5481565b5f600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f60055f9054906101000a900460ff16905090565b610afa611344565b610b02611385565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6790612680565b60405180910390fd5b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fbf86feedee5b30c30a8243bd21deebb704d141478d39b1be04fe5ee739f214e760405160405180910390a250565b60085481565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610c49611385565b610c525f611b0b565b565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c81611344565b610c89611385565b5f82118015610c9757505f81115b610cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccd906126e8565b60405180910390fd5b606482610ce161090f565b610ceb9190612733565b610cf591906127a1565b600781905550606481610d0661090f565b610d109190612733565b610d1a91906127a1565b6008819055505050565b610d3682610d3061140c565b83611425565b610d408282611a8c565b5050565b60075481565b5f600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610d829061259e565b80601f0160208091040260200160405190810160405280929190818152602001828054610dae9061259e565b8015610df95780601f10610dd057610100808354040283529160200191610df9565b820191905f5260205f20905b815481529060010190602001808311610ddc57829003601f168201915b5050505050905090565b610e0b611344565b610e13611385565b610e1d8282611bd0565b8173ffffffffffffffffffffffffffffffffffffffff167f167fec55059eb0be5a803ca151d74e2f1df0223b4482c9eb80a57be642be0bf582604051610e639190612375565b60405180910390a25050565b610e77611344565b610e7f611385565b5f8111610ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb89061281b565b60405180910390fd5b80600a819055507f4996f5d01949abbe5db474cf3d527992a819addf57e873a4f9ef6a08cb3eecdf81604051610ef7919061239d565b60405180910390a150565b5f80610f0c61140c565b9050610f198185856114b7565b600191505092915050565b60095481565b600d602052805f5260405f205f915054906101000a900460ff1681565b610f4f611344565b610f57611385565b801515600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503610fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdd906128a9565b60405180910390fd5b80600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f43e5678c2fcaa42d15df6505520f417a1fbf973324cb2f7c106ebdbd662d0c3d826040516110809190612375565b60405180910390a25050565b611094611385565b5f81116110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90612911565b60405180910390fd5b6064816110e161090f565b6110eb9190612733565b6110f591906127a1565b60098190555050565b611106611344565b61110e611385565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361117c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117390612680565b60405180910390fd5b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167faf367c7d20ce5b2ab6da56afd0c9c39b00ba995263c60292a3e1ee3781fd48855f6040516112169190612375565b60405180910390a250565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b600e602052805f5260405f205f915054906101000a900460ff1681565b6112c8611385565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611338575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161132f9190612474565b60405180910390fd5b61134181611b0b565b50565b61134c610add565b15611383576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61138d61140c565b73ffffffffffffffffffffffffffffffffffffffff166113ab610d4a565b73ffffffffffffffffffffffffffffffffffffffff161461140a576113ce61140c565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016114019190612474565b60405180910390fd5b565b5f33905090565b6114208383836001611cb7565b505050565b5f6114308484611221565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146114b157818110156114a2578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016114999392919061292f565b60405180910390fd5b6114b084848484035f611cb7565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c906129d4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a90612a62565b60405180910390fd5b600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156116315750600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b611670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166790612aca565b60405180910390fd5b600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561170957600854811115611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb90612b32565b60405180910390fd5b6117f7565b600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156117f65760075481111561179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490612b9a565b60405180910390fd5b6009546117a983610bfc565b826117b49190612bb8565b11156117f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ec90612c35565b60405180910390fd5b5b5b5f810361180e5761180983835f611e86565b611a87565b5f600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806118aa5750600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b156118b3575f90505b600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156119515750600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561195a575f90505b8015611a7a575f600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156119d1576064600b54846119c09190612733565b6119ca91906127a1565b9050611a3e565b600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611a3d576064600a5484611a309190612733565b611a3a91906127a1565b90505b5b8083611a4a9190612c53565b9250611a788560065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611e86565b505b611a85848484611e86565b505b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611afc575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611af39190612474565b60405180910390fd5b611b07825f83611f76565b5050565b5f600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b801515600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5690612cf6565b60405180910390fd5b80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611d27575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611d1e9190612474565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d97575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611d8e9190612474565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611e80578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611e77919061239d565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ef6575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611eed9190612474565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f66575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611f5d9190612474565b60405180910390fd5b611f71838383611f76565b505050565b611f81838383611f86565b505050565b611f8e611344565b611f99838383611f9e565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fee578060025f828254611fe29190612bb8565b925050819055506120bc565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612077578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161206e9392919061292f565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612103578060025f828254039250508190555061214d565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516121aa919061239d565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156121ee5780820151818401526020810190506121d3565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612213826121b7565b61221d81856121c1565b935061222d8185602086016121d1565b612236816121f9565b840191505092915050565b5f6020820190508181035f8301526122598184612209565b905092915050565b5f80fd5b5f819050919050565b61227781612265565b8114612281575f80fd5b50565b5f813590506122928161226e565b92915050565b5f602082840312156122ad576122ac612261565b5b5f6122ba84828501612284565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6122ec826122c3565b9050919050565b6122fc816122e2565b8114612306575f80fd5b50565b5f81359050612317816122f3565b92915050565b5f806040838503121561233357612332612261565b5b5f61234085828601612309565b925050602061235185828601612284565b9150509250929050565b5f8115159050919050565b61236f8161235b565b82525050565b5f6020820190506123885f830184612366565b92915050565b61239781612265565b82525050565b5f6020820190506123b05f83018461238e565b92915050565b5f805f606084860312156123cd576123cc612261565b5b5f6123da86828701612309565b93505060206123eb86828701612309565b92505060406123fc86828701612284565b9150509250925092565b5f60ff82169050919050565b61241b81612406565b82525050565b5f6020820190506124345f830184612412565b92915050565b5f6020828403121561244f5761244e612261565b5b5f61245c84828501612309565b91505092915050565b61246e816122e2565b82525050565b5f6020820190506124875f830184612465565b92915050565b5f80604083850312156124a3576124a2612261565b5b5f6124b085828601612284565b92505060206124c185828601612284565b9150509250929050565b6124d48161235b565b81146124de575f80fd5b50565b5f813590506124ef816124cb565b92915050565b5f806040838503121561250b5761250a612261565b5b5f61251885828601612309565b9250506020612529858286016124e1565b9150509250929050565b5f806040838503121561254957612548612261565b5b5f61255685828601612309565b925050602061256785828601612309565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806125b557607f821691505b6020821081036125c8576125c7612571565b5b50919050565b7f4d696e2073656c6c54617820697320312050657263656e7461676500000000005f82015250565b5f612602601b836121c1565b915061260d826125ce565b602082019050919050565b5f6020820190508181035f83015261262f816125f6565b9050919050565b7f496e76616c6964204164647265737300000000000000000000000000000000005f82015250565b5f61266a600f836121c1565b915061267582612636565b602082019050919050565b5f6020820190508181035f8301526126978161265e565b9050919050565b7f496e76616c69642050657263656e7461676500000000000000000000000000005f82015250565b5f6126d26012836121c1565b91506126dd8261269e565b602082019050919050565b5f6020820190508181035f8301526126ff816126c6565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61273d82612265565b915061274883612265565b925082820261275681612265565b9150828204841483151761276d5761276c612706565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6127ab82612265565b91506127b683612265565b9250826127c6576127c5612774565b5b828204905092915050565b7f4d696e2062757954617820697320312050657263656e746167650000000000005f82015250565b5f612805601a836121c1565b9150612810826127d1565b602082019050919050565b5f6020820190508181035f830152612832816127f9565b9050919050565b7f4163636f756e7420697320616c7265616479207468652076616c7565206f66205f8201527f276578636c756465642700000000000000000000000000000000000000000000602082015250565b5f612893602a836121c1565b915061289e82612839565b604082019050919050565b5f6020820190508181035f8301526128c081612887565b9050919050565b7f496e61766c69642050657263656e7461676500000000000000000000000000005f82015250565b5f6128fb6012836121c1565b9150612906826128c7565b602082019050919050565b5f6020820190508181035f830152612928816128ef565b9050919050565b5f6060820190506129425f830186612465565b61294f602083018561238e565b61295c604083018461238e565b949350505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6129be6025836121c1565b91506129c982612964565b604082019050919050565b5f6020820190508181035f8301526129eb816129b2565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612a4c6023836121c1565b9150612a57826129f2565b604082019050919050565b5f6020820190508181035f830152612a7981612a40565b9050919050565b7f5573657220626c61636b6c6973746564000000000000000000000000000000005f82015250565b5f612ab46010836121c1565b9150612abf82612a80565b602082019050919050565b5f6020820190508181035f830152612ae181612aa8565b9050919050565b7f596f752061726520657863656564696e67206d617853656c6c416d6f756e74005f82015250565b5f612b1c601f836121c1565b9150612b2782612ae8565b602082019050919050565b5f6020820190508181035f830152612b4981612b10565b9050919050565b7f596f752061726520657863656564696e67206d6178427579416d6f756e7400005f82015250565b5f612b84601e836121c1565b9150612b8f82612b50565b602082019050919050565b5f6020820190508181035f830152612bb181612b78565b9050919050565b5f612bc282612265565b9150612bcd83612265565b9250828201905080821115612be557612be4612706565b5b92915050565b7f556e61626c6520746f20657863656564204d61782057616c6c657400000000005f82015250565b5f612c1f601b836121c1565b9150612c2a82612beb565b602082019050919050565b5f6020820190508181035f830152612c4c81612c13565b9050919050565b5f612c5d82612265565b9150612c6883612265565b9250828203905081811115612c8057612c7f612706565b5b92915050565b7f4175746f6d61746564206d61726b6574206d616b6572207061697220697320615f8201527f6c72656164792073657420746f20746861742076616c75650000000000000000602082015250565b5f612ce06038836121c1565b9150612ceb82612c86565b604082019050919050565b5f6020820190508181035f830152612d0d81612cd4565b905091905056fea2646970667358221220b5fb8c56447e31f97c69a223ab2bf89c562516dd7c52d907ad403f6e95b3287b64736f6c63430008140033

Deployed Bytecode Sourcemap

31973:8494:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19406:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37033:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21699:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20508:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32260:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22467:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20359:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34701:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30590:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32223:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38615:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9646:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36193:267;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32149:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20670:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13019:103;;;;;;;;;;;;;:::i;:::-;;32078:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34191:353;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31008:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32115:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12344:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19616:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37563:253;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36628:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20993:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32184:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32359:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35643:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33859:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35094:267;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21238:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32423:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13277:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19406:91;19451:13;19484:5;19477:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19406:91;:::o;37033:274::-;9251:19;:17;:19::i;:::-;12230:13:::1;:11;:13::i;:::-;37178:1:::2;37161:14;:18;37153:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37237:14;37222:12;:29;;;;37267:32;37284:14;37267:32;;;;;;:::i;:::-;;;;;;;;37033:274:::0;:::o;21699:190::-;21772:4;21789:13;21805:12;:10;:12::i;:::-;21789:28;;21828:31;21837:5;21844:7;21853:5;21828:8;:31::i;:::-;21877:4;21870:11;;;21699:190;;;;:::o;20508:99::-;20560:7;20587:12;;20580:19;;20508:99;:::o;32260:31::-;;;;:::o;22467:249::-;22554:4;22571:15;22589:12;:10;:12::i;:::-;22571:30;;22612:37;22628:4;22634:7;22643:5;22612:15;:37::i;:::-;22660:26;22670:4;22676:2;22680:5;22660:9;:26::i;:::-;22704:4;22697:11;;;22467:249;;;;;:::o;20359:84::-;20408:5;20433:2;20426:9;;20359:84;:::o;34701:219::-;12230:13;:11;:13::i;:::-;34801:1:::1;34782:21;;:7;:21;;::::0;34774:49:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;34859:4;34834:13;:22;34848:7;34834:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34898:7;34879:33;;;34907:4;34879:33;;;;;;:::i;:::-;;;;;;;;34701:219:::0;:::o;30590:89::-;30645:26;30651:12;:10;:12::i;:::-;30665:5;30645;:26::i;:::-;30590:89;:::o;32223:30::-;;;;:::o;38615:126::-;38681:4;38705:19;:28;38725:7;38705:28;;;;;;;;;;;;;;;;;;;;;;;;;38698:35;;38615:126;;;:::o;9646:86::-;9693:4;9717:7;;;;;;;;;;;9710:14;;9646:86;:::o;36193:267::-;9251:19;:17;:19::i;:::-;12230:13:::1;:11;:13::i;:::-;36343:1:::2;36322:23;;:9;:23;;::::0;36314:51:::2;;;;;;;;;;;;:::i;:::-;;;;;;;;;36394:9;36376:15;;:27;;;;;;;;;;;;;;;;;;36442:9;36419:33;;;;;;;;;;;;36193:267:::0;:::o;32149:28::-;;;;:::o;20670:118::-;20735:7;20762:9;:18;20772:7;20762:18;;;;;;;;;;;;;;;;20755:25;;20670:118;;;:::o;13019:103::-;12230:13;:11;:13::i;:::-;13084:30:::1;13111:1;13084:18;:30::i;:::-;13019:103::o:0;32078:30::-;;;;;;;;;;;;;:::o;34191:353::-;9251:19;:17;:19::i;:::-;12230:13:::1;:11;:13::i;:::-;34362:1:::2;34346:13;:17;:39;;;;;34384:1;34367:14;:18;34346:39;34338:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;34468:3;34451:13;34435;:11;:13::i;:::-;:29;;;;:::i;:::-;34434:37;;;;:::i;:::-;34419:12;:52;;;;34533:3;34515:14;34499:13;:11;:13::i;:::-;:30;;;;:::i;:::-;34498:38;;;;:::i;:::-;34482:13;:54;;;;34191:353:::0;;:::o;31008:161::-;31084:45;31100:7;31109:12;:10;:12::i;:::-;31123:5;31084:15;:45::i;:::-;31140:21;31146:7;31155:5;31140;:21::i;:::-;31008:161;;:::o;32115:27::-;;;;:::o;12344:87::-;12390:7;12417:6;;;;;;;;;;;12410:13;;12344:87;:::o;19616:95::-;19663:13;19696:7;19689:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19616:95;:::o;37563:253::-;9251:19;:17;:19::i;:::-;12230:13:::1;:11;:13::i;:::-;37705:44:::2;37734:7;37743:5;37705:28;:44::i;:::-;37793:7;37765:43;;;37802:5;37765:43;;;;;;:::i;:::-;;;;;;;;37563:253:::0;;:::o;36628:234::-;9251:19;:17;:19::i;:::-;12230:13:::1;:11;:13::i;:::-;36738:1:::2;36722:13;:17;36714:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;36795:13;36781:11;:27;;;;36824:30;36840:13;36824:30;;;;;;:::i;:::-;;;;;;;;36628:234:::0;:::o;20993:182::-;21062:4;21079:13;21095:12;:10;:12::i;:::-;21079:28;;21118:27;21128:5;21135:2;21139:5;21118:9;:27::i;:::-;21163:4;21156:11;;;20993:182;;;;:::o;32184:30::-;;;;:::o;32359:57::-;;;;;;;;;;;;;;;;;;;;;;:::o;35643:379::-;9251:19;:17;:19::i;:::-;12230:13:::1;:11;:13::i;:::-;35828:8:::2;35796:40;;:19;:28;35816:7;35796:28;;;;;;;;;;;;;;;;;;;;;;;;;:40;;::::0;35774:132:::2;;;;;;;;;;;;:::i;:::-;;;;;;;;;35948:8;35917:19;:28;35937:7;35917:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;35996:7;35972:42;;;36005:8;35972:42;;;;;;:::i;:::-;;;;;;;;35643:379:::0;;:::o;33859:213::-;12230:13;:11;:13::i;:::-;33971:1:::1;33952:16;:20;33944:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;34061:3;34041:16;34025:13;:11;:13::i;:::-;:32;;;;:::i;:::-;34024:40;;;;:::i;:::-;34006:15;:58;;;;33859:213:::0;:::o;35094:267::-;9251:19;:17;:19::i;:::-;12230:13:::1;:11;:13::i;:::-;35240:1:::2;35221:21;;:7;:21;;::::0;35213:49:::2;;;;;;;;;;;;:::i;:::-;;;;;;;;;35298:5;35273:13;:22;35287:7;35273:22;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;35338:7;35319:34;;;35347:5;35319:34;;;;;;:::i;:::-;;;;;;;;35094:267:::0;:::o;21238:142::-;21318:7;21345:11;:18;21357:5;21345:18;;;;;;;;;;;;;;;:27;21364:7;21345:27;;;;;;;;;;;;;;;;21338:34;;21238:142;;;;:::o;32423:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;13277:220::-;12230:13;:11;:13::i;:::-;13382:1:::1;13362:22;;:8;:22;;::::0;13358:93:::1;;13436:1;13408:31;;;;;;;;;;;:::i;:::-;;;;;;;;13358:93;13461:28;13480:8;13461:18;:28::i;:::-;13277:220:::0;:::o;9805:132::-;9871:8;:6;:8::i;:::-;9867:63;;;9903:15;;;;;;;;;;;;;;9867:63;9805:132::o;12509:166::-;12580:12;:10;:12::i;:::-;12569:23;;:7;:5;:7::i;:::-;:23;;;12565:103;;12643:12;:10;:12::i;:::-;12616:40;;;;;;;;;;;:::i;:::-;;;;;;;;12565:103;12509:166::o;7425:98::-;7478:7;7505:10;7498:17;;7425:98;:::o;26534:130::-;26619:37;26628:5;26635:7;26644:5;26651:4;26619:8;:37::i;:::-;26534:130;;;:::o;28250:487::-;28350:24;28377:25;28387:5;28394:7;28377:9;:25::i;:::-;28350:52;;28437:17;28417:16;:37;28413:317;;28494:5;28475:16;:24;28471:132;;;28554:7;28563:16;28581:5;28527:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;28471:132;28646:57;28655:5;28662:7;28690:5;28671:16;:24;28697:5;28646:8;:57::i;:::-;28413:317;28339:398;28250:487;;;:::o;38847:1617::-;38995:1;38979:18;;:4;:18;;;38971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39072:1;39058:16;;:2;:16;;;39050:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;39134:13;:19;39148:4;39134:19;;;;;;;;;;;;;;;;;;;;;;;;;39133:20;:42;;;;;39158:13;:17;39172:2;39158:17;;;;;;;;;;;;;;;;;;;;;;;;;39157:18;39133:42;39125:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;39213:25;:29;39239:2;39213:29;;;;;;;;;;;;;;;;;;;;;;;;;39209:409;;;39277:13;;39267:6;:23;;39259:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;39209:409;;;39348:25;:31;39374:4;39348:31;;;;;;;;;;;;;;;;;;;;;;;;;39344:274;;;39414:12;;39404:6;:22;;39396:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39528:15;;39511:13;39521:2;39511:9;:13::i;:::-;39502:6;:22;;;;:::i;:::-;:41;;39476:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;39344:274;39209:409;39644:1;39634:6;:11;39630:93;;39662:28;39678:4;39684:2;39688:1;39662:15;:28::i;:::-;39705:7;;39630:93;39735:12;39764:19;:25;39784:4;39764:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;39793:19;:23;39813:2;39793:23;;;;;;;;;;;;;;;;;;;;;;;;;39764:52;39760:100;;;39843:5;39833:15;;39760:100;39891:25;:29;39917:2;39891:29;;;;;;;;;;;;;;;;;;;;;;;;;39890:30;:66;;;;;39925:25;:31;39951:4;39925:31;;;;;;;;;;;;;;;;;;;;;;;;;39924:32;39890:66;39872:138;;;39993:5;39983:15;;39872:138;40026:7;40022:391;;;40050:14;40083:25;:29;40109:2;40083:29;;;;;;;;;;;;;;;;;;;;;;;;;40079:223;;;40168:3;40152:12;;40143:6;:21;;;;:::i;:::-;40142:29;;;;:::i;:::-;40133:38;;40079:223;;;40197:25;:31;40223:4;40197:31;;;;;;;;;;;;;;;;;;;;;;;;;40193:109;;;40283:3;40268:11;;40259:6;:20;;;;:::i;:::-;40258:28;;;;:::i;:::-;40249:37;;40193:109;40079:223;40334:6;40325;:15;;;;:::i;:::-;40316:24;;40355:46;40371:4;40377:15;;;;;;;;;;;40394:6;40355:15;:46::i;:::-;40035:378;40022:391;40423:33;40439:4;40445:2;40449:6;40423:15;:33::i;:::-;38960:1504;38847:1617;;;;:::o;25770:211::-;25860:1;25841:21;;:7;:21;;;25837:91;;25913:1;25886:30;;;;;;;;;;;:::i;:::-;;;;;;;;25837:91;25938:35;25946:7;25963:1;25967:5;25938:7;:35::i;:::-;25770:211;;:::o;13657:191::-;13731:16;13750:6;;;;;;;;;;;13731:25;;13776:8;13767:6;;:17;;;;;;;;;;;;;;;;;;13831:8;13800:40;;13821:8;13800:40;;;;;;;;;;;;13720:128;13657:191;:::o;38082:296::-;38228:5;38190:43;;:25;:34;38216:7;38190:34;;;;;;;;;;;;;;;;;;;;;;;;;:43;;;38168:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;38365:5;38328:25;:34;38354:7;38328:34;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;38082:296;;:::o;27515:443::-;27645:1;27628:19;;:5;:19;;;27624:91;;27700:1;27671:32;;;;;;;;;;;:::i;:::-;;;;;;;;27624:91;27748:1;27729:21;;:7;:21;;;27725:92;;27802:1;27774:31;;;;;;;;;;;:::i;:::-;;;;;;;;27725:92;27857:5;27827:11;:18;27839:5;27827:18;;;;;;;;;;;;;;;:27;27846:7;27827:27;;;;;;;;;;;;;;;:35;;;;27877:9;27873:78;;;27924:7;27908:31;;27917:5;27908:31;;;27933:5;27908:31;;;;;;:::i;:::-;;;;;;;;27873:78;27515:443;;;;:::o;23101:316::-;23209:1;23193:18;;:4;:18;;;23189:88;;23262:1;23235:30;;;;;;;;;;;:::i;:::-;;;;;;;;23189:88;23305:1;23291:16;;:2;:16;;;23287:88;;23360:1;23331:32;;;;;;;;;;;:::i;:::-;;;;;;;;23287:88;23385:24;23393:4;23399:2;23403:5;23385:7;:24::i;:::-;23101:316;;;:::o;33559:181::-;33702:30;33716:4;33722:2;33726:5;33702:13;:30::i;:::-;33559:181;;;:::o;29841:147::-;9251:19;:17;:19::i;:::-;29950:30:::1;29964:4;29970:2;29974:5;29950:13;:30::i;:::-;29841:147:::0;;;:::o;23741:1135::-;23847:1;23831:18;;:4;:18;;;23827:552;;23985:5;23969:12;;:21;;;;;;;:::i;:::-;;;;;;;;23827:552;;;24023:19;24045:9;:15;24055:4;24045:15;;;;;;;;;;;;;;;;24023:37;;24093:5;24079:11;:19;24075:117;;;24151:4;24157:11;24170:5;24126:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;24075:117;24347:5;24333:11;:19;24315:9;:15;24325:4;24315:15;;;;;;;;;;;;;;;:37;;;;24008:371;23827:552;24409:1;24395:16;;:2;:16;;;24391:435;;24577:5;24561:12;;:21;;;;;;;;;;;24391:435;;;24794:5;24777:9;:13;24787:2;24777:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;24391:435;24858:2;24843:25;;24852:4;24843:25;;;24862:5;24843:25;;;;;;:::i;:::-;;;;;;;;23741:1135;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:77;1713:7;1742:5;1731:16;;1676:77;;;:::o;1759:122::-;1832:24;1850:5;1832:24;:::i;:::-;1825:5;1822:35;1812:63;;1871:1;1868;1861:12;1812:63;1759:122;:::o;1887:139::-;1933:5;1971:6;1958:20;1949:29;;1987:33;2014:5;1987:33;:::i;:::-;1887:139;;;;:::o;2032:329::-;2091:6;2140:2;2128:9;2119:7;2115:23;2111:32;2108:119;;;2146:79;;:::i;:::-;2108:119;2266:1;2291:53;2336:7;2327:6;2316:9;2312:22;2291:53;:::i;:::-;2281:63;;2237:117;2032:329;;;;:::o;2367:126::-;2404:7;2444:42;2437:5;2433:54;2422:65;;2367:126;;;:::o;2499:96::-;2536:7;2565:24;2583:5;2565:24;:::i;:::-;2554:35;;2499:96;;;:::o;2601:122::-;2674:24;2692:5;2674:24;:::i;:::-;2667:5;2664:35;2654:63;;2713:1;2710;2703:12;2654:63;2601:122;:::o;2729:139::-;2775:5;2813:6;2800:20;2791:29;;2829:33;2856:5;2829:33;:::i;:::-;2729:139;;;;:::o;2874:474::-;2942:6;2950;2999:2;2987:9;2978:7;2974:23;2970:32;2967:119;;;3005:79;;:::i;:::-;2967:119;3125:1;3150:53;3195:7;3186:6;3175:9;3171:22;3150:53;:::i;:::-;3140:63;;3096:117;3252:2;3278:53;3323:7;3314:6;3303:9;3299:22;3278:53;:::i;:::-;3268:63;;3223:118;2874:474;;;;;:::o;3354:90::-;3388:7;3431:5;3424:13;3417:21;3406:32;;3354:90;;;:::o;3450:109::-;3531:21;3546:5;3531:21;:::i;:::-;3526:3;3519:34;3450:109;;:::o;3565:210::-;3652:4;3690:2;3679:9;3675:18;3667:26;;3703:65;3765:1;3754:9;3750:17;3741:6;3703:65;:::i;:::-;3565:210;;;;:::o;3781:118::-;3868:24;3886:5;3868:24;:::i;:::-;3863:3;3856:37;3781:118;;:::o;3905:222::-;3998:4;4036:2;4025:9;4021:18;4013:26;;4049:71;4117:1;4106:9;4102:17;4093:6;4049:71;:::i;:::-;3905:222;;;;:::o;4133:619::-;4210:6;4218;4226;4275:2;4263:9;4254:7;4250:23;4246:32;4243:119;;;4281:79;;:::i;:::-;4243:119;4401:1;4426:53;4471:7;4462:6;4451:9;4447:22;4426:53;:::i;:::-;4416:63;;4372:117;4528:2;4554:53;4599:7;4590:6;4579:9;4575:22;4554:53;:::i;:::-;4544:63;;4499:118;4656:2;4682:53;4727:7;4718:6;4707:9;4703:22;4682:53;:::i;:::-;4672:63;;4627:118;4133:619;;;;;:::o;4758:86::-;4793:7;4833:4;4826:5;4822:16;4811:27;;4758:86;;;:::o;4850:112::-;4933:22;4949:5;4933:22;:::i;:::-;4928:3;4921:35;4850:112;;:::o;4968:214::-;5057:4;5095:2;5084:9;5080:18;5072:26;;5108:67;5172:1;5161:9;5157:17;5148:6;5108:67;:::i;:::-;4968:214;;;;:::o;5188:329::-;5247:6;5296:2;5284:9;5275:7;5271:23;5267:32;5264:119;;;5302:79;;:::i;:::-;5264:119;5422:1;5447:53;5492:7;5483:6;5472:9;5468:22;5447:53;:::i;:::-;5437:63;;5393:117;5188:329;;;;:::o;5523:118::-;5610:24;5628:5;5610:24;:::i;:::-;5605:3;5598:37;5523:118;;:::o;5647:222::-;5740:4;5778:2;5767:9;5763:18;5755:26;;5791:71;5859:1;5848:9;5844:17;5835:6;5791:71;:::i;:::-;5647:222;;;;:::o;5875:474::-;5943:6;5951;6000:2;5988:9;5979:7;5975:23;5971:32;5968:119;;;6006:79;;:::i;:::-;5968:119;6126:1;6151:53;6196:7;6187:6;6176:9;6172:22;6151:53;:::i;:::-;6141:63;;6097:117;6253:2;6279:53;6324:7;6315:6;6304:9;6300:22;6279:53;:::i;:::-;6269:63;;6224:118;5875:474;;;;;:::o;6355:116::-;6425:21;6440:5;6425:21;:::i;:::-;6418:5;6415:32;6405:60;;6461:1;6458;6451:12;6405:60;6355:116;:::o;6477:133::-;6520:5;6558:6;6545:20;6536:29;;6574:30;6598:5;6574:30;:::i;:::-;6477:133;;;;:::o;6616:468::-;6681:6;6689;6738:2;6726:9;6717:7;6713:23;6709:32;6706:119;;;6744:79;;:::i;:::-;6706:119;6864:1;6889:53;6934:7;6925:6;6914:9;6910:22;6889:53;:::i;:::-;6879:63;;6835:117;6991:2;7017:50;7059:7;7050:6;7039:9;7035:22;7017:50;:::i;:::-;7007:60;;6962:115;6616:468;;;;;:::o;7090:474::-;7158:6;7166;7215:2;7203:9;7194:7;7190:23;7186:32;7183:119;;;7221:79;;:::i;:::-;7183:119;7341:1;7366:53;7411:7;7402:6;7391:9;7387:22;7366:53;:::i;:::-;7356:63;;7312:117;7468:2;7494:53;7539:7;7530:6;7519:9;7515:22;7494:53;:::i;:::-;7484:63;;7439:118;7090:474;;;;;:::o;7570:180::-;7618:77;7615:1;7608:88;7715:4;7712:1;7705:15;7739:4;7736:1;7729:15;7756:320;7800:6;7837:1;7831:4;7827:12;7817:22;;7884:1;7878:4;7874:12;7905:18;7895:81;;7961:4;7953:6;7949:17;7939:27;;7895:81;8023:2;8015:6;8012:14;7992:18;7989:38;7986:84;;8042:18;;:::i;:::-;7986:84;7807:269;7756:320;;;:::o;8082:177::-;8222:29;8218:1;8210:6;8206:14;8199:53;8082:177;:::o;8265:366::-;8407:3;8428:67;8492:2;8487:3;8428:67;:::i;:::-;8421:74;;8504:93;8593:3;8504:93;:::i;:::-;8622:2;8617:3;8613:12;8606:19;;8265:366;;;:::o;8637:419::-;8803:4;8841:2;8830:9;8826:18;8818:26;;8890:9;8884:4;8880:20;8876:1;8865:9;8861:17;8854:47;8918:131;9044:4;8918:131;:::i;:::-;8910:139;;8637:419;;;:::o;9062:165::-;9202:17;9198:1;9190:6;9186:14;9179:41;9062:165;:::o;9233:366::-;9375:3;9396:67;9460:2;9455:3;9396:67;:::i;:::-;9389:74;;9472:93;9561:3;9472:93;:::i;:::-;9590:2;9585:3;9581:12;9574:19;;9233:366;;;:::o;9605:419::-;9771:4;9809:2;9798:9;9794:18;9786:26;;9858:9;9852:4;9848:20;9844:1;9833:9;9829:17;9822:47;9886:131;10012:4;9886:131;:::i;:::-;9878:139;;9605:419;;;:::o;10030:168::-;10170:20;10166:1;10158:6;10154:14;10147:44;10030:168;:::o;10204:366::-;10346:3;10367:67;10431:2;10426:3;10367:67;:::i;:::-;10360:74;;10443:93;10532:3;10443:93;:::i;:::-;10561:2;10556:3;10552:12;10545:19;;10204:366;;;:::o;10576:419::-;10742:4;10780:2;10769:9;10765:18;10757:26;;10829:9;10823:4;10819:20;10815:1;10804:9;10800:17;10793:47;10857:131;10983:4;10857:131;:::i;:::-;10849:139;;10576:419;;;:::o;11001:180::-;11049:77;11046:1;11039:88;11146:4;11143:1;11136:15;11170:4;11167:1;11160:15;11187:410;11227:7;11250:20;11268:1;11250:20;:::i;:::-;11245:25;;11284:20;11302:1;11284:20;:::i;:::-;11279:25;;11339:1;11336;11332:9;11361:30;11379:11;11361:30;:::i;:::-;11350:41;;11540:1;11531:7;11527:15;11524:1;11521:22;11501:1;11494:9;11474:83;11451:139;;11570:18;;:::i;:::-;11451:139;11235:362;11187:410;;;;:::o;11603:180::-;11651:77;11648:1;11641:88;11748:4;11745:1;11738:15;11772:4;11769:1;11762:15;11789:185;11829:1;11846:20;11864:1;11846:20;:::i;:::-;11841:25;;11880:20;11898:1;11880:20;:::i;:::-;11875:25;;11919:1;11909:35;;11924:18;;:::i;:::-;11909:35;11966:1;11963;11959:9;11954:14;;11789:185;;;;:::o;11980:176::-;12120:28;12116:1;12108:6;12104:14;12097:52;11980:176;:::o;12162:366::-;12304:3;12325:67;12389:2;12384:3;12325:67;:::i;:::-;12318:74;;12401:93;12490:3;12401:93;:::i;:::-;12519:2;12514:3;12510:12;12503:19;;12162:366;;;:::o;12534:419::-;12700:4;12738:2;12727:9;12723:18;12715:26;;12787:9;12781:4;12777:20;12773:1;12762:9;12758:17;12751:47;12815:131;12941:4;12815:131;:::i;:::-;12807:139;;12534:419;;;:::o;12959:229::-;13099:34;13095:1;13087:6;13083:14;13076:58;13168:12;13163:2;13155:6;13151:15;13144:37;12959:229;:::o;13194:366::-;13336:3;13357:67;13421:2;13416:3;13357:67;:::i;:::-;13350:74;;13433:93;13522:3;13433:93;:::i;:::-;13551:2;13546:3;13542:12;13535:19;;13194:366;;;:::o;13566:419::-;13732:4;13770:2;13759:9;13755:18;13747:26;;13819:9;13813:4;13809:20;13805:1;13794:9;13790:17;13783:47;13847:131;13973:4;13847:131;:::i;:::-;13839:139;;13566:419;;;:::o;13991:168::-;14131:20;14127:1;14119:6;14115:14;14108:44;13991:168;:::o;14165:366::-;14307:3;14328:67;14392:2;14387:3;14328:67;:::i;:::-;14321:74;;14404:93;14493:3;14404:93;:::i;:::-;14522:2;14517:3;14513:12;14506:19;;14165:366;;;:::o;14537:419::-;14703:4;14741:2;14730:9;14726:18;14718:26;;14790:9;14784:4;14780:20;14776:1;14765:9;14761:17;14754:47;14818:131;14944:4;14818:131;:::i;:::-;14810:139;;14537:419;;;:::o;14962:442::-;15111:4;15149:2;15138:9;15134:18;15126:26;;15162:71;15230:1;15219:9;15215:17;15206:6;15162:71;:::i;:::-;15243:72;15311:2;15300:9;15296:18;15287:6;15243:72;:::i;:::-;15325;15393:2;15382:9;15378:18;15369:6;15325:72;:::i;:::-;14962:442;;;;;;:::o;15410:224::-;15550:34;15546:1;15538:6;15534:14;15527:58;15619:7;15614:2;15606:6;15602:15;15595:32;15410:224;:::o;15640:366::-;15782:3;15803:67;15867:2;15862:3;15803:67;:::i;:::-;15796:74;;15879:93;15968:3;15879:93;:::i;:::-;15997:2;15992:3;15988:12;15981:19;;15640:366;;;:::o;16012:419::-;16178:4;16216:2;16205:9;16201:18;16193:26;;16265:9;16259:4;16255:20;16251:1;16240:9;16236:17;16229:47;16293:131;16419:4;16293:131;:::i;:::-;16285:139;;16012:419;;;:::o;16437:222::-;16577:34;16573:1;16565:6;16561:14;16554:58;16646:5;16641:2;16633:6;16629:15;16622:30;16437:222;:::o;16665:366::-;16807:3;16828:67;16892:2;16887:3;16828:67;:::i;:::-;16821:74;;16904:93;16993:3;16904:93;:::i;:::-;17022:2;17017:3;17013:12;17006:19;;16665:366;;;:::o;17037:419::-;17203:4;17241:2;17230:9;17226:18;17218:26;;17290:9;17284:4;17280:20;17276:1;17265:9;17261:17;17254:47;17318:131;17444:4;17318:131;:::i;:::-;17310:139;;17037:419;;;:::o;17462:166::-;17602:18;17598:1;17590:6;17586:14;17579:42;17462:166;:::o;17634:366::-;17776:3;17797:67;17861:2;17856:3;17797:67;:::i;:::-;17790:74;;17873:93;17962:3;17873:93;:::i;:::-;17991:2;17986:3;17982:12;17975:19;;17634:366;;;:::o;18006:419::-;18172:4;18210:2;18199:9;18195:18;18187:26;;18259:9;18253:4;18249:20;18245:1;18234:9;18230:17;18223:47;18287:131;18413:4;18287:131;:::i;:::-;18279:139;;18006:419;;;:::o;18431:181::-;18571:33;18567:1;18559:6;18555:14;18548:57;18431:181;:::o;18618:366::-;18760:3;18781:67;18845:2;18840:3;18781:67;:::i;:::-;18774:74;;18857:93;18946:3;18857:93;:::i;:::-;18975:2;18970:3;18966:12;18959:19;;18618:366;;;:::o;18990:419::-;19156:4;19194:2;19183:9;19179:18;19171:26;;19243:9;19237:4;19233:20;19229:1;19218:9;19214:17;19207:47;19271:131;19397:4;19271:131;:::i;:::-;19263:139;;18990:419;;;:::o;19415:180::-;19555:32;19551:1;19543:6;19539:14;19532:56;19415:180;:::o;19601:366::-;19743:3;19764:67;19828:2;19823:3;19764:67;:::i;:::-;19757:74;;19840:93;19929:3;19840:93;:::i;:::-;19958:2;19953:3;19949:12;19942:19;;19601:366;;;:::o;19973:419::-;20139:4;20177:2;20166:9;20162:18;20154:26;;20226:9;20220:4;20216:20;20212:1;20201:9;20197:17;20190:47;20254:131;20380:4;20254:131;:::i;:::-;20246:139;;19973:419;;;:::o;20398:191::-;20438:3;20457:20;20475:1;20457:20;:::i;:::-;20452:25;;20491:20;20509:1;20491:20;:::i;:::-;20486:25;;20534:1;20531;20527:9;20520:16;;20555:3;20552:1;20549:10;20546:36;;;20562:18;;:::i;:::-;20546:36;20398:191;;;;:::o;20595:177::-;20735:29;20731:1;20723:6;20719:14;20712:53;20595:177;:::o;20778:366::-;20920:3;20941:67;21005:2;21000:3;20941:67;:::i;:::-;20934:74;;21017:93;21106:3;21017:93;:::i;:::-;21135:2;21130:3;21126:12;21119:19;;20778:366;;;:::o;21150:419::-;21316:4;21354:2;21343:9;21339:18;21331:26;;21403:9;21397:4;21393:20;21389:1;21378:9;21374:17;21367:47;21431:131;21557:4;21431:131;:::i;:::-;21423:139;;21150:419;;;:::o;21575:194::-;21615:4;21635:20;21653:1;21635:20;:::i;:::-;21630:25;;21669:20;21687:1;21669:20;:::i;:::-;21664:25;;21713:1;21710;21706:9;21698:17;;21737:1;21731:4;21728:11;21725:37;;;21742:18;;:::i;:::-;21725:37;21575:194;;;;:::o;21775:243::-;21915:34;21911:1;21903:6;21899:14;21892:58;21984:26;21979:2;21971:6;21967:15;21960:51;21775:243;:::o;22024:366::-;22166:3;22187:67;22251:2;22246:3;22187:67;:::i;:::-;22180:74;;22263:93;22352:3;22263:93;:::i;:::-;22381:2;22376:3;22372:12;22365:19;;22024:366;;;:::o;22396:419::-;22562:4;22600:2;22589:9;22585:18;22577:26;;22649:9;22643:4;22639:20;22635:1;22624:9;22620:17;22613:47;22677:131;22803:4;22677:131;:::i;:::-;22669:139;;22396:419;;;:::o

Swarm Source

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