ETH Price: $3,710.18 (+3.10%)

Token

ERC-20: hopiumtxt (HTXT)
 

Overview

Max Total Supply

2,000 HTXT

Holders

1,915

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 HTXT
0xbd7194a0a219dd778b6719b197430a733960bd81
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
hopiumtxt

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-01
*/

// SPDX-License-Identifier: GPL-3.0

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        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_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            IERC165
    // ==============================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    // ==============================
    //        IERC721Metadata
    // ==============================

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

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

    // Mapping from token ID to approved address.
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * @dev Returns the starting token ID. 
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count. 
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }
            
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}


// File: contracts/hopiumtxt.sol

pragma solidity >=0.8.0 <0.9.0;

contract hopiumtxt is ERC721A, Ownable, ReentrancyGuard {

    using Strings for uint256;
    
    string public baseURI;
    string public notRevealedUri;
    string public uriSuffix = ".json";
  
    uint256 public cost = 0 ether;
    uint256 public maxSupply = 2000;
    uint256 public MaxperTx = 1;
    uint256 public nftPerAddressLimit = 1;

    mapping(address => uint256) public addressMintedBalance;

    bool public paused = true;
    bool public revealed = true;

    constructor() ERC721A("hopiumtxt", "HTXT") {
      setBaseURI("ipfs://QmVG6cfpqiu24tw5mkkmdk9UC478S15TDjG8N6gDk3DMw4/");
    }


    // Internal
    function _baseURI() internal view virtual override returns (string memory) {
      return baseURI;
    }

    function _startTokenId() internal view virtual override returns (uint256) {
      return 1;
    }


    // Public Mint
    function mint(uint256 _amount) external payable {

    address _caller = _msgSender();
    uint256 ownerMintedCount = addressMintedBalance[_caller];

    require(!paused, "Contract is paused.");
    require(ownerMintedCount + _amount <= nftPerAddressLimit, "Max mints per address limit exceeded.");
    require(_amount > 0, "Need to mint at least 1 NFT.");
    require(_amount <= MaxperTx, "Exceed max mint per tx.");
    require(totalSupply() + _amount <= maxSupply, "Max supply exceeded.");
    require(tx.origin == _caller, "Caller can't be another contract.");

    require(_amount * cost >= msg.value, "Invalid funds provided.");

    addressMintedBalance[_caller] += _amount;
    _safeMint(_caller, _amount);
    }


    // Only owner mint, used to mint tokens for other wallets
    function mintForAddress(uint256 _mintAmount, address _receiver) public onlyOwner {

        require(_mintAmount > 0, "Invalid mint amount!");
        require(totalSupply() + _mintAmount <= maxSupply, "Max supply exceeded!");

        addressMintedBalance[_receiver] += _mintAmount;
        _safeMint(_receiver, _mintAmount);
        }


    // TokenURI index
    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
      require(_exists(_tokenId),"ERC721Metadata: URI query for nonexistent token.");
    
      if (revealed == false) {
        return notRevealedUri;
      }

      string memory currentBaseURI = _baseURI();
      return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : '';
    }

    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
      uint256 ownerTokenCount = balanceOf(_owner);
      uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
      uint256 currentTokenId = 1;
      uint256 ownedTokenIndex = 0;

      while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
        address currentTokenOwner = ownerOf(currentTokenId);

        if (currentTokenOwner == _owner) {
            ownedTokenIds[ownedTokenIndex] = currentTokenId;

            ownedTokenIndex++;
        }
        currentTokenId++;
      }
      return ownedTokenIds;
    }

    // Set Cost
    function setCost(uint256 _cost) public onlyOwner {
      cost = _cost;
    }

    // Sets the max amount of mints per transaction
    function setMaxperTx(uint256 _maxperTx) public onlyOwner {
      MaxperTx = _maxperTx;
    }

    // Sets the max amount of mints per transaction
    function setMaxPerAdd(uint256 _maxPerAddLimit) public onlyOwner {
      nftPerAddressLimit = _maxPerAddLimit;
    }

    // Returns the baseURI for metadata
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
      baseURI = _newBaseURI;
    }

    // Internal function to set the hidden IPFS metadata
    function setNotRevealedUri(string memory _notRevealedUri) public onlyOwner {
      notRevealedUri = _notRevealedUri;
    }

    // Internal function to change contract revealed, true = revealed
    function setReveal(bool _state) public onlyOwner {
      revealed = _state;
    }

    // Internal function to change contract pause, true = paused
    function setPaused(bool _state) public onlyOwner {
      paused = _state;
    }

    // Do not remove this function or you will not be able to withdraw funds
    function withdraw() public onlyOwner nonReentrant {
      (bool os, ) = payable(owner()).call{value: address(this).balance}("");
      require(os);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MaxperTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerAddLimit","type":"uint256"}],"name":"setMaxPerAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxperTx","type":"uint256"}],"name":"setMaxperTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedUri","type":"string"}],"name":"setNotRevealedUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90805190602001906200005192919062000365565b506000600d556107d0600e556001600f5560016010556001601260006101000a81548160ff0219169083151502179055506001601260016101000a81548160ff021916908315150217905550348015620000aa57600080fd5b506040518060400160405280600981526020017f686f7069756d74787400000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f485458540000000000000000000000000000000000000000000000000000000081525081600290805190602001906200012f92919062000365565b5080600390805190602001906200014892919062000365565b5062000159620001b960201b60201c565b60008190555050506200018162000175620001c260201b60201c565b620001ca60201b60201c565b6001600981905550620001b360405180606001604052806036815260200162004486603691396200029060201b60201c565b620004fd565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002a0620001c260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002c66200033b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200031f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000316906200043c565b60405180910390fd5b80600a90805190602001906200033792919062000365565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b82805462000373906200046f565b90600052602060002090601f016020900481019282620003975760008555620003e3565b82601f10620003b257805160ff1916838001178555620003e3565b82800160010185558215620003e3579182015b82811115620003e2578251825591602001919060010190620003c5565b5b509050620003f29190620003f6565b5090565b5b8082111562000411576000816000905550600101620003f7565b5090565b6000620004246020836200045e565b91506200043182620004d4565b602082019050919050565b60006020820190508181036000830152620004578162000415565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200048857607f821691505b602082108114156200049f576200049e620004a5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b613f79806200050d6000396000f3fe6080604052600436106102255760003560e01c80635c975abb11610123578063a22cb465116100ab578063d5abeb011161006f578063d5abeb01146107e4578063e985e9c51461080f578063efbd73f41461084c578063f2fde38b14610875578063ff6456911461089e57610225565b8063a22cb46514610701578063b88d4fde1461072a578063ba7d2c7614610753578063c17ecd121461077e578063c87b56dd146107a757610225565b806370a08231116100f257806370a082311461063b578063715018a6146106785780638da5cb5b1461068f57806395d89b41146106ba578063a0712d68146106e557610225565b80635c975abb1461057f5780635ef9ff37146105aa5780636352211e146105d35780636c0360eb1461061057610225565b806323b872dd116101b157806344a0d68a1161017557806344a0d68a146104ae57806351830227146104d75780635503a0e81461050257806355f804b31461052d57806358c76daf1461055657610225565b806323b872dd146103df5780632a3f300c146104085780633ccfd60b1461043157806342842e0e14610448578063438b63001461047157610225565b8063095ea7b3116101f8578063095ea7b3146102fa57806313faede61461032357806316c38b3c1461034e57806318160ddd1461037757806318cae269146103a257610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063081c8c44146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612fc7565b6108c9565b60405161025e9190613564565b60405180910390f35b34801561027357600080fd5b5061027c61095b565b604051610289919061357f565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b4919061306a565b6109ed565b6040516102c691906134db565b60405180910390f35b3480156102db57600080fd5b506102e4610a69565b6040516102f1919061357f565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c9190612f5a565b610af7565b005b34801561032f57600080fd5b50610338610c9e565b6040516103459190613741565b60405180910390f35b34801561035a57600080fd5b5061037560048036038101906103709190612f9a565b610ca4565b005b34801561038357600080fd5b5061038c610d3d565b6040516103999190613741565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c49190612dd7565b610d54565b6040516103d69190613741565b60405180910390f35b3480156103eb57600080fd5b5061040660048036038101906104019190612e44565b610d6c565b005b34801561041457600080fd5b5061042f600480360381019061042a9190612f9a565b610d7c565b005b34801561043d57600080fd5b50610446610e15565b005b34801561045457600080fd5b5061046f600480360381019061046a9190612e44565b610f67565b005b34801561047d57600080fd5b5061049860048036038101906104939190612dd7565b610f87565b6040516104a59190613542565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d0919061306a565b611092565b005b3480156104e357600080fd5b506104ec611118565b6040516104f99190613564565b60405180910390f35b34801561050e57600080fd5b5061051761112b565b604051610524919061357f565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190613021565b6111b9565b005b34801561056257600080fd5b5061057d6004803603810190610578919061306a565b61124f565b005b34801561058b57600080fd5b506105946112d5565b6040516105a19190613564565b60405180910390f35b3480156105b657600080fd5b506105d160048036038101906105cc919061306a565b6112e8565b005b3480156105df57600080fd5b506105fa60048036038101906105f5919061306a565b61136e565b60405161060791906134db565b60405180910390f35b34801561061c57600080fd5b50610625611380565b604051610632919061357f565b60405180910390f35b34801561064757600080fd5b50610662600480360381019061065d9190612dd7565b61140e565b60405161066f9190613741565b60405180910390f35b34801561068457600080fd5b5061068d6114c7565b005b34801561069b57600080fd5b506106a461154f565b6040516106b191906134db565b60405180910390f35b3480156106c657600080fd5b506106cf611579565b6040516106dc919061357f565b60405180910390f35b6106ff60048036038101906106fa919061306a565b61160b565b005b34801561070d57600080fd5b5061072860048036038101906107239190612f1a565b6118fd565b005b34801561073657600080fd5b50610751600480360381019061074c9190612e97565b611a75565b005b34801561075f57600080fd5b50610768611ae8565b6040516107759190613741565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a09190613021565b611aee565b005b3480156107b357600080fd5b506107ce60048036038101906107c9919061306a565b611b84565b6040516107db919061357f565b60405180910390f35b3480156107f057600080fd5b506107f9611cdd565b6040516108069190613741565b60405180910390f35b34801561081b57600080fd5b5061083660048036038101906108319190612e04565b611ce3565b6040516108439190613564565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190613097565b611d77565b005b34801561088157600080fd5b5061089c60048036038101906108979190612dd7565b611ef1565b005b3480156108aa57600080fd5b506108b3611fe9565b6040516108c09190613741565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109545750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461096a90613a4a565b80601f016020809104026020016040519081016040528092919081815260200182805461099690613a4a565b80156109e35780601f106109b8576101008083540402835291602001916109e3565b820191906000526020600020905b8154815290600101906020018083116109c657829003601f168201915b5050505050905090565b60006109f882611fef565b610a2e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b8054610a7690613a4a565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa290613a4a565b8015610aef5780601f10610ac457610100808354040283529160200191610aef565b820191906000526020600020905b815481529060010190602001808311610ad257829003601f168201915b505050505081565b6000610b028261204e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b6a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b8961211c565b73ffffffffffffffffffffffffffffffffffffffff1614610bec57610bb581610bb061211c565b611ce3565b610beb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600d5481565b610cac612124565b73ffffffffffffffffffffffffffffffffffffffff16610cca61154f565b73ffffffffffffffffffffffffffffffffffffffff1614610d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1790613681565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b6000610d4761212c565b6001546000540303905090565b60116020528060005260406000206000915090505481565b610d77838383612135565b505050565b610d84612124565b73ffffffffffffffffffffffffffffffffffffffff16610da261154f565b73ffffffffffffffffffffffffffffffffffffffff1614610df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610def90613681565b60405180910390fd5b80601260016101000a81548160ff02191690831515021790555050565b610e1d612124565b73ffffffffffffffffffffffffffffffffffffffff16610e3b61154f565b73ffffffffffffffffffffffffffffffffffffffff1614610e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8890613681565b60405180910390fd5b60026009541415610ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece906136e1565b60405180910390fd5b60026009819055506000610ee961154f565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f0c906134c6565b60006040518083038185875af1925050503d8060008114610f49576040519150601f19603f3d011682016040523d82523d6000602084013e610f4e565b606091505b5050905080610f5c57600080fd5b506001600981905550565b610f8283838360405180602001604052806000815250611a75565b505050565b60606000610f948361140e565b905060008167ffffffffffffffff811115610fb257610fb1613be3565b5b604051908082528060200260200182016040528015610fe05781602001602082028036833780820191505090505b50905060006001905060005b8381108015610ffd5750600e548211155b1561108657600061100d8361136e565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611072578284838151811061105757611056613bb4565b5b602002602001018181525050818061106e90613aad565b9250505b828061107d90613aad565b93505050610fec565b82945050505050919050565b61109a612124565b73ffffffffffffffffffffffffffffffffffffffff166110b861154f565b73ffffffffffffffffffffffffffffffffffffffff161461110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110590613681565b60405180910390fd5b80600d8190555050565b601260019054906101000a900460ff1681565b600c805461113890613a4a565b80601f016020809104026020016040519081016040528092919081815260200182805461116490613a4a565b80156111b15780601f10611186576101008083540402835291602001916111b1565b820191906000526020600020905b81548152906001019060200180831161119457829003601f168201915b505050505081565b6111c1612124565b73ffffffffffffffffffffffffffffffffffffffff166111df61154f565b73ffffffffffffffffffffffffffffffffffffffff1614611235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122c90613681565b60405180910390fd5b80600a908051906020019061124b929190612beb565b5050565b611257612124565b73ffffffffffffffffffffffffffffffffffffffff1661127561154f565b73ffffffffffffffffffffffffffffffffffffffff16146112cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c290613681565b60405180910390fd5b8060108190555050565b601260009054906101000a900460ff1681565b6112f0612124565b73ffffffffffffffffffffffffffffffffffffffff1661130e61154f565b73ffffffffffffffffffffffffffffffffffffffff1614611364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135b90613681565b60405180910390fd5b80600f8190555050565b60006113798261204e565b9050919050565b600a805461138d90613a4a565b80601f01602080910402602001604051908101604052809291908181526020018280546113b990613a4a565b80156114065780601f106113db57610100808354040283529160200191611406565b820191906000526020600020905b8154815290600101906020018083116113e957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611476576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6114cf612124565b73ffffffffffffffffffffffffffffffffffffffff166114ed61154f565b73ffffffffffffffffffffffffffffffffffffffff1614611543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153a90613681565b60405180910390fd5b61154d60006124df565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461158890613a4a565b80601f01602080910402602001604051908101604052809291908181526020018280546115b490613a4a565b80156116015780601f106115d657610100808354040283529160200191611601565b820191906000526020600020905b8154815290600101906020018083116115e457829003601f168201915b5050505050905090565b6000611615612124565b90506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601260009054906101000a900460ff16156116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a2906136c1565b60405180910390fd5b60105483826116ba919061387f565b11156116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f2906135a1565b60405180910390fd5b6000831161173e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611735906135c1565b60405180910390fd5b600f54831115611783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177a90613641565b60405180910390fd5b600e548361178f610d3d565b611799919061387f565b11156117da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d190613721565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183f906135e1565b60405180910390fd5b34600d54846118579190613906565b1015611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90613661565b60405180910390fd5b82601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118e7919061387f565b925050819055506118f882846125a5565b505050565b61190561211c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561196a576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061197761211c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a2461211c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a699190613564565b60405180910390a35050565b611a80848484612135565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611ae257611aab848484846125c3565b611ae1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60105481565b611af6612124565b73ffffffffffffffffffffffffffffffffffffffff16611b1461154f565b73ffffffffffffffffffffffffffffffffffffffff1614611b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6190613681565b60405180910390fd5b80600b9080519060200190611b80929190612beb565b5050565b6060611b8f82611fef565b611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc590613701565b60405180910390fd5b60001515601260019054906101000a900460ff1615151415611c7c57600b8054611bf790613a4a565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2390613a4a565b8015611c705780601f10611c4557610100808354040283529160200191611c70565b820191906000526020600020905b815481529060010190602001808311611c5357829003601f168201915b50505050509050611cd8565b6000611c86612723565b90506000815111611ca65760405180602001604052806000815250611cd4565b80611cb0846127b5565b600c604051602001611cc493929190613495565b6040516020818303038152906040525b9150505b919050565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d7f612124565b73ffffffffffffffffffffffffffffffffffffffff16611d9d61154f565b73ffffffffffffffffffffffffffffffffffffffff1614611df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dea90613681565b60405180910390fd5b60008211611e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2d90613621565b60405180910390fd5b600e5482611e42610d3d565b611e4c919061387f565b1115611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e84906136a1565b60405180910390fd5b81601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611edc919061387f565b92505081905550611eed81836125a5565b5050565b611ef9612124565b73ffffffffffffffffffffffffffffffffffffffff16611f1761154f565b73ffffffffffffffffffffffffffffffffffffffff1614611f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6490613681565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd490613601565b60405180910390fd5b611fe6816124df565b50565b600f5481565b600081611ffa61212c565b11158015612009575060005482105b8015612047575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061205d61212c565b116120e5576000548110156120e45760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156120e2575b60008114156120d85760046000836001900393508381526020019081526020016000205490506120ad565b8092505050612117565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b60006121408261204e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146121a7576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166121c861211c565b73ffffffffffffffffffffffffffffffffffffffff1614806121f757506121f6856121f161211c565b611ce3565b5b8061223c575061220561211c565b73ffffffffffffffffffffffffffffffffffffffff16612224846109ed565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612275576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156122dc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122e98585856001612916565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6123e68661291c565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561247057600060018401905060006004600083815260200190815260200160002054141561246e57600054811461246d578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124d88585856001612926565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125bf82826040518060200160405280600081525061292c565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125e961211c565b8786866040518563ffffffff1660e01b815260040161260b94939291906134f6565b602060405180830381600087803b15801561262557600080fd5b505af192505050801561265657506040513d601f19601f820116820180604052508101906126539190612ff4565b60015b6126d0573d8060008114612686576040519150601f19603f3d011682016040523d82523d6000602084013e61268b565b606091505b506000815114156126c8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461273290613a4a565b80601f016020809104026020016040519081016040528092919081815260200182805461275e90613a4a565b80156127ab5780601f10612780576101008083540402835291602001916127ab565b820191906000526020600020905b81548152906001019060200180831161278e57829003601f168201915b5050505050905090565b606060008214156127fd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612911565b600082905060005b6000821461282f57808061281890613aad565b915050600a8261282891906138d5565b9150612805565b60008167ffffffffffffffff81111561284b5761284a613be3565b5b6040519080825280601f01601f19166020018201604052801561287d5781602001600182028036833780820191505090505b5090505b6000851461290a576001826128969190613960565b9150600a856128a59190613af6565b60306128b1919061387f565b60f81b8183815181106128c7576128c6613bb4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561290391906138d5565b9450612881565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612999576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156129d4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129e16000858386612916565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612a4660018514612be1565b901b60a042901b612a568661291c565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612b5a575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b0a60008784806001019550876125c3565b612b40576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612a9b578260005414612b5557600080fd5b612bc5565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612b5b575b816000819055505050612bdb6000858386612926565b50505050565b6000819050919050565b828054612bf790613a4a565b90600052602060002090601f016020900481019282612c195760008555612c60565b82601f10612c3257805160ff1916838001178555612c60565b82800160010185558215612c60579182015b82811115612c5f578251825591602001919060010190612c44565b5b509050612c6d9190612c71565b5090565b5b80821115612c8a576000816000905550600101612c72565b5090565b6000612ca1612c9c84613781565b61375c565b905082815260208101848484011115612cbd57612cbc613c17565b5b612cc8848285613a08565b509392505050565b6000612ce3612cde846137b2565b61375c565b905082815260208101848484011115612cff57612cfe613c17565b5b612d0a848285613a08565b509392505050565b600081359050612d2181613ee7565b92915050565b600081359050612d3681613efe565b92915050565b600081359050612d4b81613f15565b92915050565b600081519050612d6081613f15565b92915050565b600082601f830112612d7b57612d7a613c12565b5b8135612d8b848260208601612c8e565b91505092915050565b600082601f830112612da957612da8613c12565b5b8135612db9848260208601612cd0565b91505092915050565b600081359050612dd181613f2c565b92915050565b600060208284031215612ded57612dec613c21565b5b6000612dfb84828501612d12565b91505092915050565b60008060408385031215612e1b57612e1a613c21565b5b6000612e2985828601612d12565b9250506020612e3a85828601612d12565b9150509250929050565b600080600060608486031215612e5d57612e5c613c21565b5b6000612e6b86828701612d12565b9350506020612e7c86828701612d12565b9250506040612e8d86828701612dc2565b9150509250925092565b60008060008060808587031215612eb157612eb0613c21565b5b6000612ebf87828801612d12565b9450506020612ed087828801612d12565b9350506040612ee187828801612dc2565b925050606085013567ffffffffffffffff811115612f0257612f01613c1c565b5b612f0e87828801612d66565b91505092959194509250565b60008060408385031215612f3157612f30613c21565b5b6000612f3f85828601612d12565b9250506020612f5085828601612d27565b9150509250929050565b60008060408385031215612f7157612f70613c21565b5b6000612f7f85828601612d12565b9250506020612f9085828601612dc2565b9150509250929050565b600060208284031215612fb057612faf613c21565b5b6000612fbe84828501612d27565b91505092915050565b600060208284031215612fdd57612fdc613c21565b5b6000612feb84828501612d3c565b91505092915050565b60006020828403121561300a57613009613c21565b5b600061301884828501612d51565b91505092915050565b60006020828403121561303757613036613c21565b5b600082013567ffffffffffffffff81111561305557613054613c1c565b5b61306184828501612d94565b91505092915050565b6000602082840312156130805761307f613c21565b5b600061308e84828501612dc2565b91505092915050565b600080604083850312156130ae576130ad613c21565b5b60006130bc85828601612dc2565b92505060206130cd85828601612d12565b9150509250929050565b60006130e38383613477565b60208301905092915050565b6130f881613994565b82525050565b600061310982613808565b6131138185613836565b935061311e836137e3565b8060005b8381101561314f57815161313688826130d7565b975061314183613829565b925050600181019050613122565b5085935050505092915050565b613165816139a6565b82525050565b600061317682613813565b6131808185613847565b9350613190818560208601613a17565b61319981613c26565b840191505092915050565b60006131af8261381e565b6131b98185613863565b93506131c9818560208601613a17565b6131d281613c26565b840191505092915050565b60006131e88261381e565b6131f28185613874565b9350613202818560208601613a17565b80840191505092915050565b6000815461321b81613a4a565b6132258186613874565b94506001821660008114613240576001811461325157613284565b60ff19831686528186019350613284565b61325a856137f3565b60005b8381101561327c5781548189015260018201915060208101905061325d565b838801955050505b50505092915050565b600061329a602583613863565b91506132a582613c37565b604082019050919050565b60006132bd601c83613863565b91506132c882613c86565b602082019050919050565b60006132e0602183613863565b91506132eb82613caf565b604082019050919050565b6000613303602683613863565b915061330e82613cfe565b604082019050919050565b6000613326601483613863565b915061333182613d4d565b602082019050919050565b6000613349601783613863565b915061335482613d76565b602082019050919050565b600061336c601783613863565b915061337782613d9f565b602082019050919050565b600061338f602083613863565b915061339a82613dc8565b602082019050919050565b60006133b2600083613858565b91506133bd82613df1565b600082019050919050565b60006133d5601483613863565b91506133e082613df4565b602082019050919050565b60006133f8601383613863565b915061340382613e1d565b602082019050919050565b600061341b601f83613863565b915061342682613e46565b602082019050919050565b600061343e603083613863565b915061344982613e6f565b604082019050919050565b6000613461601483613863565b915061346c82613ebe565b602082019050919050565b613480816139fe565b82525050565b61348f816139fe565b82525050565b60006134a182866131dd565b91506134ad82856131dd565b91506134b9828461320e565b9150819050949350505050565b60006134d1826133a5565b9150819050919050565b60006020820190506134f060008301846130ef565b92915050565b600060808201905061350b60008301876130ef565b61351860208301866130ef565b6135256040830185613486565b8181036060830152613537818461316b565b905095945050505050565b6000602082019050818103600083015261355c81846130fe565b905092915050565b6000602082019050613579600083018461315c565b92915050565b6000602082019050818103600083015261359981846131a4565b905092915050565b600060208201905081810360008301526135ba8161328d565b9050919050565b600060208201905081810360008301526135da816132b0565b9050919050565b600060208201905081810360008301526135fa816132d3565b9050919050565b6000602082019050818103600083015261361a816132f6565b9050919050565b6000602082019050818103600083015261363a81613319565b9050919050565b6000602082019050818103600083015261365a8161333c565b9050919050565b6000602082019050818103600083015261367a8161335f565b9050919050565b6000602082019050818103600083015261369a81613382565b9050919050565b600060208201905081810360008301526136ba816133c8565b9050919050565b600060208201905081810360008301526136da816133eb565b9050919050565b600060208201905081810360008301526136fa8161340e565b9050919050565b6000602082019050818103600083015261371a81613431565b9050919050565b6000602082019050818103600083015261373a81613454565b9050919050565b60006020820190506137566000830184613486565b92915050565b6000613766613777565b90506137728282613a7c565b919050565b6000604051905090565b600067ffffffffffffffff82111561379c5761379b613be3565b5b6137a582613c26565b9050602081019050919050565b600067ffffffffffffffff8211156137cd576137cc613be3565b5b6137d682613c26565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061388a826139fe565b9150613895836139fe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138ca576138c9613b27565b5b828201905092915050565b60006138e0826139fe565b91506138eb836139fe565b9250826138fb576138fa613b56565b5b828204905092915050565b6000613911826139fe565b915061391c836139fe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561395557613954613b27565b5b828202905092915050565b600061396b826139fe565b9150613976836139fe565b92508282101561398957613988613b27565b5b828203905092915050565b600061399f826139de565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a35578082015181840152602081019050613a1a565b83811115613a44576000848401525b50505050565b60006002820490506001821680613a6257607f821691505b60208210811415613a7657613a75613b85565b5b50919050565b613a8582613c26565b810181811067ffffffffffffffff82111715613aa457613aa3613be3565b5b80604052505050565b6000613ab8826139fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613aeb57613aea613b27565b5b600182019050919050565b6000613b01826139fe565b9150613b0c836139fe565b925082613b1c57613b1b613b56565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d6178206d696e7473207065722061646472657373206c696d6974206578636560008201527f656465642e000000000000000000000000000000000000000000000000000000602082015250565b7f4e65656420746f206d696e74206174206c656173742031204e46542e00000000600082015250565b7f43616c6c65722063616e277420626520616e6f7468657220636f6e747261637460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f457863656564206d6178206d696e74207065722074782e000000000000000000600082015250565b7f496e76616c69642066756e64732070726f76696465642e000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f436f6e7472616374206973207061757365642e00000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b7f4d617820737570706c792065786365656465642e000000000000000000000000600082015250565b613ef081613994565b8114613efb57600080fd5b50565b613f07816139a6565b8114613f1257600080fd5b50565b613f1e816139b2565b8114613f2957600080fd5b50565b613f35816139fe565b8114613f4057600080fd5b5056fea26469706673582212207c6796eb5204a59da2e4ecb1e058cb8cb42c99aef6e2269ac261752056f8dd3564736f6c63430008070033697066733a2f2f516d56473663667071697532347477356d6b6b6d646b39554334373853313554446a47384e3667446b33444d77342f

Deployed Bytecode

0x6080604052600436106102255760003560e01c80635c975abb11610123578063a22cb465116100ab578063d5abeb011161006f578063d5abeb01146107e4578063e985e9c51461080f578063efbd73f41461084c578063f2fde38b14610875578063ff6456911461089e57610225565b8063a22cb46514610701578063b88d4fde1461072a578063ba7d2c7614610753578063c17ecd121461077e578063c87b56dd146107a757610225565b806370a08231116100f257806370a082311461063b578063715018a6146106785780638da5cb5b1461068f57806395d89b41146106ba578063a0712d68146106e557610225565b80635c975abb1461057f5780635ef9ff37146105aa5780636352211e146105d35780636c0360eb1461061057610225565b806323b872dd116101b157806344a0d68a1161017557806344a0d68a146104ae57806351830227146104d75780635503a0e81461050257806355f804b31461052d57806358c76daf1461055657610225565b806323b872dd146103df5780632a3f300c146104085780633ccfd60b1461043157806342842e0e14610448578063438b63001461047157610225565b8063095ea7b3116101f8578063095ea7b3146102fa57806313faede61461032357806316c38b3c1461034e57806318160ddd1461037757806318cae269146103a257610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063081c8c44146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612fc7565b6108c9565b60405161025e9190613564565b60405180910390f35b34801561027357600080fd5b5061027c61095b565b604051610289919061357f565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b4919061306a565b6109ed565b6040516102c691906134db565b60405180910390f35b3480156102db57600080fd5b506102e4610a69565b6040516102f1919061357f565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c9190612f5a565b610af7565b005b34801561032f57600080fd5b50610338610c9e565b6040516103459190613741565b60405180910390f35b34801561035a57600080fd5b5061037560048036038101906103709190612f9a565b610ca4565b005b34801561038357600080fd5b5061038c610d3d565b6040516103999190613741565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c49190612dd7565b610d54565b6040516103d69190613741565b60405180910390f35b3480156103eb57600080fd5b5061040660048036038101906104019190612e44565b610d6c565b005b34801561041457600080fd5b5061042f600480360381019061042a9190612f9a565b610d7c565b005b34801561043d57600080fd5b50610446610e15565b005b34801561045457600080fd5b5061046f600480360381019061046a9190612e44565b610f67565b005b34801561047d57600080fd5b5061049860048036038101906104939190612dd7565b610f87565b6040516104a59190613542565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d0919061306a565b611092565b005b3480156104e357600080fd5b506104ec611118565b6040516104f99190613564565b60405180910390f35b34801561050e57600080fd5b5061051761112b565b604051610524919061357f565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190613021565b6111b9565b005b34801561056257600080fd5b5061057d6004803603810190610578919061306a565b61124f565b005b34801561058b57600080fd5b506105946112d5565b6040516105a19190613564565b60405180910390f35b3480156105b657600080fd5b506105d160048036038101906105cc919061306a565b6112e8565b005b3480156105df57600080fd5b506105fa60048036038101906105f5919061306a565b61136e565b60405161060791906134db565b60405180910390f35b34801561061c57600080fd5b50610625611380565b604051610632919061357f565b60405180910390f35b34801561064757600080fd5b50610662600480360381019061065d9190612dd7565b61140e565b60405161066f9190613741565b60405180910390f35b34801561068457600080fd5b5061068d6114c7565b005b34801561069b57600080fd5b506106a461154f565b6040516106b191906134db565b60405180910390f35b3480156106c657600080fd5b506106cf611579565b6040516106dc919061357f565b60405180910390f35b6106ff60048036038101906106fa919061306a565b61160b565b005b34801561070d57600080fd5b5061072860048036038101906107239190612f1a565b6118fd565b005b34801561073657600080fd5b50610751600480360381019061074c9190612e97565b611a75565b005b34801561075f57600080fd5b50610768611ae8565b6040516107759190613741565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a09190613021565b611aee565b005b3480156107b357600080fd5b506107ce60048036038101906107c9919061306a565b611b84565b6040516107db919061357f565b60405180910390f35b3480156107f057600080fd5b506107f9611cdd565b6040516108069190613741565b60405180910390f35b34801561081b57600080fd5b5061083660048036038101906108319190612e04565b611ce3565b6040516108439190613564565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190613097565b611d77565b005b34801561088157600080fd5b5061089c60048036038101906108979190612dd7565b611ef1565b005b3480156108aa57600080fd5b506108b3611fe9565b6040516108c09190613741565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109545750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461096a90613a4a565b80601f016020809104026020016040519081016040528092919081815260200182805461099690613a4a565b80156109e35780601f106109b8576101008083540402835291602001916109e3565b820191906000526020600020905b8154815290600101906020018083116109c657829003601f168201915b5050505050905090565b60006109f882611fef565b610a2e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b8054610a7690613a4a565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa290613a4a565b8015610aef5780601f10610ac457610100808354040283529160200191610aef565b820191906000526020600020905b815481529060010190602001808311610ad257829003601f168201915b505050505081565b6000610b028261204e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b6a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b8961211c565b73ffffffffffffffffffffffffffffffffffffffff1614610bec57610bb581610bb061211c565b611ce3565b610beb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600d5481565b610cac612124565b73ffffffffffffffffffffffffffffffffffffffff16610cca61154f565b73ffffffffffffffffffffffffffffffffffffffff1614610d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1790613681565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b6000610d4761212c565b6001546000540303905090565b60116020528060005260406000206000915090505481565b610d77838383612135565b505050565b610d84612124565b73ffffffffffffffffffffffffffffffffffffffff16610da261154f565b73ffffffffffffffffffffffffffffffffffffffff1614610df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610def90613681565b60405180910390fd5b80601260016101000a81548160ff02191690831515021790555050565b610e1d612124565b73ffffffffffffffffffffffffffffffffffffffff16610e3b61154f565b73ffffffffffffffffffffffffffffffffffffffff1614610e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8890613681565b60405180910390fd5b60026009541415610ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece906136e1565b60405180910390fd5b60026009819055506000610ee961154f565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f0c906134c6565b60006040518083038185875af1925050503d8060008114610f49576040519150601f19603f3d011682016040523d82523d6000602084013e610f4e565b606091505b5050905080610f5c57600080fd5b506001600981905550565b610f8283838360405180602001604052806000815250611a75565b505050565b60606000610f948361140e565b905060008167ffffffffffffffff811115610fb257610fb1613be3565b5b604051908082528060200260200182016040528015610fe05781602001602082028036833780820191505090505b50905060006001905060005b8381108015610ffd5750600e548211155b1561108657600061100d8361136e565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611072578284838151811061105757611056613bb4565b5b602002602001018181525050818061106e90613aad565b9250505b828061107d90613aad565b93505050610fec565b82945050505050919050565b61109a612124565b73ffffffffffffffffffffffffffffffffffffffff166110b861154f565b73ffffffffffffffffffffffffffffffffffffffff161461110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110590613681565b60405180910390fd5b80600d8190555050565b601260019054906101000a900460ff1681565b600c805461113890613a4a565b80601f016020809104026020016040519081016040528092919081815260200182805461116490613a4a565b80156111b15780601f10611186576101008083540402835291602001916111b1565b820191906000526020600020905b81548152906001019060200180831161119457829003601f168201915b505050505081565b6111c1612124565b73ffffffffffffffffffffffffffffffffffffffff166111df61154f565b73ffffffffffffffffffffffffffffffffffffffff1614611235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122c90613681565b60405180910390fd5b80600a908051906020019061124b929190612beb565b5050565b611257612124565b73ffffffffffffffffffffffffffffffffffffffff1661127561154f565b73ffffffffffffffffffffffffffffffffffffffff16146112cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c290613681565b60405180910390fd5b8060108190555050565b601260009054906101000a900460ff1681565b6112f0612124565b73ffffffffffffffffffffffffffffffffffffffff1661130e61154f565b73ffffffffffffffffffffffffffffffffffffffff1614611364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135b90613681565b60405180910390fd5b80600f8190555050565b60006113798261204e565b9050919050565b600a805461138d90613a4a565b80601f01602080910402602001604051908101604052809291908181526020018280546113b990613a4a565b80156114065780601f106113db57610100808354040283529160200191611406565b820191906000526020600020905b8154815290600101906020018083116113e957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611476576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6114cf612124565b73ffffffffffffffffffffffffffffffffffffffff166114ed61154f565b73ffffffffffffffffffffffffffffffffffffffff1614611543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153a90613681565b60405180910390fd5b61154d60006124df565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461158890613a4a565b80601f01602080910402602001604051908101604052809291908181526020018280546115b490613a4a565b80156116015780601f106115d657610100808354040283529160200191611601565b820191906000526020600020905b8154815290600101906020018083116115e457829003601f168201915b5050505050905090565b6000611615612124565b90506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601260009054906101000a900460ff16156116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a2906136c1565b60405180910390fd5b60105483826116ba919061387f565b11156116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f2906135a1565b60405180910390fd5b6000831161173e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611735906135c1565b60405180910390fd5b600f54831115611783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177a90613641565b60405180910390fd5b600e548361178f610d3d565b611799919061387f565b11156117da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d190613721565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183f906135e1565b60405180910390fd5b34600d54846118579190613906565b1015611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90613661565b60405180910390fd5b82601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118e7919061387f565b925050819055506118f882846125a5565b505050565b61190561211c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561196a576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061197761211c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a2461211c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a699190613564565b60405180910390a35050565b611a80848484612135565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611ae257611aab848484846125c3565b611ae1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60105481565b611af6612124565b73ffffffffffffffffffffffffffffffffffffffff16611b1461154f565b73ffffffffffffffffffffffffffffffffffffffff1614611b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6190613681565b60405180910390fd5b80600b9080519060200190611b80929190612beb565b5050565b6060611b8f82611fef565b611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc590613701565b60405180910390fd5b60001515601260019054906101000a900460ff1615151415611c7c57600b8054611bf790613a4a565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2390613a4a565b8015611c705780601f10611c4557610100808354040283529160200191611c70565b820191906000526020600020905b815481529060010190602001808311611c5357829003601f168201915b50505050509050611cd8565b6000611c86612723565b90506000815111611ca65760405180602001604052806000815250611cd4565b80611cb0846127b5565b600c604051602001611cc493929190613495565b6040516020818303038152906040525b9150505b919050565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d7f612124565b73ffffffffffffffffffffffffffffffffffffffff16611d9d61154f565b73ffffffffffffffffffffffffffffffffffffffff1614611df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dea90613681565b60405180910390fd5b60008211611e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2d90613621565b60405180910390fd5b600e5482611e42610d3d565b611e4c919061387f565b1115611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e84906136a1565b60405180910390fd5b81601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611edc919061387f565b92505081905550611eed81836125a5565b5050565b611ef9612124565b73ffffffffffffffffffffffffffffffffffffffff16611f1761154f565b73ffffffffffffffffffffffffffffffffffffffff1614611f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6490613681565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd490613601565b60405180910390fd5b611fe6816124df565b50565b600f5481565b600081611ffa61212c565b11158015612009575060005482105b8015612047575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061205d61212c565b116120e5576000548110156120e45760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156120e2575b60008114156120d85760046000836001900393508381526020019081526020016000205490506120ad565b8092505050612117565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b60006121408261204e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146121a7576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166121c861211c565b73ffffffffffffffffffffffffffffffffffffffff1614806121f757506121f6856121f161211c565b611ce3565b5b8061223c575061220561211c565b73ffffffffffffffffffffffffffffffffffffffff16612224846109ed565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612275576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156122dc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122e98585856001612916565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6123e68661291c565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561247057600060018401905060006004600083815260200190815260200160002054141561246e57600054811461246d578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124d88585856001612926565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125bf82826040518060200160405280600081525061292c565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125e961211c565b8786866040518563ffffffff1660e01b815260040161260b94939291906134f6565b602060405180830381600087803b15801561262557600080fd5b505af192505050801561265657506040513d601f19601f820116820180604052508101906126539190612ff4565b60015b6126d0573d8060008114612686576040519150601f19603f3d011682016040523d82523d6000602084013e61268b565b606091505b506000815114156126c8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461273290613a4a565b80601f016020809104026020016040519081016040528092919081815260200182805461275e90613a4a565b80156127ab5780601f10612780576101008083540402835291602001916127ab565b820191906000526020600020905b81548152906001019060200180831161278e57829003601f168201915b5050505050905090565b606060008214156127fd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612911565b600082905060005b6000821461282f57808061281890613aad565b915050600a8261282891906138d5565b9150612805565b60008167ffffffffffffffff81111561284b5761284a613be3565b5b6040519080825280601f01601f19166020018201604052801561287d5781602001600182028036833780820191505090505b5090505b6000851461290a576001826128969190613960565b9150600a856128a59190613af6565b60306128b1919061387f565b60f81b8183815181106128c7576128c6613bb4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561290391906138d5565b9450612881565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612999576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156129d4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129e16000858386612916565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612a4660018514612be1565b901b60a042901b612a568661291c565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612b5a575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b0a60008784806001019550876125c3565b612b40576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612a9b578260005414612b5557600080fd5b612bc5565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612b5b575b816000819055505050612bdb6000858386612926565b50505050565b6000819050919050565b828054612bf790613a4a565b90600052602060002090601f016020900481019282612c195760008555612c60565b82601f10612c3257805160ff1916838001178555612c60565b82800160010185558215612c60579182015b82811115612c5f578251825591602001919060010190612c44565b5b509050612c6d9190612c71565b5090565b5b80821115612c8a576000816000905550600101612c72565b5090565b6000612ca1612c9c84613781565b61375c565b905082815260208101848484011115612cbd57612cbc613c17565b5b612cc8848285613a08565b509392505050565b6000612ce3612cde846137b2565b61375c565b905082815260208101848484011115612cff57612cfe613c17565b5b612d0a848285613a08565b509392505050565b600081359050612d2181613ee7565b92915050565b600081359050612d3681613efe565b92915050565b600081359050612d4b81613f15565b92915050565b600081519050612d6081613f15565b92915050565b600082601f830112612d7b57612d7a613c12565b5b8135612d8b848260208601612c8e565b91505092915050565b600082601f830112612da957612da8613c12565b5b8135612db9848260208601612cd0565b91505092915050565b600081359050612dd181613f2c565b92915050565b600060208284031215612ded57612dec613c21565b5b6000612dfb84828501612d12565b91505092915050565b60008060408385031215612e1b57612e1a613c21565b5b6000612e2985828601612d12565b9250506020612e3a85828601612d12565b9150509250929050565b600080600060608486031215612e5d57612e5c613c21565b5b6000612e6b86828701612d12565b9350506020612e7c86828701612d12565b9250506040612e8d86828701612dc2565b9150509250925092565b60008060008060808587031215612eb157612eb0613c21565b5b6000612ebf87828801612d12565b9450506020612ed087828801612d12565b9350506040612ee187828801612dc2565b925050606085013567ffffffffffffffff811115612f0257612f01613c1c565b5b612f0e87828801612d66565b91505092959194509250565b60008060408385031215612f3157612f30613c21565b5b6000612f3f85828601612d12565b9250506020612f5085828601612d27565b9150509250929050565b60008060408385031215612f7157612f70613c21565b5b6000612f7f85828601612d12565b9250506020612f9085828601612dc2565b9150509250929050565b600060208284031215612fb057612faf613c21565b5b6000612fbe84828501612d27565b91505092915050565b600060208284031215612fdd57612fdc613c21565b5b6000612feb84828501612d3c565b91505092915050565b60006020828403121561300a57613009613c21565b5b600061301884828501612d51565b91505092915050565b60006020828403121561303757613036613c21565b5b600082013567ffffffffffffffff81111561305557613054613c1c565b5b61306184828501612d94565b91505092915050565b6000602082840312156130805761307f613c21565b5b600061308e84828501612dc2565b91505092915050565b600080604083850312156130ae576130ad613c21565b5b60006130bc85828601612dc2565b92505060206130cd85828601612d12565b9150509250929050565b60006130e38383613477565b60208301905092915050565b6130f881613994565b82525050565b600061310982613808565b6131138185613836565b935061311e836137e3565b8060005b8381101561314f57815161313688826130d7565b975061314183613829565b925050600181019050613122565b5085935050505092915050565b613165816139a6565b82525050565b600061317682613813565b6131808185613847565b9350613190818560208601613a17565b61319981613c26565b840191505092915050565b60006131af8261381e565b6131b98185613863565b93506131c9818560208601613a17565b6131d281613c26565b840191505092915050565b60006131e88261381e565b6131f28185613874565b9350613202818560208601613a17565b80840191505092915050565b6000815461321b81613a4a565b6132258186613874565b94506001821660008114613240576001811461325157613284565b60ff19831686528186019350613284565b61325a856137f3565b60005b8381101561327c5781548189015260018201915060208101905061325d565b838801955050505b50505092915050565b600061329a602583613863565b91506132a582613c37565b604082019050919050565b60006132bd601c83613863565b91506132c882613c86565b602082019050919050565b60006132e0602183613863565b91506132eb82613caf565b604082019050919050565b6000613303602683613863565b915061330e82613cfe565b604082019050919050565b6000613326601483613863565b915061333182613d4d565b602082019050919050565b6000613349601783613863565b915061335482613d76565b602082019050919050565b600061336c601783613863565b915061337782613d9f565b602082019050919050565b600061338f602083613863565b915061339a82613dc8565b602082019050919050565b60006133b2600083613858565b91506133bd82613df1565b600082019050919050565b60006133d5601483613863565b91506133e082613df4565b602082019050919050565b60006133f8601383613863565b915061340382613e1d565b602082019050919050565b600061341b601f83613863565b915061342682613e46565b602082019050919050565b600061343e603083613863565b915061344982613e6f565b604082019050919050565b6000613461601483613863565b915061346c82613ebe565b602082019050919050565b613480816139fe565b82525050565b61348f816139fe565b82525050565b60006134a182866131dd565b91506134ad82856131dd565b91506134b9828461320e565b9150819050949350505050565b60006134d1826133a5565b9150819050919050565b60006020820190506134f060008301846130ef565b92915050565b600060808201905061350b60008301876130ef565b61351860208301866130ef565b6135256040830185613486565b8181036060830152613537818461316b565b905095945050505050565b6000602082019050818103600083015261355c81846130fe565b905092915050565b6000602082019050613579600083018461315c565b92915050565b6000602082019050818103600083015261359981846131a4565b905092915050565b600060208201905081810360008301526135ba8161328d565b9050919050565b600060208201905081810360008301526135da816132b0565b9050919050565b600060208201905081810360008301526135fa816132d3565b9050919050565b6000602082019050818103600083015261361a816132f6565b9050919050565b6000602082019050818103600083015261363a81613319565b9050919050565b6000602082019050818103600083015261365a8161333c565b9050919050565b6000602082019050818103600083015261367a8161335f565b9050919050565b6000602082019050818103600083015261369a81613382565b9050919050565b600060208201905081810360008301526136ba816133c8565b9050919050565b600060208201905081810360008301526136da816133eb565b9050919050565b600060208201905081810360008301526136fa8161340e565b9050919050565b6000602082019050818103600083015261371a81613431565b9050919050565b6000602082019050818103600083015261373a81613454565b9050919050565b60006020820190506137566000830184613486565b92915050565b6000613766613777565b90506137728282613a7c565b919050565b6000604051905090565b600067ffffffffffffffff82111561379c5761379b613be3565b5b6137a582613c26565b9050602081019050919050565b600067ffffffffffffffff8211156137cd576137cc613be3565b5b6137d682613c26565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061388a826139fe565b9150613895836139fe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138ca576138c9613b27565b5b828201905092915050565b60006138e0826139fe565b91506138eb836139fe565b9250826138fb576138fa613b56565b5b828204905092915050565b6000613911826139fe565b915061391c836139fe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561395557613954613b27565b5b828202905092915050565b600061396b826139fe565b9150613976836139fe565b92508282101561398957613988613b27565b5b828203905092915050565b600061399f826139de565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a35578082015181840152602081019050613a1a565b83811115613a44576000848401525b50505050565b60006002820490506001821680613a6257607f821691505b60208210811415613a7657613a75613b85565b5b50919050565b613a8582613c26565b810181811067ffffffffffffffff82111715613aa457613aa3613be3565b5b80604052505050565b6000613ab8826139fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613aeb57613aea613b27565b5b600182019050919050565b6000613b01826139fe565b9150613b0c836139fe565b925082613b1c57613b1b613b56565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d6178206d696e7473207065722061646472657373206c696d6974206578636560008201527f656465642e000000000000000000000000000000000000000000000000000000602082015250565b7f4e65656420746f206d696e74206174206c656173742031204e46542e00000000600082015250565b7f43616c6c65722063616e277420626520616e6f7468657220636f6e747261637460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f457863656564206d6178206d696e74207065722074782e000000000000000000600082015250565b7f496e76616c69642066756e64732070726f76696465642e000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f436f6e7472616374206973207061757365642e00000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b7f4d617820737570706c792065786365656465642e000000000000000000000000600082015250565b613ef081613994565b8114613efb57600080fd5b50565b613f07816139a6565b8114613f1257600080fd5b50565b613f1e816139b2565b8114613f2957600080fd5b50565b613f35816139fe565b8114613f4057600080fd5b5056fea26469706673582212207c6796eb5204a59da2e4ecb1e058cb8cb42c99aef6e2269ac261752056f8dd3564736f6c63430008070033

Deployed Bytecode Sourcemap

63956:4529:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38609:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43622:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45690:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64087:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45150:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64166:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68159:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37663:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64320:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46576:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68002:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68326:156;;;;;;;;;;;;;:::i;:::-;;46817:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66501:645;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67171:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64416:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64122:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67631:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67465:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64384:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67310:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43411:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64059:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39288:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24719:103;;;;;;;;;;;;;:::i;:::-;;24068:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43791:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64850:736;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45966:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47073:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64274:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67799:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66033:460;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64202:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46345:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65659:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24977:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64240:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38609:615;38694:4;39009:10;38994:25;;:11;:25;;;;:102;;;;39086:10;39071:25;;:11;:25;;;;38994:102;:179;;;;39163:10;39148:25;;:11;:25;;;;38994:179;38974:199;;38609:615;;;:::o;43622:100::-;43676:13;43709:5;43702:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43622:100;:::o;45690:204::-;45758:7;45783:16;45791:7;45783;:16::i;:::-;45778:64;;45808:34;;;;;;;;;;;;;;45778:64;45862:15;:24;45878:7;45862:24;;;;;;;;;;;;;;;;;;;;;45855:31;;45690:204;;;:::o;64087:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45150:474::-;45223:13;45255:27;45274:7;45255:18;:27::i;:::-;45223:61;;45305:5;45299:11;;:2;:11;;;45295:48;;;45319:24;;;;;;;;;;;;;;45295:48;45383:5;45360:28;;:19;:17;:19::i;:::-;:28;;;45356:175;;45408:44;45425:5;45432:19;:17;:19::i;:::-;45408:16;:44::i;:::-;45403:128;;45480:35;;;;;;;;;;;;;;45403:128;45356:175;45570:2;45543:15;:24;45559:7;45543:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45608:7;45604:2;45588:28;;45597:5;45588:28;;;;;;;;;;;;45212:412;45150:474;;:::o;64166:29::-;;;;:::o;68159:81::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68226:6:::1;68217;;:15;;;;;;;;;;;;;;;;;;68159:81:::0;:::o;37663:315::-;37716:7;37944:15;:13;:15::i;:::-;37929:12;;37913:13;;:28;:46;37906:53;;37663:315;:::o;64320:55::-;;;;;;;;;;;;;;;;;:::o;46576:170::-;46710:28;46720:4;46726:2;46730:7;46710:9;:28::i;:::-;46576:170;;;:::o;68002:83::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68071:6:::1;68060:8;;:17;;;;;;;;;;;;;;;;;;68002:83:::0;:::o;68326:156::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19042:1:::1;19640:7;;:19;;19632:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;19042:1;19773:7;:18;;;;68386:7:::2;68407;:5;:7::i;:::-;68399:21;;68428;68399:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68385:69;;;68471:2;68463:11;;;::::0;::::2;;68376:106;18998:1:::1;19952:7;:22;;;;68326:156::o:0;46817:185::-;46955:39;46972:4;46978:2;46982:7;46955:39;;;;;;;;;;;;:16;:39::i;:::-;46817:185;;;:::o;66501:645::-;66561:16;66588:23;66614:17;66624:6;66614:9;:17::i;:::-;66588:43;;66640:30;66687:15;66673:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66640:63;;66712:22;66737:1;66712:26;;66747:23;66785:325;66810:15;66792;:33;:64;;;;;66847:9;;66829:14;:27;;66792:64;66785:325;;;66869:25;66897:23;66905:14;66897:7;:23::i;:::-;66869:51;;66958:6;66937:27;;:17;:27;;;66933:141;;;67014:14;66981:13;66995:15;66981:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;67045:17;;;;;:::i;:::-;;;;66933:141;67084:16;;;;;:::i;:::-;;;;66858:252;66785:325;;;67125:13;67118:20;;;;;;66501:645;;;:::o;67171:78::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67236:5:::1;67229:4;:12;;;;67171:78:::0;:::o;64416:27::-;;;;;;;;;;;;;:::o;64122:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67631:102::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67714:11:::1;67704:7;:21;;;;;;;;;;;;:::i;:::-;;67631:102:::0;:::o;67465:117::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67559:15:::1;67538:18;:36;;;;67465:117:::0;:::o;64384:25::-;;;;;;;;;;;;;:::o;67310:94::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67387:9:::1;67376:8;:20;;;;67310:94:::0;:::o;43411:144::-;43475:7;43518:27;43537:7;43518:18;:27::i;:::-;43495:52;;43411:144;;;:::o;64059:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39288:224::-;39352:7;39393:1;39376:19;;:5;:19;;;39372:60;;;39404:28;;;;;;;;;;;;;;39372:60;34627:13;39450:18;:25;39469:5;39450:25;;;;;;;;;;;;;;;;:54;39443:61;;39288:224;;;:::o;24719:103::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24784:30:::1;24811:1;24784:18;:30::i;:::-;24719:103::o:0;24068:87::-;24114:7;24141:6;;;;;;;;;;;24134:13;;24068:87;:::o;43791:104::-;43847:13;43880:7;43873:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43791:104;:::o;64850:736::-;64907:15;64925:12;:10;:12::i;:::-;64907:30;;64944:24;64971:20;:29;64992:7;64971:29;;;;;;;;;;;;;;;;64944:56;;65018:6;;;;;;;;;;;65017:7;65009:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;65093:18;;65082:7;65063:16;:26;;;;:::i;:::-;:48;;65055:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;65178:1;65168:7;:11;65160:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;65238:8;;65227:7;:19;;65219:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;65316:9;;65305:7;65289:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;65281:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;65378:7;65365:20;;:9;:20;;;65357:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;65458:9;65450:4;;65440:7;:14;;;;:::i;:::-;:27;;65432:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;65537:7;65504:20;:29;65525:7;65504:29;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;65551:27;65561:7;65570;65551:9;:27::i;:::-;64898:688;;64850:736;:::o;45966:308::-;46077:19;:17;:19::i;:::-;46065:31;;:8;:31;;;46061:61;;;46105:17;;;;;;;;;;;;;;46061:61;46187:8;46135:18;:39;46154:19;:17;:19::i;:::-;46135:39;;;;;;;;;;;;;;;:49;46175:8;46135:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;46247:8;46211:55;;46226:19;:17;:19::i;:::-;46211:55;;;46257:8;46211:55;;;;;;:::i;:::-;;;;;;;;45966:308;;:::o;47073:396::-;47240:28;47250:4;47256:2;47260:7;47240:9;:28::i;:::-;47301:1;47283:2;:14;;;:19;47279:183;;47322:56;47353:4;47359:2;47363:7;47372:5;47322:30;:56::i;:::-;47317:145;;47406:40;;;;;;;;;;;;;;47317:145;47279:183;47073:396;;;;:::o;64274:37::-;;;;:::o;67799:124::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67900:15:::1;67883:14;:32;;;;;;;;;;;;:::i;:::-;;67799:124:::0;:::o;66033:460::-;66107:13;66139:17;66147:8;66139:7;:17::i;:::-;66131:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;66239:5;66227:17;;:8;;;;;;;;;;;:17;;;66223:65;;;66264:14;66257:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66223:65;66298:28;66329:10;:8;:10::i;:::-;66298:41;;66386:1;66361:14;66355:28;:32;:130;;;;;;;;;;;;;;;;;66423:14;66439:19;:8;:17;:19::i;:::-;66460:9;66406:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66355:130;66348:137;;;66033:460;;;;:::o;64202:31::-;;;;:::o;46345:164::-;46442:4;46466:18;:25;46485:5;46466:25;;;;;;;;;;;;;;;:35;46492:8;46466:35;;;;;;;;;;;;;;;;;;;;;;;;;46459:42;;46345:164;;;;:::o;65659:341::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65775:1:::1;65761:11;:15;65753:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;65851:9;;65836:11;65820:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;65812:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;65933:11;65898:20;:31;65919:9;65898:31;;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;;;;;;;65955:33;65965:9;65976:11;65955:9;:33::i;:::-;65659:341:::0;;:::o;24977:201::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25086:1:::1;25066:22;;:8;:22;;;;25058:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25142:28;25161:8;25142:18;:28::i;:::-;24977:201:::0;:::o;64240:27::-;;;;:::o;47724:273::-;47781:4;47837:7;47818:15;:13;:15::i;:::-;:26;;:66;;;;;47871:13;;47861:7;:23;47818:66;:152;;;;;47969:1;35397:8;47922:17;:26;47940:7;47922:26;;;;;;;;;;;;:43;:48;47818:152;47798:172;;47724:273;;;:::o;40926:1129::-;40993:7;41013:12;41028:7;41013:22;;41096:4;41077:15;:13;:15::i;:::-;:23;41073:915;;41130:13;;41123:4;:20;41119:869;;;41168:14;41185:17;:23;41203:4;41185:23;;;;;;;;;;;;41168:40;;41301:1;35397:8;41274:6;:23;:28;41270:699;;;41793:113;41810:1;41800:6;:11;41793:113;;;41853:17;:25;41871:6;;;;;;;41853:25;;;;;;;;;;;;41844:34;;41793:113;;;41939:6;41932:13;;;;;;41270:699;41145:843;41119:869;41073:915;42016:31;;;;;;;;;;;;;;40926:1129;;;;:::o;61706:105::-;61766:7;61793:10;61786:17;;61706:105;:::o;22792:98::-;22845:7;22872:10;22865:17;;22792:98;:::o;64721:99::-;64786:7;64811:1;64804:8;;64721:99;:::o;52963:2515::-;53078:27;53108;53127:7;53108:18;:27::i;:::-;53078:57;;53193:4;53152:45;;53168:19;53152:45;;;53148:86;;53206:28;;;;;;;;;;;;;;53148:86;53247:22;53296:4;53273:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;53317:43;53334:4;53340:19;:17;:19::i;:::-;53317:16;:43::i;:::-;53273:87;:147;;;;53401:19;:17;:19::i;:::-;53377:43;;:20;53389:7;53377:11;:20::i;:::-;:43;;;53273:147;53247:174;;53439:17;53434:66;;53465:35;;;;;;;;;;;;;;53434:66;53529:1;53515:16;;:2;:16;;;53511:52;;;53540:23;;;;;;;;;;;;;;53511:52;53576:43;53598:4;53604:2;53608:7;53617:1;53576:21;:43::i;:::-;53692:15;:24;53708:7;53692:24;;;;;;;;;;;;53685:31;;;;;;;;;;;54084:18;:24;54103:4;54084:24;;;;;;;;;;;;;;;;54082:26;;;;;;;;;;;;54153:18;:22;54172:2;54153:22;;;;;;;;;;;;;;;;54151:24;;;;;;;;;;;35679:8;35281:3;54534:15;:41;;54492:21;54510:2;54492:17;:21::i;:::-;:84;:128;54446:17;:26;54464:7;54446:26;;;;;;;;;;;:174;;;;54790:1;35679:8;54740:19;:46;:51;54736:626;;;54812:19;54844:1;54834:7;:11;54812:33;;55001:1;54967:17;:30;54985:11;54967:30;;;;;;;;;;;;:35;54963:384;;;55105:13;;55090:11;:28;55086:242;;55285:19;55252:17;:30;55270:11;55252:30;;;;;;;;;;;:52;;;;55086:242;54963:384;54793:569;54736:626;55409:7;55405:2;55390:27;;55399:4;55390:27;;;;;;;;;;;;55428:42;55449:4;55455:2;55459:7;55468:1;55428:20;:42::i;:::-;53067:2411;;52963:2515;;;:::o;25338:191::-;25412:16;25431:6;;;;;;;;;;;25412:25;;25457:8;25448:6;;:17;;;;;;;;;;;;;;;;;;25512:8;25481:40;;25502:8;25481:40;;;;;;;;;;;;25401:128;25338:191;:::o;48081:104::-;48150:27;48160:2;48164:8;48150:27;;;;;;;;;;;;:9;:27::i;:::-;48081:104;;:::o;59175:716::-;59338:4;59384:2;59359:45;;;59405:19;:17;:19::i;:::-;59426:4;59432:7;59441:5;59359:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;59355:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59659:1;59642:6;:13;:18;59638:235;;;59688:40;;;;;;;;;;;;;;59638:235;59831:6;59825:13;59816:6;59812:2;59808:15;59801:38;59355:529;59528:54;;;59518:64;;;:6;:64;;;;59511:71;;;59175:716;;;;;;:::o;64607:106::-;64667:13;64698:7;64691:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64607:106;:::o;20354:723::-;20410:13;20640:1;20631:5;:10;20627:53;;;20658:10;;;;;;;;;;;;;;;;;;;;;20627:53;20690:12;20705:5;20690:20;;20721:14;20746:78;20761:1;20753:4;:9;20746:78;;20779:8;;;;;:::i;:::-;;;;20810:2;20802:10;;;;;:::i;:::-;;;20746:78;;;20834:19;20866:6;20856:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20834:39;;20884:154;20900:1;20891:5;:10;20884:154;;20928:1;20918:11;;;;;:::i;:::-;;;20995:2;20987:5;:10;;;;:::i;:::-;20974:2;:24;;;;:::i;:::-;20961:39;;20944:6;20951;20944:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;21024:2;21015:11;;;;;:::i;:::-;;;20884:154;;;21062:6;21048:21;;;;;20354:723;;;;:::o;60539:159::-;;;;;:::o;44711:148::-;44775:14;44836:5;44826:15;;44711:148;;;:::o;61357:158::-;;;;;:::o;48558:2236::-;48681:20;48704:13;;48681:36;;48746:1;48732:16;;:2;:16;;;48728:48;;;48757:19;;;;;;;;;;;;;;48728:48;48803:1;48791:8;:13;48787:44;;;48813:18;;;;;;;;;;;;;;48787:44;48844:61;48874:1;48878:2;48882:12;48896:8;48844:21;:61::i;:::-;49448:1;34764:2;49419:1;:25;;49418:31;49406:8;:44;49380:18;:22;49399:2;49380:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;35544:3;49849:29;49876:1;49864:8;:13;49849:14;:29::i;:::-;:56;;35281:3;49786:15;:41;;49744:21;49762:2;49744:17;:21::i;:::-;:84;:162;49693:17;:31;49711:12;49693:31;;;;;;;;;;;:213;;;;49923:20;49946:12;49923:35;;49973:11;50002:8;49987:12;:23;49973:37;;50049:1;50031:2;:14;;;:19;50027:635;;50071:313;50127:12;50123:2;50102:38;;50119:1;50102:38;;;;;;;;;;;;50168:69;50207:1;50211:2;50215:14;;;;;;50231:5;50168:30;:69::i;:::-;50163:174;;50273:40;;;;;;;;;;;;;;50163:174;50379:3;50364:12;:18;50071:313;;50465:12;50448:13;;:29;50444:43;;50479:8;;;50444:43;50027:635;;;50528:119;50584:14;;;;;;50580:2;50559:40;;50576:1;50559:40;;;;;;;;;;;;50642:3;50627:12;:18;50528:119;;50027:635;50692:12;50676:13;:28;;;;49157:1559;;50726:60;50755:1;50759:2;50763:12;50777:8;50726:20;:60::i;:::-;48670:2124;48558:2236;;;:::o;44946:142::-;45004:14;45065:5;45055:15;;44946:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:474::-;7555:6;7563;7612:2;7600:9;7591:7;7587:23;7583:32;7580:119;;;7618:79;;:::i;:::-;7580:119;7738:1;7763:53;7808:7;7799:6;7788:9;7784:22;7763:53;:::i;:::-;7753:63;;7709:117;7865:2;7891:53;7936:7;7927:6;7916:9;7912:22;7891:53;:::i;:::-;7881:63;;7836:118;7487:474;;;;;:::o;7967:179::-;8036:10;8057:46;8099:3;8091:6;8057:46;:::i;:::-;8135:4;8130:3;8126:14;8112:28;;7967:179;;;;:::o;8152:118::-;8239:24;8257:5;8239:24;:::i;:::-;8234:3;8227:37;8152:118;;:::o;8306:732::-;8425:3;8454:54;8502:5;8454:54;:::i;:::-;8524:86;8603:6;8598:3;8524:86;:::i;:::-;8517:93;;8634:56;8684:5;8634:56;:::i;:::-;8713:7;8744:1;8729:284;8754:6;8751:1;8748:13;8729:284;;;8830:6;8824:13;8857:63;8916:3;8901:13;8857:63;:::i;:::-;8850:70;;8943:60;8996:6;8943:60;:::i;:::-;8933:70;;8789:224;8776:1;8773;8769:9;8764:14;;8729:284;;;8733:14;9029:3;9022:10;;8430:608;;;8306:732;;;;:::o;9044:109::-;9125:21;9140:5;9125:21;:::i;:::-;9120:3;9113:34;9044:109;;:::o;9159:360::-;9245:3;9273:38;9305:5;9273:38;:::i;:::-;9327:70;9390:6;9385:3;9327:70;:::i;:::-;9320:77;;9406:52;9451:6;9446:3;9439:4;9432:5;9428:16;9406:52;:::i;:::-;9483:29;9505:6;9483:29;:::i;:::-;9478:3;9474:39;9467:46;;9249:270;9159:360;;;;:::o;9525:364::-;9613:3;9641:39;9674:5;9641:39;:::i;:::-;9696:71;9760:6;9755:3;9696:71;:::i;:::-;9689:78;;9776:52;9821:6;9816:3;9809:4;9802:5;9798:16;9776:52;:::i;:::-;9853:29;9875:6;9853:29;:::i;:::-;9848:3;9844:39;9837:46;;9617:272;9525:364;;;;:::o;9895:377::-;10001:3;10029:39;10062:5;10029:39;:::i;:::-;10084:89;10166:6;10161:3;10084:89;:::i;:::-;10077:96;;10182:52;10227:6;10222:3;10215:4;10208:5;10204:16;10182:52;:::i;:::-;10259:6;10254:3;10250:16;10243:23;;10005:267;9895:377;;;;:::o;10302:845::-;10405:3;10442:5;10436:12;10471:36;10497:9;10471:36;:::i;:::-;10523:89;10605:6;10600:3;10523:89;:::i;:::-;10516:96;;10643:1;10632:9;10628:17;10659:1;10654:137;;;;10805:1;10800:341;;;;10621:520;;10654:137;10738:4;10734:9;10723;10719:25;10714:3;10707:38;10774:6;10769:3;10765:16;10758:23;;10654:137;;10800:341;10867:38;10899:5;10867:38;:::i;:::-;10927:1;10941:154;10955:6;10952:1;10949:13;10941:154;;;11029:7;11023:14;11019:1;11014:3;11010:11;11003:35;11079:1;11070:7;11066:15;11055:26;;10977:4;10974:1;10970:12;10965:17;;10941:154;;;11124:6;11119:3;11115:16;11108:23;;10807:334;;10621:520;;10409:738;;10302:845;;;;:::o;11153:366::-;11295:3;11316:67;11380:2;11375:3;11316:67;:::i;:::-;11309:74;;11392:93;11481:3;11392:93;:::i;:::-;11510:2;11505:3;11501:12;11494:19;;11153:366;;;:::o;11525:::-;11667:3;11688:67;11752:2;11747:3;11688:67;:::i;:::-;11681:74;;11764:93;11853:3;11764:93;:::i;:::-;11882:2;11877:3;11873:12;11866:19;;11525:366;;;:::o;11897:::-;12039:3;12060:67;12124:2;12119:3;12060:67;:::i;:::-;12053:74;;12136:93;12225:3;12136:93;:::i;:::-;12254:2;12249:3;12245:12;12238:19;;11897:366;;;:::o;12269:::-;12411:3;12432:67;12496:2;12491:3;12432:67;:::i;:::-;12425:74;;12508:93;12597:3;12508:93;:::i;:::-;12626:2;12621:3;12617:12;12610:19;;12269:366;;;:::o;12641:::-;12783:3;12804:67;12868:2;12863:3;12804:67;:::i;:::-;12797:74;;12880:93;12969:3;12880:93;:::i;:::-;12998:2;12993:3;12989:12;12982:19;;12641:366;;;:::o;13013:::-;13155:3;13176:67;13240:2;13235:3;13176:67;:::i;:::-;13169:74;;13252:93;13341:3;13252:93;:::i;:::-;13370:2;13365:3;13361:12;13354:19;;13013:366;;;:::o;13385:::-;13527:3;13548:67;13612:2;13607:3;13548:67;:::i;:::-;13541:74;;13624:93;13713:3;13624:93;:::i;:::-;13742:2;13737:3;13733:12;13726:19;;13385:366;;;:::o;13757:::-;13899:3;13920:67;13984:2;13979:3;13920:67;:::i;:::-;13913:74;;13996:93;14085:3;13996:93;:::i;:::-;14114:2;14109:3;14105:12;14098:19;;13757:366;;;:::o;14129:398::-;14288:3;14309:83;14390:1;14385:3;14309:83;:::i;:::-;14302:90;;14401:93;14490:3;14401:93;:::i;:::-;14519:1;14514:3;14510:11;14503:18;;14129:398;;;:::o;14533:366::-;14675:3;14696:67;14760:2;14755:3;14696:67;:::i;:::-;14689:74;;14772:93;14861:3;14772:93;:::i;:::-;14890:2;14885:3;14881:12;14874:19;;14533:366;;;:::o;14905:::-;15047:3;15068:67;15132:2;15127:3;15068:67;:::i;:::-;15061:74;;15144:93;15233:3;15144:93;:::i;:::-;15262:2;15257:3;15253:12;15246:19;;14905:366;;;:::o;15277:::-;15419:3;15440:67;15504:2;15499:3;15440:67;:::i;:::-;15433:74;;15516:93;15605:3;15516:93;:::i;:::-;15634:2;15629:3;15625:12;15618:19;;15277:366;;;:::o;15649:::-;15791:3;15812:67;15876:2;15871:3;15812:67;:::i;:::-;15805:74;;15888:93;15977:3;15888:93;:::i;:::-;16006:2;16001:3;15997:12;15990:19;;15649:366;;;:::o;16021:::-;16163:3;16184:67;16248:2;16243:3;16184:67;:::i;:::-;16177:74;;16260:93;16349:3;16260:93;:::i;:::-;16378:2;16373:3;16369:12;16362:19;;16021:366;;;:::o;16393:108::-;16470:24;16488:5;16470:24;:::i;:::-;16465:3;16458:37;16393:108;;:::o;16507:118::-;16594:24;16612:5;16594:24;:::i;:::-;16589:3;16582:37;16507:118;;:::o;16631:589::-;16856:3;16878:95;16969:3;16960:6;16878:95;:::i;:::-;16871:102;;16990:95;17081:3;17072:6;16990:95;:::i;:::-;16983:102;;17102:92;17190:3;17181:6;17102:92;:::i;:::-;17095:99;;17211:3;17204:10;;16631:589;;;;;;:::o;17226:379::-;17410:3;17432:147;17575:3;17432:147;:::i;:::-;17425:154;;17596:3;17589:10;;17226:379;;;:::o;17611:222::-;17704:4;17742:2;17731:9;17727:18;17719:26;;17755:71;17823:1;17812:9;17808:17;17799:6;17755:71;:::i;:::-;17611:222;;;;:::o;17839:640::-;18034:4;18072:3;18061:9;18057:19;18049:27;;18086:71;18154:1;18143:9;18139:17;18130:6;18086:71;:::i;:::-;18167:72;18235:2;18224:9;18220:18;18211:6;18167:72;:::i;:::-;18249;18317:2;18306:9;18302:18;18293:6;18249:72;:::i;:::-;18368:9;18362:4;18358:20;18353:2;18342:9;18338:18;18331:48;18396:76;18467:4;18458:6;18396:76;:::i;:::-;18388:84;;17839:640;;;;;;;:::o;18485:373::-;18628:4;18666:2;18655:9;18651:18;18643:26;;18715:9;18709:4;18705:20;18701:1;18690:9;18686:17;18679:47;18743:108;18846:4;18837:6;18743:108;:::i;:::-;18735:116;;18485:373;;;;:::o;18864:210::-;18951:4;18989:2;18978:9;18974:18;18966:26;;19002:65;19064:1;19053:9;19049:17;19040:6;19002:65;:::i;:::-;18864:210;;;;:::o;19080:313::-;19193:4;19231:2;19220:9;19216:18;19208:26;;19280:9;19274:4;19270:20;19266:1;19255:9;19251:17;19244:47;19308:78;19381:4;19372:6;19308:78;:::i;:::-;19300:86;;19080:313;;;;:::o;19399:419::-;19565:4;19603:2;19592:9;19588:18;19580:26;;19652:9;19646:4;19642:20;19638:1;19627:9;19623:17;19616:47;19680:131;19806:4;19680:131;:::i;:::-;19672:139;;19399:419;;;:::o;19824:::-;19990:4;20028:2;20017:9;20013:18;20005:26;;20077:9;20071:4;20067:20;20063:1;20052:9;20048:17;20041:47;20105:131;20231:4;20105:131;:::i;:::-;20097:139;;19824:419;;;:::o;20249:::-;20415:4;20453:2;20442:9;20438:18;20430:26;;20502:9;20496:4;20492:20;20488:1;20477:9;20473:17;20466:47;20530:131;20656:4;20530:131;:::i;:::-;20522:139;;20249:419;;;:::o;20674:::-;20840:4;20878:2;20867:9;20863:18;20855:26;;20927:9;20921:4;20917:20;20913:1;20902:9;20898:17;20891:47;20955:131;21081:4;20955:131;:::i;:::-;20947:139;;20674:419;;;:::o;21099:::-;21265:4;21303:2;21292:9;21288:18;21280:26;;21352:9;21346:4;21342:20;21338:1;21327:9;21323:17;21316:47;21380:131;21506:4;21380:131;:::i;:::-;21372:139;;21099:419;;;:::o;21524:::-;21690:4;21728:2;21717:9;21713:18;21705:26;;21777:9;21771:4;21767:20;21763:1;21752:9;21748:17;21741:47;21805:131;21931:4;21805:131;:::i;:::-;21797:139;;21524:419;;;:::o;21949:::-;22115:4;22153:2;22142:9;22138:18;22130:26;;22202:9;22196:4;22192:20;22188:1;22177:9;22173:17;22166:47;22230:131;22356:4;22230:131;:::i;:::-;22222:139;;21949:419;;;:::o;22374:::-;22540:4;22578:2;22567:9;22563:18;22555:26;;22627:9;22621:4;22617:20;22613:1;22602:9;22598:17;22591:47;22655:131;22781:4;22655:131;:::i;:::-;22647:139;;22374:419;;;:::o;22799:::-;22965:4;23003:2;22992:9;22988:18;22980:26;;23052:9;23046:4;23042:20;23038:1;23027:9;23023:17;23016:47;23080:131;23206:4;23080:131;:::i;:::-;23072:139;;22799:419;;;:::o;23224:::-;23390:4;23428:2;23417:9;23413:18;23405:26;;23477:9;23471:4;23467:20;23463:1;23452:9;23448:17;23441:47;23505:131;23631:4;23505:131;:::i;:::-;23497:139;;23224:419;;;:::o;23649:::-;23815:4;23853:2;23842:9;23838:18;23830:26;;23902:9;23896:4;23892:20;23888:1;23877:9;23873:17;23866:47;23930:131;24056:4;23930:131;:::i;:::-;23922:139;;23649:419;;;:::o;24074:::-;24240:4;24278:2;24267:9;24263:18;24255:26;;24327:9;24321:4;24317:20;24313:1;24302:9;24298:17;24291:47;24355:131;24481:4;24355:131;:::i;:::-;24347:139;;24074:419;;;:::o;24499:::-;24665:4;24703:2;24692:9;24688:18;24680:26;;24752:9;24746:4;24742:20;24738:1;24727:9;24723:17;24716:47;24780:131;24906:4;24780:131;:::i;:::-;24772:139;;24499:419;;;:::o;24924:222::-;25017:4;25055:2;25044:9;25040:18;25032:26;;25068:71;25136:1;25125:9;25121:17;25112:6;25068:71;:::i;:::-;24924:222;;;;:::o;25152:129::-;25186:6;25213:20;;:::i;:::-;25203:30;;25242:33;25270:4;25262:6;25242:33;:::i;:::-;25152:129;;;:::o;25287:75::-;25320:6;25353:2;25347:9;25337:19;;25287:75;:::o;25368:307::-;25429:4;25519:18;25511:6;25508:30;25505:56;;;25541:18;;:::i;:::-;25505:56;25579:29;25601:6;25579:29;:::i;:::-;25571:37;;25663:4;25657;25653:15;25645:23;;25368:307;;;:::o;25681:308::-;25743:4;25833:18;25825:6;25822:30;25819:56;;;25855:18;;:::i;:::-;25819:56;25893:29;25915:6;25893:29;:::i;:::-;25885:37;;25977:4;25971;25967:15;25959:23;;25681:308;;;:::o;25995:132::-;26062:4;26085:3;26077:11;;26115:4;26110:3;26106:14;26098:22;;25995:132;;;:::o;26133:141::-;26182:4;26205:3;26197:11;;26228:3;26225:1;26218:14;26262:4;26259:1;26249:18;26241:26;;26133:141;;;:::o;26280:114::-;26347:6;26381:5;26375:12;26365:22;;26280:114;;;:::o;26400:98::-;26451:6;26485:5;26479:12;26469:22;;26400:98;;;:::o;26504:99::-;26556:6;26590:5;26584:12;26574:22;;26504:99;;;:::o;26609:113::-;26679:4;26711;26706:3;26702:14;26694:22;;26609:113;;;:::o;26728:184::-;26827:11;26861:6;26856:3;26849:19;26901:4;26896:3;26892:14;26877:29;;26728:184;;;;:::o;26918:168::-;27001:11;27035:6;27030:3;27023:19;27075:4;27070:3;27066:14;27051:29;;26918:168;;;;:::o;27092:147::-;27193:11;27230:3;27215:18;;27092:147;;;;:::o;27245:169::-;27329:11;27363:6;27358:3;27351:19;27403:4;27398:3;27394:14;27379:29;;27245:169;;;;:::o;27420:148::-;27522:11;27559:3;27544:18;;27420:148;;;;:::o;27574:305::-;27614:3;27633:20;27651:1;27633:20;:::i;:::-;27628:25;;27667:20;27685:1;27667:20;:::i;:::-;27662:25;;27821:1;27753:66;27749:74;27746:1;27743:81;27740:107;;;27827:18;;:::i;:::-;27740:107;27871:1;27868;27864:9;27857:16;;27574:305;;;;:::o;27885:185::-;27925:1;27942:20;27960:1;27942:20;:::i;:::-;27937:25;;27976:20;27994:1;27976:20;:::i;:::-;27971:25;;28015:1;28005:35;;28020:18;;:::i;:::-;28005:35;28062:1;28059;28055:9;28050:14;;27885:185;;;;:::o;28076:348::-;28116:7;28139:20;28157:1;28139:20;:::i;:::-;28134:25;;28173:20;28191:1;28173:20;:::i;:::-;28168:25;;28361:1;28293:66;28289:74;28286:1;28283:81;28278:1;28271:9;28264:17;28260:105;28257:131;;;28368:18;;:::i;:::-;28257:131;28416:1;28413;28409:9;28398:20;;28076:348;;;;:::o;28430:191::-;28470:4;28490:20;28508:1;28490:20;:::i;:::-;28485:25;;28524:20;28542:1;28524:20;:::i;:::-;28519:25;;28563:1;28560;28557:8;28554:34;;;28568:18;;:::i;:::-;28554:34;28613:1;28610;28606:9;28598:17;;28430:191;;;;:::o;28627:96::-;28664:7;28693:24;28711:5;28693:24;:::i;:::-;28682:35;;28627:96;;;:::o;28729:90::-;28763:7;28806:5;28799:13;28792:21;28781:32;;28729:90;;;:::o;28825:149::-;28861:7;28901:66;28894:5;28890:78;28879:89;;28825:149;;;:::o;28980:126::-;29017:7;29057:42;29050:5;29046:54;29035:65;;28980:126;;;:::o;29112:77::-;29149:7;29178:5;29167:16;;29112:77;;;:::o;29195:154::-;29279:6;29274:3;29269;29256:30;29341:1;29332:6;29327:3;29323:16;29316:27;29195:154;;;:::o;29355:307::-;29423:1;29433:113;29447:6;29444:1;29441:13;29433:113;;;29532:1;29527:3;29523:11;29517:18;29513:1;29508:3;29504:11;29497:39;29469:2;29466:1;29462:10;29457:15;;29433:113;;;29564:6;29561:1;29558:13;29555:101;;;29644:1;29635:6;29630:3;29626:16;29619:27;29555:101;29404:258;29355:307;;;:::o;29668:320::-;29712:6;29749:1;29743:4;29739:12;29729:22;;29796:1;29790:4;29786:12;29817:18;29807:81;;29873:4;29865:6;29861:17;29851:27;;29807:81;29935:2;29927:6;29924:14;29904:18;29901:38;29898:84;;;29954:18;;:::i;:::-;29898:84;29719:269;29668:320;;;:::o;29994:281::-;30077:27;30099:4;30077:27;:::i;:::-;30069:6;30065:40;30207:6;30195:10;30192:22;30171:18;30159:10;30156:34;30153:62;30150:88;;;30218:18;;:::i;:::-;30150:88;30258:10;30254:2;30247:22;30037:238;29994:281;;:::o;30281:233::-;30320:3;30343:24;30361:5;30343:24;:::i;:::-;30334:33;;30389:66;30382:5;30379:77;30376:103;;;30459:18;;:::i;:::-;30376:103;30506:1;30499:5;30495:13;30488:20;;30281:233;;;:::o;30520:176::-;30552:1;30569:20;30587:1;30569:20;:::i;:::-;30564:25;;30603:20;30621:1;30603:20;:::i;:::-;30598:25;;30642:1;30632:35;;30647:18;;:::i;:::-;30632:35;30688:1;30685;30681:9;30676:14;;30520:176;;;;:::o;30702:180::-;30750:77;30747:1;30740:88;30847:4;30844:1;30837:15;30871:4;30868:1;30861:15;30888:180;30936:77;30933:1;30926:88;31033:4;31030:1;31023:15;31057:4;31054:1;31047:15;31074:180;31122:77;31119:1;31112:88;31219:4;31216:1;31209:15;31243:4;31240:1;31233:15;31260:180;31308:77;31305:1;31298:88;31405:4;31402:1;31395:15;31429:4;31426:1;31419:15;31446:180;31494:77;31491:1;31484:88;31591:4;31588:1;31581:15;31615:4;31612:1;31605:15;31632:117;31741:1;31738;31731:12;31755:117;31864:1;31861;31854:12;31878:117;31987:1;31984;31977:12;32001:117;32110:1;32107;32100:12;32124:102;32165:6;32216:2;32212:7;32207:2;32200:5;32196:14;32192:28;32182:38;;32124:102;;;:::o;32232:224::-;32372:34;32368:1;32360:6;32356:14;32349:58;32441:7;32436:2;32428:6;32424:15;32417:32;32232:224;:::o;32462:178::-;32602:30;32598:1;32590:6;32586:14;32579:54;32462:178;:::o;32646:220::-;32786:34;32782:1;32774:6;32770:14;32763:58;32855:3;32850:2;32842:6;32838:15;32831:28;32646:220;:::o;32872:225::-;33012:34;33008:1;33000:6;32996:14;32989:58;33081:8;33076:2;33068:6;33064:15;33057:33;32872:225;:::o;33103:170::-;33243:22;33239:1;33231:6;33227:14;33220:46;33103:170;:::o;33279:173::-;33419:25;33415:1;33407:6;33403:14;33396:49;33279:173;:::o;33458:::-;33598:25;33594:1;33586:6;33582:14;33575:49;33458:173;:::o;33637:182::-;33777:34;33773:1;33765:6;33761:14;33754:58;33637:182;:::o;33825:114::-;;:::o;33945:170::-;34085:22;34081:1;34073:6;34069:14;34062:46;33945:170;:::o;34121:169::-;34261:21;34257:1;34249:6;34245:14;34238:45;34121:169;:::o;34296:181::-;34436:33;34432:1;34424:6;34420:14;34413:57;34296:181;:::o;34483:235::-;34623:34;34619:1;34611:6;34607:14;34600:58;34692:18;34687:2;34679:6;34675:15;34668:43;34483:235;:::o;34724:170::-;34864:22;34860:1;34852:6;34848:14;34841:46;34724:170;:::o;34900:122::-;34973:24;34991:5;34973:24;:::i;:::-;34966:5;34963:35;34953:63;;35012:1;35009;35002:12;34953:63;34900:122;:::o;35028:116::-;35098:21;35113:5;35098:21;:::i;:::-;35091:5;35088:32;35078:60;;35134:1;35131;35124:12;35078:60;35028:116;:::o;35150:120::-;35222:23;35239:5;35222:23;:::i;:::-;35215:5;35212:34;35202:62;;35260:1;35257;35250:12;35202:62;35150:120;:::o;35276:122::-;35349:24;35367:5;35349:24;:::i;:::-;35342:5;35339:35;35329:63;;35388:1;35385;35378:12;35329:63;35276:122;:::o

Swarm Source

ipfs://7c6796eb5204a59da2e4ecb1e058cb8cb42c99aef6e2269ac261752056f8dd35
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.