POL Price: $0.573365 (-3.12%)
 

Overview

Max Total Supply

100,000,000,000 DEAR

Holders

3,239 (0.00%)

Total Transfers

-

Market

Price

$0.00 @ 0.000000 POL

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

OVERVIEW

DEAR Protocol is a decentralized marketplace leveraging blockchain technology for secure, transparent transactions. Operating on Ethereum and Matic chains, it allows global crypto payments, overcoming borders for service sales. Our goal is to innovate e-commerce, ensuring trust and efficiency.

Contract Source Code Verified (Exact Match)

Contract Name:
DEARToken

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2024-07-26
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

        emit Transfer(from, to, value);
    }

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

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

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

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

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

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

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * ==== Security Considerations
 *
 * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
 * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
 * considered as an intention to spend the allowance in any specific way. The second is that because permits have
 * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
 * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
 * generally recommended is:
 *
 * ```solidity
 * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
 *     try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
 *     doThing(..., value);
 * }
 *
 * function doThing(..., uint256 value) public {
 *     token.safeTransferFrom(msg.sender, address(this), value);
 *     ...
 * }
 * ```
 *
 * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
 * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
 * {SafeERC20-safeTransferFrom}).
 *
 * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
 * contracts should have entry points that don't rely on permit.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     *
     * CAUTION: See Security Considerations above.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS
    }

    /**
     * @dev The signature derives the `address(0)`.
     */
    error ECDSAInvalidSignature();

    /**
     * @dev The signature has an invalid length.
     */
    error ECDSAInvalidSignatureLength(uint256 length);

    /**
     * @dev The signature has an S value that is in the upper half order.
     */
    error ECDSAInvalidSignatureS(bytes32 s);

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not
     * return address(0) without also returning an error description. Errors are documented using an enum (error type)
     * and a bytes32 providing additional information about the error.
     *
     * If no error is returned, then the address can be used for verification purposes.
     *
     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     */
    function tryRecover(bytes32 hash, bytes memory signature)
        internal
        pure
        returns (
            address,
            RecoverError,
            bytes32
        )
    {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (
                address(0),
                RecoverError.InvalidSignatureLength,
                bytes32(signature.length)
            );
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature)
        internal
        pure
        returns (address)
    {
        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(
            hash,
            signature
        );
        _throwError(error, errorArg);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    )
        internal
        pure
        returns (
            address,
            RecoverError,
            bytes32
        )
    {
        unchecked {
            bytes32 s = vs &
                bytes32(
                    0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
                );
            // We do not check for an overflow here since the shift operation results in 0 or 1.
            uint8 v = uint8((uint256(vs) >> 255) + 27);
            return tryRecover(hash, v, r, s);
        }
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(
            hash,
            r,
            vs
        );
        _throwError(error, errorArg);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    )
        internal
        pure
        returns (
            address,
            RecoverError,
            bytes32
        )
    {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (
            uint256(s) >
            0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0
        ) {
            return (address(0), RecoverError.InvalidSignatureS, s);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature, bytes32(0));
        }

        return (signer, RecoverError.NoError, bytes32(0));
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(
            hash,
            v,
            r,
            s
        );
        _throwError(error, errorArg);
        return recovered;
    }

    /**
     * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.
     */
    function _throwError(RecoverError error, bytes32 errorArg) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert ECDSAInvalidSignature();
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert ECDSAInvalidSignatureLength(uint256(errorArg));
        } else if (error == RecoverError.InvalidSignatureS) {
            revert ECDSAInvalidSignatureS(errorArg);
        }
    }
}

// File: @openzeppelin/contracts/utils/math/Math.sol

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Muldiv operation overflow.
     */
    error MathOverflowedMulDiv();

    enum Rounding {
        Floor, // Toward negative infinity
        Ceil, // Toward positive infinity
        Trunc, // Toward zero
        Expand // Away from zero
    }

    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     */
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     */
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     */
    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     */
    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds towards infinity instead
     * of rounding towards zero.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        if (b == 0) {
            // Guarantee the same behavior as in a regular Solidity division.
            return a / b;
        }

        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or
     * denominator == 0.
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by
     * Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0 = x * y; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            if (denominator <= prod1) {
                revert MathOverflowedMulDiv();
            }

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.
            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.

            uint256 twos = denominator & (0 - denominator);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also
            // works in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded
     * towards zero.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding)
        internal
        pure
        returns (uint256)
    {
        unchecked {
            uint256 result = sqrt(a);
            return
                result +
                (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding)
        internal
        pure
        returns (uint256)
    {
        unchecked {
            uint256 result = log2(value);
            return
                result +
                (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding)
        internal
        pure
        returns (uint256)
    {
        unchecked {
            uint256 result = log10(value);
            return
                result +
                (unsignedRoundsUp(rounding) && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding)
        internal
        pure
        returns (uint256)
    {
        unchecked {
            uint256 result = log256(value);
            return
                result +
                (
                    unsignedRoundsUp(rounding) && 1 << (result << 3) < value
                        ? 1
                        : 0
                );
        }
    }

    /**
     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
     */
    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
        return uint8(rounding) % 2 == 1;
    }
}

// File: @openzeppelin/contracts/utils/math/SignedMath.sol

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

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

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant HEX_DIGITS = "0123456789abcdef";
    uint8 private constant ADDRESS_LENGTH = 20;

    /**
     * @dev The `value` string doesn't fit in the specified `length`.
     */
    error StringsInsufficientHexLength(uint256 value, uint256 length);

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toStringSigned(int256 value)
        internal
        pure
        returns (string memory)
    {
        return
            string.concat(
                value < 0 ? "-" : "",
                toString(SignedMath.abs(value))
            );
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length)
        internal
        pure
        returns (string memory)
    {
        uint256 localValue = value;
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = HEX_DIGITS[localValue & 0xf];
            localValue >>= 4;
        }
        if (localValue != 0) {
            revert StringsInsufficientHexLength(value, length);
        }
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal
     * representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b)
        internal
        pure
        returns (bool)
    {
        return
            bytes(a).length == bytes(b).length &&
            keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

// File: @openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol

/**
 * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.
 *
 * The library provides methods for generating a hash of a message that conforms to the
 * https://eips.ethereum.org/EIPS/eip-191[EIP 191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]
 * specifications.
 */
library MessageHashUtils {
    /**
     * @dev Returns the keccak256 digest of an EIP-191 signed data with version
     * `0x45` (`personal_sign` messages).
     *
     * The digest is calculated by prefixing a bytes32 `messageHash` with
     * `"\x19Ethereum Signed Message:\n32"` and hashing the result. It corresponds with the
     * hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.
     *
     * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with
     * keccak256, although any bytes32 value can be safely used because the final digest will
     * be re-hashed.
     *
     * See {ECDSA-recover}.
     */
    function toEthSignedMessageHash(bytes32 messageHash)
        internal
        pure
        returns (bytes32 digest)
    {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, "\x19Ethereum Signed Message:\n32") // 32 is the bytes-length of messageHash
            mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix
            digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)
        }
    }

    /**
     * @dev Returns the keccak256 digest of an EIP-191 signed data with version
     * `0x45` (`personal_sign` messages).
     *
     * The digest is calculated by prefixing an arbitrary `message` with
     * `"\x19Ethereum Signed Message:\n" + len(message)` and hashing the result. It corresponds with the
     * hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.
     *
     * See {ECDSA-recover}.
     */
    function toEthSignedMessageHash(bytes memory message)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                bytes.concat(
                    "\x19Ethereum Signed Message:\n",
                    bytes(Strings.toString(message.length)),
                    message
                )
            );
    }

    /**
     * @dev Returns the keccak256 digest of an EIP-191 signed data with version
     * `0x00` (data with intended validator).
     *
     * The digest is calculated by prefixing an arbitrary `data` with `"\x19\x00"` and the intended
     * `validator` address. Then hashing the result.
     *
     * See {ECDSA-recover}.
     */
    function toDataWithIntendedValidatorHash(
        address validator,
        bytes memory data
    ) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(hex"19_00", validator, data));
    }

    /**
     * @dev Returns the keccak256 digest of an EIP-712 typed data (EIP-191 version `0x01`).
     *
     * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with
     * `\x19\x01` and hashing the result. It corresponds to the hash signed by the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.
     *
     * See {ECDSA-recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash)
        internal
        pure
        returns (bytes32 digest)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, hex"19_01")
            mstore(add(ptr, 0x02), domainSeparator)
            mstore(add(ptr, 0x22), structHash)
            digest := keccak256(ptr, 0x42)
        }
    }
}

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

/**
 * @dev Library for reading and writing primitive types to specific storage slots.
 *
 * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
 * This library helps with reading and writing to such slots without the need for inline assembly.
 *
 * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
 *
 * Example usage to set ERC1967 implementation slot:
 * ```solidity
 * contract ERC1967 {
 *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
 *
 *     function _getImplementation() internal view returns (address) {
 *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
 *     }
 *
 *     function _setImplementation(address newImplementation) internal {
 *         require(newImplementation.code.length > 0);
 *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
 *     }
 * }
 * ```
 */
library StorageSlot {
    struct AddressSlot {
        address value;
    }

    struct BooleanSlot {
        bool value;
    }

    struct Bytes32Slot {
        bytes32 value;
    }

    struct Uint256Slot {
        uint256 value;
    }

    struct StringSlot {
        string value;
    }

    struct BytesSlot {
        bytes value;
    }

    /**
     * @dev Returns an `AddressSlot` with member `value` located at `slot`.
     */
    function getAddressSlot(bytes32 slot)
        internal
        pure
        returns (AddressSlot storage r)
    {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
     */
    function getBooleanSlot(bytes32 slot)
        internal
        pure
        returns (BooleanSlot storage r)
    {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
     */
    function getBytes32Slot(bytes32 slot)
        internal
        pure
        returns (Bytes32Slot storage r)
    {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
     */
    function getUint256Slot(bytes32 slot)
        internal
        pure
        returns (Uint256Slot storage r)
    {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `StringSlot` with member `value` located at `slot`.
     */
    function getStringSlot(bytes32 slot)
        internal
        pure
        returns (StringSlot storage r)
    {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `StringSlot` representation of the string storage pointer `store`.
     */
    function getStringSlot(string storage store)
        internal
        pure
        returns (StringSlot storage r)
    {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := store.slot
        }
    }

    /**
     * @dev Returns an `BytesSlot` with member `value` located at `slot`.
     */
    function getBytesSlot(bytes32 slot)
        internal
        pure
        returns (BytesSlot storage r)
    {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.
     */
    function getBytesSlot(bytes storage store)
        internal
        pure
        returns (BytesSlot storage r)
    {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := store.slot
        }
    }
}

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

// | string  | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA   |
// | length  | 0x                                                              BB |
type ShortString is bytes32;

/**
 * @dev This library provides functions to convert short memory strings
 * into a `ShortString` type that can be used as an immutable variable.
 *
 * Strings of arbitrary length can be optimized using this library if
 * they are short enough (up to 31 bytes) by packing them with their
 * length (1 byte) in a single EVM word (32 bytes). Additionally, a
 * fallback mechanism can be used for every other case.
 *
 * Usage example:
 *
 * ```solidity
 * contract Named {
 *     using ShortStrings for *;
 *
 *     ShortString private immutable _name;
 *     string private _nameFallback;
 *
 *     constructor(string memory contractName) {
 *         _name = contractName.toShortStringWithFallback(_nameFallback);
 *     }
 *
 *     function name() external view returns (string memory) {
 *         return _name.toStringWithFallback(_nameFallback);
 *     }
 * }
 * ```
 */
library ShortStrings {
    // Used as an identifier for strings longer than 31 bytes.
    bytes32 private constant FALLBACK_SENTINEL =
        0x00000000000000000000000000000000000000000000000000000000000000FF;

    error StringTooLong(string str);
    error InvalidShortString();

    /**
     * @dev Encode a string of at most 31 chars into a `ShortString`.
     *
     * This will trigger a `StringTooLong` error is the input string is too long.
     */
    function toShortString(string memory str)
        internal
        pure
        returns (ShortString)
    {
        bytes memory bstr = bytes(str);
        if (bstr.length > 31) {
            revert StringTooLong(str);
        }
        return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length));
    }

    /**
     * @dev Decode a `ShortString` back to a "normal" string.
     */
    function toString(ShortString sstr) internal pure returns (string memory) {
        uint256 len = byteLength(sstr);
        // using `new string(len)` would work locally but is not memory safe.
        string memory str = new string(32);
        /// @solidity memory-safe-assembly
        assembly {
            mstore(str, len)
            mstore(add(str, 0x20), sstr)
        }
        return str;
    }

    /**
     * @dev Return the length of a `ShortString`.
     */
    function byteLength(ShortString sstr) internal pure returns (uint256) {
        uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF;
        if (result > 31) {
            revert InvalidShortString();
        }
        return result;
    }

    /**
     * @dev Encode a string into a `ShortString`, or write it to storage if it is too long.
     */
    function toShortStringWithFallback(
        string memory value,
        string storage store
    ) internal returns (ShortString) {
        if (bytes(value).length < 32) {
            return toShortString(value);
        } else {
            StorageSlot.getStringSlot(store).value = value;
            return ShortString.wrap(FALLBACK_SENTINEL);
        }
    }

    /**
     * @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}.
     */
    function toStringWithFallback(ShortString value, string storage store)
        internal
        pure
        returns (string memory)
    {
        if (ShortString.unwrap(value) != FALLBACK_SENTINEL) {
            return toString(value);
        } else {
            return store;
        }
    }

    /**
     * @dev Return the length of a string that was encoded to `ShortString` or written to storage using
     * {setWithFallback}.
     *
     * WARNING: This will return the "byte length" of the string. This may not reflect the actual length in terms of
     * actual characters as the UTF-8 encoding of a single character can span over multiple bytes.
     */
    function byteLengthWithFallback(ShortString value, string storage store)
        internal
        view
        returns (uint256)
    {
        if (ShortString.unwrap(value) != FALLBACK_SENTINEL) {
            return byteLength(value);
        } else {
            return bytes(store).length;
        }
    }
}

// File: @openzeppelin/contracts/interfaces/IERC5267.sol

interface IERC5267 {
    /**
     * @dev MAY be emitted to signal that the domain could have changed.
     */
    event EIP712DomainChanged();

    /**
     * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712
     * signature.
     */
    function eip712Domain()
        external
        view
        returns (
            bytes1 fields,
            string memory name,
            string memory version,
            uint256 chainId,
            address verifyingContract,
            bytes32 salt,
            uint256[] memory extensions
        );
}

// File: @openzeppelin/contracts/utils/cryptography/EIP712.sol

/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose
 * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract
 * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to
 * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain
 * separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the
 * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.
 *
 * @custom:oz-upgrades-unsafe-allow state-variable-immutable
 */
abstract contract EIP712 is IERC5267 {
    using ShortStrings for *;

    bytes32 private constant TYPE_HASH =
        keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );

    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _cachedDomainSeparator;
    uint256 private immutable _cachedChainId;
    address private immutable _cachedThis;

    bytes32 private immutable _hashedName;
    bytes32 private immutable _hashedVersion;

    ShortString private immutable _name;
    ShortString private immutable _version;
    string private _nameFallback;
    string private _versionFallback;

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        _name = name.toShortStringWithFallback(_nameFallback);
        _version = version.toShortStringWithFallback(_versionFallback);
        _hashedName = keccak256(bytes(name));
        _hashedVersion = keccak256(bytes(version));

        _cachedChainId = block.chainid;
        _cachedDomainSeparator = _buildDomainSeparator();
        _cachedThis = address(this);
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _cachedThis && block.chainid == _cachedChainId) {
            return _cachedDomainSeparator;
        } else {
            return _buildDomainSeparator();
        }
    }

    function _buildDomainSeparator() private view returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    TYPE_HASH,
                    _hashedName,
                    _hashedVersion,
                    block.chainid,
                    address(this)
                )
            );
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash)
        internal
        view
        virtual
        returns (bytes32)
    {
        return
            MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);
    }

    /**
     * @dev See {IERC-5267}.
     */
    function eip712Domain()
        public
        view
        virtual
        returns (
            bytes1 fields,
            string memory name,
            string memory version,
            uint256 chainId,
            address verifyingContract,
            bytes32 salt,
            uint256[] memory extensions
        )
    {
        return (
            hex"0f", // 01111
            _EIP712Name(),
            _EIP712Version(),
            block.chainid,
            address(this),
            bytes32(0),
            new uint256[](0)
        );
    }

    /**
     * @dev The name parameter for the EIP712 domain.
     *
     * NOTE: By default this function reads _name which is an immutable value.
     * It only reads from storage if necessary (in case the value is too large to fit in a ShortString).
     */
    // solhint-disable-next-line func-name-mixedcase
    function _EIP712Name() internal view returns (string memory) {
        return _name.toStringWithFallback(_nameFallback);
    }

    /**
     * @dev The version parameter for the EIP712 domain.
     *
     * NOTE: By default this function reads _version which is an immutable value.
     * It only reads from storage if necessary (in case the value is too large to fit in a ShortString).
     */
    // solhint-disable-next-line func-name-mixedcase
    function _EIP712Version() internal view returns (string memory) {
        return _version.toStringWithFallback(_versionFallback);
    }
}

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

/**
 * @dev Provides tracking nonces for addresses. Nonces will only increment.
 */
abstract contract Nonces {
    /**
     * @dev The nonce used for an `account` is not the expected current nonce.
     */
    error InvalidAccountNonce(address account, uint256 currentNonce);

    mapping(address => uint256) private _nonces;

    /**
     * @dev Returns the next unused nonce for an address.
     */
    function nonces(address owner) public view virtual returns (uint256) {
        return _nonces[owner];
    }

    /**
     * @dev Consumes a nonce.
     *
     * Returns the current value and increments nonce.
     */
    function _useNonce(address owner) internal virtual returns (uint256) {
        // For each account, the nonce has an initial value of 0, can only be incremented by one, and cannot be
        // decremented or reset. This guarantees that the nonce never overflows.
        unchecked {
            // It is important to do x++ and not ++x here.
            return _nonces[owner]++;
        }
    }

    /**
     * @dev Same as {_useNonce} but checking that `nonce` is the next valid for `owner`.
     */
    function _useCheckedNonce(address owner, uint256 nonce) internal virtual {
        uint256 current = _useNonce(owner);
        if (nonce != current) {
            revert InvalidAccountNonce(owner, current);
        }
    }
}

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

/**
 * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712, Nonces {
    bytes32 private constant PERMIT_TYPEHASH =
        keccak256(
            "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
        );

    /**
     * @dev Permit deadline has expired.
     */
    error ERC2612ExpiredSignature(uint256 deadline);

    /**
     * @dev Mismatched signature.
     */
    error ERC2612InvalidSigner(address signer, address owner);

    /**
     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
     *
     * It's a good idea to use the same `name` that is defined as the ERC20 token name.
     */
    constructor(string memory name) EIP712(name, "1") {}

    /**
     * @inheritdoc IERC20Permit
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        if (block.timestamp > deadline) {
            revert ERC2612ExpiredSignature(deadline);
        }

        bytes32 structHash = keccak256(
            abi.encode(
                PERMIT_TYPEHASH,
                owner,
                spender,
                value,
                _useNonce(owner),
                deadline
            )
        );

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        if (signer != owner) {
            revert ERC2612InvalidSigner(signer, owner);
        }

        _approve(owner, spender, value);
    }

    /**
     * @inheritdoc IERC20Permit
     */
    function nonces(address owner)
        public
        view
        virtual
        override(IERC20Permit, Nonces)
        returns (uint256)
    {
        return super.nonces(owner);
    }

    /**
     * @inheritdoc IERC20Permit
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {
        return _domainSeparatorV4();
    }
}
// Next Token Migration Interface if Upgraded in Future
interface IMigrationToken{
    function migrateOldToken(address user,uint amount) external;
}

// Holding Map
struct HoldingMap {
    address wallet;
    uint256 amount;
}

// Dividend Pool
struct Pool {
    uint256 totalAmount;
    uint256 timestamp;
    uint256 circulatingSupply;
    HoldingMap[] holding;
    address[] holders;
    uint holderCount;
    mapping(address=>bool) isClaimed;
}
interface ITokenInterface{
    function mintFromBridge(address user,uint amount) external;
}

// Bridge Pool
contract BridgePool is Ownable{
    string public chain;
    uint public chainId;
    IERC20 public token;
    address tokenContract;

    event SwappedIn(address indexed user, uint amount,uint fromChainId);
    event SwappedOut(address indexed user, uint amount,uint toChainId);

    constructor(string memory _chainName,uint _chainId,address _token,address bridgeEmitter)
    Ownable(bridgeEmitter)
    {
        chain = _chainName;
        chainId = _chainId;
        tokenContract = _token;
        token = IERC20(_token);
    }

    function swapIn(address to,uint value) public onlyOwner{
        ITokenInterface(tokenContract).mintFromBridge(to,value);
        emit SwappedIn(to,value,chainId);
    }

    function swapOut(address user,uint amount) public {
        if(_msgSender() != tokenContract) revert("only token contract!");
        emit SwappedOut(user,amount,chainId);
    }

}

// DEAR Token Contract
contract DEARToken is
    Ownable,
    ERC20,
    ERC20Permit
{
    // USDT TOKEN
    IERC20 usdt = IERC20(address(0));
    uint pooledTokens = 0;

    // Next Migration Token
    IMigrationToken mToken = IMigrationToken(address(0));
    
    // Stakes in percentage total must be 100;
    address profitPool = address(0);
    uint256 foundersShare = 10;
    uint256 operationShare = 20;
    uint256 comunityShare = 50;
    uint256 marketingShare = 20;
    address immutable public founderWallet = 0x410F2d02Cc3712D2E87d44E25056417F4B69dd9b;
    address immutable public communityWallet = 0xc79B3c0772Ee5E386546C9297fbCBD82efaaaD97;
    address immutable public marketingWallet = 0x8072491267E5Dce46aBcF69D155ce60340Af4D9B;
    address immutable public operationWallet = 0xA73D937c7c84980be530aFe7D0a85CdE9A5Ac2f2;
    // uint _totalSupply = 0;

    // Pools Data
    mapping(uint256 => Pool) public pools;
    uint256 lastPoolIndex = 0;

    // HoldingMap for holder tracking tracking
    uint256 public holdersCount = 0;
    HoldingMap[] public _holdings;
    mapping(address => uint256) holdingMapIndexofUser_;
    mapping(address => bool) userExistsInHoldingMap_;
    address[] public holders;

    // Brdge Pool (ChainID=>bool) (ChainID=>PoolAddress)
    mapping(uint=>bool) public isChainExists;
    mapping(uint=>address) public bridgePoolAddress;

    // Used to mint
    mapping(address => bool) public isBridgeEnabled;

    event ClaimedReward(uint indexed poolId,address indexed user,uint reward);

    constructor(
        string memory name,
        string memory symbol,
        uint256 supply,
        address usdt_
    ) ERC20(name, symbol) ERC20Permit(name) Ownable(_msgSender()) {
        uint256 foundersStake = (supply * foundersShare) / 100;
        uint256 operationStake = (supply * operationShare) / 100;
        uint256 communityStake = (supply * comunityShare) / 100;
        uint256 marketingStake = supply -
            foundersStake -
            operationStake -
            communityStake;
        _mint(founderWallet, foundersStake);
        _mint(operationWallet, operationStake);
        _mint(communityWallet, communityStake);
        _mint(marketingWallet, marketingStake);
        usdt = IERC20(usdt_);
    }
    
    
    function setProfitPoolAddress(address newPool) public onlyOwner(){
        profitPool = newPool;
    }

    
    function createAPool() public {
        if (_msgSender() != profitPool) revert("Not allowed to interact!");

        uint256 tokenBalance = usdt.balanceOf(address(this));
        uint amount = tokenBalance - pooledTokens;
        // Create Distribution Pool
        pools[lastPoolIndex].totalAmount = amount;
        pools[lastPoolIndex].timestamp = block.timestamp;
        pools[lastPoolIndex].circulatingSupply = totalSupply();
        pools[lastPoolIndex].holding = _holdings;
        pools[lastPoolIndex].holders = holders;
        pools[lastPoolIndex].holderCount = holdersCount;
        pooledTokens += amount;
        lastPoolIndex += 1;
    }

    /**
        @dev
        Override existing _update function to capture balance and holders
    */
    function _update(
        address from,
        address to,
        uint256 value
    ) internal virtual override {
        super._update(from, to, value);
        if(to != address(0)){
            if (!userExistsInHoldingMap_[to]) {
                // add to holders
                holders.push(to);
                // add to holding map
                _holdings.push(HoldingMap(to, balanceOf(to)));
                // set holding map exists to true
                userExistsInHoldingMap_[to] = true;
                // set holding map index
                holdingMapIndexofUser_[to] = holdersCount;
                // increase last Index
                holdersCount += 1;
            }
            _updateUserBalance(to);
        }
        if(from != address(0)){
            // Update Holding Map
            if (balanceOf(from) > 0) {
                // Update Balance of from user
                _updateUserBalance(from);
            } else {
                // delete from Holding Map
                // update position of shifted user from Holding Map
                _deleteUserFromHolding(from);
            }
        }
    }
    
    
    function _updateUserBalance(address user) private {
        uint256 i = holdingMapIndexofUser_[user];
        if (_holdings[i].wallet == user) {
            _holdings[i].amount = balanceOf(user);
        }
    }

    
    function _deleteUserFromHolding(address user) private {
        userExistsInHoldingMap_[user] = false;
        uint256 lastIndex = holders.length - 1;
        uint256 positionOfCurrentUser = holdingMapIndexofUser_[user];
        if (positionOfCurrentUser == lastIndex) {
            // POP
            holders.pop();
            _holdings.pop();
        } else {
            address lastHolder = holders[lastIndex];
            uint256 positionOfLastHolder = holdingMapIndexofUser_[lastHolder];
            // Shift to end
            holders[positionOfCurrentUser] = lastHolder;
            _holdings[positionOfCurrentUser] = _holdings[positionOfLastHolder];
            holdingMapIndexofUser_[lastHolder] = positionOfCurrentUser;
            holdingMapIndexofUser_[user] = 0;
            // POP
            holders.pop();
            _holdings.pop();
        }
        holdersCount -= 1;
    }

    
    function isUserListedInPool(uint poolId,address user) public view returns(bool){
        for(uint i = 0;i< pools[poolId].holderCount;i++){
            if(pools[poolId].holders[i] == user){
                return true;
            }
        }
        return false;
    }

     
    function getIndexOfUserInPool(uint poolId,address user) public view returns(uint){
        for(uint i = 0;i<pools[poolId].holderCount; i++){
            if(pools[poolId].holders[i] == user){
                return i;
            }
        }
        return 0;
    }

    
    function isClaimed(uint poolId,address user) public view returns(bool){
        return pools[poolId].isClaimed[user];
    }

    
    function claim(uint poolId) public{
        if(isUserListedInPool(poolId, _msgSender()) && !isClaimed(poolId, _msgSender())){
            uint i = getIndexOfUserInPool(poolId, _msgSender());
            uint reward = _calculateReward(poolId, i);
            pools[poolId].isClaimed[_msgSender()] = true;
            pooledTokens -= reward;
            usdt.transfer(_msgSender(), reward);
            emit ClaimedReward(poolId,_msgSender(), reward);
        }else{
            revert("You cant claim!");
        }
    }

    function _calculateReward(uint poolId,uint index) private view returns(uint){
        Pool storage p = pools[poolId];
        return (p.holding[index].amount * p.totalAmount) / p.circulatingSupply;
    }

    
    function calculateReward(uint poolId,address user) public view returns(uint){
        if(isUserListedInPool(poolId, user) && !isClaimed(poolId, user)){
            uint i = getIndexOfUserInPool(poolId, user);
            uint reward = _calculateReward(poolId, i);
            return reward;
        }else{
            return 0;
        }
    }
    
    
    // Migration Functions
    function migrate() public {
        address user = _msgSender();
        uint balance_ = balanceOf(user);
        super._burn(user, balance_);
        mToken.migrateOldToken(user, balance_);
    }

    
    function setMigrationToken(address token_) public onlyOwner{
        mToken = IMigrationToken(token_);
    }

    
    // Bridge Functions
    function swapToChain(uint chainId,uint amount) public{
        if(!isChainExists[chainId]) revert ("Chain not enabled!");
        address poolAddress = bridgePoolAddress[chainId];
        BridgePool pool = BridgePool(poolAddress);
        _burn(_msgSender(), amount);
        pool.swapOut(_msgSender(),amount);
    }

    
    function addAChain(uint chainId,string memory chainName, address emitter) public onlyOwner{
        if(isChainExists[chainId]) revert ("Chain already enabled!");
        isChainExists[chainId] = true;
        BridgePool pool = new BridgePool(chainName,chainId,address(this),emitter);
        bridgePoolAddress[chainId] = address(pool);
        isBridgeEnabled[address(pool)] = true;
    }

    function mintFromBridge(address account,uint value) public {
        if(!isBridgeEnabled[_msgSender()]) revert("not allowed");

        _mint(account, value);
    }

    
    function disableAChain(uint chainId) public onlyOwner{
        if(!isChainExists[chainId]) revert ("Chain already disabled!");
        isChainExists[chainId] = false;
    }

    
    function enableAChain(uint chainId) public onlyOwner{
        if(isChainExists[chainId]) revert ("Chain already enabled!");
        isChainExists[chainId] = true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"address","name":"usdt_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"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":"uint256","name":"deadline","type":"uint256"}],"name":"ERC2612ExpiredSignature","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC2612InvalidSigner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"currentNonce","type":"uint256"}],"name":"InvalidAccountNonce","type":"error"},{"inputs":[],"name":"InvalidShortString","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":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"ClaimedReward","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","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":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_holdings","outputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"chainName","type":"string"},{"internalType":"address","name":"emitter","type":"address"}],"name":"addAChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bridgePoolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"calculateReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"communityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createAPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"disableAChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"enableAChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"founderWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"getIndexOfUserInPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"holders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holdersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBridgeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isChainExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"isUserListedInPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mintFromBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"circulatingSupply","type":"uint256"},{"internalType":"uint256","name":"holderCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"}],"name":"setMigrationToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPool","type":"address"}],"name":"setProfitPoolAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"swapToChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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"}]

6101e06040525f60095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f600a555f600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a600d556014600e556032600f55601460105573410f2d02cc3712d2e87d44e25056417f4b69dd9b73ffffffffffffffffffffffffffffffffffffffff166101609073ffffffffffffffffffffffffffffffffffffffff1681525073c79b3c0772ee5e386546c9297fbcbd82efaaad9773ffffffffffffffffffffffffffffffffffffffff166101809073ffffffffffffffffffffffffffffffffffffffff16815250738072491267e5dce46abcf69d155ce60340af4d9b73ffffffffffffffffffffffffffffffffffffffff166101a09073ffffffffffffffffffffffffffffffffffffffff1681525073a73d937c7c84980be530afe7d0a85cde9a5ac2f273ffffffffffffffffffffffffffffffffffffffff166101c09073ffffffffffffffffffffffffffffffffffffffff168152505f6012555f60135534801562000211575f80fd5b506040516200743d3803806200743d833981810160405281019062000237919062001428565b83806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152508686620002816200050d60201b60201c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620002f4575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620002eb9190620014e6565b60405180910390fd5b62000305816200051460201b60201c565b5081600490816200031791906200172f565b5080600590816200032991906200172f565b50505062000342600683620005d560201b90919060201c565b610120818152505062000360600782620005d560201b90919060201c565b6101408181525050818051906020012060e08181525050808051906020012061010081815250504660a081815250506200039f6200062a60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250505050505f6064600d5484620003f0919062001840565b620003fc9190620018b7565b90505f6064600e548562000411919062001840565b6200041d9190620018b7565b90505f6064600f548662000432919062001840565b6200043e9190620018b7565b90505f81838588620004519190620018ee565b6200045d9190620018ee565b620004699190620018ee565b90506200048061016051856200068660201b60201c565b620004956101c051846200068660201b60201c565b620004aa61018051836200068660201b60201c565b620004bf6101a051826200068660201b60201c565b8460095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050505062001ba8565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f602083511015620005fa57620005f2836200071060201b60201c565b905062000624565b826200060c836200077a60201b60201c565b5f0190816200061c91906200172f565b5060ff5f1b90505b92915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60e0516101005146306040516020016200066b95949392919062001953565b60405160208183030381529060405280519060200120905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620006f9575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401620006f09190620014e6565b60405180910390fd5b6200070c5f83836200078360201b60201c565b5050565b5f80829050601f815111156200075f57826040517f305a27a9000000000000000000000000000000000000000000000000000000008152600401620007569190620019fe565b60405180910390fd5b8051816200076d9062001a4f565b5f1c175f1b915050919050565b5f819050919050565b6200079683838362000a6f60201b60201c565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620009f35760165f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16620009e157601782908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601460405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001620008b38562000c9660201b60201c565b815250908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101555050600160165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555060135460155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600160135f828254620009d9919062001abe565b925050819055505b620009f28262000cdc60201b60201c565b5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000a6a575f62000a398462000c9660201b60201c565b111562000a575762000a518362000cdc60201b60201c565b62000a69565b62000a688362000dd560201b60201c565b5b5b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000ac3578060035f82825462000ab6919062001abe565b9250508190555062000b96565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101562000b50578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040162000b479392919062001af8565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000bdf578060035f828254039250508190555062000c2a565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000c89919062001b33565b60405180910390a3505050565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508173ffffffffffffffffffffffffffffffffffffffff166014828154811062000d4b5762000d4a62001b4e565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160362000dd15762000da68262000c9660201b60201c565b6014828154811062000dbd5762000dbc62001b4e565b5b905f5260205f209060020201600101819055505b5050565b5f60165f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f600160178054905062000e3e9190620018ee565b90505f60155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081810362000f2e57601780548062000e9e5762000e9d62001b7b565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055601480548062000ee55762000ee462001b7b565b5b600190038181905f5260205f2090600202015f8082015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182015f905550509055620011ea565b5f6017838154811062000f465762000f4562001b4e565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050816017848154811062000fc95762000fc862001b4e565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506014818154811062001025576200102462001b4e565b5b905f5260205f2090600202016014848154811062001048576200104762001b4e565b5b905f5260205f2090600202015f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182015481600101559050508260155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060178054806200115d576200115c62001b7b565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556014805480620011a457620011a362001b7b565b5b600190038181905f5260205f2090600202015f8082015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182015f90555050905550505b600160135f828254620011fe9190620018ee565b92505081905550505050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6200126b8262001223565b810181811067ffffffffffffffff821117156200128d576200128c62001233565b5b80604052505050565b5f620012a16200120a565b9050620012af828262001260565b919050565b5f67ffffffffffffffff821115620012d157620012d062001233565b5b620012dc8262001223565b9050602081019050919050565b5f5b8381101562001308578082015181840152602081019050620012eb565b5f8484015250505050565b5f620013296200132384620012b4565b62001296565b9050828152602081018484840111156200134857620013476200121f565b5b62001355848285620012e9565b509392505050565b5f82601f8301126200137457620013736200121b565b5b81516200138684826020860162001313565b91505092915050565b5f819050919050565b620013a3816200138f565b8114620013ae575f80fd5b50565b5f81519050620013c18162001398565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620013f282620013c7565b9050919050565b6200140481620013e6565b81146200140f575f80fd5b50565b5f815190506200142281620013f9565b92915050565b5f805f806080858703121562001443576200144262001213565b5b5f85015167ffffffffffffffff81111562001463576200146262001217565b5b62001471878288016200135d565b945050602085015167ffffffffffffffff81111562001495576200149462001217565b5b620014a3878288016200135d565b9350506040620014b687828801620013b1565b9250506060620014c98782880162001412565b91505092959194509250565b620014e081620013e6565b82525050565b5f602082019050620014fb5f830184620014d5565b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200155057607f821691505b6020821081036200156657620015656200150b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620015ca7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200158d565b620015d686836200158d565b95508019841693508086168417925050509392505050565b5f819050919050565b5f62001617620016116200160b846200138f565b620015ee565b6200138f565b9050919050565b5f819050919050565b6200163283620015f7565b6200164a62001641826200161e565b84845462001599565b825550505050565b5f90565b6200166062001652565b6200166d81848462001627565b505050565b5b818110156200169457620016885f8262001656565b60018101905062001673565b5050565b601f821115620016e357620016ad816200156c565b620016b8846200157e565b81016020851015620016c8578190505b620016e0620016d7856200157e565b83018262001672565b50505b505050565b5f82821c905092915050565b5f620017055f1984600802620016e8565b1980831691505092915050565b5f6200171f8383620016f4565b9150826002028217905092915050565b6200173a8262001501565b67ffffffffffffffff81111562001756576200175562001233565b5b62001762825462001538565b6200176f82828562001698565b5f60209050601f831160018114620017a5575f841562001790578287015190505b6200179c858262001712565b8655506200180b565b601f198416620017b5866200156c565b5f5b82811015620017de57848901518255600182019150602085019450602081019050620017b7565b86831015620017fe5784890151620017fa601f891682620016f4565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6200184c826200138f565b915062001859836200138f565b925082820262001869816200138f565b9150828204841483151762001883576200188262001813565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f620018c3826200138f565b9150620018d0836200138f565b925082620018e357620018e26200188a565b5b828204905092915050565b5f620018fa826200138f565b915062001907836200138f565b925082820390508181111562001922576200192162001813565b5b92915050565b5f819050919050565b6200193c8162001928565b82525050565b6200194d816200138f565b82525050565b5f60a082019050620019685f83018862001931565b62001977602083018762001931565b62001986604083018662001931565b62001995606083018562001942565b620019a46080830184620014d5565b9695505050505050565b5f82825260208201905092915050565b5f620019ca8262001501565b620019d68185620019ae565b9350620019e8818560208601620012e9565b620019f38162001223565b840191505092915050565b5f6020820190508181035f83015262001a188184620019be565b905092915050565b5f81519050919050565b5f819050602082019050919050565b5f62001a46825162001928565b80915050919050565b5f62001a5b8262001a20565b8262001a678462001a2a565b905062001a748162001a39565b9250602082101562001ab75762001ab27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026200158d565b831692505b5050919050565b5f62001aca826200138f565b915062001ad7836200138f565b925082820190508082111562001af25762001af162001813565b5b92915050565b5f60608201905062001b0d5f830186620014d5565b62001b1c602083018562001942565b62001b2b604083018462001942565b949350505050565b5f60208201905062001b485f83018462001942565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c05161581b62001c225f395f611bdc01525f61118001525f61160401525f61145401525f61218601525f61214901525f61284801525f61282701525f611f1801525f611f6f01525f611f99015261581b5ff3fe608060405234801562000010575f80fd5b50600436106200028a575f3560e01c80637985fe201162000163578063ac4afa3811620000d3578063d305180c1162000091578063d305180c1462000805578063d505accf1462000825578063dd62ed3e1462000845578063e042ad58146200087b578063e39e021f146200089d578063f2fde38b14620008d4576200028a565b8063ac4afa381462000748578063ae5849181462000781578063c757483914620007a1578063ce5f282414620007c3578063d2ef079514620007cf576200028a565b806395d89b41116200012157806395d89b411462000678578063a18f07a0146200069a578063a23d3c3514620006d0578063a6d656a314620006f2578063a9059cbb1462000712576200028a565b80637985fe2014620005b65780637ecebe0014620005ec57806384b0196e14620006225780638da5cb5b146200064a5780638fd3ab80146200066c576200028a565b80633247f5d611620001ff5780636b4ed21b11620001bd5780636b4ed21b14620004fa57806370a08231146200051c578063715018a614620005525780637175f226146200055e57806375f0a8741462000594576200028a565b80633247f5d6146200042c5780633644e515146200044c578063379607f5146200046e57806344dded46146200048e57806355b523dd14620004c4576200028a565b80631f418fc1116200024d5780631f418fc1146200034857806321e71412146200037e57806323b872dd146200039e5780632a11ced014620003d4578063313ce567146200040a576200028a565b806306fdde03146200028e578063095ea7b314620002b05780630d3cbda714620002e657806318160ddd146200030657806318a03bc21462000328575b5f80fd5b62000298620008f4565b604051620002a7919062003636565b60405180910390f35b620002ce6004803603810190620002c8919062003702565b6200098c565b604051620002dd919062003763565b60405180910390f35b620003046004803603810190620002fe91906200377e565b620009b2565b005b62000310620009ff565b6040516200031f9190620037bf565b60405180910390f35b620003466004803603810190620003409190620037da565b62000a08565b005b6200036660048036038101906200036091906200380a565b62000a9f565b60405162000375919062003763565b60405180910390f35b6200039c60048036038101906200039691906200377e565b62000b72565b005b620003bc6004803603810190620003b691906200384f565b62000bbf565b604051620003cb919062003763565b60405180910390f35b620003f26004803603810190620003ec9190620037da565b62000bf3565b604051620004019190620038b9565b60405180910390f35b6200041462000c2f565b604051620004239190620038f1565b60405180910390f35b6200044a600480360381019062000444919062003a54565b62000c37565b005b6200045662000db4565b60405162000465919062003ae6565b60405180910390f35b6200048c6004803603810190620004869190620037da565b62000dc4565b005b620004ac6004803603810190620004a69190620037da565b62000ffc565b604051620004bb9190620038b9565b60405180910390f35b620004e26004803603810190620004dc91906200380a565b6200102c565b604051620004f19190620037bf565b60405180910390f35b62000504620010fe565b604051620005139190620037bf565b60405180910390f35b6200053a60048036038101906200053491906200377e565b62001104565b604051620005499190620037bf565b60405180910390f35b6200055c6200114a565b005b6200057c6004803603810190620005769190620037da565b62001161565b6040516200058b919062003763565b60405180910390f35b6200059e6200117e565b604051620005ad9190620038b9565b60405180910390f35b620005d46004803603810190620005ce91906200377e565b620011a2565b604051620005e3919062003763565b60405180910390f35b6200060a60048036038101906200060491906200377e565b620011bf565b604051620006199190620037bf565b60405180910390f35b6200062c620011d2565b60405162000641979695949392919062003c04565b60405180910390f35b620006546200127f565b604051620006639190620038b9565b60405180910390f35b62000676620012a6565b005b620006826200135e565b60405162000691919062003636565b60405180910390f35b620006b86004803603810190620006b291906200380a565b620013f6565b604051620006c79190620037bf565b60405180910390f35b620006da62001452565b604051620006e99190620038b9565b60405180910390f35b6200071060048036038101906200070a9190620037da565b62001476565b005b6200073060048036038101906200072a919062003702565b6200150b565b6040516200073f919062003763565b60405180910390f35b620007666004803603810190620007609190620037da565b62001531565b60405162000778949392919062003c94565b60405180910390f35b6200079f600480360381019062000799919062003702565b6200155d565b005b620007ab62001602565b604051620007ba9190620038b9565b60405180910390f35b620007cd62001626565b005b620007ed6004803603810190620007e791906200380a565b62001876565b604051620007fc919062003763565b60405180910390f35b6200082360048036038101906200081d919062003cdf565b620018db565b005b6200084360048036038101906200083d919062003d82565b62001a03565b005b6200086360048036038101906200085d919062003e30565b62001b58565b604051620008729190620037bf565b60405180910390f35b6200088562001bda565b604051620008949190620038b9565b60405180910390f35b620008bb6004803603810190620008b59190620037da565b62001bfe565b604051620008cb92919062003e75565b60405180910390f35b620008f26004803603810190620008ec91906200377e565b62001c4d565b005b606060048054620009059062003ecd565b80601f0160208091040260200160405190810160405280929190818152602001828054620009339062003ecd565b8015620009825780601f10620009585761010080835404028352916020019162000982565b820191905f5260205f20905b8154815290600101906020018083116200096457829003601f168201915b5050505050905090565b5f806200099862001cd8565b9050620009a781858562001cdf565b600191505092915050565b620009bc62001cf3565b80600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f600354905090565b62000a1262001cf3565b60185f8281526020019081526020015f205f9054906101000a900460ff161562000a73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a6a9062003f4f565b60405180910390fd5b600160185f8381526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f805f90505b60115f8581526020019081526020015f206005015481101562000b67578273ffffffffffffffffffffffffffffffffffffffff1660115f8681526020019081526020015f20600401828154811062000b025762000b0162003f6f565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160362000b5157600191505062000b6c565b808062000b5e9062003fc9565b91505062000aa5565b505f90505b92915050565b62000b7c62001cf3565b80600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f8062000bcb62001cd8565b905062000bda85828562001d83565b62000be785858562001e1d565b60019150509392505050565b6017818154811062000c03575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6012905090565b62000c4162001cf3565b60185f8481526020019081526020015f205f9054906101000a900460ff161562000ca2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c999062003f4f565b60405180910390fd5b600160185f8581526020019081526020015f205f6101000a81548160ff0219169083151502179055505f8284308460405162000cde9062003419565b62000ced949392919062004015565b604051809103905ff08015801562000d07573d5f803e3d5ffd5b5090508060195f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050505050565b5f62000dbf62001f15565b905090565b62000dd98162000dd362001cd8565b62000a9f565b801562000df8575062000df68162000df062001cd8565b62001876565b155b1562000fbc575f62000e148262000e0e62001cd8565b6200102c565b90505f62000e23838362001fd0565b9050600160115f8581526020019081526020015f206006015f62000e4662001cd8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080600a5f82825462000ea8919062004067565b9250508190555060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb62000ef662001cd8565b836040518363ffffffff1660e01b815260040162000f1692919062003e75565b6020604051808303815f875af115801562000f33573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000f599190620040d0565b5062000f6462001cd8565b73ffffffffffffffffffffffffffffffffffffffff16837fb3aa8b63132d4c8c050f3c58896489ee2a949eaf514406ec8e56b2da530551c08360405162000fac9190620037bf565b60405180910390a3505062000ff9565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ff0906200414e565b60405180910390fd5b50565b6019602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f90505b60115f8581526020019081526020015f2060050154811015620010f3578273ffffffffffffffffffffffffffffffffffffffff1660115f8681526020019081526020015f2060040182815481106200108f576200108e62003f6f565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603620010dd5780915050620010f8565b8080620010ea9062003fc9565b91505062001032565b505f90505b92915050565b60135481565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6200115462001cf3565b6200115f5f62002038565b565b6018602052805f5260405f205f915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b601a602052805f5260405f205f915054906101000a900460ff1681565b5f620011cb82620020f9565b9050919050565b5f6060805f805f6060620011e56200213f565b620011ef6200217c565b46305f801b5f67ffffffffffffffff81111562001211576200121062003914565b5b604051908082528060200260200182016040528015620012405781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f620012b162001cd8565b90505f620012bf8262001104565b9050620012cd8282620021b9565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eae3d7d983836040518363ffffffff1660e01b81526004016200132b92919062003e75565b5f604051808303815f87803b15801562001343575f80fd5b505af115801562001356573d5f803e3d5ffd5b505050505050565b6060600580546200136f9062003ecd565b80601f01602080910402602001604051908101604052809291908181526020018280546200139d9062003ecd565b8015620013ec5780601f10620013c257610100808354040283529160200191620013ec565b820191905f5260205f20905b815481529060010190602001808311620013ce57829003601f168201915b5050505050905090565b5f62001403838362000a9f565b801562001419575062001417838362001876565b155b1562001448575f6200142c84846200102c565b90505f6200143b858362001fd0565b905080925050506200144c565b5f90505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6200148062001cf3565b60185f8281526020019081526020015f205f9054906101000a900460ff16620014e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620014d790620041bc565b60405180910390fd5b5f60185f8381526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f806200151762001cd8565b90506200152681858562001e1d565b600191505092915050565b6011602052805f5260405f205f91509050805f0154908060010154908060020154908060050154905084565b601a5f6200156a62001cd8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16620015f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620015e9906200422a565b60405180910390fd5b620015fe82826200223d565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166200166862001cd8565b73ffffffffffffffffffffffffffffffffffffffff1614620016c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620016b89062004298565b60405180910390fd5b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016200171e9190620038b9565b602060405180830381865afa1580156200173a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620017609190620042ce565b90505f600a548262001773919062004067565b90508060115f60125481526020019081526020015f205f01819055504260115f60125481526020019081526020015f2060010181905550620017b4620009ff565b60115f60125481526020019081526020015f2060020181905550601460115f60125481526020019081526020015f20600301908054620017f692919062003427565b50601760115f60125481526020019081526020015f206004019080546200181f929190620034ed565b5060135460115f60125481526020019081526020015f206005018190555080600a5f828254620018509190620042fe565b92505081905550600160125f8282546200186b9190620042fe565b925050819055505050565b5f60115f8481526020019081526020015f206006015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b60185f8381526020019081526020015f205f9054906101000a900460ff166200193b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620019329062004386565b60405180910390fd5b5f60195f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f819050620019886200198162001cd8565b84620021b9565b8073ffffffffffffffffffffffffffffffffffffffff166310d974ae620019ae62001cd8565b856040518363ffffffff1660e01b8152600401620019ce92919062003e75565b5f604051808303815f87803b158015620019e6575f80fd5b505af1158015620019f9573d5f803e3d5ffd5b5050505050505050565b8342111562001a4b57836040517f6279130200000000000000000000000000000000000000000000000000000000815260040162001a429190620037bf565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888862001a7b8c620022c1565b8960405160200162001a9396959493929190620043a6565b6040516020818303038152906040528051906020012090505f62001ab78262002314565b90505f62001ac88287878762002331565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161462001b3f57808a6040517f4b800e4600000000000000000000000000000000000000000000000000000000815260040162001b3692919062004411565b60405180910390fd5b62001b4c8a8a8a62001cdf565b50505050505050505050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6014818154811062001c0e575f80fd5b905f5260205f2090600202015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b62001c5762001cf3565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362001cca575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040162001cc19190620038b9565b60405180910390fd5b62001cd58162002038565b50565b5f33905090565b62001cee838383600162002363565b505050565b62001cfd62001cd8565b73ffffffffffffffffffffffffffffffffffffffff1662001d1d6200127f565b73ffffffffffffffffffffffffffffffffffffffff161462001d815762001d4362001cd8565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040162001d789190620038b9565b60405180910390fd5b565b5f62001d90848462001b58565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811462001e17578181101562001e06578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040162001dfd939291906200443c565b60405180910390fd5b62001e1684848484035f62002363565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362001e90575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040162001e879190620038b9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362001f03575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040162001efa9190620038b9565b60405180910390fd5b62001f108383836200253b565b505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801562001f9157507f000000000000000000000000000000000000000000000000000000000000000046145b1562001fc0577f0000000000000000000000000000000000000000000000000000000000000000905062001fcd565b62001fca62002803565b90505b90565b5f8060115f8581526020019081526020015f2090508060020154815f015482600301858154811062002007576200200662003f6f565b5b905f5260205f2090600202016001015462002023919062004477565b6200202f9190620044ee565b91505092915050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b60606200217760067f00000000000000000000000000000000000000000000000000000000000000006200289a90919063ffffffff16565b905090565b6060620021b460077f00000000000000000000000000000000000000000000000000000000000000006200289a90919063ffffffff16565b905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200222c575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401620022239190620038b9565b60405180910390fd5b62002239825f836200253b565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620022b0575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401620022a79190620038b9565b60405180910390fd5b620022bd5f83836200253b565b5050565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050559050919050565b5f6200232a6200232362001f15565b8362002953565b9050919050565b5f805f80620023438888888862002993565b92509250925062002355828262002a81565b829350505050949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603620023d6575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401620023cd9190620038b9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362002449575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401620024409190620038b9565b60405180910390fd5b8160025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801562002535578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516200252c9190620037bf565b60405180910390a35b50505050565b6200254883838362002c03565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620027995760165f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166200278d57601782908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601460405180604001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020016200265f8562001104565b815250908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101555050600160165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555060135460155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600160135f828254620027859190620042fe565b925050819055505b620027988262002e2a565b5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620027fe575f620027d98462001104565b1115620027f157620027eb8362002e2a565b620027fd565b620027fc8362002f1d565b5b5b505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000046306040516020016200287f95949392919062004525565b60405160208183030381529060405280519060200120905090565b606060ff5f1b8314620028ba57620028b28362003352565b90506200294d565b818054620028c89062003ecd565b80601f0160208091040260200160405190810160405280929190818152602001828054620028f69062003ecd565b8015620029455780601f106200291b5761010080835404028352916020019162002945565b820191905f5260205f20905b8154815290600101906020018083116200292757829003601f168201915b505050505090505b92915050565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115620029d1575f60038592509250925062002a77565b5f6001888888886040515f8152602001604052604051620029f6949392919062004580565b6020604051602081039080840390855afa15801562002a17573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362002a6a575f60015f801b9350935093505062002a77565b805f805f1b935093509350505b9450945094915050565b5f600381111562002a975762002a96620045cb565b5b82600381111562002aad5762002aac620045cb565b5b031562002bff576001600381111562002acb5762002aca620045cb565b5b82600381111562002ae15762002ae0620045cb565b5b0362002b19576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600381111562002b305762002b2f620045cb565b5b82600381111562002b465762002b45620045cb565b5b0362002b8d57805f1c6040517ffce698f700000000000000000000000000000000000000000000000000000000815260040162002b849190620037bf565b60405180910390fd5b60038081111562002ba35762002ba2620045cb565b5b82600381111562002bb95762002bb8620045cb565b5b0362002bfe57806040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260040162002bf5919062003ae6565b60405180910390fd5b5b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362002c57578060035f82825462002c4a9190620042fe565b9250508190555062002d2a565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101562002ce4578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040162002cdb939291906200443c565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362002d73578060035f828254039250508190555062002dbe565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162002e1d9190620037bf565b60405180910390a3505050565b5f60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508173ffffffffffffffffffffffffffffffffffffffff166014828154811062002e995762002e9862003f6f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160362002f195762002eee8262001104565b6014828154811062002f055762002f0462003f6f565b5b905f5260205f209060020201600101819055505b5050565b5f60165f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f600160178054905062002f86919062004067565b90505f60155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181036200307657601780548062002fe65762002fe5620045f8565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905560148054806200302d576200302c620045f8565b5b600190038181905f5260205f2090600202015f8082015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182015f90555050905562003332565b5f601783815481106200308e576200308d62003f6f565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050816017848154811062003111576200311062003f6f565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601481815481106200316d576200316c62003f6f565b5b905f5260205f2090600202016014848154811062003190576200318f62003f6f565b5b905f5260205f2090600202015f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182015481600101559050508260155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506017805480620032a557620032a4620045f8565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556014805480620032ec57620032eb620045f8565b5b600190038181905f5260205f2090600202015f8082015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182015f90555050905550505b600160135f82825462003346919062004067565b92505081905550505050565b60605f6200336083620033ca565b90505f602067ffffffffffffffff81111562003381576200338062003914565b5b6040519080825280601f01601f191660200182016040528015620033b45781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b5f8060ff835f1c169050601f81111562003410576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b6111c0806200462683390190565b828054828255905f5260205f20906002028101928215620034da575f5260205f209160020282015b82811115620034d95782825f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182015481600101555050916002019190600201906200344f565b5b509050620034e9919062003540565b5090565b828054828255905f5260205f209081019282156200352d575f5260205f209182015b828111156200352c5782548255916001019190600101906200350f565b5b5090506200353c919062003585565b5090565b5b8082111562003581575f8082015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182015f90555060020162003541565b5090565b5b808211156200359e575f815f90555060010162003586565b5090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015620035db578082015181840152602081019050620035be565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6200360282620035a2565b6200360e8185620035ac565b935062003620818560208601620035bc565b6200362b81620035e6565b840191505092915050565b5f6020820190508181035f830152620036508184620035f6565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620036948262003669565b9050919050565b620036a68162003688565b8114620036b1575f80fd5b50565b5f81359050620036c4816200369b565b92915050565b5f819050919050565b620036de81620036ca565b8114620036e9575f80fd5b50565b5f81359050620036fc81620036d3565b92915050565b5f80604083850312156200371b576200371a62003661565b5b5f6200372a85828601620036b4565b92505060206200373d85828601620036ec565b9150509250929050565b5f8115159050919050565b6200375d8162003747565b82525050565b5f602082019050620037785f83018462003752565b92915050565b5f6020828403121562003796576200379562003661565b5b5f620037a584828501620036b4565b91505092915050565b620037b981620036ca565b82525050565b5f602082019050620037d45f830184620037ae565b92915050565b5f60208284031215620037f257620037f162003661565b5b5f6200380184828501620036ec565b91505092915050565b5f806040838503121562003823576200382262003661565b5b5f6200383285828601620036ec565b92505060206200384585828601620036b4565b9150509250929050565b5f805f6060848603121562003869576200386862003661565b5b5f6200387886828701620036b4565b93505060206200388b86828701620036b4565b92505060406200389e86828701620036ec565b9150509250925092565b620038b38162003688565b82525050565b5f602082019050620038ce5f830184620038a8565b92915050565b5f60ff82169050919050565b620038eb81620038d4565b82525050565b5f602082019050620039065f830184620038e0565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6200394c82620035e6565b810181811067ffffffffffffffff821117156200396e576200396d62003914565b5b80604052505050565b5f6200398262003658565b905062003990828262003941565b919050565b5f67ffffffffffffffff821115620039b257620039b162003914565b5b620039bd82620035e6565b9050602081019050919050565b828183375f83830152505050565b5f620039ee620039e88462003995565b62003977565b90508281526020810184848401111562003a0d5762003a0c62003910565b5b62003a1a848285620039ca565b509392505050565b5f82601f83011262003a395762003a386200390c565b5b813562003a4b848260208601620039d8565b91505092915050565b5f805f6060848603121562003a6e5762003a6d62003661565b5b5f62003a7d86828701620036ec565b935050602084013567ffffffffffffffff81111562003aa15762003aa062003665565b5b62003aaf8682870162003a22565b925050604062003ac286828701620036b4565b9150509250925092565b5f819050919050565b62003ae08162003acc565b82525050565b5f60208201905062003afb5f83018462003ad5565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b62003b378162003b01565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b62003b7181620036ca565b82525050565b5f62003b84838362003b66565b60208301905092915050565b5f602082019050919050565b5f62003ba88262003b3d565b62003bb4818562003b47565b935062003bc18362003b57565b805f5b8381101562003bf757815162003bdb888262003b77565b975062003be88362003b90565b92505060018101905062003bc4565b5085935050505092915050565b5f60e08201905062003c195f83018a62003b2c565b818103602083015262003c2d8189620035f6565b9050818103604083015262003c438188620035f6565b905062003c546060830187620037ae565b62003c636080830186620038a8565b62003c7260a083018562003ad5565b81810360c083015262003c86818462003b9c565b905098975050505050505050565b5f60808201905062003ca95f830187620037ae565b62003cb86020830186620037ae565b62003cc76040830185620037ae565b62003cd66060830184620037ae565b95945050505050565b5f806040838503121562003cf85762003cf762003661565b5b5f62003d0785828601620036ec565b925050602062003d1a85828601620036ec565b9150509250929050565b62003d2f81620038d4565b811462003d3a575f80fd5b50565b5f8135905062003d4d8162003d24565b92915050565b62003d5e8162003acc565b811462003d69575f80fd5b50565b5f8135905062003d7c8162003d53565b92915050565b5f805f805f805f60e0888a03121562003da05762003d9f62003661565b5b5f62003daf8a828b01620036b4565b975050602062003dc28a828b01620036b4565b965050604062003dd58a828b01620036ec565b955050606062003de88a828b01620036ec565b945050608062003dfb8a828b0162003d3d565b93505060a062003e0e8a828b0162003d6c565b92505060c062003e218a828b0162003d6c565b91505092959891949750929550565b5f806040838503121562003e495762003e4862003661565b5b5f62003e5885828601620036b4565b925050602062003e6b85828601620036b4565b9150509250929050565b5f60408201905062003e8a5f830185620038a8565b62003e996020830184620037ae565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062003ee557607f821691505b60208210810362003efb5762003efa62003ea0565b5b50919050565b7f436861696e20616c726561647920656e61626c656421000000000000000000005f82015250565b5f62003f37601683620035ac565b915062003f448262003f01565b602082019050919050565b5f6020820190508181035f83015262003f688162003f29565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62003fd582620036ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200400a576200400962003f9c565b5b600182019050919050565b5f6080820190508181035f8301526200402f8187620035f6565b9050620040406020830186620037ae565b6200404f6040830185620038a8565b6200405e6060830184620038a8565b95945050505050565b5f6200407382620036ca565b91506200408083620036ca565b92508282039050818111156200409b576200409a62003f9c565b5b92915050565b620040ac8162003747565b8114620040b7575f80fd5b50565b5f81519050620040ca81620040a1565b92915050565b5f60208284031215620040e857620040e762003661565b5b5f620040f784828501620040ba565b91505092915050565b7f596f752063616e7420636c61696d2100000000000000000000000000000000005f82015250565b5f62004136600f83620035ac565b9150620041438262004100565b602082019050919050565b5f6020820190508181035f830152620041678162004128565b9050919050565b7f436861696e20616c72656164792064697361626c6564210000000000000000005f82015250565b5f620041a4601783620035ac565b9150620041b1826200416e565b602082019050919050565b5f6020820190508181035f830152620041d58162004196565b9050919050565b7f6e6f7420616c6c6f7765640000000000000000000000000000000000000000005f82015250565b5f62004212600b83620035ac565b91506200421f82620041dc565b602082019050919050565b5f6020820190508181035f830152620042438162004204565b9050919050565b7f4e6f7420616c6c6f77656420746f20696e7465726163742100000000000000005f82015250565b5f62004280601883620035ac565b91506200428d826200424a565b602082019050919050565b5f6020820190508181035f830152620042b18162004272565b9050919050565b5f81519050620042c881620036d3565b92915050565b5f60208284031215620042e657620042e562003661565b5b5f620042f584828501620042b8565b91505092915050565b5f6200430a82620036ca565b91506200431783620036ca565b925082820190508082111562004332576200433162003f9c565b5b92915050565b7f436861696e206e6f7420656e61626c65642100000000000000000000000000005f82015250565b5f6200436e601283620035ac565b91506200437b8262004338565b602082019050919050565b5f6020820190508181035f8301526200439f8162004360565b9050919050565b5f60c082019050620043bb5f83018962003ad5565b620043ca6020830188620038a8565b620043d96040830187620038a8565b620043e86060830186620037ae565b620043f76080830185620037ae565b6200440660a0830184620037ae565b979650505050505050565b5f604082019050620044265f830185620038a8565b620044356020830184620038a8565b9392505050565b5f606082019050620044515f830186620038a8565b620044606020830185620037ae565b6200446f6040830184620037ae565b949350505050565b5f6200448382620036ca565b91506200449083620036ca565b9250828202620044a081620036ca565b91508282048414831517620044ba57620044b962003f9c565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f620044fa82620036ca565b91506200450783620036ca565b9250826200451a5762004519620044c1565b5b828204905092915050565b5f60a0820190506200453a5f83018862003ad5565b62004549602083018762003ad5565b62004558604083018662003ad5565b620045676060830185620037ae565b620045766080830184620038a8565b9695505050505050565b5f608082019050620045955f83018762003ad5565b620045a46020830186620038e0565b620045b3604083018562003ad5565b620045c2606083018462003ad5565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfe608060405234801562000010575f80fd5b50604051620011c0380380620011c083398181016040528101906200003691906200043e565b805f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000aa575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000a19190620004dd565b60405180910390fd5b620000bb816200015f60201b60201c565b508360019081620000cd919062000726565b50826002819055508160045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050506200080a565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620002818262000239565b810181811067ffffffffffffffff82111715620002a357620002a262000249565b5b80604052505050565b5f620002b762000220565b9050620002c5828262000276565b919050565b5f67ffffffffffffffff821115620002e757620002e662000249565b5b620002f28262000239565b9050602081019050919050565b5f5b838110156200031e57808201518184015260208101905062000301565b5f8484015250505050565b5f6200033f6200033984620002ca565b620002ac565b9050828152602081018484840111156200035e576200035d62000235565b5b6200036b848285620002ff565b509392505050565b5f82601f8301126200038a576200038962000231565b5b81516200039c84826020860162000329565b91505092915050565b5f819050919050565b620003b981620003a5565b8114620003c4575f80fd5b50565b5f81519050620003d781620003ae565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200040882620003dd565b9050919050565b6200041a81620003fc565b811462000425575f80fd5b50565b5f8151905062000438816200040f565b92915050565b5f805f806080858703121562000459576200045862000229565b5b5f85015167ffffffffffffffff8111156200047957620004786200022d565b5b620004878782880162000373565b94505060206200049a87828801620003c7565b9350506040620004ad8782880162000428565b9250506060620004c08782880162000428565b91505092959194509250565b620004d781620003fc565b82525050565b5f602082019050620004f25f830184620004cc565b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200054757607f821691505b6020821081036200055d576200055c62000502565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620005c17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000584565b620005cd868362000584565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6200060e620006086200060284620003a5565b620005e5565b620003a5565b9050919050565b5f819050919050565b6200062983620005ee565b62000641620006388262000615565b84845462000590565b825550505050565b5f90565b6200065762000649565b620006648184846200061e565b505050565b5b818110156200068b576200067f5f826200064d565b6001810190506200066a565b5050565b601f821115620006da57620006a48162000563565b620006af8462000575565b81016020851015620006bf578190505b620006d7620006ce8562000575565b83018262000669565b50505b505050565b5f82821c905092915050565b5f620006fc5f1984600802620006df565b1980831691505092915050565b5f620007168383620006eb565b9150826002028217905092915050565b6200073182620004f8565b67ffffffffffffffff8111156200074d576200074c62000249565b5b6200075982546200052f565b620007668282856200068f565b5f60209050601f8311600181146200079c575f841562000787578287015190505b62000793858262000709565b86555062000802565b601f198416620007ac8662000563565b5f5b82811015620007d557848901518255600182019150602085019450602081019050620007ae565b86831015620007f55784890151620007f1601f891682620006eb565b8355505b6001600288020188555050505b505050505050565b6109a880620008185f395ff3fe608060405234801561000f575f80fd5b5060043610610086575f3560e01c80639a8a0592116100595780639a8a0592146100ea578063c763e5a114610108578063f2fde38b14610126578063fc0c546a1461014257610086565b806310d974ae1461008a57806356e7170c146100a6578063715018a6146100c25780638da5cb5b146100cc575b5f80fd5b6100a4600480360381019061009f9190610688565b610160565b005b6100c060048036038101906100bb9190610688565b61024c565b005b6100ca610333565b005b6100d4610346565b6040516100e191906106d5565b60405180910390f35b6100f261036d565b6040516100ff91906106fd565b60405180910390f35b610110610373565b60405161011d91906107a0565b60405180910390f35b610140600480360381019061013b91906107c0565b6103ff565b005b61014a610483565b6040516101579190610846565b60405180910390f35b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166101a06104a8565b73ffffffffffffffffffffffffffffffffffffffff16146101f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ed906108a9565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f5827c3e8def2eacec3e946260bf6bc1782b9a823f2b99f600f88e5f80b7cfb3f826002546040516102409291906108c7565b60405180910390a25050565b6102546104af565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ae58491883836040518363ffffffff1660e01b81526004016102b09291906108ee565b5f604051808303815f87803b1580156102c7575f80fd5b505af11580156102d9573d5f803e3d5ffd5b505050508173ffffffffffffffffffffffffffffffffffffffff167fe166cae232ae4a1823a66ae352fe64900fcf92f4abd454ca894fdf235179b691826002546040516103279291906108c7565b60405180910390a25050565b61033b6104af565b6103445f610536565b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60025481565b6001805461038090610942565b80601f01602080910402602001604051908101604052809291908181526020018280546103ac90610942565b80156103f75780601f106103ce576101008083540402835291602001916103f7565b820191905f5260205f20905b8154815290600101906020018083116103da57829003601f168201915b505050505081565b6104076104af565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610477575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161046e91906106d5565b60405180910390fd5b61048081610536565b50565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f33905090565b6104b76104a8565b73ffffffffffffffffffffffffffffffffffffffff166104d5610346565b73ffffffffffffffffffffffffffffffffffffffff1614610534576104f86104a8565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161052b91906106d5565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610624826105fb565b9050919050565b6106348161061a565b811461063e575f80fd5b50565b5f8135905061064f8161062b565b92915050565b5f819050919050565b61066781610655565b8114610671575f80fd5b50565b5f813590506106828161065e565b92915050565b5f806040838503121561069e5761069d6105f7565b5b5f6106ab85828601610641565b92505060206106bc85828601610674565b9150509250929050565b6106cf8161061a565b82525050565b5f6020820190506106e85f8301846106c6565b92915050565b6106f781610655565b82525050565b5f6020820190506107105f8301846106ee565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561074d578082015181840152602081019050610732565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61077282610716565b61077c8185610720565b935061078c818560208601610730565b61079581610758565b840191505092915050565b5f6020820190508181035f8301526107b88184610768565b905092915050565b5f602082840312156107d5576107d46105f7565b5b5f6107e284828501610641565b91505092915050565b5f819050919050565b5f61080e610809610804846105fb565b6107eb565b6105fb565b9050919050565b5f61081f826107f4565b9050919050565b5f61083082610815565b9050919050565b61084081610826565b82525050565b5f6020820190506108595f830184610837565b92915050565b7f6f6e6c7920746f6b656e20636f6e7472616374210000000000000000000000005f82015250565b5f610893601483610720565b915061089e8261085f565b602082019050919050565b5f6020820190508181035f8301526108c081610887565b9050919050565b5f6040820190506108da5f8301856106ee565b6108e760208301846106ee565b9392505050565b5f6040820190506109015f8301856106c6565b61090e60208301846106ee565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061095957607f821691505b60208210810361096c5761096b610915565b5b5091905056fea2646970667358221220d2834959181aa133204f2acd620ad169caaa0aa0f8a8ade0d37abb0dc697f14764736f6c63430008150033a264697066735822122015a0584f5d4a6796851274e2c9ebcf6737bf65a8468584223919e8054bba349164736f6c63430008150033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000001431e0fae6d7217caa0000000000000000000000000000000c2132d05d31c914a87c6611c10748aeb04b58e8f000000000000000000000000000000000000000000000000000000000000000a4445415220546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044445415200000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801562000010575f80fd5b50600436106200028a575f3560e01c80637985fe201162000163578063ac4afa3811620000d3578063d305180c1162000091578063d305180c1462000805578063d505accf1462000825578063dd62ed3e1462000845578063e042ad58146200087b578063e39e021f146200089d578063f2fde38b14620008d4576200028a565b8063ac4afa381462000748578063ae5849181462000781578063c757483914620007a1578063ce5f282414620007c3578063d2ef079514620007cf576200028a565b806395d89b41116200012157806395d89b411462000678578063a18f07a0146200069a578063a23d3c3514620006d0578063a6d656a314620006f2578063a9059cbb1462000712576200028a565b80637985fe2014620005b65780637ecebe0014620005ec57806384b0196e14620006225780638da5cb5b146200064a5780638fd3ab80146200066c576200028a565b80633247f5d611620001ff5780636b4ed21b11620001bd5780636b4ed21b14620004fa57806370a08231146200051c578063715018a614620005525780637175f226146200055e57806375f0a8741462000594576200028a565b80633247f5d6146200042c5780633644e515146200044c578063379607f5146200046e57806344dded46146200048e57806355b523dd14620004c4576200028a565b80631f418fc1116200024d5780631f418fc1146200034857806321e71412146200037e57806323b872dd146200039e5780632a11ced014620003d4578063313ce567146200040a576200028a565b806306fdde03146200028e578063095ea7b314620002b05780630d3cbda714620002e657806318160ddd146200030657806318a03bc21462000328575b5f80fd5b62000298620008f4565b604051620002a7919062003636565b60405180910390f35b620002ce6004803603810190620002c8919062003702565b6200098c565b604051620002dd919062003763565b60405180910390f35b620003046004803603810190620002fe91906200377e565b620009b2565b005b62000310620009ff565b6040516200031f9190620037bf565b60405180910390f35b620003466004803603810190620003409190620037da565b62000a08565b005b6200036660048036038101906200036091906200380a565b62000a9f565b60405162000375919062003763565b60405180910390f35b6200039c60048036038101906200039691906200377e565b62000b72565b005b620003bc6004803603810190620003b691906200384f565b62000bbf565b604051620003cb919062003763565b60405180910390f35b620003f26004803603810190620003ec9190620037da565b62000bf3565b604051620004019190620038b9565b60405180910390f35b6200041462000c2f565b604051620004239190620038f1565b60405180910390f35b6200044a600480360381019062000444919062003a54565b62000c37565b005b6200045662000db4565b60405162000465919062003ae6565b60405180910390f35b6200048c6004803603810190620004869190620037da565b62000dc4565b005b620004ac6004803603810190620004a69190620037da565b62000ffc565b604051620004bb9190620038b9565b60405180910390f35b620004e26004803603810190620004dc91906200380a565b6200102c565b604051620004f19190620037bf565b60405180910390f35b62000504620010fe565b604051620005139190620037bf565b60405180910390f35b6200053a60048036038101906200053491906200377e565b62001104565b604051620005499190620037bf565b60405180910390f35b6200055c6200114a565b005b6200057c6004803603810190620005769190620037da565b62001161565b6040516200058b919062003763565b60405180910390f35b6200059e6200117e565b604051620005ad9190620038b9565b60405180910390f35b620005d46004803603810190620005ce91906200377e565b620011a2565b604051620005e3919062003763565b60405180910390f35b6200060a60048036038101906200060491906200377e565b620011bf565b604051620006199190620037bf565b60405180910390f35b6200062c620011d2565b60405162000641979695949392919062003c04565b60405180910390f35b620006546200127f565b604051620006639190620038b9565b60405180910390f35b62000676620012a6565b005b620006826200135e565b60405162000691919062003636565b60405180910390f35b620006b86004803603810190620006b291906200380a565b620013f6565b604051620006c79190620037bf565b60405180910390f35b620006da62001452565b604051620006e99190620038b9565b60405180910390f35b6200071060048036038101906200070a9190620037da565b62001476565b005b6200073060048036038101906200072a919062003702565b6200150b565b6040516200073f919062003763565b60405180910390f35b620007666004803603810190620007609190620037da565b62001531565b60405162000778949392919062003c94565b60405180910390f35b6200079f600480360381019062000799919062003702565b6200155d565b005b620007ab62001602565b604051620007ba9190620038b9565b60405180910390f35b620007cd62001626565b005b620007ed6004803603810190620007e791906200380a565b62001876565b604051620007fc919062003763565b60405180910390f35b6200082360048036038101906200081d919062003cdf565b620018db565b005b6200084360048036038101906200083d919062003d82565b62001a03565b005b6200086360048036038101906200085d919062003e30565b62001b58565b604051620008729190620037bf565b60405180910390f35b6200088562001bda565b604051620008949190620038b9565b60405180910390f35b620008bb6004803603810190620008b59190620037da565b62001bfe565b604051620008cb92919062003e75565b60405180910390f35b620008f26004803603810190620008ec91906200377e565b62001c4d565b005b606060048054620009059062003ecd565b80601f0160208091040260200160405190810160405280929190818152602001828054620009339062003ecd565b8015620009825780601f10620009585761010080835404028352916020019162000982565b820191905f5260205f20905b8154815290600101906020018083116200096457829003601f168201915b5050505050905090565b5f806200099862001cd8565b9050620009a781858562001cdf565b600191505092915050565b620009bc62001cf3565b80600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f600354905090565b62000a1262001cf3565b60185f8281526020019081526020015f205f9054906101000a900460ff161562000a73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a6a9062003f4f565b60405180910390fd5b600160185f8381526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f805f90505b60115f8581526020019081526020015f206005015481101562000b67578273ffffffffffffffffffffffffffffffffffffffff1660115f8681526020019081526020015f20600401828154811062000b025762000b0162003f6f565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160362000b5157600191505062000b6c565b808062000b5e9062003fc9565b91505062000aa5565b505f90505b92915050565b62000b7c62001cf3565b80600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f8062000bcb62001cd8565b905062000bda85828562001d83565b62000be785858562001e1d565b60019150509392505050565b6017818154811062000c03575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6012905090565b62000c4162001cf3565b60185f8481526020019081526020015f205f9054906101000a900460ff161562000ca2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c999062003f4f565b60405180910390fd5b600160185f8581526020019081526020015f205f6101000a81548160ff0219169083151502179055505f8284308460405162000cde9062003419565b62000ced949392919062004015565b604051809103905ff08015801562000d07573d5f803e3d5ffd5b5090508060195f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050505050565b5f62000dbf62001f15565b905090565b62000dd98162000dd362001cd8565b62000a9f565b801562000df8575062000df68162000df062001cd8565b62001876565b155b1562000fbc575f62000e148262000e0e62001cd8565b6200102c565b90505f62000e23838362001fd0565b9050600160115f8581526020019081526020015f206006015f62000e4662001cd8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080600a5f82825462000ea8919062004067565b9250508190555060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb62000ef662001cd8565b836040518363ffffffff1660e01b815260040162000f1692919062003e75565b6020604051808303815f875af115801562000f33573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000f599190620040d0565b5062000f6462001cd8565b73ffffffffffffffffffffffffffffffffffffffff16837fb3aa8b63132d4c8c050f3c58896489ee2a949eaf514406ec8e56b2da530551c08360405162000fac9190620037bf565b60405180910390a3505062000ff9565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ff0906200414e565b60405180910390fd5b50565b6019602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f90505b60115f8581526020019081526020015f2060050154811015620010f3578273ffffffffffffffffffffffffffffffffffffffff1660115f8681526020019081526020015f2060040182815481106200108f576200108e62003f6f565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603620010dd5780915050620010f8565b8080620010ea9062003fc9565b91505062001032565b505f90505b92915050565b60135481565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6200115462001cf3565b6200115f5f62002038565b565b6018602052805f5260405f205f915054906101000a900460ff1681565b7f0000000000000000000000008072491267e5dce46abcf69d155ce60340af4d9b81565b601a602052805f5260405f205f915054906101000a900460ff1681565b5f620011cb82620020f9565b9050919050565b5f6060805f805f6060620011e56200213f565b620011ef6200217c565b46305f801b5f67ffffffffffffffff81111562001211576200121062003914565b5b604051908082528060200260200182016040528015620012405781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f620012b162001cd8565b90505f620012bf8262001104565b9050620012cd8282620021b9565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eae3d7d983836040518363ffffffff1660e01b81526004016200132b92919062003e75565b5f604051808303815f87803b15801562001343575f80fd5b505af115801562001356573d5f803e3d5ffd5b505050505050565b6060600580546200136f9062003ecd565b80601f01602080910402602001604051908101604052809291908181526020018280546200139d9062003ecd565b8015620013ec5780601f10620013c257610100808354040283529160200191620013ec565b820191905f5260205f20905b815481529060010190602001808311620013ce57829003601f168201915b5050505050905090565b5f62001403838362000a9f565b801562001419575062001417838362001876565b155b1562001448575f6200142c84846200102c565b90505f6200143b858362001fd0565b905080925050506200144c565b5f90505b92915050565b7f000000000000000000000000410f2d02cc3712d2e87d44e25056417f4b69dd9b81565b6200148062001cf3565b60185f8281526020019081526020015f205f9054906101000a900460ff16620014e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620014d790620041bc565b60405180910390fd5b5f60185f8381526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f806200151762001cd8565b90506200152681858562001e1d565b600191505092915050565b6011602052805f5260405f205f91509050805f0154908060010154908060020154908060050154905084565b601a5f6200156a62001cd8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16620015f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620015e9906200422a565b60405180910390fd5b620015fe82826200223d565b5050565b7f000000000000000000000000c79b3c0772ee5e386546c9297fbcbd82efaaad9781565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166200166862001cd8565b73ffffffffffffffffffffffffffffffffffffffff1614620016c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620016b89062004298565b60405180910390fd5b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016200171e9190620038b9565b602060405180830381865afa1580156200173a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620017609190620042ce565b90505f600a548262001773919062004067565b90508060115f60125481526020019081526020015f205f01819055504260115f60125481526020019081526020015f2060010181905550620017b4620009ff565b60115f60125481526020019081526020015f2060020181905550601460115f60125481526020019081526020015f20600301908054620017f692919062003427565b50601760115f60125481526020019081526020015f206004019080546200181f929190620034ed565b5060135460115f60125481526020019081526020015f206005018190555080600a5f828254620018509190620042fe565b92505081905550600160125f8282546200186b9190620042fe565b925050819055505050565b5f60115f8481526020019081526020015f206006015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b60185f8381526020019081526020015f205f9054906101000a900460ff166200193b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620019329062004386565b60405180910390fd5b5f60195f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f819050620019886200198162001cd8565b84620021b9565b8073ffffffffffffffffffffffffffffffffffffffff166310d974ae620019ae62001cd8565b856040518363ffffffff1660e01b8152600401620019ce92919062003e75565b5f604051808303815f87803b158015620019e6575f80fd5b505af1158015620019f9573d5f803e3d5ffd5b5050505050505050565b8342111562001a4b57836040517f6279130200000000000000000000000000000000000000000000000000000000815260040162001a429190620037bf565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888862001a7b8c620022c1565b8960405160200162001a9396959493929190620043a6565b6040516020818303038152906040528051906020012090505f62001ab78262002314565b90505f62001ac88287878762002331565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161462001b3f57808a6040517f4b800e4600000000000000000000000000000000000000000000000000000000815260040162001b3692919062004411565b60405180910390fd5b62001b4c8a8a8a62001cdf565b50505050505050505050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b7f000000000000000000000000a73d937c7c84980be530afe7d0a85cde9a5ac2f281565b6014818154811062001c0e575f80fd5b905f5260205f2090600202015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b62001c5762001cf3565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362001cca575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040162001cc19190620038b9565b60405180910390fd5b62001cd58162002038565b50565b5f33905090565b62001cee838383600162002363565b505050565b62001cfd62001cd8565b73ffffffffffffffffffffffffffffffffffffffff1662001d1d6200127f565b73ffffffffffffffffffffffffffffffffffffffff161462001d815762001d4362001cd8565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040162001d789190620038b9565b60405180910390fd5b565b5f62001d90848462001b58565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811462001e17578181101562001e06578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040162001dfd939291906200443c565b60405180910390fd5b62001e1684848484035f62002363565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362001e90575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040162001e879190620038b9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362001f03575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040162001efa9190620038b9565b60405180910390fd5b62001f108383836200253b565b505050565b5f7f0000000000000000000000004d08ef733cf27b4cd37810cf9b72a82d2a13554973ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801562001f9157507f000000000000000000000000000000000000000000000000000000000000008946145b1562001fc0577fa8aa8560de00b8a3686a037685530078ddedf6b5f73d284256645476603b9ead905062001fcd565b62001fca62002803565b90505b90565b5f8060115f8581526020019081526020015f2090508060020154815f015482600301858154811062002007576200200662003f6f565b5b905f5260205f2090600202016001015462002023919062004477565b6200202f9190620044ee565b91505092915050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b60606200217760067f4445415220546f6b656e0000000000000000000000000000000000000000000a6200289a90919063ffffffff16565b905090565b6060620021b460077f31000000000000000000000000000000000000000000000000000000000000016200289a90919063ffffffff16565b905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200222c575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401620022239190620038b9565b60405180910390fd5b62002239825f836200253b565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620022b0575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401620022a79190620038b9565b60405180910390fd5b620022bd5f83836200253b565b5050565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050559050919050565b5f6200232a6200232362001f15565b8362002953565b9050919050565b5f805f80620023438888888862002993565b92509250925062002355828262002a81565b829350505050949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603620023d6575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401620023cd9190620038b9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362002449575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401620024409190620038b9565b60405180910390fd5b8160025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801562002535578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516200252c9190620037bf565b60405180910390a35b50505050565b6200254883838362002c03565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620027995760165f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166200278d57601782908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601460405180604001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020016200265f8562001104565b815250908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101555050600160165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555060135460155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600160135f828254620027859190620042fe565b925050819055505b620027988262002e2a565b5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620027fe575f620027d98462001104565b1115620027f157620027eb8362002e2a565b620027fd565b620027fc8362002f1d565b5b5b505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4b22ba47557354598cfb0b5e298474c8e33a8855501cbc707b0691b5dfdcbdae7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200287f95949392919062004525565b60405160208183030381529060405280519060200120905090565b606060ff5f1b8314620028ba57620028b28362003352565b90506200294d565b818054620028c89062003ecd565b80601f0160208091040260200160405190810160405280929190818152602001828054620028f69062003ecd565b8015620029455780601f106200291b5761010080835404028352916020019162002945565b820191905f5260205f20905b8154815290600101906020018083116200292757829003601f168201915b505050505090505b92915050565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115620029d1575f60038592509250925062002a77565b5f6001888888886040515f8152602001604052604051620029f6949392919062004580565b6020604051602081039080840390855afa15801562002a17573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362002a6a575f60015f801b9350935093505062002a77565b805f805f1b935093509350505b9450945094915050565b5f600381111562002a975762002a96620045cb565b5b82600381111562002aad5762002aac620045cb565b5b031562002bff576001600381111562002acb5762002aca620045cb565b5b82600381111562002ae15762002ae0620045cb565b5b0362002b19576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600381111562002b305762002b2f620045cb565b5b82600381111562002b465762002b45620045cb565b5b0362002b8d57805f1c6040517ffce698f700000000000000000000000000000000000000000000000000000000815260040162002b849190620037bf565b60405180910390fd5b60038081111562002ba35762002ba2620045cb565b5b82600381111562002bb95762002bb8620045cb565b5b0362002bfe57806040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260040162002bf5919062003ae6565b60405180910390fd5b5b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362002c57578060035f82825462002c4a9190620042fe565b9250508190555062002d2a565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101562002ce4578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040162002cdb939291906200443c565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362002d73578060035f828254039250508190555062002dbe565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162002e1d9190620037bf565b60405180910390a3505050565b5f60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508173ffffffffffffffffffffffffffffffffffffffff166014828154811062002e995762002e9862003f6f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160362002f195762002eee8262001104565b6014828154811062002f055762002f0462003f6f565b5b905f5260205f209060020201600101819055505b5050565b5f60165f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f600160178054905062002f86919062004067565b90505f60155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181036200307657601780548062002fe65762002fe5620045f8565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905560148054806200302d576200302c620045f8565b5b600190038181905f5260205f2090600202015f8082015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182015f90555050905562003332565b5f601783815481106200308e576200308d62003f6f565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050816017848154811062003111576200311062003f6f565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601481815481106200316d576200316c62003f6f565b5b905f5260205f2090600202016014848154811062003190576200318f62003f6f565b5b905f5260205f2090600202015f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182015481600101559050508260155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506017805480620032a557620032a4620045f8565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556014805480620032ec57620032eb620045f8565b5b600190038181905f5260205f2090600202015f8082015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182015f90555050905550505b600160135f82825462003346919062004067565b92505081905550505050565b60605f6200336083620033ca565b90505f602067ffffffffffffffff81111562003381576200338062003914565b5b6040519080825280601f01601f191660200182016040528015620033b45781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b5f8060ff835f1c169050601f81111562003410576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b6111c0806200462683390190565b828054828255905f5260205f20906002028101928215620034da575f5260205f209160020282015b82811115620034d95782825f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182015481600101555050916002019190600201906200344f565b5b509050620034e9919062003540565b5090565b828054828255905f5260205f209081019282156200352d575f5260205f209182015b828111156200352c5782548255916001019190600101906200350f565b5b5090506200353c919062003585565b5090565b5b8082111562003581575f8082015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182015f90555060020162003541565b5090565b5b808211156200359e575f815f90555060010162003586565b5090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015620035db578082015181840152602081019050620035be565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6200360282620035a2565b6200360e8185620035ac565b935062003620818560208601620035bc565b6200362b81620035e6565b840191505092915050565b5f6020820190508181035f830152620036508184620035f6565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620036948262003669565b9050919050565b620036a68162003688565b8114620036b1575f80fd5b50565b5f81359050620036c4816200369b565b92915050565b5f819050919050565b620036de81620036ca565b8114620036e9575f80fd5b50565b5f81359050620036fc81620036d3565b92915050565b5f80604083850312156200371b576200371a62003661565b5b5f6200372a85828601620036b4565b92505060206200373d85828601620036ec565b9150509250929050565b5f8115159050919050565b6200375d8162003747565b82525050565b5f602082019050620037785f83018462003752565b92915050565b5f6020828403121562003796576200379562003661565b5b5f620037a584828501620036b4565b91505092915050565b620037b981620036ca565b82525050565b5f602082019050620037d45f830184620037ae565b92915050565b5f60208284031215620037f257620037f162003661565b5b5f6200380184828501620036ec565b91505092915050565b5f806040838503121562003823576200382262003661565b5b5f6200383285828601620036ec565b92505060206200384585828601620036b4565b9150509250929050565b5f805f6060848603121562003869576200386862003661565b5b5f6200387886828701620036b4565b93505060206200388b86828701620036b4565b92505060406200389e86828701620036ec565b9150509250925092565b620038b38162003688565b82525050565b5f602082019050620038ce5f830184620038a8565b92915050565b5f60ff82169050919050565b620038eb81620038d4565b82525050565b5f602082019050620039065f830184620038e0565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6200394c82620035e6565b810181811067ffffffffffffffff821117156200396e576200396d62003914565b5b80604052505050565b5f6200398262003658565b905062003990828262003941565b919050565b5f67ffffffffffffffff821115620039b257620039b162003914565b5b620039bd82620035e6565b9050602081019050919050565b828183375f83830152505050565b5f620039ee620039e88462003995565b62003977565b90508281526020810184848401111562003a0d5762003a0c62003910565b5b62003a1a848285620039ca565b509392505050565b5f82601f83011262003a395762003a386200390c565b5b813562003a4b848260208601620039d8565b91505092915050565b5f805f6060848603121562003a6e5762003a6d62003661565b5b5f62003a7d86828701620036ec565b935050602084013567ffffffffffffffff81111562003aa15762003aa062003665565b5b62003aaf8682870162003a22565b925050604062003ac286828701620036b4565b9150509250925092565b5f819050919050565b62003ae08162003acc565b82525050565b5f60208201905062003afb5f83018462003ad5565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b62003b378162003b01565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b62003b7181620036ca565b82525050565b5f62003b84838362003b66565b60208301905092915050565b5f602082019050919050565b5f62003ba88262003b3d565b62003bb4818562003b47565b935062003bc18362003b57565b805f5b8381101562003bf757815162003bdb888262003b77565b975062003be88362003b90565b92505060018101905062003bc4565b5085935050505092915050565b5f60e08201905062003c195f83018a62003b2c565b818103602083015262003c2d8189620035f6565b9050818103604083015262003c438188620035f6565b905062003c546060830187620037ae565b62003c636080830186620038a8565b62003c7260a083018562003ad5565b81810360c083015262003c86818462003b9c565b905098975050505050505050565b5f60808201905062003ca95f830187620037ae565b62003cb86020830186620037ae565b62003cc76040830185620037ae565b62003cd66060830184620037ae565b95945050505050565b5f806040838503121562003cf85762003cf762003661565b5b5f62003d0785828601620036ec565b925050602062003d1a85828601620036ec565b9150509250929050565b62003d2f81620038d4565b811462003d3a575f80fd5b50565b5f8135905062003d4d8162003d24565b92915050565b62003d5e8162003acc565b811462003d69575f80fd5b50565b5f8135905062003d7c8162003d53565b92915050565b5f805f805f805f60e0888a03121562003da05762003d9f62003661565b5b5f62003daf8a828b01620036b4565b975050602062003dc28a828b01620036b4565b965050604062003dd58a828b01620036ec565b955050606062003de88a828b01620036ec565b945050608062003dfb8a828b0162003d3d565b93505060a062003e0e8a828b0162003d6c565b92505060c062003e218a828b0162003d6c565b91505092959891949750929550565b5f806040838503121562003e495762003e4862003661565b5b5f62003e5885828601620036b4565b925050602062003e6b85828601620036b4565b9150509250929050565b5f60408201905062003e8a5f830185620038a8565b62003e996020830184620037ae565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062003ee557607f821691505b60208210810362003efb5762003efa62003ea0565b5b50919050565b7f436861696e20616c726561647920656e61626c656421000000000000000000005f82015250565b5f62003f37601683620035ac565b915062003f448262003f01565b602082019050919050565b5f6020820190508181035f83015262003f688162003f29565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62003fd582620036ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200400a576200400962003f9c565b5b600182019050919050565b5f6080820190508181035f8301526200402f8187620035f6565b9050620040406020830186620037ae565b6200404f6040830185620038a8565b6200405e6060830184620038a8565b95945050505050565b5f6200407382620036ca565b91506200408083620036ca565b92508282039050818111156200409b576200409a62003f9c565b5b92915050565b620040ac8162003747565b8114620040b7575f80fd5b50565b5f81519050620040ca81620040a1565b92915050565b5f60208284031215620040e857620040e762003661565b5b5f620040f784828501620040ba565b91505092915050565b7f596f752063616e7420636c61696d2100000000000000000000000000000000005f82015250565b5f62004136600f83620035ac565b9150620041438262004100565b602082019050919050565b5f6020820190508181035f830152620041678162004128565b9050919050565b7f436861696e20616c72656164792064697361626c6564210000000000000000005f82015250565b5f620041a4601783620035ac565b9150620041b1826200416e565b602082019050919050565b5f6020820190508181035f830152620041d58162004196565b9050919050565b7f6e6f7420616c6c6f7765640000000000000000000000000000000000000000005f82015250565b5f62004212600b83620035ac565b91506200421f82620041dc565b602082019050919050565b5f6020820190508181035f830152620042438162004204565b9050919050565b7f4e6f7420616c6c6f77656420746f20696e7465726163742100000000000000005f82015250565b5f62004280601883620035ac565b91506200428d826200424a565b602082019050919050565b5f6020820190508181035f830152620042b18162004272565b9050919050565b5f81519050620042c881620036d3565b92915050565b5f60208284031215620042e657620042e562003661565b5b5f620042f584828501620042b8565b91505092915050565b5f6200430a82620036ca565b91506200431783620036ca565b925082820190508082111562004332576200433162003f9c565b5b92915050565b7f436861696e206e6f7420656e61626c65642100000000000000000000000000005f82015250565b5f6200436e601283620035ac565b91506200437b8262004338565b602082019050919050565b5f6020820190508181035f8301526200439f8162004360565b9050919050565b5f60c082019050620043bb5f83018962003ad5565b620043ca6020830188620038a8565b620043d96040830187620038a8565b620043e86060830186620037ae565b620043f76080830185620037ae565b6200440660a0830184620037ae565b979650505050505050565b5f604082019050620044265f830185620038a8565b620044356020830184620038a8565b9392505050565b5f606082019050620044515f830186620038a8565b620044606020830185620037ae565b6200446f6040830184620037ae565b949350505050565b5f6200448382620036ca565b91506200449083620036ca565b9250828202620044a081620036ca565b91508282048414831517620044ba57620044b962003f9c565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f620044fa82620036ca565b91506200450783620036ca565b9250826200451a5762004519620044c1565b5b828204905092915050565b5f60a0820190506200453a5f83018862003ad5565b62004549602083018762003ad5565b62004558604083018662003ad5565b620045676060830185620037ae565b620045766080830184620038a8565b9695505050505050565b5f608082019050620045955f83018762003ad5565b620045a46020830186620038e0565b620045b3604083018562003ad5565b620045c2606083018462003ad5565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfe608060405234801562000010575f80fd5b50604051620011c0380380620011c083398181016040528101906200003691906200043e565b805f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000aa575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000a19190620004dd565b60405180910390fd5b620000bb816200015f60201b60201c565b508360019081620000cd919062000726565b50826002819055508160045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050506200080a565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620002818262000239565b810181811067ffffffffffffffff82111715620002a357620002a262000249565b5b80604052505050565b5f620002b762000220565b9050620002c5828262000276565b919050565b5f67ffffffffffffffff821115620002e757620002e662000249565b5b620002f28262000239565b9050602081019050919050565b5f5b838110156200031e57808201518184015260208101905062000301565b5f8484015250505050565b5f6200033f6200033984620002ca565b620002ac565b9050828152602081018484840111156200035e576200035d62000235565b5b6200036b848285620002ff565b509392505050565b5f82601f8301126200038a576200038962000231565b5b81516200039c84826020860162000329565b91505092915050565b5f819050919050565b620003b981620003a5565b8114620003c4575f80fd5b50565b5f81519050620003d781620003ae565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200040882620003dd565b9050919050565b6200041a81620003fc565b811462000425575f80fd5b50565b5f8151905062000438816200040f565b92915050565b5f805f806080858703121562000459576200045862000229565b5b5f85015167ffffffffffffffff8111156200047957620004786200022d565b5b620004878782880162000373565b94505060206200049a87828801620003c7565b9350506040620004ad8782880162000428565b9250506060620004c08782880162000428565b91505092959194509250565b620004d781620003fc565b82525050565b5f602082019050620004f25f830184620004cc565b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200054757607f821691505b6020821081036200055d576200055c62000502565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620005c17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000584565b620005cd868362000584565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6200060e620006086200060284620003a5565b620005e5565b620003a5565b9050919050565b5f819050919050565b6200062983620005ee565b62000641620006388262000615565b84845462000590565b825550505050565b5f90565b6200065762000649565b620006648184846200061e565b505050565b5b818110156200068b576200067f5f826200064d565b6001810190506200066a565b5050565b601f821115620006da57620006a48162000563565b620006af8462000575565b81016020851015620006bf578190505b620006d7620006ce8562000575565b83018262000669565b50505b505050565b5f82821c905092915050565b5f620006fc5f1984600802620006df565b1980831691505092915050565b5f620007168383620006eb565b9150826002028217905092915050565b6200073182620004f8565b67ffffffffffffffff8111156200074d576200074c62000249565b5b6200075982546200052f565b620007668282856200068f565b5f60209050601f8311600181146200079c575f841562000787578287015190505b62000793858262000709565b86555062000802565b601f198416620007ac8662000563565b5f5b82811015620007d557848901518255600182019150602085019450602081019050620007ae565b86831015620007f55784890151620007f1601f891682620006eb565b8355505b6001600288020188555050505b505050505050565b6109a880620008185f395ff3fe608060405234801561000f575f80fd5b5060043610610086575f3560e01c80639a8a0592116100595780639a8a0592146100ea578063c763e5a114610108578063f2fde38b14610126578063fc0c546a1461014257610086565b806310d974ae1461008a57806356e7170c146100a6578063715018a6146100c25780638da5cb5b146100cc575b5f80fd5b6100a4600480360381019061009f9190610688565b610160565b005b6100c060048036038101906100bb9190610688565b61024c565b005b6100ca610333565b005b6100d4610346565b6040516100e191906106d5565b60405180910390f35b6100f261036d565b6040516100ff91906106fd565b60405180910390f35b610110610373565b60405161011d91906107a0565b60405180910390f35b610140600480360381019061013b91906107c0565b6103ff565b005b61014a610483565b6040516101579190610846565b60405180910390f35b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166101a06104a8565b73ffffffffffffffffffffffffffffffffffffffff16146101f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ed906108a9565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f5827c3e8def2eacec3e946260bf6bc1782b9a823f2b99f600f88e5f80b7cfb3f826002546040516102409291906108c7565b60405180910390a25050565b6102546104af565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ae58491883836040518363ffffffff1660e01b81526004016102b09291906108ee565b5f604051808303815f87803b1580156102c7575f80fd5b505af11580156102d9573d5f803e3d5ffd5b505050508173ffffffffffffffffffffffffffffffffffffffff167fe166cae232ae4a1823a66ae352fe64900fcf92f4abd454ca894fdf235179b691826002546040516103279291906108c7565b60405180910390a25050565b61033b6104af565b6103445f610536565b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60025481565b6001805461038090610942565b80601f01602080910402602001604051908101604052809291908181526020018280546103ac90610942565b80156103f75780601f106103ce576101008083540402835291602001916103f7565b820191905f5260205f20905b8154815290600101906020018083116103da57829003601f168201915b505050505081565b6104076104af565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610477575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161046e91906106d5565b60405180910390fd5b61048081610536565b50565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f33905090565b6104b76104a8565b73ffffffffffffffffffffffffffffffffffffffff166104d5610346565b73ffffffffffffffffffffffffffffffffffffffff1614610534576104f86104a8565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161052b91906106d5565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610624826105fb565b9050919050565b6106348161061a565b811461063e575f80fd5b50565b5f8135905061064f8161062b565b92915050565b5f819050919050565b61066781610655565b8114610671575f80fd5b50565b5f813590506106828161065e565b92915050565b5f806040838503121561069e5761069d6105f7565b5b5f6106ab85828601610641565b92505060206106bc85828601610674565b9150509250929050565b6106cf8161061a565b82525050565b5f6020820190506106e85f8301846106c6565b92915050565b6106f781610655565b82525050565b5f6020820190506107105f8301846106ee565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561074d578082015181840152602081019050610732565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61077282610716565b61077c8185610720565b935061078c818560208601610730565b61079581610758565b840191505092915050565b5f6020820190508181035f8301526107b88184610768565b905092915050565b5f602082840312156107d5576107d46105f7565b5b5f6107e284828501610641565b91505092915050565b5f819050919050565b5f61080e610809610804846105fb565b6107eb565b6105fb565b9050919050565b5f61081f826107f4565b9050919050565b5f61083082610815565b9050919050565b61084081610826565b82525050565b5f6020820190506108595f830184610837565b92915050565b7f6f6e6c7920746f6b656e20636f6e7472616374210000000000000000000000005f82015250565b5f610893601483610720565b915061089e8261085f565b602082019050919050565b5f6020820190508181035f8301526108c081610887565b9050919050565b5f6040820190506108da5f8301856106ee565b6108e760208301846106ee565b9392505050565b5f6040820190506109015f8301856106c6565b61090e60208301846106ee565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061095957607f821691505b60208210810361096c5761096b610915565b5b5091905056fea2646970667358221220d2834959181aa133204f2acd620ad169caaa0aa0f8a8ade0d37abb0dc697f14764736f6c63430008150033a264697066735822122015a0584f5d4a6796851274e2c9ebcf6737bf65a8468584223919e8054bba349164736f6c63430008150033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000001431e0fae6d7217caa0000000000000000000000000000000c2132d05d31c914a87c6611c10748aeb04b58e8f000000000000000000000000000000000000000000000000000000000000000a4445415220546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044445415200000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): DEAR Token
Arg [1] : symbol (string): DEAR
Arg [2] : supply (uint256): 100000000000000000000000000000
Arg [3] : usdt_ (address): 0xc2132D05D31c914a87C6611C10748AEb04B58e8F

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000001431e0fae6d7217caa0000000
Arg [3] : 000000000000000000000000c2132d05d31c914a87c6611c10748aeb04b58e8f
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [5] : 4445415220546f6b656e00000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 4445415200000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

83722:9089:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15502:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17836:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91379:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16604:99;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92637:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89294:276;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86047:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18636:283;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84927:24;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16455:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91864:394;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82069:114;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90009:530;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85065:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89585:271;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84741:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16766:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12861:103;;;:::i;:::-;;85018:40;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84379:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85142:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81761:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76493:580;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;12186:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91164:201;;;:::i;:::-;;15712:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90767:351;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84197:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92448:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17089:182;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84615:37;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;92266:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84287:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86165:665;;;:::i;:::-;;89870:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91528:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80866:836;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17334:183;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84471:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84779:29;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;13119:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15502:91;15547:13;15580:5;15573:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15502:91;:::o;17836:222::-;17936:4;17958:13;17974:12;:10;:12::i;:::-;17958:28;;17997:31;18006:5;18013:7;18022:5;17997:8;:31::i;:::-;18046:4;18039:11;;;17836:222;;;;:::o;91379:110::-;12072:13;:11;:13::i;:::-;91474:6:::1;91449;;:32;;;;;;;;;;;;;;;;;;91379:110:::0;:::o;16604:99::-;16656:7;16683:12;;16676:19;;16604:99;:::o;92637:171::-;12072:13;:11;:13::i;:::-;92703::::1;:22;92717:7;92703:22;;;;;;;;;;;;;;;;;;;;;92700:60;;;92727:33;;;;;;;;;;:::i;:::-;;;;;;;;92700:60;92796:4;92771:13;:22;92785:7;92771:22;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;92637:171:::0;:::o;89294:276::-;89368:4;89388:6;89397:1;89388:10;;89384:156;89402:5;:13;89408:6;89402:13;;;;;;;;;;;:25;;;89399:1;:28;89384:156;;;89478:4;89450:32;;:5;:13;89456:6;89450:13;;;;;;;;;;;:21;;89472:1;89450:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:32;;;89447:82;;89509:4;89502:11;;;;;89447:82;89428:3;;;;;:::i;:::-;;;;89384:156;;;;89557:5;89550:12;;89294:276;;;;;:::o;86047:104::-;12072:13;:11;:13::i;:::-;86136:7:::1;86123:10;;:20;;;;;;;;;;;;;;;;;;86047:104:::0;:::o;18636:283::-;18757:4;18774:15;18792:12;:10;:12::i;:::-;18774:30;;18815:37;18831:4;18837:7;18846:5;18815:15;:37::i;:::-;18863:26;18873:4;18879:2;18883:5;18863:9;:26::i;:::-;18907:4;18900:11;;;18636:283;;;;;:::o;84927:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16455:84::-;16504:5;16529:2;16522:9;;16455:84;:::o;91864:394::-;12072:13;:11;:13::i;:::-;91968::::1;:22;91982:7;91968:22;;;;;;;;;;;;;;;;;;;;;91965:60;;;91992:33;;;;;;;;;;:::i;:::-;;;;;;;;91965:60;92061:4;92036:13;:22;92050:7;92036:22;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;92076:15;92109:9;92119:7;92135:4;92141:7;92094:55;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;92076:73;;92197:4;92160:17;:26;92178:7;92160:26;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;92246:4;92213:15;:30;92237:4;92213:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;91954:304;91864:394:::0;;;:::o;82069:114::-;82128:7;82155:20;:18;:20::i;:::-;82148:27;;82069:114;:::o;90009:530::-;90057:40;90076:6;90084:12;:10;:12::i;:::-;90057:18;:40::i;:::-;:76;;;;;90102:31;90112:6;90120:12;:10;:12::i;:::-;90102:9;:31::i;:::-;90101:32;90057:76;90054:478;;;90149:6;90158:42;90179:6;90187:12;:10;:12::i;:::-;90158:20;:42::i;:::-;90149:51;;90215:11;90229:27;90246:6;90254:1;90229:16;:27::i;:::-;90215:41;;90311:4;90271:5;:13;90277:6;90271:13;;;;;;;;;;;:23;;:37;90295:12;:10;:12::i;:::-;90271:37;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;90346:6;90330:12;;:22;;;;;;;:::i;:::-;;;;;;;;90367:4;;;;;;;;;;;:13;;;90381:12;:10;:12::i;:::-;90395:6;90367:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;90443:12;:10;:12::i;:::-;90422:42;;90436:6;90422:42;90457:6;90422:42;;;;;;:::i;:::-;;;;;;;;90134:342;;90054:478;;;90495:25;;;;;;;;;;:::i;:::-;;;;;;;;90054:478;90009:530;:::o;85065:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;89585:271::-;89661:4;89681:6;89690:1;89681:10;;89677:153;89694:5;:13;89700:6;89694:13;;;;;;;;;;;:25;;;89692:1;:27;89677:153;;;89771:4;89743:32;;:5;:13;89749:6;89743:13;;;;;;;;;;;:21;;89765:1;89743:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:32;;;89740:79;;89802:1;89795:8;;;;;89740:79;89721:3;;;;;:::i;:::-;;;;89677:153;;;;89847:1;89840:8;;89585:271;;;;;:::o;84741:31::-;;;;:::o;16766:118::-;16831:7;16858:9;:18;16868:7;16858:18;;;;;;;;;;;;;;;;16851:25;;16766:118;;;:::o;12861:103::-;12072:13;:11;:13::i;:::-;12926:30:::1;12953:1;12926:18;:30::i;:::-;12861:103::o:0;85018:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;84379:85::-;;;:::o;85142:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;81761:195::-;81897:7;81929:19;81942:5;81929:12;:19::i;:::-;81922:26;;81761:195;;;:::o;76493:580::-;76596:13;76624:18;76657:21;76693:15;76723:25;76763:12;76790:27;76898:13;:11;:13::i;:::-;76926:16;:14;:16::i;:::-;76957:13;76993:4;77021:1;77013:10;;77052:1;77038:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76845:220;;;;;;;;;;;;;;;;;;;;;76493:580;;;;;;;:::o;12186:87::-;12232:7;12259:6;;;;;;;;;;;12252:13;;12186:87;:::o;91164:201::-;91201:12;91216;:10;:12::i;:::-;91201:27;;91239:13;91255:15;91265:4;91255:9;:15::i;:::-;91239:31;;91281:27;91293:4;91299:8;91281:11;:27::i;:::-;91319:6;;;;;;;;;;;:22;;;91342:4;91348:8;91319:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91190:175;;91164:201::o;15712:95::-;15759:13;15792:7;15785:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15712:95;:::o;90767:351::-;90838:4;90857:32;90876:6;90884:4;90857:18;:32::i;:::-;:60;;;;;90894:23;90904:6;90912:4;90894:9;:23::i;:::-;90893:24;90857:60;90854:257;;;90933:6;90942:34;90963:6;90971:4;90942:20;:34::i;:::-;90933:43;;90991:11;91005:27;91022:6;91030:1;91005:16;:27::i;:::-;90991:41;;91054:6;91047:13;;;;;;90854:257;91098:1;91091:8;;90767:351;;;;;:::o;84197:83::-;;;:::o;92448:175::-;12072:13;:11;:13::i;:::-;92516::::1;:22;92530:7;92516:22;;;;;;;;;;;;;;;;;;;;;92512:62;;92540:34;;;;;;;;;;:::i;:::-;;;;;;;;92512:62;92610:5;92585:13;:22;92599:7;92585:22;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;92448:175:::0;:::o;17089:182::-;17158:4;17175:13;17191:12;:10;:12::i;:::-;17175:28;;17214:27;17224:5;17231:2;17235:5;17214:9;:27::i;:::-;17259:4;17252:11;;;17089:182;;;;:::o;84615:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;92266:168::-;92340:15;:29;92356:12;:10;:12::i;:::-;92340:29;;;;;;;;;;;;;;;;;;;;;;;;;92336:56;;92371:21;;;;;;;;;;:::i;:::-;;;;;;;;92336:56;92405:21;92411:7;92420:5;92405;:21::i;:::-;92266:168;;:::o;84287:85::-;;;:::o;86165:665::-;86226:10;;;;;;;;;;;86210:26;;:12;:10;:12::i;:::-;:26;;;86206:66;;86238:34;;;;;;;;;;:::i;:::-;;;;;;;;86206:66;86285:20;86308:4;;;;;;;;;;;:14;;;86331:4;86308:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;86285:52;;86348:11;86377:12;;86362;:27;;;;:::i;:::-;86348:41;;86472:6;86437:5;:20;86443:13;;86437:20;;;;;;;;;;;:32;;:41;;;;86522:15;86489:5;:20;86495:13;;86489:20;;;;;;;;;;;:30;;:48;;;;86589:13;:11;:13::i;:::-;86548:5;:20;86554:13;;86548:20;;;;;;;;;;;:38;;:54;;;;86644:9;86613:5;:20;86619:13;;86613:20;;;;;;;;;;;:28;;:40;;;;;;;;:::i;:::-;;86695:7;86664:5;:20;86670:13;;86664:20;;;;;;;;;;;:28;;:38;;;;;;;;:::i;:::-;;86748:12;;86713:5;:20;86719:13;;86713:20;;;;;;;;;;;:32;;:47;;;;86787:6;86771:12;;:22;;;;;;;:::i;:::-;;;;;;;;86821:1;86804:13;;:18;;;;;;;:::i;:::-;;;;;;;;86195:635;;86165:665::o;89870:125::-;89935:4;89958:5;:13;89964:6;89958:13;;;;;;;;;;;:23;;:29;89982:4;89958:29;;;;;;;;;;;;;;;;;;;;;;;;;89951:36;;89870:125;;;;:::o;91528:322::-;91596:13;:22;91610:7;91596:22;;;;;;;;;;;;;;;;;;;;;91592:57;;91620:29;;;;;;;;;;:::i;:::-;;;;;;;;91592:57;91660:19;91682:17;:26;91700:7;91682:26;;;;;;;;;;;;;;;;;;;;;91660:48;;91719:15;91748:11;91719:41;;91771:27;91777:12;:10;:12::i;:::-;91791:6;91771:5;:27::i;:::-;91809:4;:12;;;91822;:10;:12::i;:::-;91835:6;91809:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91581:269;;91528:322;;:::o;80866:836::-;81096:8;81078:15;:26;81074:99;;;81152:8;81128:33;;;;;;;;;;;:::i;:::-;;;;;;;;81074:99;81185:18;80162:119;81293:5;81317:7;81343:5;81367:16;81377:5;81367:9;:16::i;:::-;81402:8;81230:195;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;81206:230;;;;;;81185:251;;81449:12;81464:28;81481:10;81464:16;:28::i;:::-;81449:43;;81505:14;81522:28;81536:4;81542:1;81545;81548;81522:13;:28::i;:::-;81505:45;;81575:5;81565:15;;:6;:15;;;81561:90;;81625:6;81633:5;81604:35;;;;;;;;;;;;:::i;:::-;;;;;;;;81561:90;81663:31;81672:5;81679:7;81688:5;81663:8;:31::i;:::-;81063:639;;;80866:836;;;;;;;:::o;17334:183::-;17450:7;17482:11;:18;17494:5;17482:18;;;;;;;;;;;;;;;:27;17501:7;17482:27;;;;;;;;;;;;;;;;17475:34;;17334:183;;;;:::o;84471:85::-;;;:::o;84779:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13119:220::-;12072:13;:11;:13::i;:::-;13224:1:::1;13204:22;;:8;:22;;::::0;13200:93:::1;;13278:1;13250:31;;;;;;;;;;;:::i;:::-;;;;;;;;13200:93;13303:28;13322:8;13303:18;:28::i;:::-;13119:220:::0;:::o;4124:98::-;4177:7;4204:10;4197:17;;4124:98;:::o;22797:164::-;22916:37;22925:5;22932:7;22941:5;22948:4;22916:8;:37::i;:::-;22797:164;;;:::o;12351:166::-;12422:12;:10;:12::i;:::-;12411:23;;:7;:5;:7::i;:::-;:23;;;12407:103;;12485:12;:10;:12::i;:::-;12458:40;;;;;;;;;;;:::i;:::-;;;;;;;;12407:103;12351:166::o;24590:603::-;24724:24;24751:25;24761:5;24768:7;24751:9;:25::i;:::-;24724:52;;24811:17;24791:16;:37;24787:399;;24868:5;24849:16;:24;24845:214;;;24950:7;24980:16;25019:5;24901:142;;;;;;;;;;;;;:::i;:::-;;;;;;;;24845:214;25102:57;25111:5;25118:7;25146:5;25127:16;:24;25153:5;25102:8;:57::i;:::-;24787:399;24713:480;24590:603;;;:::o;19304:342::-;19438:1;19422:18;;:4;:18;;;19418:88;;19491:1;19464:30;;;;;;;;;;;:::i;:::-;;;;;;;;19418:88;19534:1;19520:16;;:2;:16;;;19516:88;;19589:1;19560:32;;;;;;;;;;;:::i;:::-;;;;;;;;19516:88;19614:24;19622:4;19628:2;19632:5;19614:7;:24::i;:::-;19304:342;;;:::o;74937:268::-;74990:7;75031:11;75014:28;;75022:4;75014:28;;;:63;;;;;75063:14;75046:13;:31;75014:63;75010:188;;;75101:22;75094:29;;;;75010:188;75163:23;:21;:23::i;:::-;75156:30;;74937:268;;:::o;90547:206::-;90618:4;90634:14;90651:5;:13;90657:6;90651:13;;;;;;;;;;;90634:30;;90726:1;:19;;;90709:1;:13;;;90683:1;:9;;90693:5;90683:16;;;;;;;;:::i;:::-;;;;;;;;;;;;:23;;;:39;;;;:::i;:::-;90682:63;;;;:::i;:::-;90675:70;;;90547:206;;;;:::o;13499:191::-;13573:16;13592:6;;;;;;;;;;;13573:25;;13618:8;13609:6;;:17;;;;;;;;;;;;;;;;;;13673:8;13642:40;;13663:8;13642:40;;;;;;;;;;;;13562:128;13499:191;:::o;78481:109::-;78541:7;78568;:14;78576:5;78568:14;;;;;;;;;;;;;;;;78561:21;;78481:109;;;:::o;77402:128::-;77448:13;77481:41;77508:13;77481:5;:26;;:41;;;;:::i;:::-;77474:48;;77402:128;:::o;77865:137::-;77914:13;77947:47;77977:16;77947:8;:29;;:47;;;;:::i;:::-;77940:54;;77865:137;:::o;22033:211::-;22123:1;22104:21;;:7;:21;;;22100:91;;22176:1;22149:30;;;;;;;;;;;:::i;:::-;;;;;;;;22100:91;22201:35;22209:7;22226:1;22230:5;22201:7;:35::i;:::-;22033:211;;:::o;21492:213::-;21582:1;21563:21;;:7;:21;;;21559:93;;21637:1;21608:32;;;;;;;;;;;:::i;:::-;;;;;;;;21559:93;21662:35;21678:1;21682:7;21691:5;21662:7;:35::i;:::-;21492:213;;:::o;78711:402::-;78771:7;79078;:14;79086:5;79078:14;;;;;;;;;;;;;;;;:16;;;;;;;;;;;;79071:23;;78711:402;;;:::o;76205:232::-;76318:7;76363:66;76396:20;:18;:20::i;:::-;76418:10;76363:32;:66::i;:::-;76343:86;;76205:232;;;:::o;36488:370::-;36616:7;36637:17;36656:18;36676:16;36696:88;36721:4;36740:1;36756;36772;36696:10;:88::i;:::-;36636:148;;;;;;36795:28;36807:5;36814:8;36795:11;:28::i;:::-;36841:9;36834:16;;;;;36488:370;;;;;;:::o;23812:486::-;23985:1;23968:19;;:5;:19;;;23964:91;;24040:1;24011:32;;;;;;;;;;;:::i;:::-;;;;;;;;23964:91;24088:1;24069:21;;:7;:21;;;24065:92;;24142:1;24114:31;;;;;;;;;;;:::i;:::-;;;;;;;;24065:92;24197:5;24167:11;:18;24179:5;24167:18;;;;;;;;;;;;;;;:27;24186:7;24167:27;;;;;;;;;;;;;;;:35;;;;24217:9;24213:78;;;24264:7;24248:31;;24257:5;24248:31;;;24273:5;24248:31;;;;;;:::i;:::-;;;;;;;;24213:78;23812:486;;;;:::o;86944:1172::-;87073:30;87087:4;87093:2;87097:5;87073:13;:30::i;:::-;87131:1;87117:16;;:2;:16;;;87114:588;;87154:23;:27;87178:2;87154:27;;;;;;;;;;;;;;;;;;;;;;;;;87149:505;;87237:7;87250:2;87237:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87311:9;87326:29;;;;;;;;87337:2;87326:29;;;;;;87341:13;87351:2;87341:9;:13::i;:::-;87326:29;;;87311:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87456:4;87426:23;:27;87450:2;87426:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;87550:12;;87521:22;:26;87544:2;87521:26;;;;;;;;;;;;;;;:41;;;;87637:1;87621:12;;:17;;;;;;;:::i;:::-;;;;;;;;87149:505;87668:22;87687:2;87668:18;:22::i;:::-;87114:588;87731:1;87715:18;;:4;:18;;;87712:397;;87806:1;87788:15;87798:4;87788:9;:15::i;:::-;:19;87784:314;;;87876:24;87895:4;87876:18;:24::i;:::-;87784:314;;;88054:28;88077:4;88054:22;:28::i;:::-;87784:314;87712:397;86944:1172;;;:::o;75213:350::-;75268:7;73105:119;75401:11;75435:14;75472:13;75516:4;75336:204;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75308:247;;;;;;75288:267;;75213:350;:::o;69544:305::-;69665:13;67433:66;69729:17;;69719:5;69700:46;69696:146;;69770:15;69779:5;69770:8;:15::i;:::-;69763:22;;;;69696:146;69825:5;69818:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69544:305;;;;;:::o;61515:442::-;61635:14;61752:4;61746:11;61783:10;61778:3;61771:23;61831:15;61824:4;61819:3;61815:14;61808:39;61884:10;61877:4;61872:3;61868:14;61861:34;61934:4;61929:3;61919:20;61909:30;;61720:230;61515:442;;;;:::o;34674:1675::-;34846:7;34868:12;34895:7;35857:66;35839:1;35831:10;;:92;35813:203;;;35966:1;35970:30;36002:1;35950:54;;;;;;;;35813:203;36113:14;36130:24;36140:4;36146:1;36149;36152;36130:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36113:41;;36187:1;36169:20;;:6;:20;;;36165:115;;36222:1;36226:29;36265:1;36257:10;;36206:62;;;;;;;;;36165:115;36300:6;36308:20;36338:1;36330:10;;36292:49;;;;;;;34674:1675;;;;;;;;;:::o;36996:542::-;37092:20;37083:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;37079:452;37129:7;37079:452;37190:29;37181:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;37177:354;;37243:23;;;;;;;;;;;;;;37177:354;37297:35;37288:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;37284:247;;37392:8;37384:17;;37356:46;;;;;;;;;;;:::i;:::-;;;;;;;;37284:247;37433:30;37424:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;37420:111;;37510:8;37487:32;;;;;;;;;;;:::i;:::-;;;;;;;;37420:111;36996:542;;;:::o;19970:1169::-;20110:1;20094:18;;:4;:18;;;20090:552;;20248:5;20232:12;;:21;;;;;;;:::i;:::-;;;;;;;;20090:552;;;20286:19;20308:9;:15;20318:4;20308:15;;;;;;;;;;;;;;;;20286:37;;20356:5;20342:11;:19;20338:117;;;20414:4;20420:11;20433:5;20389:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;20338:117;20610:5;20596:11;:19;20578:9;:15;20588:4;20578:15;;;;;;;;;;;;;;;:37;;;;20271:371;20090:552;20672:1;20658:16;;:2;:16;;;20654:435;;20840:5;20824:12;;:21;;;;;;;;;;;20654:435;;;21057:5;21040:9;:13;21050:2;21040:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;20654:435;21121:2;21106:25;;21115:4;21106:25;;;21125:5;21106:25;;;;;;:::i;:::-;;;;;;;;19970:1169;;;:::o;88134:216::-;88195:9;88207:22;:28;88230:4;88207:28;;;;;;;;;;;;;;;;88195:40;;88273:4;88250:27;;:9;88260:1;88250:12;;;;;;;;:::i;:::-;;;;;;;;;;;;:19;;;;;;;;;;;;:27;;;88246:97;;88316:15;88326:4;88316:9;:15::i;:::-;88294:9;88304:1;88294:12;;;;;;;;:::i;:::-;;;;;;;;;;;;:19;;:37;;;;88246:97;88184:166;88134:216;:::o;88364:916::-;88461:5;88429:23;:29;88453:4;88429:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;88477:17;88514:1;88497:7;:14;;;;:18;;;;:::i;:::-;88477:38;;88526:29;88558:22;:28;88581:4;88558:28;;;;;;;;;;;;;;;;88526:60;;88626:9;88601:21;:34;88597:648;;88672:7;:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;88700:9;:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88597:648;;;88748:18;88769:7;88777:9;88769:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;88748:39;;88802:28;88833:22;:34;88856:10;88833:34;;;;;;;;;;;;;;;;88802:65;;88944:10;88911:7;88919:21;88911:30;;;;;;;;:::i;:::-;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;89004:9;89014:20;89004:31;;;;;;;;:::i;:::-;;;;;;;;;;;;88969:9;88979:21;88969:32;;;;;;;;:::i;:::-;;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89087:21;89050:22;:34;89073:10;89050:34;;;;;;;;;;;;;;;:58;;;;89154:1;89123:22;:28;89146:4;89123:28;;;;;;;;;;;;;;;:32;;;;89190:7;:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;89218:9;:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88733:512;;88597:648;89271:1;89255:12;;:17;;;;;;;:::i;:::-;;;;;;;;88418:862;;88364:916;:::o;68174:415::-;68233:13;68259:11;68273:16;68284:4;68273:10;:16::i;:::-;68259:30;;68379:17;68410:2;68399:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68379:34;;68504:3;68499;68492:16;68545:4;68538;68533:3;68529:14;68522:28;68578:3;68571:10;;;;68174:415;;;:::o;68666:251::-;68727:7;68747:14;68800:4;68791;68764:33;;:40;68747:57;;68828:2;68819:6;:11;68815:71;;;68854:20;;;;;;;;;;;;;;68815:71;68903:6;68896:13;;;68666:251;;;:::o;-1:-1:-1:-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:329::-;3505:6;3554:2;3542:9;3533:7;3529:23;3525:32;3522:119;;;3560:79;;:::i;:::-;3522:119;3680:1;3705:53;3750:7;3741:6;3730:9;3726:22;3705:53;:::i;:::-;3695:63;;3651:117;3446:329;;;;:::o;3781:118::-;3868:24;3886:5;3868:24;:::i;:::-;3863:3;3856:37;3781:118;;:::o;3905:222::-;3998:4;4036:2;4025:9;4021:18;4013:26;;4049:71;4117:1;4106:9;4102:17;4093:6;4049:71;:::i;:::-;3905:222;;;;:::o;4133:329::-;4192:6;4241:2;4229:9;4220:7;4216:23;4212:32;4209:119;;;4247:79;;:::i;:::-;4209:119;4367:1;4392:53;4437:7;4428:6;4417:9;4413:22;4392:53;:::i;:::-;4382:63;;4338:117;4133:329;;;;:::o;4468:474::-;4536:6;4544;4593:2;4581:9;4572:7;4568:23;4564:32;4561:119;;;4599:79;;:::i;:::-;4561:119;4719:1;4744:53;4789:7;4780:6;4769:9;4765:22;4744:53;:::i;:::-;4734:63;;4690:117;4846:2;4872:53;4917:7;4908:6;4897:9;4893:22;4872:53;:::i;:::-;4862:63;;4817:118;4468:474;;;;;:::o;4948:619::-;5025:6;5033;5041;5090:2;5078:9;5069:7;5065:23;5061:32;5058:119;;;5096:79;;:::i;:::-;5058:119;5216:1;5241:53;5286:7;5277:6;5266:9;5262:22;5241:53;:::i;:::-;5231:63;;5187:117;5343:2;5369:53;5414:7;5405:6;5394:9;5390:22;5369:53;:::i;:::-;5359:63;;5314:118;5471:2;5497:53;5542:7;5533:6;5522:9;5518:22;5497:53;:::i;:::-;5487:63;;5442:118;4948:619;;;;;:::o;5573:118::-;5660:24;5678:5;5660:24;:::i;:::-;5655:3;5648:37;5573:118;;:::o;5697:222::-;5790:4;5828:2;5817:9;5813:18;5805:26;;5841:71;5909:1;5898:9;5894:17;5885:6;5841:71;:::i;:::-;5697:222;;;;:::o;5925:86::-;5960:7;6000:4;5993:5;5989:16;5978:27;;5925:86;;;:::o;6017:112::-;6100:22;6116:5;6100:22;:::i;:::-;6095:3;6088:35;6017:112;;:::o;6135:214::-;6224:4;6262:2;6251:9;6247:18;6239:26;;6275:67;6339:1;6328:9;6324:17;6315:6;6275:67;:::i;:::-;6135:214;;;;:::o;6355:117::-;6464:1;6461;6454:12;6478:117;6587:1;6584;6577:12;6601:180;6649:77;6646:1;6639:88;6746:4;6743:1;6736:15;6770:4;6767:1;6760:15;6787:281;6870:27;6892:4;6870:27;:::i;:::-;6862:6;6858:40;7000:6;6988:10;6985:22;6964:18;6952:10;6949:34;6946:62;6943:88;;;7011:18;;:::i;:::-;6943:88;7051:10;7047:2;7040:22;6830:238;6787:281;;:::o;7074:129::-;7108:6;7135:20;;:::i;:::-;7125:30;;7164:33;7192:4;7184:6;7164:33;:::i;:::-;7074:129;;;:::o;7209:308::-;7271:4;7361:18;7353:6;7350:30;7347:56;;;7383:18;;:::i;:::-;7347:56;7421:29;7443:6;7421:29;:::i;:::-;7413:37;;7505:4;7499;7495:15;7487:23;;7209:308;;;:::o;7523:146::-;7620:6;7615:3;7610;7597:30;7661:1;7652:6;7647:3;7643:16;7636:27;7523:146;;;:::o;7675:425::-;7753:5;7778:66;7794:49;7836:6;7794:49;:::i;:::-;7778:66;:::i;:::-;7769:75;;7867:6;7860:5;7853:21;7905:4;7898:5;7894:16;7943:3;7934:6;7929:3;7925:16;7922:25;7919:112;;;7950:79;;:::i;:::-;7919:112;8040:54;8087:6;8082:3;8077;8040:54;:::i;:::-;7759:341;7675:425;;;;;:::o;8120:340::-;8176:5;8225:3;8218:4;8210:6;8206:17;8202:27;8192:122;;8233:79;;:::i;:::-;8192:122;8350:6;8337:20;8375:79;8450:3;8442:6;8435:4;8427:6;8423:17;8375:79;:::i;:::-;8366:88;;8182:278;8120:340;;;;:::o;8466:799::-;8553:6;8561;8569;8618:2;8606:9;8597:7;8593:23;8589:32;8586:119;;;8624:79;;:::i;:::-;8586:119;8744:1;8769:53;8814:7;8805:6;8794:9;8790:22;8769:53;:::i;:::-;8759:63;;8715:117;8899:2;8888:9;8884:18;8871:32;8930:18;8922:6;8919:30;8916:117;;;8952:79;;:::i;:::-;8916:117;9057:63;9112:7;9103:6;9092:9;9088:22;9057:63;:::i;:::-;9047:73;;8842:288;9169:2;9195:53;9240:7;9231:6;9220:9;9216:22;9195:53;:::i;:::-;9185:63;;9140:118;8466:799;;;;;:::o;9271:77::-;9308:7;9337:5;9326:16;;9271:77;;;:::o;9354:118::-;9441:24;9459:5;9441:24;:::i;:::-;9436:3;9429:37;9354:118;;:::o;9478:222::-;9571:4;9609:2;9598:9;9594:18;9586:26;;9622:71;9690:1;9679:9;9675:17;9666:6;9622:71;:::i;:::-;9478:222;;;;:::o;9706:149::-;9742:7;9782:66;9775:5;9771:78;9760:89;;9706:149;;;:::o;9861:115::-;9946:23;9963:5;9946:23;:::i;:::-;9941:3;9934:36;9861:115;;:::o;9982:114::-;10049:6;10083:5;10077:12;10067:22;;9982:114;;;:::o;10102:184::-;10201:11;10235:6;10230:3;10223:19;10275:4;10270:3;10266:14;10251:29;;10102:184;;;;:::o;10292:132::-;10359:4;10382:3;10374:11;;10412:4;10407:3;10403:14;10395:22;;10292:132;;;:::o;10430:108::-;10507:24;10525:5;10507:24;:::i;:::-;10502:3;10495:37;10430:108;;:::o;10544:179::-;10613:10;10634:46;10676:3;10668:6;10634:46;:::i;:::-;10712:4;10707:3;10703:14;10689:28;;10544:179;;;;:::o;10729:113::-;10799:4;10831;10826:3;10822:14;10814:22;;10729:113;;;:::o;10878:732::-;10997:3;11026:54;11074:5;11026:54;:::i;:::-;11096:86;11175:6;11170:3;11096:86;:::i;:::-;11089:93;;11206:56;11256:5;11206:56;:::i;:::-;11285:7;11316:1;11301:284;11326:6;11323:1;11320:13;11301:284;;;11402:6;11396:13;11429:63;11488:3;11473:13;11429:63;:::i;:::-;11422:70;;11515:60;11568:6;11515:60;:::i;:::-;11505:70;;11361:224;11348:1;11345;11341:9;11336:14;;11301:284;;;11305:14;11601:3;11594:10;;11002:608;;;10878:732;;;;:::o;11616:1215::-;11965:4;12003:3;11992:9;11988:19;11980:27;;12017:69;12083:1;12072:9;12068:17;12059:6;12017:69;:::i;:::-;12133:9;12127:4;12123:20;12118:2;12107:9;12103:18;12096:48;12161:78;12234:4;12225:6;12161:78;:::i;:::-;12153:86;;12286:9;12280:4;12276:20;12271:2;12260:9;12256:18;12249:48;12314:78;12387:4;12378:6;12314:78;:::i;:::-;12306:86;;12402:72;12470:2;12459:9;12455:18;12446:6;12402:72;:::i;:::-;12484:73;12552:3;12541:9;12537:19;12528:6;12484:73;:::i;:::-;12567;12635:3;12624:9;12620:19;12611:6;12567:73;:::i;:::-;12688:9;12682:4;12678:20;12672:3;12661:9;12657:19;12650:49;12716:108;12819:4;12810:6;12716:108;:::i;:::-;12708:116;;11616:1215;;;;;;;;;;:::o;12837:553::-;13014:4;13052:3;13041:9;13037:19;13029:27;;13066:71;13134:1;13123:9;13119:17;13110:6;13066:71;:::i;:::-;13147:72;13215:2;13204:9;13200:18;13191:6;13147:72;:::i;:::-;13229;13297:2;13286:9;13282:18;13273:6;13229:72;:::i;:::-;13311;13379:2;13368:9;13364:18;13355:6;13311:72;:::i;:::-;12837:553;;;;;;;:::o;13396:474::-;13464:6;13472;13521:2;13509:9;13500:7;13496:23;13492:32;13489:119;;;13527:79;;:::i;:::-;13489:119;13647:1;13672:53;13717:7;13708:6;13697:9;13693:22;13672:53;:::i;:::-;13662:63;;13618:117;13774:2;13800:53;13845:7;13836:6;13825:9;13821:22;13800:53;:::i;:::-;13790:63;;13745:118;13396:474;;;;;:::o;13876:118::-;13947:22;13963:5;13947:22;:::i;:::-;13940:5;13937:33;13927:61;;13984:1;13981;13974:12;13927:61;13876:118;:::o;14000:135::-;14044:5;14082:6;14069:20;14060:29;;14098:31;14123:5;14098:31;:::i;:::-;14000:135;;;;:::o;14141:122::-;14214:24;14232:5;14214:24;:::i;:::-;14207:5;14204:35;14194:63;;14253:1;14250;14243:12;14194:63;14141:122;:::o;14269:139::-;14315:5;14353:6;14340:20;14331:29;;14369:33;14396:5;14369:33;:::i;:::-;14269:139;;;;:::o;14414:1199::-;14525:6;14533;14541;14549;14557;14565;14573;14622:3;14610:9;14601:7;14597:23;14593:33;14590:120;;;14629:79;;:::i;:::-;14590:120;14749:1;14774:53;14819:7;14810:6;14799:9;14795:22;14774:53;:::i;:::-;14764:63;;14720:117;14876:2;14902:53;14947:7;14938:6;14927:9;14923:22;14902:53;:::i;:::-;14892:63;;14847:118;15004:2;15030:53;15075:7;15066:6;15055:9;15051:22;15030:53;:::i;:::-;15020:63;;14975:118;15132:2;15158:53;15203:7;15194:6;15183:9;15179:22;15158:53;:::i;:::-;15148:63;;15103:118;15260:3;15287:51;15330:7;15321:6;15310:9;15306:22;15287:51;:::i;:::-;15277:61;;15231:117;15387:3;15414:53;15459:7;15450:6;15439:9;15435:22;15414:53;:::i;:::-;15404:63;;15358:119;15516:3;15543:53;15588:7;15579:6;15568:9;15564:22;15543:53;:::i;:::-;15533:63;;15487:119;14414:1199;;;;;;;;;;:::o;15619:474::-;15687:6;15695;15744:2;15732:9;15723:7;15719:23;15715:32;15712:119;;;15750:79;;:::i;:::-;15712:119;15870:1;15895:53;15940:7;15931:6;15920:9;15916:22;15895:53;:::i;:::-;15885:63;;15841:117;15997:2;16023:53;16068:7;16059:6;16048:9;16044:22;16023:53;:::i;:::-;16013:63;;15968:118;15619:474;;;;;:::o;16099:332::-;16220:4;16258:2;16247:9;16243:18;16235:26;;16271:71;16339:1;16328:9;16324:17;16315:6;16271:71;:::i;:::-;16352:72;16420:2;16409:9;16405:18;16396:6;16352:72;:::i;:::-;16099:332;;;;;:::o;16437:180::-;16485:77;16482:1;16475:88;16582:4;16579:1;16572:15;16606:4;16603:1;16596:15;16623:320;16667:6;16704:1;16698:4;16694:12;16684:22;;16751:1;16745:4;16741:12;16772:18;16762:81;;16828:4;16820:6;16816:17;16806:27;;16762:81;16890:2;16882:6;16879:14;16859:18;16856:38;16853:84;;16909:18;;:::i;:::-;16853:84;16674:269;16623:320;;;:::o;16949:172::-;17089:24;17085:1;17077:6;17073:14;17066:48;16949:172;:::o;17127:366::-;17269:3;17290:67;17354:2;17349:3;17290:67;:::i;:::-;17283:74;;17366:93;17455:3;17366:93;:::i;:::-;17484:2;17479:3;17475:12;17468:19;;17127:366;;;:::o;17499:419::-;17665:4;17703:2;17692:9;17688:18;17680:26;;17752:9;17746:4;17742:20;17738:1;17727:9;17723:17;17716:47;17780:131;17906:4;17780:131;:::i;:::-;17772:139;;17499:419;;;:::o;17924:180::-;17972:77;17969:1;17962:88;18069:4;18066:1;18059:15;18093:4;18090:1;18083:15;18110:180;18158:77;18155:1;18148:88;18255:4;18252:1;18245:15;18279:4;18276:1;18269:15;18296:233;18335:3;18358:24;18376:5;18358:24;:::i;:::-;18349:33;;18404:66;18397:5;18394:77;18391:103;;18474:18;;:::i;:::-;18391:103;18521:1;18514:5;18510:13;18503:20;;18296:233;;;:::o;18535:644::-;18732:4;18770:3;18759:9;18755:19;18747:27;;18820:9;18814:4;18810:20;18806:1;18795:9;18791:17;18784:47;18848:78;18921:4;18912:6;18848:78;:::i;:::-;18840:86;;18936:72;19004:2;18993:9;18989:18;18980:6;18936:72;:::i;:::-;19018;19086:2;19075:9;19071:18;19062:6;19018:72;:::i;:::-;19100;19168:2;19157:9;19153:18;19144:6;19100:72;:::i;:::-;18535:644;;;;;;;:::o;19185:194::-;19225:4;19245:20;19263:1;19245:20;:::i;:::-;19240:25;;19279:20;19297:1;19279:20;:::i;:::-;19274:25;;19323:1;19320;19316:9;19308:17;;19347:1;19341:4;19338:11;19335:37;;;19352:18;;:::i;:::-;19335:37;19185:194;;;;:::o;19385:116::-;19455:21;19470:5;19455:21;:::i;:::-;19448:5;19445:32;19435:60;;19491:1;19488;19481:12;19435:60;19385:116;:::o;19507:137::-;19561:5;19592:6;19586:13;19577:22;;19608:30;19632:5;19608:30;:::i;:::-;19507:137;;;;:::o;19650:345::-;19717:6;19766:2;19754:9;19745:7;19741:23;19737:32;19734:119;;;19772:79;;:::i;:::-;19734:119;19892:1;19917:61;19970:7;19961:6;19950:9;19946:22;19917:61;:::i;:::-;19907:71;;19863:125;19650:345;;;;:::o;20001:165::-;20141:17;20137:1;20129:6;20125:14;20118:41;20001:165;:::o;20172:366::-;20314:3;20335:67;20399:2;20394:3;20335:67;:::i;:::-;20328:74;;20411:93;20500:3;20411:93;:::i;:::-;20529:2;20524:3;20520:12;20513:19;;20172:366;;;:::o;20544:419::-;20710:4;20748:2;20737:9;20733:18;20725:26;;20797:9;20791:4;20787:20;20783:1;20772:9;20768:17;20761:47;20825:131;20951:4;20825:131;:::i;:::-;20817:139;;20544:419;;;:::o;20969:173::-;21109:25;21105:1;21097:6;21093:14;21086:49;20969:173;:::o;21148:366::-;21290:3;21311:67;21375:2;21370:3;21311:67;:::i;:::-;21304:74;;21387:93;21476:3;21387:93;:::i;:::-;21505:2;21500:3;21496:12;21489:19;;21148:366;;;:::o;21520:419::-;21686:4;21724:2;21713:9;21709:18;21701:26;;21773:9;21767:4;21763:20;21759:1;21748:9;21744:17;21737:47;21801:131;21927:4;21801:131;:::i;:::-;21793:139;;21520:419;;;:::o;21945:161::-;22085:13;22081:1;22073:6;22069:14;22062:37;21945:161;:::o;22112:366::-;22254:3;22275:67;22339:2;22334:3;22275:67;:::i;:::-;22268:74;;22351:93;22440:3;22351:93;:::i;:::-;22469:2;22464:3;22460:12;22453:19;;22112:366;;;:::o;22484:419::-;22650:4;22688:2;22677:9;22673:18;22665:26;;22737:9;22731:4;22727:20;22723:1;22712:9;22708:17;22701:47;22765:131;22891:4;22765:131;:::i;:::-;22757:139;;22484:419;;;:::o;22909:174::-;23049:26;23045:1;23037:6;23033:14;23026:50;22909:174;:::o;23089:366::-;23231:3;23252:67;23316:2;23311:3;23252:67;:::i;:::-;23245:74;;23328:93;23417:3;23328:93;:::i;:::-;23446:2;23441:3;23437:12;23430:19;;23089:366;;;:::o;23461:419::-;23627:4;23665:2;23654:9;23650:18;23642:26;;23714:9;23708:4;23704:20;23700:1;23689:9;23685:17;23678:47;23742:131;23868:4;23742:131;:::i;:::-;23734:139;;23461:419;;;:::o;23886:143::-;23943:5;23974:6;23968:13;23959:22;;23990:33;24017:5;23990:33;:::i;:::-;23886:143;;;;:::o;24035:351::-;24105:6;24154:2;24142:9;24133:7;24129:23;24125:32;24122:119;;;24160:79;;:::i;:::-;24122:119;24280:1;24305:64;24361:7;24352:6;24341:9;24337:22;24305:64;:::i;:::-;24295:74;;24251:128;24035:351;;;;:::o;24392:191::-;24432:3;24451:20;24469:1;24451:20;:::i;:::-;24446:25;;24485:20;24503:1;24485:20;:::i;:::-;24480:25;;24528:1;24525;24521:9;24514:16;;24549:3;24546:1;24543:10;24540:36;;;24556:18;;:::i;:::-;24540:36;24392:191;;;;:::o;24589:168::-;24729:20;24725:1;24717:6;24713:14;24706:44;24589:168;:::o;24763:366::-;24905:3;24926:67;24990:2;24985:3;24926:67;:::i;:::-;24919:74;;25002:93;25091:3;25002:93;:::i;:::-;25120:2;25115:3;25111:12;25104:19;;24763:366;;;:::o;25135:419::-;25301:4;25339:2;25328:9;25324:18;25316:26;;25388:9;25382:4;25378:20;25374:1;25363:9;25359:17;25352:47;25416:131;25542:4;25416:131;:::i;:::-;25408:139;;25135:419;;;:::o;25560:775::-;25793:4;25831:3;25820:9;25816:19;25808:27;;25845:71;25913:1;25902:9;25898:17;25889:6;25845:71;:::i;:::-;25926:72;25994:2;25983:9;25979:18;25970:6;25926:72;:::i;:::-;26008;26076:2;26065:9;26061:18;26052:6;26008:72;:::i;:::-;26090;26158:2;26147:9;26143:18;26134:6;26090:72;:::i;:::-;26172:73;26240:3;26229:9;26225:19;26216:6;26172:73;:::i;:::-;26255;26323:3;26312:9;26308:19;26299:6;26255:73;:::i;:::-;25560:775;;;;;;;;;:::o;26341:332::-;26462:4;26500:2;26489:9;26485:18;26477:26;;26513:71;26581:1;26570:9;26566:17;26557:6;26513:71;:::i;:::-;26594:72;26662:2;26651:9;26647:18;26638:6;26594:72;:::i;:::-;26341:332;;;;;:::o;26679:442::-;26828:4;26866:2;26855:9;26851:18;26843:26;;26879:71;26947:1;26936:9;26932:17;26923:6;26879:71;:::i;:::-;26960:72;27028:2;27017:9;27013:18;27004:6;26960:72;:::i;:::-;27042;27110:2;27099:9;27095:18;27086:6;27042:72;:::i;:::-;26679:442;;;;;;:::o;27127:410::-;27167:7;27190:20;27208:1;27190:20;:::i;:::-;27185:25;;27224:20;27242:1;27224:20;:::i;:::-;27219:25;;27279:1;27276;27272:9;27301:30;27319:11;27301:30;:::i;:::-;27290:41;;27480:1;27471:7;27467:15;27464:1;27461:22;27441:1;27434:9;27414:83;27391:139;;27510:18;;:::i;:::-;27391:139;27175:362;27127:410;;;;:::o;27543:180::-;27591:77;27588:1;27581:88;27688:4;27685:1;27678:15;27712:4;27709:1;27702:15;27729:185;27769:1;27786:20;27804:1;27786:20;:::i;:::-;27781:25;;27820:20;27838:1;27820:20;:::i;:::-;27815:25;;27859:1;27849:35;;27864:18;;:::i;:::-;27849:35;27906:1;27903;27899:9;27894:14;;27729:185;;;;:::o;27920:664::-;28125:4;28163:3;28152:9;28148:19;28140:27;;28177:71;28245:1;28234:9;28230:17;28221:6;28177:71;:::i;:::-;28258:72;28326:2;28315:9;28311:18;28302:6;28258:72;:::i;:::-;28340;28408:2;28397:9;28393:18;28384:6;28340:72;:::i;:::-;28422;28490:2;28479:9;28475:18;28466:6;28422:72;:::i;:::-;28504:73;28572:3;28561:9;28557:19;28548:6;28504:73;:::i;:::-;27920:664;;;;;;;;:::o;28590:545::-;28763:4;28801:3;28790:9;28786:19;28778:27;;28815:71;28883:1;28872:9;28868:17;28859:6;28815:71;:::i;:::-;28896:68;28960:2;28949:9;28945:18;28936:6;28896:68;:::i;:::-;28974:72;29042:2;29031:9;29027:18;29018:6;28974:72;:::i;:::-;29056;29124:2;29113:9;29109:18;29100:6;29056:72;:::i;:::-;28590:545;;;;;;;:::o;29141:180::-;29189:77;29186:1;29179:88;29286:4;29283:1;29276:15;29310:4;29307:1;29300:15;29327:180;29375:77;29372:1;29365:88;29472:4;29469:1;29462:15;29496:4;29493:1;29486:15

Swarm Source

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