BNB Price: $633.67 (+0.77%)
 

Overview

Max Total Supply

21,000,000ZIMOMO

Holders

39,586

Market

Price

$0.00 @ 0.000000 BNB

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.0001 ZIMOMO

Value
$0.00
0xb952097f0ab35d0d20423ba93d455792c2ff44a5
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
ZIMOMOToken

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at BscScan.com on 2025-11-15
*/

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


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

pragma solidity >=0.4.16;

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

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

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

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

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

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

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

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

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


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

pragma solidity >=0.6.2;


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

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

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

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


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

pragma solidity ^0.8.20;

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

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

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

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


// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol)
pragma solidity >=0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v5.4.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 ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

    /// @inheritdoc IERC20
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /// @inheritdoc IERC20
    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;
    }

    /// @inheritdoc IERC20
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

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

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

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

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

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

        emit Transfer(from, to, value);
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.20;



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

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

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


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

pragma solidity ^0.8.20;


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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

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

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

    uint256 private _status;

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

    constructor() {
        _status = NOT_ENTERED;
    }

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

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

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

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

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

// File: contracts/ZIMOMOToken.sol


pragma solidity ^0.8.20;






interface IPancakePair {
  
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function sync() external;

    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
 
}

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

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

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


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

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


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

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

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

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

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

/**
 * @title ZIMOMO Token
 */
contract ZIMOMOToken is ERC20, ERC20Burnable, Ownable, ReentrancyGuard {

    // 代币精度(小数位数)
    uint8 private _decimals;
    
    // 最大供应量
    uint256 public maxSupply;
    
    address public swapPair; 

    address public constant BLACK_ADDRESS = address(0xdEaD);
    address public constant bnbTokenAddress = 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c;
    address public constant usdtTokenAddress = 0x55d398326f99059fF775485246999027B3197955;
    address public constant routerContractAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E;
    address public constant labubuAddress = 0x7109cb91f05E567E4164cd0bA692033198f39B2A;
    IPancakeRouter02 public pancakeRouter = IPancakeRouter02(routerContractAddress);

    // 卖出税 10%
    uint256 public constant SELL_TAX_PERCENT = 1000;
    // 买入税 100%
    uint256 public constant BUY_TAX_PERCENT = 10000;
    uint256 public constant BASE_PERCENT = 10000;

    address private foundationAddress;
    address private distributorAddress;


    struct PricePoint {
        uint256 hourStart;    // unix timestamp at hour start (e.g. block.timestamp / 3600 * 3600)
        uint256 lowPrice;     // lowest price (scaled by 1e18) observed within that hour
        uint256 startPrice;
    }
    uint8 public constant WINDOW = 6; // 4 * 6 = 24 hours window
    uint256 public constant WINDOW_TIME = 14400; // 4 hours

    uint256 public constant COOLDOWN = 1 days;

    // ring buffer of last 24 hourly lows
    PricePoint[WINDOW] public hourlyPrices;
    uint8 public priceHead;
    uint256 public lastPriceHourStart;    
    uint256 public lastBurnSwapPairTime;
    uint256 public burnSwapPairStartTime;
    uint256 public distributeRate = 2000;

    // switch
    bool public isUpdateHourlyLow = true; 
    bool public isBurnSwapPair = false;

    address public origin = 0x63f60c78c8F5b0a044d303e98042265a4Fc9317B;
    mapping(address => bool) public isTaxExempt; // 免税地址
   
    constructor() ERC20("ZIMOMO", "ZIMOMO") Ownable(origin) ReentrancyGuard() {
        _decimals = 18;
        maxSupply = 21000000 * 10 ** _decimals;
        
        // 铸造初始供应量给合约部署者
        _mint(origin, maxSupply);

        // 设置swapPair为流动性池
        // swapPair = IPancakeFactory(
        //     pancakeRouter.factory()
        // ).createPair(address(this), labubuAddress);
        isTaxExempt[address(this)] = true;
        isTaxExempt[origin] = true;
        isTaxExempt[BLACK_ADDRESS] = true;
    }
    
    /**
     * @dev 返回代币小数位数
     */
    function decimals() public view virtual override returns (uint8) {
        return _decimals;
    }
    

    
    function approveToken(address token, address spender, uint256 amount) public onlyOwner nonReentrant {
        ERC20(token).approve(spender, amount);
    }
    
    receive() external payable {
        if(isUpdateHourlyLow) {
            updateHourlyLow();
        }
        payable(msg.sender).transfer(msg.value);
    }

    function _update(address from, address to, uint256 value)
        internal
        override(ERC20)
    {

        if(from != address(0) && isUpdateHourlyLow && !isTaxExempt[from] && !isTaxExempt[to]) {
            updateHourlyLow();
        }
        if(from != address(0) && swapPair != address(0) && from == swapPair && to != swapPair && !isTaxExempt[to]) { 
            super._update(from, BLACK_ADDRESS, value);
            value = 0;
        } else if(from != address(0) && swapPair != address(0) && to == swapPair && from != swapPair && !isTaxExempt[from]) { // 到流动性池卖出

            uint256 taxAmount = value * SELL_TAX_PERCENT / BASE_PERCENT;
            uint256 halfValue = taxAmount / 2;
            super._update(from, BLACK_ADDRESS, halfValue);
            super._update(from, foundationAddress, taxAmount - halfValue);
            // coin tax
            if(isUpdateHourlyLow) {
                (uint256 percent, uint8 position) = percentChangeFrom24hLowest();
                if(position > 0) {
                    uint256 taxAmount2 = value * percent * 2 / BASE_PERCENT;
                    if(taxAmount2 + taxAmount > value) {
                        taxAmount2 = value - taxAmount;
                    }
                    super._update(from, BLACK_ADDRESS, taxAmount2);
                    value -= taxAmount2;
                }
            }
            value -= taxAmount;
        }
        super._update(from, to, value);
    }

    function taxExemptBatch(address[] calldata addrs, bool taxExempt) external onlyOwner {
        for (uint256 i = 0; i < addrs.length; i++) {
            isTaxExempt[addrs[i]] = taxExempt;
        }
    }

    event BurnSwapPair(uint256 amount, uint256 time, uint256 distributeRate);

    function burnSwapPair() external nonReentrant {
        require(isBurnSwapPair, "not allowed");
        require(block.timestamp - lastBurnSwapPairTime > COOLDOWN, "not allowed");

        lastBurnSwapPairTime = block.timestamp / COOLDOWN * COOLDOWN;
        uint256 balance = balanceOf(swapPair);
        require(balance > 0, "no liquidity");
        uint256 r = 200;
        if(balance > 4000000 * 1e18) {
            r = 200;
        } else if(balance > 2000000 * 1e18) {
            r = 180;
        } else if(balance > 1000000 * 1e18) {
            r = 160;
        } else if(balance > 500000 * 1e18) {
            r = 140;
        } else if(balance > 250000 * 1e18) {
            r = 120;
        } else {
            r = 100;
        }
        balance = balance * r / BASE_PERCENT;
        uint256 shareRate = distributeRate;
        if(shareRate > 8000) {
            shareRate = 8000;
        } else {
            distributeRate = distributeRate * 10050 / BASE_PERCENT;
        }
        uint256 distributeBalance = shareRate * balance / BASE_PERCENT;
        uint256 burnBalance = balance - distributeBalance;
        super._update(swapPair, BLACK_ADDRESS, burnBalance);
        super._update(swapPair, distributorAddress, distributeBalance);
        IPancakePair(swapPair).sync();
        emit BurnSwapPair(balance, lastBurnSwapPairTime, shareRate);
    }

    // ========== Internal helpers ==========
    function _hour4Start(uint256 ts) internal pure returns (uint256) {
        return (ts / WINDOW_TIME) * WINDOW_TIME;
    }

    function getTokenPriceUsdt() public view returns (uint256) {
        uint256 bnbPrice = getCurrentPrice(bnbTokenAddress, usdtTokenAddress);
        uint256 labubuPrice = getCurrentPrice(labubuAddress, bnbTokenAddress);
        uint256 thisPrice = getCurrentPrice(address(this), labubuAddress);
        return bnbPrice * labubuPrice / 1e18 * thisPrice / 1e18;
    }
    function getCurrentPrice(address tokenA, address tokenB) public view returns (uint256) {
        address pair = IPancakeFactory(pancakeRouter.factory()).getPair(tokenA, tokenB);
        (uint112 r0, uint112 r1,) = IPancakePair(pair).getReserves();
        if(r0 == 0 || r1 == 0) {
            return 0;
        }

        address t0 = IPancakePair(pair).token0();
        if (tokenA == t0) {
            return (uint256(r1) * 1e18) / uint256(r0);
        } else {
            return (uint256(r0) * 1e18) / uint256(r1);
        }
    }

    // events
    event HourlyLowUpdated(uint256 indexed hourStart, uint8 indexed slotIndex, uint256 newLowPrice, bool isNewHour);


    // ========== External: update lowest price ==========
    /// @notice Update the current hour low price from DEX reserves.
    /// - If within same hour: update stored low if current price < stored low.
    /// - If new hour: advance ring buffer (possibly multiple hours) and init new slot with current price.
    function updateHourlyLow() public nonReentrant {
        uint256 currentPrice = getTokenPriceUsdt();

        uint256 curHour = _hour4Start(block.timestamp);

        if (curHour == lastPriceHourStart) {
            // same hour: update low if lower
            if (currentPrice < hourlyPrices[priceHead].lowPrice) {
                hourlyPrices[priceHead].lowPrice = currentPrice;
                emit HourlyLowUpdated(curHour, priceHead, currentPrice, false);
            }
        } else if (curHour > lastPriceHourStart) {
            // now set current hour slot
            priceHead = uint8((uint256(priceHead) + 1) % WINDOW);
            hourlyPrices[priceHead].hourStart = curHour;
            hourlyPrices[priceHead].lowPrice = currentPrice;
            hourlyPrices[priceHead].startPrice = currentPrice;
            lastPriceHourStart = curHour;
            emit HourlyLowUpdated(curHour, priceHead, currentPrice, true);
        } else {
            // block.timestamp moved backwards? should not happen
            revert("time regression");
        }
    }

    // ========== Views ==========
    /// @notice Get raw hourly price point at slot index (0..23)
    /// slot 0..23 corresponds to internal ring buffer index; caller can inspect timestamps
    function getHourlySlot(uint8 idx) external view returns (uint256 hourStart, uint256 lowPrice, uint256 startPrice) {
        require(idx < WINDOW, "idx out");
        PricePoint memory p = hourlyPrices[idx];
        return (p.hourStart, p.lowPrice, p.startPrice);
    }

    /// @notice Get lowest price observed in the last 24 hours (scanned from buffer, ignoring empty slots)
    function get24hLowest() public view returns (uint256 lowest, uint256 count) {
        lowest = type(uint256).max;
        uint256 cutoff = _hour4Start(block.timestamp) - (WINDOW - 1) * WINDOW_TIME; // earliest hour included
        count = 0;
        for (uint8 i = 0; i < WINDOW; i++) {
            if (hourlyPrices[i].startPrice > 0 && hourlyPrices[i].hourStart >= cutoff) {
                count++;
                if (hourlyPrices[i].lowPrice < lowest) {
                    lowest = hourlyPrices[i].lowPrice;
                }
            }
        }
        if (count == 0) {
            // no data
            return (0, 0);
        }
        return (lowest, count);
    }

    /// @notice Get current price and also percent change from 24h lowest (scaled by 1e18; positive=1 means lowest < start)
    function percentChangeFrom24hLowest() public view returns (uint256 pctScaled, uint8 position) {
        pctScaled = 0;
        position = 0;
        uint256 lowest = type(uint256).max;
        uint256 cutoff = _hour4Start(block.timestamp) - (WINDOW - 1) * WINDOW_TIME; // earliest hour included
        uint256 count = 0;
        uint256 startPrice = 0;
        uint256 startTime = block.timestamp + 1;
        
        for (uint8 i = 0; i < WINDOW; i++) {
            if (hourlyPrices[i].startPrice > 0 && hourlyPrices[i].hourStart >= cutoff) {
                count++;
                if (hourlyPrices[i].lowPrice < lowest) {
                    lowest = hourlyPrices[i].lowPrice;
                }
                if(hourlyPrices[i].hourStart < startTime) {
                    startPrice = hourlyPrices[i].startPrice;
                    startTime = hourlyPrices[i].hourStart;
                }
            }
        }
        if (count > 0 && startPrice > 0) {
            if(lowest >= startPrice) {
                position = 0;
                pctScaled = (lowest - startPrice) * BASE_PERCENT / startPrice;
            } else {
                position = 1;
                pctScaled = (startPrice - lowest) * BASE_PERCENT / startPrice;
            }
        }
        return (pctScaled, position);
    }

    // convenience: get current hour's low (if any)
    function getCurrentHourLow() external view returns (uint256 hourStart, uint256 lowPrice, uint256 startPrice) {
        PricePoint memory p = hourlyPrices[priceHead];
        return (p.hourStart, p.lowPrice, p.startPrice);
    }

    function setSwapPair(address _swapPair) external onlyOwner {
        swapPair = _swapPair;
        _approve(address(this), address(pancakeRouter), type(uint256).max);
    }

    function setIsUpdateHourlyLow(bool _isUpdateHourlyLow) external onlyOwner {
        isUpdateHourlyLow = _isUpdateHourlyLow;
    }

    function setFoundationAddress(address _foundationAddress, address _distributorAddress) external onlyOwner {
        foundationAddress = _foundationAddress;
        isTaxExempt[foundationAddress] = true;
        distributorAddress = _distributorAddress;
        isTaxExempt[distributorAddress] = true;
    }

    function setIsBurnSwapPair(bool _isBurnSwapPair) external onlyOwner {
        isBurnSwapPair = _isBurnSwapPair;
        if(_isBurnSwapPair) {
            lastBurnSwapPairTime = block.timestamp / COOLDOWN * COOLDOWN;
            burnSwapPairStartTime = lastBurnSwapPairTime;
        }
    }
}

Contract Security Audit

Contract ABI

API
[{"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":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"distributeRate","type":"uint256"}],"name":"BurnSwapPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"hourStart","type":"uint256"},{"indexed":true,"internalType":"uint8","name":"slotIndex","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"newLowPrice","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isNewHour","type":"bool"}],"name":"HourlyLowUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BASE_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLACK_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BUY_TAX_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COOLDOWN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SELL_TAX_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WINDOW","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WINDOW_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approveToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bnbTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnSwapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnSwapPairStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get24hLowest","outputs":[{"internalType":"uint256","name":"lowest","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentHourLow","outputs":[{"internalType":"uint256","name":"hourStart","type":"uint256"},{"internalType":"uint256","name":"lowPrice","type":"uint256"},{"internalType":"uint256","name":"startPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"idx","type":"uint8"}],"name":"getHourlySlot","outputs":[{"internalType":"uint256","name":"hourStart","type":"uint256"},{"internalType":"uint256","name":"lowPrice","type":"uint256"},{"internalType":"uint256","name":"startPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPriceUsdt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hourlyPrices","outputs":[{"internalType":"uint256","name":"hourStart","type":"uint256"},{"internalType":"uint256","name":"lowPrice","type":"uint256"},{"internalType":"uint256","name":"startPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBurnSwapPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTaxExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isUpdateHourlyLow","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"labubuAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBurnSwapPairTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPriceHourStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","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":"origin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pancakeRouter","outputs":[{"internalType":"contract IPancakeRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentChangeFrom24hLowest","outputs":[{"internalType":"uint256","name":"pctScaled","type":"uint256"},{"internalType":"uint8","name":"position","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceHead","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"routerContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_foundationAddress","type":"address"},{"internalType":"address","name":"_distributorAddress","type":"address"}],"name":"setFoundationAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isBurnSwapPair","type":"bool"}],"name":"setIsBurnSwapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isUpdateHourlyLow","type":"bool"}],"name":"setIsUpdateHourlyLow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapPair","type":"address"}],"name":"setSwapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"bool","name":"taxExempt","type":"bool"}],"name":"taxExemptBatch","outputs":[],"stateMutability":"nonpayable","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":[],"name":"updateHourlyLow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdtTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040527310ed43c718714eb63d5aa57b78b54704e256024e600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506107d0602355600160245f6101000a81548160ff0219169083151502179055505f602460016101000a81548160ff0219169083151502179055507363f60c78c8f5b0a044d303e98042265a4fc9317b602460026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000f3575f80fd5b50602460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600681526020017f5a494d4f4d4f00000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f5a494d4f4d4f00000000000000000000000000000000000000000000000000008152508160039081620001949190620018e7565b508060049081620001a69190620018e7565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200021c575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040162000213919062001a0e565b60405180910390fd5b6200022d81620003e460201b60201c565b506001600681905550601260075f6101000a81548160ff021916908360ff16021790555060075f9054906101000a900460ff16600a6200026e919062001bb2565b6301406f406200027f919062001c02565b600881905550620002bb602460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600854620004a760201b60201c565b600160255f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160255f602460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160255f61dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550620020a8565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200051a575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040162000511919062001a0e565b60405180910390fd5b6200052d5f83836200053160201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801562000579575060245f9054906101000a900460ff165b8015620005cd575060255f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801562000621575060255f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1562000638576200063762000af060201b60201c565b5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015620006c257505f73ffffffffffffffffffffffffffffffffffffffff1660095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156200071b575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b801562000775575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015620007c9575060255f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15620007ed57620007e48361dead8362000d9060201b60201c565b5f905062000ad8565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156200087757505f73ffffffffffffffffffffffffffffffffffffffff1660095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015620008d0575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80156200092a575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b80156200097e575060255f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1562000ad7575f6127106103e88362000998919062001c02565b620009a4919062001c79565b90505f600282620009b6919062001c79565b9050620009cd8561dead8362000d9060201b60201c565b62000a0e85600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838562000a02919062001cb0565b62000d9060201b60201c565b60245f9054906101000a900460ff161562000ac4575f8062000a3562000fb460201b60201c565b915091505f8160ff16111562000ac1575f6127106002848862000a59919062001c02565b62000a65919062001c02565b62000a71919062001c79565b905085858262000a82919062001cea565b111562000a9a57848662000a97919062001cb0565b90505b62000aaf8861dead8362000d9060201b60201c565b808662000abd919062001cb0565b9550505b50505b818362000ad2919062001cb0565b925050505b5b62000aeb83838362000d9060201b60201c565b505050565b62000b006200120c60201b60201c565b5f62000b116200125360201b60201c565b90505f62000b25426200134460201b60201c565b9050602054810362000bf257600d601f5f9054906101000a900460ff1660ff166006811062000b595762000b5862001d24565b5b600302016001015482101562000bec5781600d601f5f9054906101000a900460ff1660ff166006811062000b925762000b9162001d24565b5b6003020160010181905550601f5f9054906101000a900460ff1660ff16817f596c6d2faf82b7d466ea30c5fa59549ac24bde283bd718630cc88b70f8586bce845f60405162000be392919062001d7e565b60405180910390a35b62000d7c565b60205481111562000d3e57600660ff166001601f5f9054906101000a900460ff1660ff1662000c22919062001cea565b62000c2e919062001da9565b601f5f6101000a81548160ff021916908360ff16021790555080600d601f5f9054906101000a900460ff1660ff166006811062000c705762000c6f62001d24565b5b600302015f018190555081600d601f5f9054906101000a900460ff1660ff166006811062000ca35762000ca262001d24565b5b600302016001018190555081600d601f5f9054906101000a900460ff1660ff166006811062000cd75762000cd662001d24565b5b600302016002018190555080602081905550601f5f9054906101000a900460ff1660ff16817f596c6d2faf82b7d466ea30c5fa59549ac24bde283bd718630cc88b70f8586bce84600160405162000d3092919062001d7e565b60405180910390a362000d7b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d729062001e3e565b60405180910390fd5b5b505062000d8e6200136960201b60201c565b565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000de4578060025f82825462000dd7919062001cea565b9250508190555062000eb5565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101562000e70578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040162000e679392919062001e5e565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000efe578060025f828254039250508190555062000f48565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000fa7919062001e99565b60405180910390a3505050565b5f805f91505f90505f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90505f6138406001600662000ff4919062001eb4565b60ff1662001003919062001c02565b62001014426200134460201b60201c565b62001020919062001cb0565b90505f805f60014262001034919062001cea565b90505f5b600660ff168160ff1610156200117e575f600d8260ff166006811062001063576200106262001d24565b5b600302016002015411801562001099575084600d8260ff16600681106200108f576200108e62001d24565b5b600302015f015410155b1562001170578380620010ac9062001eef565b94505085600d8260ff1660068110620010ca57620010c962001d24565b5b60030201600101541015620010fe57600d8160ff1660068110620010f357620010f262001d24565b5b600302016001015495505b81600d8260ff166006811062001119576200111862001d24565b5b600302015f015410156200116f57600d8160ff166006811062001141576200114062001d24565b5b60030201600201549250600d8160ff166006811062001165576200116462001d24565b5b600302015f015491505b5b808060010191505062001038565b505f831180156200118e57505f82115b156200120357818510620011d1575f9550816127108387620011b1919062001cb0565b620011bd919062001c02565b620011c9919062001c79565b965062001202565b60019550816127108684620011e7919062001cb0565b620011f3919062001c02565b620011ff919062001c79565b96505b5b50505050509091565b60026006540362001249576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600681905550565b5f806200128f73bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c7355d398326f99059ff775485246999027b31979556200137360201b60201c565b90505f620012cc737109cb91f05e567e4164cd0ba692033198f39b2a73bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c6200137360201b60201c565b90505f620012f530737109cb91f05e567e4164cd0ba692033198f39b2a6200137360201b60201c565b9050670de0b6b3a764000081670de0b6b3a7640000848662001318919062001c02565b62001324919062001c79565b62001330919062001c02565b6200133c919062001c79565b935050505090565b5f613840808362001356919062001c79565b62001362919062001c02565b9050919050565b6001600681905550565b5f80600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620013e0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001406919062001f6e565b73ffffffffffffffffffffffffffffffffffffffff1663e6a4390585856040518363ffffffff1660e01b81526004016200144292919062001f9e565b602060405180830381865afa1580156200145e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001484919062001f6e565b90505f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015620014d2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620014f891906200204f565b50915091505f826dffffffffffffffffffffffffffff1614806200152b57505f816dffffffffffffffffffffffffffff16145b156200153d575f93505050506200167d565b5f8373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001588573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620015ae919062001f6e565b90508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036200163357826dffffffffffffffffffffffffffff16670de0b6b3a7640000836dffffffffffffffffffffffffffff166200161b919062001c02565b62001627919062001c79565b9450505050506200167d565b816dffffffffffffffffffffffffffff16670de0b6b3a7640000846dffffffffffffffffffffffffffff166200166a919062001c02565b62001676919062001c79565b9450505050505b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620016ff57607f821691505b602082108103620017155762001714620016ba565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620017797fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200173c565b6200178586836200173c565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620017cf620017c9620017c3846200179d565b620017a6565b6200179d565b9050919050565b5f819050919050565b620017ea83620017af565b62001802620017f982620017d6565b84845462001748565b825550505050565b5f90565b620018186200180a565b62001825818484620017df565b505050565b5b818110156200184c57620018405f826200180e565b6001810190506200182b565b5050565b601f8211156200189b5762001865816200171b565b62001870846200172d565b8101602085101562001880578190505b620018986200188f856200172d565b8301826200182a565b50505b505050565b5f82821c905092915050565b5f620018bd5f1984600802620018a0565b1980831691505092915050565b5f620018d78383620018ac565b9150826002028217905092915050565b620018f28262001683565b67ffffffffffffffff8111156200190e576200190d6200168d565b5b6200191a8254620016e7565b6200192782828562001850565b5f60209050601f8311600181146200195d575f841562001948578287015190505b620019548582620018ca565b865550620019c3565b601f1984166200196d866200171b565b5f5b8281101562001996578489015182556001820191506020850194506020810190506200196f565b86831015620019b65784890151620019b2601f891682620018ac565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620019f682620019cb565b9050919050565b62001a0881620019ea565b82525050565b5f60208201905062001a235f830184620019fd565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111562001ab35780860481111562001a8b5762001a8a62001a29565b5b600185161562001a9b5780820291505b808102905062001aab8562001a56565b945062001a6b565b94509492505050565b5f8262001acd576001905062001b9f565b8162001adc575f905062001b9f565b816001811462001af5576002811462001b005762001b36565b600191505062001b9f565b60ff84111562001b155762001b1462001a29565b5b8360020a91508482111562001b2f5762001b2e62001a29565b5b5062001b9f565b5060208310610133831016604e8410600b841016171562001b705782820a90508381111562001b6a5762001b6962001a29565b5b62001b9f565b62001b7f848484600162001a62565b9250905081840481111562001b995762001b9862001a29565b5b81810290505b9392505050565b5f60ff82169050919050565b5f62001bbe826200179d565b915062001bcb8362001ba6565b925062001bfa7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462001abc565b905092915050565b5f62001c0e826200179d565b915062001c1b836200179d565b925082820262001c2b816200179d565b9150828204841483151762001c455762001c4462001a29565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f62001c85826200179d565b915062001c92836200179d565b92508262001ca55762001ca462001c4c565b5b828204905092915050565b5f62001cbc826200179d565b915062001cc9836200179d565b925082820390508181111562001ce45762001ce362001a29565b5b92915050565b5f62001cf6826200179d565b915062001d03836200179d565b925082820190508082111562001d1e5762001d1d62001a29565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b62001d5c816200179d565b82525050565b5f8115159050919050565b62001d788162001d62565b82525050565b5f60408201905062001d935f83018562001d51565b62001da2602083018462001d6d565b9392505050565b5f62001db5826200179d565b915062001dc2836200179d565b92508262001dd55762001dd462001c4c565b5b828206905092915050565b5f82825260208201905092915050565b7f74696d652072656772657373696f6e00000000000000000000000000000000005f82015250565b5f62001e26600f8362001de0565b915062001e338262001df0565b602082019050919050565b5f6020820190508181035f83015262001e578162001e18565b9050919050565b5f60608201905062001e735f830186620019fd565b62001e82602083018562001d51565b62001e91604083018462001d51565b949350505050565b5f60208201905062001eae5f83018462001d51565b92915050565b5f62001ec08262001ba6565b915062001ecd8362001ba6565b9250828203905060ff81111562001ee95762001ee862001a29565b5b92915050565b5f62001efb826200179d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362001f305762001f2f62001a29565b5b600182019050919050565b5f80fd5b62001f4a81620019ea565b811462001f55575f80fd5b50565b5f8151905062001f688162001f3f565b92915050565b5f6020828403121562001f865762001f8562001f3b565b5b5f62001f958482850162001f58565b91505092915050565b5f60408201905062001fb35f830185620019fd565b62001fc26020830184620019fd565b9392505050565b5f6dffffffffffffffffffffffffffff82169050919050565b62001fed8162001fc9565b811462001ff8575f80fd5b50565b5f815190506200200b8162001fe2565b92915050565b5f63ffffffff82169050919050565b6200202b8162002011565b811462002036575f80fd5b50565b5f81519050620020498162002020565b92915050565b5f805f6060848603121562002069576200206862001f3b565b5b5f620020788682870162001ffb565b93505060206200208b8682870162001ffb565b92505060406200209e8682870162002039565b9150509250925092565b613c0d80620020b65f395ff3fe608060405260043610610301575f3560e01c8063938b5f321161018f578063bf6c1dc2116100db578063dd62ed3e11610094578063f46632351161006e578063f466323514610baa578063f73bc05314610bd4578063f7daa2ee14610bfe578063fd7bcccd14610c2857610368565b8063dd62ed3e14610b1c578063ec6dc32014610b58578063f2fde38b14610b8257610368565b8063bf6c1dc214610a0f578063c21ebd0714610a3a578063c80d2b5e14610a64578063d5abeb0114610a8e578063da3e339714610ab8578063db16a55514610ae057610368565b8063a9059cbb11610148578063b3b640df11610122578063b3b640df1461097b578063b416d1a3146109a5578063b8865cc0146109cf578063ba3d838f146109f957610368565b8063a9059cbb146108eb578063adde0a0d14610927578063ae503a941461095157610368565b8063938b5f32146107db57806395d89b41146108055780639687383d1461082f5780639d741e5d1461086d578063a2724a4d14610897578063a53e5412146108c157610368565b806362902ac71161024e578063715018a61161020757806379cc6790116101e157806379cc6790146107355780638ce8e9d71461075d5780638da5cb5b146107875780638e1234a6146107b157610368565b8063715018a6146106cf578063717d2376146106e557806373a432bb1461070d57610368565b806362902ac7146105ad57806362f3765e146105d75780636e0c9f0a146106015780636ebbc1151461063f5780636edc03e81461066b57806370a082311461069357610368565b80631fece980116102bb5780632ec2d910116102955780632ec2d91014610506578063313ce5671461053057806342966c681461055a578063568b57fe1461058257610368565b80631fece9801461048a57806323b872dd146104a057806326991cc8146104dc57610368565b8062dc41fb1461036c57806306fdde0314610394578063095ea7b3146103be57806316c2be6b146103fa57806318160ddd146104365780631d9a15281461046057610368565b366103685760245f9054906101000a900460ff161561032357610322610c50565b5b3373ffffffffffffffffffffffffffffffffffffffff166108fc3490811502906040515f60405180830381858888f19350505050158015610366573d5f803e3d5ffd5b005b5f80fd5b348015610377575f80fd5b50610392600480360381019061038d9190613104565b610eb2565b005b34801561039f575f80fd5b506103a8610f55565b6040516103b591906131eb565b60405180910390f35b3480156103c9575f80fd5b506103e460048036038101906103df9190613298565b610fe5565b6040516103f191906132e5565b60405180910390f35b348015610405575f80fd5b50610420600480360381019061041b91906132fe565b611007565b60405161042d91906132e5565b60405180910390f35b348015610441575f80fd5b5061044a611024565b6040516104579190613338565b60405180910390f35b34801561046b575f80fd5b5061047461102d565b6040516104819190613338565b60405180910390f35b348015610495575f80fd5b5061049e610c50565b005b3480156104ab575f80fd5b506104c660048036038101906104c19190613351565b611033565b6040516104d391906132e5565b60405180910390f35b3480156104e7575f80fd5b506104f0611061565b6040516104fd91906133b0565b60405180910390f35b348015610511575f80fd5b5061051a611086565b6040516105279190613338565b60405180910390f35b34801561053b575f80fd5b5061054461108c565b60405161055191906133e4565b60405180910390f35b348015610565575f80fd5b50610580600480360381019061057b91906133fd565b6110a1565b005b34801561058d575f80fd5b506105966110b5565b6040516105a4929190613428565b60405180910390f35b3480156105b8575f80fd5b506105c16111ef565b6040516105ce9190613338565b60405180910390f35b3480156105e2575f80fd5b506105eb6111f5565b6040516105f89190613338565b60405180910390f35b34801561060c575f80fd5b50610627600480360381019061062291906133fd565b6111fb565b6040516106369392919061344f565b60405180910390f35b34801561064a575f80fd5b50610653611228565b6040516106629392919061344f565b60405180910390f35b348015610676575f80fd5b50610691600480360381019061068c9190613484565b611299565b005b34801561069e575f80fd5b506106b960048036038101906106b491906132fe565b6112ee565b6040516106c69190613338565b60405180910390f35b3480156106da575f80fd5b506106e3611333565b005b3480156106f0575f80fd5b5061070b600480360381019061070691906134af565b611346565b005b348015610718575f80fd5b50610733600480360381019061072e91906132fe565b6114be565b005b348015610740575f80fd5b5061075b60048036038101906107569190613298565b611555565b005b348015610768575f80fd5b50610771611575565b60405161077e9190613338565b60405180910390f35b348015610792575f80fd5b5061079b61157b565b6040516107a891906133b0565b60405180910390f35b3480156107bc575f80fd5b506107c56115a3565b6040516107d29190613338565b60405180910390f35b3480156107e6575f80fd5b506107ef6115a9565b6040516107fc91906133b0565b60405180910390f35b348015610810575f80fd5b506108196115cf565b60405161082691906131eb565b60405180910390f35b34801561083a575f80fd5b5061085560048036038101906108509190613517565b61165f565b6040516108649392919061344f565b60405180910390f35b348015610878575f80fd5b5061088161170d565b60405161088e91906133b0565b60405180910390f35b3480156108a2575f80fd5b506108ab611725565b6040516108b89190613338565b60405180910390f35b3480156108cc575f80fd5b506108d561172c565b6040516108e291906133e4565b60405180910390f35b3480156108f6575f80fd5b50610911600480360381019061090c9190613298565b611731565b60405161091e91906132e5565b60405180910390f35b348015610932575f80fd5b5061093b611753565b6040516109489190613338565b60405180910390f35b34801561095c575f80fd5b50610965611824565b6040516109729190613338565b60405180910390f35b348015610986575f80fd5b5061098f61182a565b60405161099c91906133b0565b60405180910390f35b3480156109b0575f80fd5b506109b9611842565b6040516109c69190613338565b60405180910390f35b3480156109da575f80fd5b506109e3611848565b6040516109f091906133b0565b60405180910390f35b348015610a04575f80fd5b50610a0d611860565b005b348015610a1a575f80fd5b50610a23611bf6565b604051610a31929190613542565b60405180910390f35b348015610a45575f80fd5b50610a4e611e11565b604051610a5b91906135c4565b60405180910390f35b348015610a6f575f80fd5b50610a78611e36565b604051610a8591906132e5565b60405180910390f35b348015610a99575f80fd5b50610aa2611e49565b604051610aaf9190613338565b60405180910390f35b348015610ac3575f80fd5b50610ade6004803603810190610ad99190613351565b611e4f565b005b348015610aeb575f80fd5b50610b066004803603810190610b0191906134af565b611ee8565b604051610b139190613338565b60405180910390f35b348015610b27575f80fd5b50610b426004803603810190610b3d91906134af565b6121dd565b604051610b4f9190613338565b60405180910390f35b348015610b63575f80fd5b50610b6c61225f565b604051610b7991906132e5565b60405180910390f35b348015610b8d575f80fd5b50610ba86004803603810190610ba391906132fe565b612271565b005b348015610bb5575f80fd5b50610bbe6122f5565b604051610bcb91906133b0565b60405180910390f35b348015610bdf575f80fd5b50610be86122fb565b604051610bf591906133b0565b60405180910390f35b348015610c09575f80fd5b50610c12612313565b604051610c1f91906133e4565b60405180910390f35b348015610c33575f80fd5b50610c4e6004803603810190610c499190613484565b612325565b005b610c58612349565b5f610c61611753565b90505f610c6d4261238f565b90506020548103610d2f57600d601f5f9054906101000a900460ff1660ff1660068110610c9d57610c9c6135dd565b5b6003020160010154821015610d2a5781600d601f5f9054906101000a900460ff1660ff1660068110610cd257610cd16135dd565b5b6003020160010181905550601f5f9054906101000a900460ff1660ff16817f596c6d2faf82b7d466ea30c5fa59549ac24bde283bd718630cc88b70f8586bce845f604051610d2192919061360a565b60405180910390a35b610ea6565b602054811115610e6a57600660ff166001601f5f9054906101000a900460ff1660ff16610d5c919061365e565b610d6691906136be565b601f5f6101000a81548160ff021916908360ff16021790555080600d601f5f9054906101000a900460ff1660ff1660068110610da557610da46135dd565b5b600302015f018190555081600d601f5f9054906101000a900460ff1660ff1660068110610dd557610dd46135dd565b5b600302016001018190555081600d601f5f9054906101000a900460ff1660ff1660068110610e0657610e056135dd565b5b600302016002018190555080602081905550601f5f9054906101000a900460ff1660ff16817f596c6d2faf82b7d466ea30c5fa59549ac24bde283bd718630cc88b70f8586bce846001604051610e5d92919061360a565b60405180910390a3610ea5565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90613738565b60405180910390fd5b5b5050610eb06123b0565b565b610eba6123ba565b5f5b83839050811015610f4f578160255f868685818110610ede57610edd6135dd565b5b9050602002016020810190610ef391906132fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508080600101915050610ebc565b50505050565b606060038054610f6490613783565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9090613783565b8015610fdb5780601f10610fb257610100808354040283529160200191610fdb565b820191905f5260205f20905b815481529060010190602001808311610fbe57829003601f168201915b5050505050905090565b5f80610fef612441565b9050610ffc818585612448565b600191505092915050565b6025602052805f5260405f205f915054906101000a900460ff1681565b5f600254905090565b60225481565b5f8061103d612441565b905061104a85828561245a565b6110558585856124ed565b60019150509392505050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60215481565b5f60075f9054906101000a900460ff16905090565b6110b26110ac612441565b826125dd565b50565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91505f613840600160066110ec91906137b3565b60ff166110f991906137e7565b6111024261238f565b61110c9190613828565b90505f91505f5b600660ff168160ff1610156111d5575f600d8260ff166006811061113a576111396135dd565b5b600302016002015411801561116c575081600d8260ff1660068110611162576111616135dd565b5b600302015f015410155b156111c857828061117c9061385b565b93505083600d8260ff1660068110611197576111966135dd565b5b600302016001015410156111c757600d8160ff16600681106111bc576111bb6135dd565b5b600302016001015493505b5b8080600101915050611113565b505f82036111e9575f8092509250506111eb565b505b9091565b60205481565b61271081565b600d816006811061120a575f80fd5b600302015f91509050805f0154908060010154908060020154905083565b5f805f80600d601f5f9054906101000a900460ff1660ff1660068110611251576112506135dd565b5b600302016040518060600160405290815f8201548152602001600182015481526020016002820154815250509050805f01518160200151826040015193509350935050909192565b6112a16123ba565b80602460016101000a81548160ff02191690831515021790555080156112eb576201518080426112d191906138a2565b6112db91906137e7565b6021819055506021546022819055505b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61133b6123ba565b6113445f61265c565b565b61134e6123ba565b81600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160255f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160255f600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b6114c66123ba565b8060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061155230600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612448565b50565b61156782611561612441565b8361245a565b61157182826125dd565b5050565b6103e881565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61384081565b602460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600480546115de90613783565b80601f016020809104026020016040519081016040528092919081815260200182805461160a90613783565b80156116555780601f1061162c57610100808354040283529160200191611655565b820191905f5260205f20905b81548152906001019060200180831161163857829003601f168201915b5050505050905090565b5f805f600660ff168460ff16106116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a29061391c565b60405180910390fd5b5f600d8560ff16600681106116c3576116c26135dd565b5b600302016040518060600160405290815f8201548152602001600182015481526020016002820154815250509050805f015181602001518260400151935093509350509193909250565b7355d398326f99059ff775485246999027b319795581565b6201518081565b600681565b5f8061173b612441565b90506117488185856124ed565b600191505092915050565b5f8061178773bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c7355d398326f99059ff775485246999027b3197955611ee8565b90505f6117bc737109cb91f05e567e4164cd0ba692033198f39b2a73bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c611ee8565b90505f6117dd30737109cb91f05e567e4164cd0ba692033198f39b2a611ee8565b9050670de0b6b3a764000081670de0b6b3a764000084866117fe91906137e7565b61180891906138a2565b61181291906137e7565b61181c91906138a2565b935050505090565b60235481565b73bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c81565b61271081565b737109cb91f05e567e4164cd0ba692033198f39b2a81565b611868612349565b602460019054906101000a900460ff166118b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ae90613984565b60405180910390fd5b62015180602154426118c99190613828565b11611909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190090613984565b60405180910390fd5b62015180804261191991906138a2565b61192391906137e7565b6021819055505f61195460095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166112ee565b90505f8111611998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198f906139ec565b60405180910390fd5b5f60c890506a034f086f3b33b6840000008211156119b95760c89050611a2f565b6a01a784379d99db420000008211156119d55760b49050611a2e565b69d3c21bcecceda10000008211156119f05760a09050611a2d565b6969e10de76676d0800000821115611a0b57608c9050611a2c565b6934f086f3b33b68400000821115611a265760789050611a2b565b606490505b5b5b5b5b6127108183611a3e91906137e7565b611a4891906138a2565b91505f6023549050611f40811115611a6457611f409050611a88565b612710612742602354611a7791906137e7565b611a8191906138a2565b6023819055505b5f6127108483611a9891906137e7565b611aa291906138a2565b90505f8185611ab19190613828565b9050611ae160095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661dead8361271f565b611b2e60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461271f565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611b94575f80fd5b505af1158015611ba6573d5f803e3d5ffd5b505050507f6623fe269860dbf802c9f303b5b0910a96492b250e6aa1b687cb8576a47bce368560215485604051611bdf9392919061344f565b60405180910390a15050505050611bf46123b0565b565b5f805f91505f90505f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90505f61384060016006611c3491906137b3565b60ff16611c4191906137e7565b611c4a4261238f565b611c549190613828565b90505f805f600142611c66919061365e565b90505f5b600660ff168160ff161015611d93575f600d8260ff1660068110611c9157611c906135dd565b5b6003020160020154118015611cc3575084600d8260ff1660068110611cb957611cb86135dd565b5b600302015f015410155b15611d86578380611cd39061385b565b94505085600d8260ff1660068110611cee57611ced6135dd565b5b60030201600101541015611d1e57600d8160ff1660068110611d1357611d126135dd565b5b600302016001015495505b81600d8260ff1660068110611d3657611d356135dd565b5b600302015f01541015611d8557600d8160ff1660068110611d5a57611d596135dd565b5b60030201600201549250600d8160ff1660068110611d7b57611d7a6135dd565b5b600302015f015491505b5b8080600101915050611c6a565b505f83118015611da257505f82115b15611e0857818510611ddc575f9550816127108387611dc19190613828565b611dcb91906137e7565b611dd591906138a2565b9650611e07565b60019550816127108684611df09190613828565b611dfa91906137e7565b611e0491906138a2565b96505b5b50505050509091565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b602460019054906101000a900460ff1681565b60085481565b611e576123ba565b611e5f612349565b8273ffffffffffffffffffffffffffffffffffffffff1663095ea7b383836040518363ffffffff1660e01b8152600401611e9a929190613a0a565b6020604051808303815f875af1158015611eb6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eda9190613a45565b50611ee36123b0565b505050565b5f80600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f789190613a84565b73ffffffffffffffffffffffffffffffffffffffff1663e6a4390585856040518363ffffffff1660e01b8152600401611fb2929190613aaf565b602060405180830381865afa158015611fcd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff19190613a84565b90505f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561203e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120629190613b52565b50915091505f826dffffffffffffffffffffffffffff16148061209457505f816dffffffffffffffffffffffffffff16145b156120a4575f93505050506121d7565b5f8373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121129190613a84565b90508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff160361219157826dffffffffffffffffffffffffffff16670de0b6b3a7640000836dffffffffffffffffffffffffffff1661217c91906137e7565b61218691906138a2565b9450505050506121d7565b816dffffffffffffffffffffffffffff16670de0b6b3a7640000846dffffffffffffffffffffffffffff166121c691906137e7565b6121d091906138a2565b9450505050505b92915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60245f9054906101000a900460ff1681565b6122796123ba565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036122e9575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016122e091906133b0565b60405180910390fd5b6122f28161265c565b50565b61dead81565b7310ed43c718714eb63d5aa57b78b54704e256024e81565b601f5f9054906101000a900460ff1681565b61232d6123ba565b8060245f6101000a81548160ff02191690831515021790555050565b600260065403612385576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600681905550565b5f613840808361239f91906138a2565b6123a991906137e7565b9050919050565b6001600681905550565b6123c2612441565b73ffffffffffffffffffffffffffffffffffffffff166123e061157b565b73ffffffffffffffffffffffffffffffffffffffff161461243f57612403612441565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161243691906133b0565b60405180910390fd5b565b5f33905090565b6124558383836001612938565b505050565b5f61246584846121dd565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156124e757818110156124d8578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016124cf93929190613ba2565b60405180910390fd5b6124e684848484035f612938565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361255d575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161255491906133b0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125cd575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016125c491906133b0565b60405180910390fd5b6125d8838383612b07565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361264d575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161264491906133b0565b60405180910390fd5b612658825f83612b07565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361276f578060025f828254612763919061365e565b9250508190555061283d565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156127f8578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016127ef93929190613ba2565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612884578060025f82825403925050819055506128ce565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161292b9190613338565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036129a8575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161299f91906133b0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a18575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612a0f91906133b0565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015612b01578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612af89190613338565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612b4e575060245f9054906101000a900460ff165b8015612ba1575060255f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612bf4575060255f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612c0257612c01610c50565b5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612c8b57505f73ffffffffffffffffffffffffffffffffffffffff1660095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015612ce3575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8015612d3c575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612d8f575060255f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612da957612da18361dead8361271f565b5f9050613056565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612e3257505f73ffffffffffffffffffffffffffffffffffffffff1660095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015612e8a575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b8015612ee3575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612f36575060255f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15613055575f6127106103e883612f4d91906137e7565b612f5791906138a2565b90505f600282612f6791906138a2565b9050612f768561dead8361271f565b612fad85600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168385612fa89190613828565b61271f565b60245f9054906101000a900460ff1615613044575f80612fcb611bf6565b915091505f8160ff161115613041575f61271060028488612fec91906137e7565b612ff691906137e7565b61300091906138a2565b905085858261300f919061365e565b11156130245784866130219190613828565b90505b6130318861dead8361271f565b808661303d9190613828565b9550505b50505b81836130509190613828565b925050505b5b61306183838361271f565b505050565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261308f5761308e61306e565b5b8235905067ffffffffffffffff8111156130ac576130ab613072565b5b6020830191508360208202830111156130c8576130c7613076565b5b9250929050565b5f8115159050919050565b6130e3816130cf565b81146130ed575f80fd5b50565b5f813590506130fe816130da565b92915050565b5f805f6040848603121561311b5761311a613066565b5b5f84013567ffffffffffffffff8111156131385761313761306a565b5b6131448682870161307a565b93509350506020613157868287016130f0565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561319857808201518184015260208101905061317d565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6131bd82613161565b6131c7818561316b565b93506131d781856020860161317b565b6131e0816131a3565b840191505092915050565b5f6020820190508181035f83015261320381846131b3565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6132348261320b565b9050919050565b6132448161322a565b811461324e575f80fd5b50565b5f8135905061325f8161323b565b92915050565b5f819050919050565b61327781613265565b8114613281575f80fd5b50565b5f813590506132928161326e565b92915050565b5f80604083850312156132ae576132ad613066565b5b5f6132bb85828601613251565b92505060206132cc85828601613284565b9150509250929050565b6132df816130cf565b82525050565b5f6020820190506132f85f8301846132d6565b92915050565b5f6020828403121561331357613312613066565b5b5f61332084828501613251565b91505092915050565b61333281613265565b82525050565b5f60208201905061334b5f830184613329565b92915050565b5f805f6060848603121561336857613367613066565b5b5f61337586828701613251565b935050602061338686828701613251565b925050604061339786828701613284565b9150509250925092565b6133aa8161322a565b82525050565b5f6020820190506133c35f8301846133a1565b92915050565b5f60ff82169050919050565b6133de816133c9565b82525050565b5f6020820190506133f75f8301846133d5565b92915050565b5f6020828403121561341257613411613066565b5b5f61341f84828501613284565b91505092915050565b5f60408201905061343b5f830185613329565b6134486020830184613329565b9392505050565b5f6060820190506134625f830186613329565b61346f6020830185613329565b61347c6040830184613329565b949350505050565b5f6020828403121561349957613498613066565b5b5f6134a6848285016130f0565b91505092915050565b5f80604083850312156134c5576134c4613066565b5b5f6134d285828601613251565b92505060206134e385828601613251565b9150509250929050565b6134f6816133c9565b8114613500575f80fd5b50565b5f81359050613511816134ed565b92915050565b5f6020828403121561352c5761352b613066565b5b5f61353984828501613503565b91505092915050565b5f6040820190506135555f830185613329565b61356260208301846133d5565b9392505050565b5f819050919050565b5f61358c6135876135828461320b565b613569565b61320b565b9050919050565b5f61359d82613572565b9050919050565b5f6135ae82613593565b9050919050565b6135be816135a4565b82525050565b5f6020820190506135d75f8301846135b5565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60408201905061361d5f830185613329565b61362a60208301846132d6565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61366882613265565b915061367383613265565b925082820190508082111561368b5761368a613631565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6136c882613265565b91506136d383613265565b9250826136e3576136e2613691565b5b828206905092915050565b7f74696d652072656772657373696f6e00000000000000000000000000000000005f82015250565b5f613722600f8361316b565b915061372d826136ee565b602082019050919050565b5f6020820190508181035f83015261374f81613716565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061379a57607f821691505b6020821081036137ad576137ac613756565b5b50919050565b5f6137bd826133c9565b91506137c8836133c9565b9250828203905060ff8111156137e1576137e0613631565b5b92915050565b5f6137f182613265565b91506137fc83613265565b925082820261380a81613265565b9150828204841483151761382157613820613631565b5b5092915050565b5f61383282613265565b915061383d83613265565b925082820390508181111561385557613854613631565b5b92915050565b5f61386582613265565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361389757613896613631565b5b600182019050919050565b5f6138ac82613265565b91506138b783613265565b9250826138c7576138c6613691565b5b828204905092915050565b7f696478206f7574000000000000000000000000000000000000000000000000005f82015250565b5f61390660078361316b565b9150613911826138d2565b602082019050919050565b5f6020820190508181035f830152613933816138fa565b9050919050565b7f6e6f7420616c6c6f7765640000000000000000000000000000000000000000005f82015250565b5f61396e600b8361316b565b91506139798261393a565b602082019050919050565b5f6020820190508181035f83015261399b81613962565b9050919050565b7f6e6f206c697175696469747900000000000000000000000000000000000000005f82015250565b5f6139d6600c8361316b565b91506139e1826139a2565b602082019050919050565b5f6020820190508181035f830152613a03816139ca565b9050919050565b5f604082019050613a1d5f8301856133a1565b613a2a6020830184613329565b9392505050565b5f81519050613a3f816130da565b92915050565b5f60208284031215613a5a57613a59613066565b5b5f613a6784828501613a31565b91505092915050565b5f81519050613a7e8161323b565b92915050565b5f60208284031215613a9957613a98613066565b5b5f613aa684828501613a70565b91505092915050565b5f604082019050613ac25f8301856133a1565b613acf60208301846133a1565b9392505050565b5f6dffffffffffffffffffffffffffff82169050919050565b613af881613ad6565b8114613b02575f80fd5b50565b5f81519050613b1381613aef565b92915050565b5f63ffffffff82169050919050565b613b3181613b19565b8114613b3b575f80fd5b50565b5f81519050613b4c81613b28565b92915050565b5f805f60608486031215613b6957613b68613066565b5b5f613b7686828701613b05565b9350506020613b8786828701613b05565b9250506040613b9886828701613b3e565b9150509250925092565b5f606082019050613bb55f8301866133a1565b613bc26020830185613329565b613bcf6040830184613329565b94935050505056fea264697066735822122003577615659682a747666f84b16a570493b3db6a49546680cbae870ec27e0f6364736f6c63430008180033

Deployed Bytecode

0x608060405260043610610301575f3560e01c8063938b5f321161018f578063bf6c1dc2116100db578063dd62ed3e11610094578063f46632351161006e578063f466323514610baa578063f73bc05314610bd4578063f7daa2ee14610bfe578063fd7bcccd14610c2857610368565b8063dd62ed3e14610b1c578063ec6dc32014610b58578063f2fde38b14610b8257610368565b8063bf6c1dc214610a0f578063c21ebd0714610a3a578063c80d2b5e14610a64578063d5abeb0114610a8e578063da3e339714610ab8578063db16a55514610ae057610368565b8063a9059cbb11610148578063b3b640df11610122578063b3b640df1461097b578063b416d1a3146109a5578063b8865cc0146109cf578063ba3d838f146109f957610368565b8063a9059cbb146108eb578063adde0a0d14610927578063ae503a941461095157610368565b8063938b5f32146107db57806395d89b41146108055780639687383d1461082f5780639d741e5d1461086d578063a2724a4d14610897578063a53e5412146108c157610368565b806362902ac71161024e578063715018a61161020757806379cc6790116101e157806379cc6790146107355780638ce8e9d71461075d5780638da5cb5b146107875780638e1234a6146107b157610368565b8063715018a6146106cf578063717d2376146106e557806373a432bb1461070d57610368565b806362902ac7146105ad57806362f3765e146105d75780636e0c9f0a146106015780636ebbc1151461063f5780636edc03e81461066b57806370a082311461069357610368565b80631fece980116102bb5780632ec2d910116102955780632ec2d91014610506578063313ce5671461053057806342966c681461055a578063568b57fe1461058257610368565b80631fece9801461048a57806323b872dd146104a057806326991cc8146104dc57610368565b8062dc41fb1461036c57806306fdde0314610394578063095ea7b3146103be57806316c2be6b146103fa57806318160ddd146104365780631d9a15281461046057610368565b366103685760245f9054906101000a900460ff161561032357610322610c50565b5b3373ffffffffffffffffffffffffffffffffffffffff166108fc3490811502906040515f60405180830381858888f19350505050158015610366573d5f803e3d5ffd5b005b5f80fd5b348015610377575f80fd5b50610392600480360381019061038d9190613104565b610eb2565b005b34801561039f575f80fd5b506103a8610f55565b6040516103b591906131eb565b60405180910390f35b3480156103c9575f80fd5b506103e460048036038101906103df9190613298565b610fe5565b6040516103f191906132e5565b60405180910390f35b348015610405575f80fd5b50610420600480360381019061041b91906132fe565b611007565b60405161042d91906132e5565b60405180910390f35b348015610441575f80fd5b5061044a611024565b6040516104579190613338565b60405180910390f35b34801561046b575f80fd5b5061047461102d565b6040516104819190613338565b60405180910390f35b348015610495575f80fd5b5061049e610c50565b005b3480156104ab575f80fd5b506104c660048036038101906104c19190613351565b611033565b6040516104d391906132e5565b60405180910390f35b3480156104e7575f80fd5b506104f0611061565b6040516104fd91906133b0565b60405180910390f35b348015610511575f80fd5b5061051a611086565b6040516105279190613338565b60405180910390f35b34801561053b575f80fd5b5061054461108c565b60405161055191906133e4565b60405180910390f35b348015610565575f80fd5b50610580600480360381019061057b91906133fd565b6110a1565b005b34801561058d575f80fd5b506105966110b5565b6040516105a4929190613428565b60405180910390f35b3480156105b8575f80fd5b506105c16111ef565b6040516105ce9190613338565b60405180910390f35b3480156105e2575f80fd5b506105eb6111f5565b6040516105f89190613338565b60405180910390f35b34801561060c575f80fd5b50610627600480360381019061062291906133fd565b6111fb565b6040516106369392919061344f565b60405180910390f35b34801561064a575f80fd5b50610653611228565b6040516106629392919061344f565b60405180910390f35b348015610676575f80fd5b50610691600480360381019061068c9190613484565b611299565b005b34801561069e575f80fd5b506106b960048036038101906106b491906132fe565b6112ee565b6040516106c69190613338565b60405180910390f35b3480156106da575f80fd5b506106e3611333565b005b3480156106f0575f80fd5b5061070b600480360381019061070691906134af565b611346565b005b348015610718575f80fd5b50610733600480360381019061072e91906132fe565b6114be565b005b348015610740575f80fd5b5061075b60048036038101906107569190613298565b611555565b005b348015610768575f80fd5b50610771611575565b60405161077e9190613338565b60405180910390f35b348015610792575f80fd5b5061079b61157b565b6040516107a891906133b0565b60405180910390f35b3480156107bc575f80fd5b506107c56115a3565b6040516107d29190613338565b60405180910390f35b3480156107e6575f80fd5b506107ef6115a9565b6040516107fc91906133b0565b60405180910390f35b348015610810575f80fd5b506108196115cf565b60405161082691906131eb565b60405180910390f35b34801561083a575f80fd5b5061085560048036038101906108509190613517565b61165f565b6040516108649392919061344f565b60405180910390f35b348015610878575f80fd5b5061088161170d565b60405161088e91906133b0565b60405180910390f35b3480156108a2575f80fd5b506108ab611725565b6040516108b89190613338565b60405180910390f35b3480156108cc575f80fd5b506108d561172c565b6040516108e291906133e4565b60405180910390f35b3480156108f6575f80fd5b50610911600480360381019061090c9190613298565b611731565b60405161091e91906132e5565b60405180910390f35b348015610932575f80fd5b5061093b611753565b6040516109489190613338565b60405180910390f35b34801561095c575f80fd5b50610965611824565b6040516109729190613338565b60405180910390f35b348015610986575f80fd5b5061098f61182a565b60405161099c91906133b0565b60405180910390f35b3480156109b0575f80fd5b506109b9611842565b6040516109c69190613338565b60405180910390f35b3480156109da575f80fd5b506109e3611848565b6040516109f091906133b0565b60405180910390f35b348015610a04575f80fd5b50610a0d611860565b005b348015610a1a575f80fd5b50610a23611bf6565b604051610a31929190613542565b60405180910390f35b348015610a45575f80fd5b50610a4e611e11565b604051610a5b91906135c4565b60405180910390f35b348015610a6f575f80fd5b50610a78611e36565b604051610a8591906132e5565b60405180910390f35b348015610a99575f80fd5b50610aa2611e49565b604051610aaf9190613338565b60405180910390f35b348015610ac3575f80fd5b50610ade6004803603810190610ad99190613351565b611e4f565b005b348015610aeb575f80fd5b50610b066004803603810190610b0191906134af565b611ee8565b604051610b139190613338565b60405180910390f35b348015610b27575f80fd5b50610b426004803603810190610b3d91906134af565b6121dd565b604051610b4f9190613338565b60405180910390f35b348015610b63575f80fd5b50610b6c61225f565b604051610b7991906132e5565b60405180910390f35b348015610b8d575f80fd5b50610ba86004803603810190610ba391906132fe565b612271565b005b348015610bb5575f80fd5b50610bbe6122f5565b604051610bcb91906133b0565b60405180910390f35b348015610bdf575f80fd5b50610be86122fb565b604051610bf591906133b0565b60405180910390f35b348015610c09575f80fd5b50610c12612313565b604051610c1f91906133e4565b60405180910390f35b348015610c33575f80fd5b50610c4e6004803603810190610c499190613484565b612325565b005b610c58612349565b5f610c61611753565b90505f610c6d4261238f565b90506020548103610d2f57600d601f5f9054906101000a900460ff1660ff1660068110610c9d57610c9c6135dd565b5b6003020160010154821015610d2a5781600d601f5f9054906101000a900460ff1660ff1660068110610cd257610cd16135dd565b5b6003020160010181905550601f5f9054906101000a900460ff1660ff16817f596c6d2faf82b7d466ea30c5fa59549ac24bde283bd718630cc88b70f8586bce845f604051610d2192919061360a565b60405180910390a35b610ea6565b602054811115610e6a57600660ff166001601f5f9054906101000a900460ff1660ff16610d5c919061365e565b610d6691906136be565b601f5f6101000a81548160ff021916908360ff16021790555080600d601f5f9054906101000a900460ff1660ff1660068110610da557610da46135dd565b5b600302015f018190555081600d601f5f9054906101000a900460ff1660ff1660068110610dd557610dd46135dd565b5b600302016001018190555081600d601f5f9054906101000a900460ff1660ff1660068110610e0657610e056135dd565b5b600302016002018190555080602081905550601f5f9054906101000a900460ff1660ff16817f596c6d2faf82b7d466ea30c5fa59549ac24bde283bd718630cc88b70f8586bce846001604051610e5d92919061360a565b60405180910390a3610ea5565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90613738565b60405180910390fd5b5b5050610eb06123b0565b565b610eba6123ba565b5f5b83839050811015610f4f578160255f868685818110610ede57610edd6135dd565b5b9050602002016020810190610ef391906132fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508080600101915050610ebc565b50505050565b606060038054610f6490613783565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9090613783565b8015610fdb5780601f10610fb257610100808354040283529160200191610fdb565b820191905f5260205f20905b815481529060010190602001808311610fbe57829003601f168201915b5050505050905090565b5f80610fef612441565b9050610ffc818585612448565b600191505092915050565b6025602052805f5260405f205f915054906101000a900460ff1681565b5f600254905090565b60225481565b5f8061103d612441565b905061104a85828561245a565b6110558585856124ed565b60019150509392505050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60215481565b5f60075f9054906101000a900460ff16905090565b6110b26110ac612441565b826125dd565b50565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91505f613840600160066110ec91906137b3565b60ff166110f991906137e7565b6111024261238f565b61110c9190613828565b90505f91505f5b600660ff168160ff1610156111d5575f600d8260ff166006811061113a576111396135dd565b5b600302016002015411801561116c575081600d8260ff1660068110611162576111616135dd565b5b600302015f015410155b156111c857828061117c9061385b565b93505083600d8260ff1660068110611197576111966135dd565b5b600302016001015410156111c757600d8160ff16600681106111bc576111bb6135dd565b5b600302016001015493505b5b8080600101915050611113565b505f82036111e9575f8092509250506111eb565b505b9091565b60205481565b61271081565b600d816006811061120a575f80fd5b600302015f91509050805f0154908060010154908060020154905083565b5f805f80600d601f5f9054906101000a900460ff1660ff1660068110611251576112506135dd565b5b600302016040518060600160405290815f8201548152602001600182015481526020016002820154815250509050805f01518160200151826040015193509350935050909192565b6112a16123ba565b80602460016101000a81548160ff02191690831515021790555080156112eb576201518080426112d191906138a2565b6112db91906137e7565b6021819055506021546022819055505b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61133b6123ba565b6113445f61265c565b565b61134e6123ba565b81600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160255f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160255f600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b6114c66123ba565b8060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061155230600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612448565b50565b61156782611561612441565b8361245a565b61157182826125dd565b5050565b6103e881565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61384081565b602460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600480546115de90613783565b80601f016020809104026020016040519081016040528092919081815260200182805461160a90613783565b80156116555780601f1061162c57610100808354040283529160200191611655565b820191905f5260205f20905b81548152906001019060200180831161163857829003601f168201915b5050505050905090565b5f805f600660ff168460ff16106116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a29061391c565b60405180910390fd5b5f600d8560ff16600681106116c3576116c26135dd565b5b600302016040518060600160405290815f8201548152602001600182015481526020016002820154815250509050805f015181602001518260400151935093509350509193909250565b7355d398326f99059ff775485246999027b319795581565b6201518081565b600681565b5f8061173b612441565b90506117488185856124ed565b600191505092915050565b5f8061178773bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c7355d398326f99059ff775485246999027b3197955611ee8565b90505f6117bc737109cb91f05e567e4164cd0ba692033198f39b2a73bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c611ee8565b90505f6117dd30737109cb91f05e567e4164cd0ba692033198f39b2a611ee8565b9050670de0b6b3a764000081670de0b6b3a764000084866117fe91906137e7565b61180891906138a2565b61181291906137e7565b61181c91906138a2565b935050505090565b60235481565b73bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c81565b61271081565b737109cb91f05e567e4164cd0ba692033198f39b2a81565b611868612349565b602460019054906101000a900460ff166118b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ae90613984565b60405180910390fd5b62015180602154426118c99190613828565b11611909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190090613984565b60405180910390fd5b62015180804261191991906138a2565b61192391906137e7565b6021819055505f61195460095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166112ee565b90505f8111611998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198f906139ec565b60405180910390fd5b5f60c890506a034f086f3b33b6840000008211156119b95760c89050611a2f565b6a01a784379d99db420000008211156119d55760b49050611a2e565b69d3c21bcecceda10000008211156119f05760a09050611a2d565b6969e10de76676d0800000821115611a0b57608c9050611a2c565b6934f086f3b33b68400000821115611a265760789050611a2b565b606490505b5b5b5b5b6127108183611a3e91906137e7565b611a4891906138a2565b91505f6023549050611f40811115611a6457611f409050611a88565b612710612742602354611a7791906137e7565b611a8191906138a2565b6023819055505b5f6127108483611a9891906137e7565b611aa291906138a2565b90505f8185611ab19190613828565b9050611ae160095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661dead8361271f565b611b2e60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461271f565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611b94575f80fd5b505af1158015611ba6573d5f803e3d5ffd5b505050507f6623fe269860dbf802c9f303b5b0910a96492b250e6aa1b687cb8576a47bce368560215485604051611bdf9392919061344f565b60405180910390a15050505050611bf46123b0565b565b5f805f91505f90505f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90505f61384060016006611c3491906137b3565b60ff16611c4191906137e7565b611c4a4261238f565b611c549190613828565b90505f805f600142611c66919061365e565b90505f5b600660ff168160ff161015611d93575f600d8260ff1660068110611c9157611c906135dd565b5b6003020160020154118015611cc3575084600d8260ff1660068110611cb957611cb86135dd565b5b600302015f015410155b15611d86578380611cd39061385b565b94505085600d8260ff1660068110611cee57611ced6135dd565b5b60030201600101541015611d1e57600d8160ff1660068110611d1357611d126135dd565b5b600302016001015495505b81600d8260ff1660068110611d3657611d356135dd565b5b600302015f01541015611d8557600d8160ff1660068110611d5a57611d596135dd565b5b60030201600201549250600d8160ff1660068110611d7b57611d7a6135dd565b5b600302015f015491505b5b8080600101915050611c6a565b505f83118015611da257505f82115b15611e0857818510611ddc575f9550816127108387611dc19190613828565b611dcb91906137e7565b611dd591906138a2565b9650611e07565b60019550816127108684611df09190613828565b611dfa91906137e7565b611e0491906138a2565b96505b5b50505050509091565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b602460019054906101000a900460ff1681565b60085481565b611e576123ba565b611e5f612349565b8273ffffffffffffffffffffffffffffffffffffffff1663095ea7b383836040518363ffffffff1660e01b8152600401611e9a929190613a0a565b6020604051808303815f875af1158015611eb6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eda9190613a45565b50611ee36123b0565b505050565b5f80600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f789190613a84565b73ffffffffffffffffffffffffffffffffffffffff1663e6a4390585856040518363ffffffff1660e01b8152600401611fb2929190613aaf565b602060405180830381865afa158015611fcd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff19190613a84565b90505f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561203e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120629190613b52565b50915091505f826dffffffffffffffffffffffffffff16148061209457505f816dffffffffffffffffffffffffffff16145b156120a4575f93505050506121d7565b5f8373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121129190613a84565b90508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff160361219157826dffffffffffffffffffffffffffff16670de0b6b3a7640000836dffffffffffffffffffffffffffff1661217c91906137e7565b61218691906138a2565b9450505050506121d7565b816dffffffffffffffffffffffffffff16670de0b6b3a7640000846dffffffffffffffffffffffffffff166121c691906137e7565b6121d091906138a2565b9450505050505b92915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60245f9054906101000a900460ff1681565b6122796123ba565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036122e9575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016122e091906133b0565b60405180910390fd5b6122f28161265c565b50565b61dead81565b7310ed43c718714eb63d5aa57b78b54704e256024e81565b601f5f9054906101000a900460ff1681565b61232d6123ba565b8060245f6101000a81548160ff02191690831515021790555050565b600260065403612385576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600681905550565b5f613840808361239f91906138a2565b6123a991906137e7565b9050919050565b6001600681905550565b6123c2612441565b73ffffffffffffffffffffffffffffffffffffffff166123e061157b565b73ffffffffffffffffffffffffffffffffffffffff161461243f57612403612441565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161243691906133b0565b60405180910390fd5b565b5f33905090565b6124558383836001612938565b505050565b5f61246584846121dd565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156124e757818110156124d8578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016124cf93929190613ba2565b60405180910390fd5b6124e684848484035f612938565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361255d575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161255491906133b0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125cd575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016125c491906133b0565b60405180910390fd5b6125d8838383612b07565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361264d575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161264491906133b0565b60405180910390fd5b612658825f83612b07565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361276f578060025f828254612763919061365e565b9250508190555061283d565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156127f8578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016127ef93929190613ba2565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612884578060025f82825403925050819055506128ce565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161292b9190613338565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036129a8575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161299f91906133b0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a18575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612a0f91906133b0565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015612b01578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612af89190613338565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612b4e575060245f9054906101000a900460ff165b8015612ba1575060255f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612bf4575060255f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612c0257612c01610c50565b5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612c8b57505f73ffffffffffffffffffffffffffffffffffffffff1660095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015612ce3575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8015612d3c575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612d8f575060255f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612da957612da18361dead8361271f565b5f9050613056565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612e3257505f73ffffffffffffffffffffffffffffffffffffffff1660095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015612e8a575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b8015612ee3575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612f36575060255f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15613055575f6127106103e883612f4d91906137e7565b612f5791906138a2565b90505f600282612f6791906138a2565b9050612f768561dead8361271f565b612fad85600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168385612fa89190613828565b61271f565b60245f9054906101000a900460ff1615613044575f80612fcb611bf6565b915091505f8160ff161115613041575f61271060028488612fec91906137e7565b612ff691906137e7565b61300091906138a2565b905085858261300f919061365e565b11156130245784866130219190613828565b90505b6130318861dead8361271f565b808661303d9190613828565b9550505b50505b81836130509190613828565b925050505b5b61306183838361271f565b505050565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261308f5761308e61306e565b5b8235905067ffffffffffffffff8111156130ac576130ab613072565b5b6020830191508360208202830111156130c8576130c7613076565b5b9250929050565b5f8115159050919050565b6130e3816130cf565b81146130ed575f80fd5b50565b5f813590506130fe816130da565b92915050565b5f805f6040848603121561311b5761311a613066565b5b5f84013567ffffffffffffffff8111156131385761313761306a565b5b6131448682870161307a565b93509350506020613157868287016130f0565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561319857808201518184015260208101905061317d565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6131bd82613161565b6131c7818561316b565b93506131d781856020860161317b565b6131e0816131a3565b840191505092915050565b5f6020820190508181035f83015261320381846131b3565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6132348261320b565b9050919050565b6132448161322a565b811461324e575f80fd5b50565b5f8135905061325f8161323b565b92915050565b5f819050919050565b61327781613265565b8114613281575f80fd5b50565b5f813590506132928161326e565b92915050565b5f80604083850312156132ae576132ad613066565b5b5f6132bb85828601613251565b92505060206132cc85828601613284565b9150509250929050565b6132df816130cf565b82525050565b5f6020820190506132f85f8301846132d6565b92915050565b5f6020828403121561331357613312613066565b5b5f61332084828501613251565b91505092915050565b61333281613265565b82525050565b5f60208201905061334b5f830184613329565b92915050565b5f805f6060848603121561336857613367613066565b5b5f61337586828701613251565b935050602061338686828701613251565b925050604061339786828701613284565b9150509250925092565b6133aa8161322a565b82525050565b5f6020820190506133c35f8301846133a1565b92915050565b5f60ff82169050919050565b6133de816133c9565b82525050565b5f6020820190506133f75f8301846133d5565b92915050565b5f6020828403121561341257613411613066565b5b5f61341f84828501613284565b91505092915050565b5f60408201905061343b5f830185613329565b6134486020830184613329565b9392505050565b5f6060820190506134625f830186613329565b61346f6020830185613329565b61347c6040830184613329565b949350505050565b5f6020828403121561349957613498613066565b5b5f6134a6848285016130f0565b91505092915050565b5f80604083850312156134c5576134c4613066565b5b5f6134d285828601613251565b92505060206134e385828601613251565b9150509250929050565b6134f6816133c9565b8114613500575f80fd5b50565b5f81359050613511816134ed565b92915050565b5f6020828403121561352c5761352b613066565b5b5f61353984828501613503565b91505092915050565b5f6040820190506135555f830185613329565b61356260208301846133d5565b9392505050565b5f819050919050565b5f61358c6135876135828461320b565b613569565b61320b565b9050919050565b5f61359d82613572565b9050919050565b5f6135ae82613593565b9050919050565b6135be816135a4565b82525050565b5f6020820190506135d75f8301846135b5565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60408201905061361d5f830185613329565b61362a60208301846132d6565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61366882613265565b915061367383613265565b925082820190508082111561368b5761368a613631565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6136c882613265565b91506136d383613265565b9250826136e3576136e2613691565b5b828206905092915050565b7f74696d652072656772657373696f6e00000000000000000000000000000000005f82015250565b5f613722600f8361316b565b915061372d826136ee565b602082019050919050565b5f6020820190508181035f83015261374f81613716565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061379a57607f821691505b6020821081036137ad576137ac613756565b5b50919050565b5f6137bd826133c9565b91506137c8836133c9565b9250828203905060ff8111156137e1576137e0613631565b5b92915050565b5f6137f182613265565b91506137fc83613265565b925082820261380a81613265565b9150828204841483151761382157613820613631565b5b5092915050565b5f61383282613265565b915061383d83613265565b925082820390508181111561385557613854613631565b5b92915050565b5f61386582613265565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361389757613896613631565b5b600182019050919050565b5f6138ac82613265565b91506138b783613265565b9250826138c7576138c6613691565b5b828204905092915050565b7f696478206f7574000000000000000000000000000000000000000000000000005f82015250565b5f61390660078361316b565b9150613911826138d2565b602082019050919050565b5f6020820190508181035f830152613933816138fa565b9050919050565b7f6e6f7420616c6c6f7765640000000000000000000000000000000000000000005f82015250565b5f61396e600b8361316b565b91506139798261393a565b602082019050919050565b5f6020820190508181035f83015261399b81613962565b9050919050565b7f6e6f206c697175696469747900000000000000000000000000000000000000005f82015250565b5f6139d6600c8361316b565b91506139e1826139a2565b602082019050919050565b5f6020820190508181035f830152613a03816139ca565b9050919050565b5f604082019050613a1d5f8301856133a1565b613a2a6020830184613329565b9392505050565b5f81519050613a3f816130da565b92915050565b5f60208284031215613a5a57613a59613066565b5b5f613a6784828501613a31565b91505092915050565b5f81519050613a7e8161323b565b92915050565b5f60208284031215613a9957613a98613066565b5b5f613aa684828501613a70565b91505092915050565b5f604082019050613ac25f8301856133a1565b613acf60208301846133a1565b9392505050565b5f6dffffffffffffffffffffffffffff82169050919050565b613af881613ad6565b8114613b02575f80fd5b50565b5f81519050613b1381613aef565b92915050565b5f63ffffffff82169050919050565b613b3181613b19565b8114613b3b575f80fd5b50565b5f81519050613b4c81613b28565b92915050565b5f805f60608486031215613b6957613b68613066565b5b5f613b7686828701613b05565b9350506020613b8786828701613b05565b9250506040613b9886828701613b3e565b9150509250925092565b5f606082019050613bb55f8301866133a1565b613bc26020830185613329565b613bcf6040830184613329565b94935050505056fea264697066735822122003577615659682a747666f84b16a570493b3db6a49546680cbae870ec27e0f6364736f6c63430008180033

Deployed Bytecode Sourcemap

36355:12969:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39336:17;;;;;;;;;;;39333:66;;;39370:17;:15;:17::i;:::-;39333:66;39417:10;39409:28;;:39;39438:9;39409:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36355:12969;;;;40966:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12986:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15196:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38310:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14059:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38047:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44232:1092;;;;;;;;;;;;;:::i;:::-;;15996:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36571:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38005:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39007:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22875:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45915:696;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;37961:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37276:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37887:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;48147:230;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;49026:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14194:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25806:103;;;;;;;;;;;;;:::i;:::-;;48707:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48385:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23293:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37145:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25131:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37731:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38237:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13196:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45527:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;36757:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37794:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37665:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14517:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42846:369;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38090:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36666:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37222:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36946:82;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41261:1399;;;;;;;;;;;;;:::i;:::-;;46744:1342;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;37035:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38194:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36534:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39127:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43221:547;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14735:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38150:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26064:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36604:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36849:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37932:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48568:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44232:1092;29231:21;:19;:21::i;:::-;44290:20:::1;44313:19;:17;:19::i;:::-;44290:42;;44345:15;44363:28;44375:15;44363:11;:28::i;:::-;44345:46;;44419:18;;44408:7;:29:::0;44404:913:::1;;44520:12;44533:9;;;;;;;;;;;44520:23;;;;;;;;;:::i;:::-;;;;;:32;;;44505:12;:47;44501:216;;;44608:12;44573;44586:9;;;;;;;;;;;44573:23;;;;;;;;;:::i;:::-;;;;;:32;;:47;;;;44670:9;;;;;;;;;;;44644:57;;44661:7;44644:57;44681:12;44695:5;44644:57;;;;;;;:::i;:::-;;;;;;;;44501:216;44404:913;;;44748:18;;44738:7;:28;44734:583;;;37696:1;44843:33;;44865:1;44852:9;;;;;;;;;;;44844:18;;:22;;;;:::i;:::-;44843:33;;;;:::i;:::-;44825:9;;:52;;;;;;;;;;;;;;;;;;44928:7;44892:12;44905:9;;;;;;;;;;;44892:23;;;;;;;;;:::i;:::-;;;;;:33;;:43;;;;44985:12;44950;44963:9;;;;;;;;;;;44950:23;;;;;;;;;:::i;:::-;;;;;:32;;:47;;;;45049:12;45012;45025:9;;;;;;;;;;;45012:23;;;;;;;;;:::i;:::-;;;;;:34;;:49;;;;45097:7;45076:18;:28;;;;45150:9;;;;;;;;;;;45124:56;;45141:7;45124:56;45161:12;45175:4;45124:56;;;;;;;:::i;:::-;;;;;;;;44734:583;;;45280:25;;;;;;;;;;:::i;:::-;;;;;;;;44734:583;44404:913;44279:1045;;29275:20:::0;:18;:20::i;:::-;44232:1092::o;40966:206::-;25017:13;:11;:13::i;:::-;41067:9:::1;41062:103;41086:5;;:12;;41082:1;:16;41062:103;;;41144:9;41120:11;:21;41132:5;;41138:1;41132:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;41120:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;41100:3;;;;;;;41062:103;;;;40966:206:::0;;;:::o;12986:91::-;13031:13;13064:5;13057:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12986:91;:::o;15196:190::-;15269:4;15286:13;15302:12;:10;:12::i;:::-;15286:28;;15325:31;15334:5;15341:7;15350:5;15325:8;:31::i;:::-;15374:4;15367:11;;;15196:190;;;;:::o;38310:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;14059:99::-;14111:7;14138:12;;14131:19;;14059:99;:::o;38047:36::-;;;;:::o;15996:249::-;16083:4;16100:15;16118:12;:10;:12::i;:::-;16100:30;;16141:37;16157:4;16163:7;16172:5;16141:15;:37::i;:::-;16189:26;16199:4;16205:2;16209:5;16189:9;:26::i;:::-;16233:4;16226:11;;;15996:249;;;;;:::o;36571:23::-;;;;;;;;;;;;;:::o;38005:35::-;;;;:::o;39007:100::-;39065:5;39090:9;;;;;;;;;;;39083:16;;39007:100;:::o;22875:89::-;22930:26;22936:12;:10;:12::i;:::-;22950:5;22930;:26::i;:::-;22875:89;:::o;45915:696::-;45960:14;45976:13;46011:17;46002:26;;46039:14;37769:5;46097:1;37696;46088:10;;;;:::i;:::-;46087:26;;;;;;:::i;:::-;46056:28;46068:15;46056:11;:28::i;:::-;:57;;;;:::i;:::-;46039:74;;46158:1;46150:9;;46175:7;46170:311;37696:1;46188:10;;:1;:10;;;46170:311;;;46253:1;46224:12;46237:1;46224:15;;;;;;;;;:::i;:::-;;;;;:26;;;:30;:69;;;;;46287:6;46258:12;46271:1;46258:15;;;;;;;;;:::i;:::-;;;;;:25;;;:35;;46224:69;46220:250;;;46314:7;;;;;:::i;:::-;;;;46371:6;46344:12;46357:1;46344:15;;;;;;;;;:::i;:::-;;;;;:24;;;:33;46340:115;;;46411:12;46424:1;46411:15;;;;;;;;;:::i;:::-;;;;;:24;;;46402:33;;46340:115;46220:250;46200:3;;;;;;;46170:311;;;;46504:1;46495:5;:10;46491:80;;46554:1;46557;46546:13;;;;;;;46491:80;46581:22;45915:696;;;:::o;37961:33::-;;;;:::o;37276:44::-;37315:5;37276:44;:::o;37887:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48147:230::-;48199:17;48218:16;48236:18;48267:19;48289:12;48302:9;;;;;;;;;;;48289:23;;;;;;;;;:::i;:::-;;;;;48267:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48331:1;:11;;;48344:1;:10;;;48356:1;:12;;;48323:46;;;;;;;48147:230;;;:::o;49026:295::-;25017:13;:11;:13::i;:::-;49122:15:::1;49105:14;;:32;;;;;;;;;;;;;;;;;;49151:15;49148:166;;;37829:6;::::0;49206:15:::1;:26;;;;:::i;:::-;:37;;;;:::i;:::-;49183:20;:60;;;;49282:20;;49258:21;:44;;;;49148:166;49026:295:::0;:::o;14194:118::-;14259:7;14286:9;:18;14296:7;14286:18;;;;;;;;;;;;;;;;14279:25;;14194:118;;;:::o;25806:103::-;25017:13;:11;:13::i;:::-;25871:30:::1;25898:1;25871:18;:30::i;:::-;25806:103::o:0;48707:311::-;25017:13;:11;:13::i;:::-;48844:18:::1;48824:17;;:38;;;;;;;;;;;;;;;;;;48906:4;48873:11;:30;48885:17;;;;;;;;;;;48873:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;48942:19;48921:18;;:40;;;;;;;;;;;;;;;;;;49006:4;48972:11;:31;48984:18;;;;;;;;;;;48972:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;48707:311:::0;;:::o;48385:175::-;25017:13;:11;:13::i;:::-;48466:9:::1;48455:8;;:20;;;;;;;;;;;;;;;;;;48486:66;48503:4;48518:13;;;;;;;;;;;48534:17;48486:8;:66::i;:::-;48385:175:::0;:::o;23293:161::-;23369:45;23385:7;23394:12;:10;:12::i;:::-;23408:5;23369:15;:45::i;:::-;23425:21;23431:7;23440:5;23425;:21::i;:::-;23293:161;;:::o;37145:47::-;37188:4;37145:47;:::o;25131:87::-;25177:7;25204:6;;;;;;;;;;;25197:13;;25131:87;:::o;37731:43::-;37769:5;37731:43;:::o;38237:66::-;;;;;;;;;;;;;:::o;13196:95::-;13243:13;13276:7;13269:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13196:95;:::o;45527:272::-;45584:17;45603:16;45621:18;37696:1;45660:12;;:3;:12;;;45652:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;45695:19;45717:12;45730:3;45717:17;;;;;;;;;:::i;:::-;;;;;45695:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45753:1;:11;;;45766:1;:10;;;45778:1;:12;;;45745:46;;;;;;;45527:272;;;;;:::o;36757:85::-;36800:42;36757:85;:::o;37794:41::-;37829:6;37794:41;:::o;37665:32::-;37696:1;37665:32;:::o;14517:182::-;14586:4;14603:13;14619:12;:10;:12::i;:::-;14603:28;;14642:27;14652:5;14659:2;14663:5;14642:9;:27::i;:::-;14687:4;14680:11;;;14517:182;;;;:::o;42846:369::-;42896:7;42916:16;42935:50;36708:42;36800;42935:15;:50::i;:::-;42916:69;;42996:19;43018:47;36986:42;36708;43018:15;:47::i;:::-;42996:69;;43076:17;43096:45;43120:4;36986:42;43096:15;:45::i;:::-;43076:65;;43203:4;43191:9;43184:4;43170:11;43159:8;:22;;;;:::i;:::-;:29;;;;:::i;:::-;:41;;;;:::i;:::-;:48;;;;:::i;:::-;43152:55;;;;;42846:369;:::o;38090:36::-;;;;:::o;36666:84::-;36708:42;36666:84;:::o;37222:47::-;37264:5;37222:47;:::o;36946:82::-;36986:42;36946:82;:::o;41261:1399::-;29231:21;:19;:21::i;:::-;41326:14:::1;;;;;;;;;;;41318:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;37829:6;41393:20;;41375:15;:38;;;;:::i;:::-;:49;41367:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37829:6;::::0;41476:15:::1;:26;;;;:::i;:::-;:37;;;;:::i;:::-;41453:20;:60;;;;41524:15;41542:19;41552:8;;;;;;;;;;;41542:9;:19::i;:::-;41524:37;;41590:1;41580:7;:11;41572:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;41619:9;41631:3;41619:15;;41658:14;41648:7;:24;41645:377;;;41693:3;41689:7;;41645:377;;;41727:14;41717:7;:24;41714:308;;;41762:3;41758:7;;41714:308;;;41796:14;41786:7;:24;41783:239;;;41831:3;41827:7;;41783:239;;;41865:13;41855:7;:23;41852:170;;;41899:3;41895:7;;41852:170;;;41933:13;41923:7;:23;41920:102;;;41967:3;41963:7;;41920:102;;;42007:3;42003:7;;41920:102;41852:170;41783:239;41714:308;41645:377;37315:5;42052:1;42042:7;:11;;;;:::i;:::-;:26;;;;:::i;:::-;42032:36;;42079:17;42099:14;;42079:34;;42139:4;42127:9;:16;42124:151;;;42172:4;42160:16;;42124:151;;;37315:5;42243;42226:14;;:22;;;;:::i;:::-;:37;;;;:::i;:::-;42209:14;:54;;;;42124:151;42285:25;37315:5;42325:7;42313:9;:19;;;;:::i;:::-;:34;;;;:::i;:::-;42285:62;;42358:19;42390:17;42380:7;:27;;;;:::i;:::-;42358:49;;42418:51;42432:8;;;;;;;;;;;36652:6;42457:11;42418:13;:51::i;:::-;42480:62;42494:8;;;;;;;;;;;42504:18;;;;;;;;;;;42524:17;42480:13;:62::i;:::-;42566:8;;;;;;;;;;;42553:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42598:54;42611:7;42620:20;;42642:9;42598:54;;;;;;;;:::i;:::-;;;;;;;;41307:1353;;;;;29275:20:::0;:18;:20::i;:::-;41261:1399::o;46744:1342::-;46803:17;46822:14;46861:1;46849:13;;46884:1;46873:12;;46896:14;46913:17;46896:34;;46941:14;37769:5;46999:1;37696;46990:10;;;;:::i;:::-;46989:26;;;;;;:::i;:::-;46958:28;46970:15;46958:11;:28::i;:::-;:57;;;;:::i;:::-;46941:74;;47052:13;47080:18;47113:17;47151:1;47133:15;:19;;;;:::i;:::-;47113:39;;47178:7;47173:513;37696:1;47191:10;;:1;:10;;;47173:513;;;47256:1;47227:12;47240:1;47227:15;;;;;;;;;:::i;:::-;;;;;:26;;;:30;:69;;;;;47290:6;47261:12;47274:1;47261:15;;;;;;;;;:::i;:::-;;;;;:25;;;:35;;47227:69;47223:452;;;47317:7;;;;;:::i;:::-;;;;47374:6;47347:12;47360:1;47347:15;;;;;;;;;:::i;:::-;;;;;:24;;;:33;47343:115;;;47414:12;47427:1;47414:15;;;;;;;;;:::i;:::-;;;;;:24;;;47405:33;;47343:115;47507:9;47479:12;47492:1;47479:15;;;;;;;;;:::i;:::-;;;;;:25;;;:37;47476:184;;;47554:12;47567:1;47554:15;;;;;;;;;:::i;:::-;;;;;:26;;;47541:39;;47615:12;47628:1;47615:15;;;;;;;;;:::i;:::-;;;;;:25;;;47603:37;;47476:184;47223:452;47203:3;;;;;;;47173:513;;;;47708:1;47700:5;:9;:27;;;;;47726:1;47713:10;:14;47700:27;47696:344;;;47757:10;47747:6;:20;47744:285;;47799:1;47788:12;;47870:10;37315:5;47841:10;47832:6;:19;;;;:::i;:::-;47831:36;;;;:::i;:::-;:49;;;;:::i;:::-;47819:61;;47744:285;;;47932:1;47921:12;;48003:10;37315:5;47978:6;47965:10;:19;;;;:::i;:::-;47964:36;;;;:::i;:::-;:49;;;;:::i;:::-;47952:61;;47744:285;47696:344;48050:28;;;;;46744:1342;;:::o;37035:79::-;;;;;;;;;;;;;:::o;38194:34::-;;;;;;;;;;;;;:::o;36534:24::-;;;;:::o;39127:156::-;25017:13;:11;:13::i;:::-;29231:21:::1;:19;:21::i;:::-;39244:5:::2;39238:20;;;39259:7;39268:6;39238:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29275:20:::1;:18;:20::i;:::-;39127:156:::0;;;:::o;43221:547::-;43299:7;43319:12;43350:13;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43334:48;;;43383:6;43391;43334:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43319:79;;43410:10;43422;43450:4;43437:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43409:60;;;;;43489:1;43483:2;:7;;;:18;;;;43500:1;43494:2;:7;;;43483:18;43480:58;;;43525:1;43518:8;;;;;;;43480:58;43550:10;43576:4;43563:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43550:40;;43615:2;43605:12;;:6;:12;;;43601:160;;43672:2;43664:11;;43656:4;43650:2;43642:11;;:18;;;;:::i;:::-;43641:34;;;;:::i;:::-;43634:41;;;;;;;;43601:160;43746:2;43738:11;;43730:4;43724:2;43716:11;;:18;;;;:::i;:::-;43715:34;;;;:::i;:::-;43708:41;;;;;;43221:547;;;;;:::o;14735:142::-;14815:7;14842:11;:18;14854:5;14842:18;;;;;;;;;;;;;;;:27;14861:7;14842:27;;;;;;;;;;;;;;;;14835:34;;14735:142;;;;:::o;38150:36::-;;;;;;;;;;;;;:::o;26064:220::-;25017:13;:11;:13::i;:::-;26169:1:::1;26149:22;;:8;:22;;::::0;26145:93:::1;;26223:1;26195:31;;;;;;;;;;;:::i;:::-;;;;;;;;26145:93;26248:28;26267:8;26248:18;:28::i;:::-;26064:220:::0;:::o;36604:55::-;36652:6;36604:55;:::o;36849:90::-;36897:42;36849:90;:::o;37932:22::-;;;;;;;;;;;;;:::o;48568:131::-;25017:13;:11;:13::i;:::-;48673:18:::1;48653:17;;:38;;;;;;;;;;;;;;;;;;48568:131:::0;:::o;29311:315::-;28609:1;29440:7;;:18;29436:88;;29482:30;;;;;;;;;;;;;;29436:88;28609:1;29601:7;:17;;;;29311:315::o;42715:123::-;42771:7;37769:5;;42799:2;:16;;;;:::i;:::-;42798:32;;;;:::i;:::-;42791:39;;42715:123;;;:::o;29634:212::-;28566:1;29817:7;:21;;;;29634:212::o;25296:166::-;25367:12;:10;:12::i;:::-;25356:23;;:7;:5;:7::i;:::-;:23;;;25352:103;;25430:12;:10;:12::i;:::-;25403:40;;;;;;;;;;;:::i;:::-;;;;;;;;25352:103;25296:166::o;4305:98::-;4358:7;4385:10;4378:17;;4305:98;:::o;20055:130::-;20140:37;20149:5;20156:7;20165:5;20172:4;20140:8;:37::i;:::-;20055:130;;;:::o;21787:486::-;21887:24;21914:25;21924:5;21931:7;21914:9;:25::i;:::-;21887:52;;21973:17;21954:16;:36;21950:316;;;22030:5;22011:16;:24;22007:132;;;22090:7;22099:16;22117:5;22063:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;22007:132;22182:57;22191:5;22198:7;22226:5;22207:16;:24;22233:5;22182:8;:57::i;:::-;21950:316;21876:397;21787:486;;;:::o;16630:308::-;16730:1;16714:18;;:4;:18;;;16710:88;;16783:1;16756:30;;;;;;;;;;;:::i;:::-;;;;;;;;16710:88;16826:1;16812:16;;:2;:16;;;16808:88;;16881:1;16852:32;;;;;;;;;;;:::i;:::-;;;;;;;;16808:88;16906:24;16914:4;16920:2;16924:5;16906:7;:24::i;:::-;16630:308;;;:::o;19291:211::-;19381:1;19362:21;;:7;:21;;;19358:91;;19434:1;19407:30;;;;;;;;;;;:::i;:::-;;;;;;;;19358:91;19459:35;19467:7;19484:1;19488:5;19459:7;:35::i;:::-;19291:211;;:::o;26444:191::-;26518:16;26537:6;;;;;;;;;;;26518:25;;26563:8;26554:6;;:17;;;;;;;;;;;;;;;;;;26618:8;26587:40;;26608:8;26587:40;;;;;;;;;;;;26507:128;26444:191;:::o;17262:1135::-;17368:1;17352:18;;:4;:18;;;17348:552;;17506:5;17490:12;;:21;;;;;;;:::i;:::-;;;;;;;;17348:552;;;17544:19;17566:9;:15;17576:4;17566:15;;;;;;;;;;;;;;;;17544:37;;17614:5;17600:11;:19;17596:117;;;17672:4;17678:11;17691:5;17647:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;17596:117;17868:5;17854:11;:19;17836:9;:15;17846:4;17836:15;;;;;;;;;;;;;;;:37;;;;17529:371;17348:552;17930:1;17916:16;;:2;:16;;;17912:435;;18098:5;18082:12;;:21;;;;;;;;;;;17912:435;;;18315:5;18298:9;:13;18308:2;18298:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;17912:435;18379:2;18364:25;;18373:4;18364:25;;;18383:5;18364:25;;;;;;:::i;:::-;;;;;;;;17262:1135;;;:::o;21052:443::-;21182:1;21165:19;;:5;:19;;;21161:91;;21237:1;21208:32;;;;;;;;;;;:::i;:::-;;;;;;;;21161:91;21285:1;21266:21;;:7;:21;;;21262:92;;21339:1;21311:31;;;;;;;;;;;:::i;:::-;;;;;;;;21262:92;21394:5;21364:11;:18;21376:5;21364:18;;;;;;;;;;;;;;;:27;21383:7;21364:27;;;;;;;;;;;;;;;:35;;;;21414:9;21410:78;;;21461:7;21445:31;;21454:5;21445:31;;;21470:5;21445:31;;;;;;:::i;:::-;;;;;;;;21410:78;21052:443;;;;:::o;39464:1494::-;39602:1;39586:18;;:4;:18;;;;:39;;;;;39608:17;;;;;;;;;;;39586:39;:61;;;;;39630:11;:17;39642:4;39630:17;;;;;;;;;;;;;;;;;;;;;;;;;39629:18;39586:61;:81;;;;;39652:11;:15;39664:2;39652:15;;;;;;;;;;;;;;;;;;;;;;;;;39651:16;39586:81;39583:130;;;39684:17;:15;:17::i;:::-;39583:130;39742:1;39726:18;;:4;:18;;;;:44;;;;;39768:1;39748:22;;:8;;;;;;;;;;;:22;;;;39726:44;:64;;;;;39782:8;;;;;;;;;;;39774:16;;:4;:16;;;39726:64;:82;;;;;39800:8;;;;;;;;;;;39794:14;;:2;:14;;;;39726:82;:102;;;;;39813:11;:15;39825:2;39813:15;;;;;;;;;;;;;;;;;;;;;;;;;39812:16;39726:102;39723:1187;;;39846:41;39860:4;36652:6;39881:5;39846:13;:41::i;:::-;39910:1;39902:9;;39723:1187;;;39948:1;39932:18;;:4;:18;;;;:44;;;;;39974:1;39954:22;;:8;;;;;;;;;;;:22;;;;39932:44;:62;;;;;39986:8;;;;;;;;;;;39980:14;;:2;:14;;;39932:62;:82;;;;;40006:8;;;;;;;;;;;39998:16;;:4;:16;;;;39932:82;:104;;;;;40019:11;:17;40031:4;40019:17;;;;;;;;;;;;;;;;;;;;;;;;;40018:18;39932:104;39929:981;;;40080:17;37315:5;37188:4;40100:5;:24;;;;:::i;:::-;:39;;;;:::i;:::-;40080:59;;40154:17;40186:1;40174:9;:13;;;;:::i;:::-;40154:33;;40202:45;40216:4;36652:6;40237:9;40202:13;:45::i;:::-;40262:61;40276:4;40282:17;;;;;;;;;;;40313:9;40301;:21;;;;:::i;:::-;40262:13;:61::i;:::-;40366:17;;;;;;;;;;;40363:503;;;40405:15;40422:14;40440:28;:26;:28::i;:::-;40404:64;;;;40501:1;40490:8;:12;;;40487:364;;;40527:18;37315:5;40566:1;40556:7;40548:5;:15;;;;:::i;:::-;:19;;;;:::i;:::-;:34;;;;:::i;:::-;40527:55;;40633:5;40621:9;40608:10;:22;;;;:::i;:::-;:30;40605:116;;;40688:9;40680:5;:17;;;;:::i;:::-;40667:30;;40605:116;40743:46;40757:4;36652:6;40778:10;40743:13;:46::i;:::-;40821:10;40812:19;;;;;:::i;:::-;;;40504:347;40487:364;40385:481;;40363:503;40889:9;40880:18;;;;;:::i;:::-;;;40038:872;;39929:981;39723:1187;40920:30;40934:4;40940:2;40944:5;40920:13;:30::i;:::-;39464:1494;;;:::o;88:117:1:-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;457:117;566:1;563;556:12;580:117;689:1;686;679:12;720:568;793:8;803:6;853:3;846:4;838:6;834:17;830:27;820:122;;861:79;;:::i;:::-;820:122;974:6;961:20;951:30;;1004:18;996:6;993:30;990:117;;;1026:79;;:::i;:::-;990:117;1140:4;1132:6;1128:17;1116:29;;1194:3;1186:4;1178:6;1174:17;1164:8;1160:32;1157:41;1154:128;;;1201:79;;:::i;:::-;1154:128;720:568;;;;;:::o;1294:90::-;1328:7;1371:5;1364:13;1357:21;1346:32;;1294:90;;;:::o;1390:116::-;1460:21;1475:5;1460:21;:::i;:::-;1453:5;1450:32;1440:60;;1496:1;1493;1486:12;1440:60;1390:116;:::o;1512:133::-;1555:5;1593:6;1580:20;1571:29;;1609:30;1633:5;1609:30;:::i;:::-;1512:133;;;;:::o;1651:698::-;1743:6;1751;1759;1808:2;1796:9;1787:7;1783:23;1779:32;1776:119;;;1814:79;;:::i;:::-;1776:119;1962:1;1951:9;1947:17;1934:31;1992:18;1984:6;1981:30;1978:117;;;2014:79;;:::i;:::-;1978:117;2127:80;2199:7;2190:6;2179:9;2175:22;2127:80;:::i;:::-;2109:98;;;;1905:312;2256:2;2282:50;2324:7;2315:6;2304:9;2300:22;2282:50;:::i;:::-;2272:60;;2227:115;1651:698;;;;;:::o;2355:99::-;2407:6;2441:5;2435:12;2425:22;;2355:99;;;:::o;2460:169::-;2544:11;2578:6;2573:3;2566:19;2618:4;2613:3;2609:14;2594:29;;2460:169;;;;:::o;2635:246::-;2716:1;2726:113;2740:6;2737:1;2734:13;2726:113;;;2825:1;2820:3;2816:11;2810:18;2806:1;2801:3;2797:11;2790:39;2762:2;2759:1;2755:10;2750:15;;2726:113;;;2873:1;2864:6;2859:3;2855:16;2848:27;2697:184;2635:246;;;:::o;2887:102::-;2928:6;2979:2;2975:7;2970:2;2963:5;2959:14;2955:28;2945:38;;2887:102;;;:::o;2995:377::-;3083:3;3111:39;3144:5;3111:39;:::i;:::-;3166:71;3230:6;3225:3;3166:71;:::i;:::-;3159:78;;3246:65;3304:6;3299:3;3292:4;3285:5;3281:16;3246:65;:::i;:::-;3336:29;3358:6;3336:29;:::i;:::-;3331:3;3327:39;3320:46;;3087:285;2995:377;;;;:::o;3378:313::-;3491:4;3529:2;3518:9;3514:18;3506:26;;3578:9;3572:4;3568:20;3564:1;3553:9;3549:17;3542:47;3606:78;3679:4;3670:6;3606:78;:::i;:::-;3598:86;;3378:313;;;;:::o;3697:126::-;3734:7;3774:42;3767:5;3763:54;3752:65;;3697:126;;;:::o;3829:96::-;3866:7;3895:24;3913:5;3895:24;:::i;:::-;3884:35;;3829:96;;;:::o;3931:122::-;4004:24;4022:5;4004:24;:::i;:::-;3997:5;3994:35;3984:63;;4043:1;4040;4033:12;3984:63;3931:122;:::o;4059:139::-;4105:5;4143:6;4130:20;4121:29;;4159:33;4186:5;4159:33;:::i;:::-;4059:139;;;;:::o;4204:77::-;4241:7;4270:5;4259:16;;4204:77;;;:::o;4287:122::-;4360:24;4378:5;4360:24;:::i;:::-;4353:5;4350:35;4340:63;;4399:1;4396;4389:12;4340:63;4287:122;:::o;4415:139::-;4461:5;4499:6;4486:20;4477:29;;4515:33;4542:5;4515:33;:::i;:::-;4415:139;;;;:::o;4560:474::-;4628:6;4636;4685:2;4673:9;4664:7;4660:23;4656:32;4653:119;;;4691:79;;:::i;:::-;4653:119;4811:1;4836:53;4881:7;4872:6;4861:9;4857:22;4836:53;:::i;:::-;4826:63;;4782:117;4938:2;4964:53;5009:7;5000:6;4989:9;4985:22;4964:53;:::i;:::-;4954:63;;4909:118;4560:474;;;;;:::o;5040:109::-;5121:21;5136:5;5121:21;:::i;:::-;5116:3;5109:34;5040:109;;:::o;5155:210::-;5242:4;5280:2;5269:9;5265:18;5257:26;;5293:65;5355:1;5344:9;5340:17;5331:6;5293:65;:::i;:::-;5155:210;;;;:::o;5371:329::-;5430:6;5479:2;5467:9;5458:7;5454:23;5450:32;5447:119;;;5485:79;;:::i;:::-;5447:119;5605:1;5630:53;5675:7;5666:6;5655:9;5651:22;5630:53;:::i;:::-;5620:63;;5576:117;5371:329;;;;:::o;5706:118::-;5793:24;5811:5;5793:24;:::i;:::-;5788:3;5781:37;5706:118;;:::o;5830:222::-;5923:4;5961:2;5950:9;5946:18;5938:26;;5974:71;6042:1;6031:9;6027:17;6018:6;5974:71;:::i;:::-;5830:222;;;;:::o;6058:619::-;6135:6;6143;6151;6200:2;6188:9;6179:7;6175:23;6171:32;6168:119;;;6206:79;;:::i;:::-;6168:119;6326:1;6351:53;6396:7;6387:6;6376:9;6372:22;6351:53;:::i;:::-;6341:63;;6297:117;6453:2;6479:53;6524:7;6515:6;6504:9;6500:22;6479:53;:::i;:::-;6469:63;;6424:118;6581:2;6607:53;6652:7;6643:6;6632:9;6628:22;6607:53;:::i;:::-;6597:63;;6552:118;6058:619;;;;;:::o;6683:118::-;6770:24;6788:5;6770:24;:::i;:::-;6765:3;6758:37;6683:118;;:::o;6807:222::-;6900:4;6938:2;6927:9;6923:18;6915:26;;6951:71;7019:1;7008:9;7004:17;6995:6;6951:71;:::i;:::-;6807:222;;;;:::o;7035:86::-;7070:7;7110:4;7103:5;7099:16;7088:27;;7035:86;;;:::o;7127:112::-;7210:22;7226:5;7210:22;:::i;:::-;7205:3;7198:35;7127:112;;:::o;7245:214::-;7334:4;7372:2;7361:9;7357:18;7349:26;;7385:67;7449:1;7438:9;7434:17;7425:6;7385:67;:::i;:::-;7245:214;;;;:::o;7465:329::-;7524:6;7573:2;7561:9;7552:7;7548:23;7544:32;7541:119;;;7579:79;;:::i;:::-;7541:119;7699:1;7724:53;7769:7;7760:6;7749:9;7745:22;7724:53;:::i;:::-;7714:63;;7670:117;7465:329;;;;:::o;7800:332::-;7921:4;7959:2;7948:9;7944:18;7936:26;;7972:71;8040:1;8029:9;8025:17;8016:6;7972:71;:::i;:::-;8053:72;8121:2;8110:9;8106:18;8097:6;8053:72;:::i;:::-;7800:332;;;;;:::o;8138:442::-;8287:4;8325:2;8314:9;8310:18;8302:26;;8338:71;8406:1;8395:9;8391:17;8382:6;8338:71;:::i;:::-;8419:72;8487:2;8476:9;8472:18;8463:6;8419:72;:::i;:::-;8501;8569:2;8558:9;8554:18;8545:6;8501:72;:::i;:::-;8138:442;;;;;;:::o;8586:323::-;8642:6;8691:2;8679:9;8670:7;8666:23;8662:32;8659:119;;;8697:79;;:::i;:::-;8659:119;8817:1;8842:50;8884:7;8875:6;8864:9;8860:22;8842:50;:::i;:::-;8832:60;;8788:114;8586:323;;;;:::o;8915:474::-;8983:6;8991;9040:2;9028:9;9019:7;9015:23;9011:32;9008:119;;;9046:79;;:::i;:::-;9008:119;9166:1;9191:53;9236:7;9227:6;9216:9;9212:22;9191:53;:::i;:::-;9181:63;;9137:117;9293:2;9319:53;9364:7;9355:6;9344:9;9340:22;9319:53;:::i;:::-;9309:63;;9264:118;8915:474;;;;;:::o;9395:118::-;9466:22;9482:5;9466:22;:::i;:::-;9459:5;9456:33;9446:61;;9503:1;9500;9493:12;9446:61;9395:118;:::o;9519:135::-;9563:5;9601:6;9588:20;9579:29;;9617:31;9642:5;9617:31;:::i;:::-;9519:135;;;;:::o;9660:325::-;9717:6;9766:2;9754:9;9745:7;9741:23;9737:32;9734:119;;;9772:79;;:::i;:::-;9734:119;9892:1;9917:51;9960:7;9951:6;9940:9;9936:22;9917:51;:::i;:::-;9907:61;;9863:115;9660:325;;;;:::o;9991:324::-;10108:4;10146:2;10135:9;10131:18;10123:26;;10159:71;10227:1;10216:9;10212:17;10203:6;10159:71;:::i;:::-;10240:68;10304:2;10293:9;10289:18;10280:6;10240:68;:::i;:::-;9991:324;;;;;:::o;10321:60::-;10349:3;10370:5;10363:12;;10321:60;;;:::o;10387:142::-;10437:9;10470:53;10488:34;10497:24;10515:5;10497:24;:::i;:::-;10488:34;:::i;:::-;10470:53;:::i;:::-;10457:66;;10387:142;;;:::o;10535:126::-;10585:9;10618:37;10649:5;10618:37;:::i;:::-;10605:50;;10535:126;;;:::o;10667:151::-;10742:9;10775:37;10806:5;10775:37;:::i;:::-;10762:50;;10667:151;;;:::o;10824:181::-;10936:62;10992:5;10936:62;:::i;:::-;10931:3;10924:75;10824:181;;:::o;11011:272::-;11129:4;11167:2;11156:9;11152:18;11144:26;;11180:96;11273:1;11262:9;11258:17;11249:6;11180:96;:::i;:::-;11011:272;;;;:::o;11289:180::-;11337:77;11334:1;11327:88;11434:4;11431:1;11424:15;11458:4;11455:1;11448:15;11475:320;11590:4;11628:2;11617:9;11613:18;11605:26;;11641:71;11709:1;11698:9;11694:17;11685:6;11641:71;:::i;:::-;11722:66;11784:2;11773:9;11769:18;11760:6;11722:66;:::i;:::-;11475:320;;;;;:::o;11801:180::-;11849:77;11846:1;11839:88;11946:4;11943:1;11936:15;11970:4;11967:1;11960:15;11987:191;12027:3;12046:20;12064:1;12046:20;:::i;:::-;12041:25;;12080:20;12098:1;12080:20;:::i;:::-;12075:25;;12123:1;12120;12116:9;12109:16;;12144:3;12141:1;12138:10;12135:36;;;12151:18;;:::i;:::-;12135:36;11987:191;;;;:::o;12184:180::-;12232:77;12229:1;12222:88;12329:4;12326:1;12319:15;12353:4;12350:1;12343:15;12370:176;12402:1;12419:20;12437:1;12419:20;:::i;:::-;12414:25;;12453:20;12471:1;12453:20;:::i;:::-;12448:25;;12492:1;12482:35;;12497:18;;:::i;:::-;12482:35;12538:1;12535;12531:9;12526:14;;12370:176;;;;:::o;12552:165::-;12692:17;12688:1;12680:6;12676:14;12669:41;12552:165;:::o;12723:366::-;12865:3;12886:67;12950:2;12945:3;12886:67;:::i;:::-;12879:74;;12962:93;13051:3;12962:93;:::i;:::-;13080:2;13075:3;13071:12;13064:19;;12723:366;;;:::o;13095:419::-;13261:4;13299:2;13288:9;13284:18;13276:26;;13348:9;13342:4;13338:20;13334:1;13323:9;13319:17;13312:47;13376:131;13502:4;13376:131;:::i;:::-;13368:139;;13095:419;;;:::o;13520:180::-;13568:77;13565:1;13558:88;13665:4;13662:1;13655:15;13689:4;13686:1;13679:15;13706:320;13750:6;13787:1;13781:4;13777:12;13767:22;;13834:1;13828:4;13824:12;13855:18;13845:81;;13911:4;13903:6;13899:17;13889:27;;13845:81;13973:2;13965:6;13962:14;13942:18;13939:38;13936:84;;13992:18;;:::i;:::-;13936:84;13757:269;13706:320;;;:::o;14032:191::-;14070:4;14090:18;14106:1;14090:18;:::i;:::-;14085:23;;14122:18;14138:1;14122:18;:::i;:::-;14117:23;;14164:1;14161;14157:9;14149:17;;14188:4;14182;14179:14;14176:40;;;14196:18;;:::i;:::-;14176:40;14032:191;;;;:::o;14229:410::-;14269:7;14292:20;14310:1;14292:20;:::i;:::-;14287:25;;14326:20;14344:1;14326:20;:::i;:::-;14321:25;;14381:1;14378;14374:9;14403:30;14421:11;14403:30;:::i;:::-;14392:41;;14582:1;14573:7;14569:15;14566:1;14563:22;14543:1;14536:9;14516:83;14493:139;;14612:18;;:::i;:::-;14493:139;14277:362;14229:410;;;;:::o;14645:194::-;14685:4;14705:20;14723:1;14705:20;:::i;:::-;14700:25;;14739:20;14757:1;14739:20;:::i;:::-;14734:25;;14783:1;14780;14776:9;14768:17;;14807:1;14801:4;14798:11;14795:37;;;14812:18;;:::i;:::-;14795:37;14645:194;;;;:::o;14845:233::-;14884:3;14907:24;14925:5;14907:24;:::i;:::-;14898:33;;14953:66;14946:5;14943:77;14940:103;;15023:18;;:::i;:::-;14940:103;15070:1;15063:5;15059:13;15052:20;;14845:233;;;:::o;15084:185::-;15124:1;15141:20;15159:1;15141:20;:::i;:::-;15136:25;;15175:20;15193:1;15175:20;:::i;:::-;15170:25;;15214:1;15204:35;;15219:18;;:::i;:::-;15204:35;15261:1;15258;15254:9;15249:14;;15084:185;;;;:::o;15275:157::-;15415:9;15411:1;15403:6;15399:14;15392:33;15275:157;:::o;15438:365::-;15580:3;15601:66;15665:1;15660:3;15601:66;:::i;:::-;15594:73;;15676:93;15765:3;15676:93;:::i;:::-;15794:2;15789:3;15785:12;15778:19;;15438:365;;;:::o;15809:419::-;15975:4;16013:2;16002:9;15998:18;15990:26;;16062:9;16056:4;16052:20;16048:1;16037:9;16033:17;16026:47;16090:131;16216:4;16090:131;:::i;:::-;16082:139;;15809:419;;;:::o;16234:161::-;16374:13;16370:1;16362:6;16358:14;16351:37;16234:161;:::o;16401:366::-;16543:3;16564:67;16628:2;16623:3;16564:67;:::i;:::-;16557:74;;16640:93;16729:3;16640:93;:::i;:::-;16758:2;16753:3;16749:12;16742:19;;16401:366;;;:::o;16773:419::-;16939:4;16977:2;16966:9;16962:18;16954:26;;17026:9;17020:4;17016:20;17012:1;17001:9;16997:17;16990:47;17054:131;17180:4;17054:131;:::i;:::-;17046:139;;16773:419;;;:::o;17198:162::-;17338:14;17334:1;17326:6;17322:14;17315:38;17198:162;:::o;17366:366::-;17508:3;17529:67;17593:2;17588:3;17529:67;:::i;:::-;17522:74;;17605:93;17694:3;17605:93;:::i;:::-;17723:2;17718:3;17714:12;17707:19;;17366:366;;;:::o;17738:419::-;17904:4;17942:2;17931:9;17927:18;17919:26;;17991:9;17985:4;17981:20;17977:1;17966:9;17962:17;17955:47;18019:131;18145:4;18019:131;:::i;:::-;18011:139;;17738:419;;;:::o;18163:332::-;18284:4;18322:2;18311:9;18307:18;18299:26;;18335:71;18403:1;18392:9;18388:17;18379:6;18335:71;:::i;:::-;18416:72;18484:2;18473:9;18469:18;18460:6;18416:72;:::i;:::-;18163:332;;;;;:::o;18501:137::-;18555:5;18586:6;18580:13;18571:22;;18602:30;18626:5;18602:30;:::i;:::-;18501:137;;;;:::o;18644:345::-;18711:6;18760:2;18748:9;18739:7;18735:23;18731:32;18728:119;;;18766:79;;:::i;:::-;18728:119;18886:1;18911:61;18964:7;18955:6;18944:9;18940:22;18911:61;:::i;:::-;18901:71;;18857:125;18644:345;;;;:::o;18995:143::-;19052:5;19083:6;19077:13;19068:22;;19099:33;19126:5;19099:33;:::i;:::-;18995:143;;;;:::o;19144:351::-;19214:6;19263:2;19251:9;19242:7;19238:23;19234:32;19231:119;;;19269:79;;:::i;:::-;19231:119;19389:1;19414:64;19470:7;19461:6;19450:9;19446:22;19414:64;:::i;:::-;19404:74;;19360:128;19144:351;;;;:::o;19501:332::-;19622:4;19660:2;19649:9;19645:18;19637:26;;19673:71;19741:1;19730:9;19726:17;19717:6;19673:71;:::i;:::-;19754:72;19822:2;19811:9;19807:18;19798:6;19754:72;:::i;:::-;19501:332;;;;;:::o;19839:114::-;19876:7;19916:30;19909:5;19905:42;19894:53;;19839:114;;;:::o;19959:122::-;20032:24;20050:5;20032:24;:::i;:::-;20025:5;20022:35;20012:63;;20071:1;20068;20061:12;20012:63;19959:122;:::o;20087:143::-;20144:5;20175:6;20169:13;20160:22;;20191:33;20218:5;20191:33;:::i;:::-;20087:143;;;;:::o;20236:93::-;20272:7;20312:10;20305:5;20301:22;20290:33;;20236:93;;;:::o;20335:120::-;20407:23;20424:5;20407:23;:::i;:::-;20400:5;20397:34;20387:62;;20445:1;20442;20435:12;20387:62;20335:120;:::o;20461:141::-;20517:5;20548:6;20542:13;20533:22;;20564:32;20590:5;20564:32;:::i;:::-;20461:141;;;;:::o;20608:661::-;20695:6;20703;20711;20760:2;20748:9;20739:7;20735:23;20731:32;20728:119;;;20766:79;;:::i;:::-;20728:119;20886:1;20911:64;20967:7;20958:6;20947:9;20943:22;20911:64;:::i;:::-;20901:74;;20857:128;21024:2;21050:64;21106:7;21097:6;21086:9;21082:22;21050:64;:::i;:::-;21040:74;;20995:129;21163:2;21189:63;21244:7;21235:6;21224:9;21220:22;21189:63;:::i;:::-;21179:73;;21134:128;20608:661;;;;;:::o;21275:442::-;21424:4;21462:2;21451:9;21447:18;21439:26;;21475:71;21543:1;21532:9;21528:17;21519:6;21475:71;:::i;:::-;21556:72;21624:2;21613:9;21609:18;21600:6;21556:72;:::i;:::-;21638;21706:2;21695:9;21691:18;21682:6;21638:72;:::i;:::-;21275:442;;;;;;:::o

Swarm Source

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