ETH Price: $2,638.41 (+0.26%)

Token

Cryptovania (BLOOD)

Overview

Max Total Supply

1,774 BLOOD

Holders

585

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BLOOD
0x3de44134ac73893c63fd5bbb0e912ef10a586cc6
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
CryptovaniaErc721

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at optimistic.etherscan.io on 2022-05-31
*/

// Sources flattened with hardhat v2.8.4 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT
// 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/[email protected]


// 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/[email protected]

// 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/token/ERC721/extensions/[email protected]

// 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/[email protected]

// 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/utils/[email protected]

// 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/utils/[email protected]

// 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/introspection/[email protected]

// 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/[email protected]

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

pragma solidity ^0.8.0;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // 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;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), 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 {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _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 {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a 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 _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


// File @openzeppelin/contracts/access/[email protected]

// 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 @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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

pragma solidity ^0.8.0;


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


// File Contracts/IBloodRune.sol

pragma solidity ^0.8.0;

interface IBloodRune {
    function redeemBloodRune(uint256 tokenId) external;
    function balanceOf(address owner) external view returns (uint256 balance);
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
    function tokenByIndex(uint256 index) external view returns (uint256);
}


// File hardhat/[email protected]

pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
	}

	function logUint(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
	}

	function log(uint p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
	}

	function log(uint p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
	}

	function log(uint p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
	}

	function log(string memory p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
	}

	function log(uint p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
	}

	function log(uint p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
	}

	function log(uint p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
	}

	function log(uint p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
	}

	function log(uint p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
	}

	function log(uint p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
	}

	function log(uint p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
	}

	function log(uint p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
	}

	function log(uint p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
	}

	function log(uint p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
	}

	function log(uint p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
	}

	function log(bool p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
	}

	function log(bool p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
	}

	function log(bool p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
	}

	function log(address p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
	}

	function log(address p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
	}

	function log(address p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}


// File Contracts/Cryptovania.sol



// _________                        __                             .__
// \_   ___ \_______ ___.__._______/  |_  _______  _______    ____ |__|____
// /    \  \/\_  __ <   |  |\____ \   __\/  _ \  \/ /\__  \  /    \|  \__  \
// \     \____|  | \/\___  ||  |_> >  | (  <_> )   /  / __ \|   |  \  |/ __ \_
// \______  /|__|   / ____||   __/|__|  \____/ \_/  (____  /___|  /__(____  /
// \/        \/     |__|                          \/     \/        \/


pragma solidity ^0.8.9;







contract CryptovaniaErc721 is ERC721, ERC721Enumerable, Ownable {
    uint public constant maxTokenPurchase = 10;
    uint256 public MAX_TOKENS = 10000;
    uint256 public totalMinted = 0;
    bool public saleIsActive = false;

    string private vampireURI = "";
    string private humanURI = "";

    mapping(uint256 => bool) tokenIdIsVampire;
    mapping(uint256 => string) tokenIdToStoryURI;

    uint256 public numberHumans = 0;
    uint256 public numberVampires = 0;

    uint256 private _price = 15000000000000000; // .05 ETH
    uint256 private _reserve = 150; // Reserve for Core Team + Community Treasury

    address public bloodRuneAddress;

    event HumanKilled(uint256 tokenId);
    event HumanBecameVampire(uint256 tokenId);

    constructor() ERC721("Cryptovania", "BLOOD") {}

    modifier onlyEOA() {
        // Used to stop deposits from contracts (avoid accidentally lost tokens)
        require(!Address.isContract(msg.sender), "Account not EOA");
        _;
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function setPrice(uint256 newPrice) public onlyOwner {
        _price = newPrice;
    }

    function setBloodRuneContract(address addr) public onlyOwner {
        bloodRuneAddress = addr;
    }

    function reserveTokens() public onlyOwner {
        console.log("hello reserve");
        require(totalMinted + _reserve < MAX_TOKENS, "We have already hit the reserve limit");
        uint i;
        for (i = 0; i < 150; i++) {
            uint mintIndex = totalMinted;
            _safeMint(msg.sender, mintIndex);
            numberHumans++;
            totalMinted++;
        }
    }

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function mint(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint Tokens");
        require(numberOfTokens <= maxTokenPurchase, "Exceeded max token purchase");
        require(totalMinted + numberOfTokens <= MAX_TOKENS, "Purchase would exceed max supply of tokens");
        require(_price * numberOfTokens <= msg.value, "Ether value sent is not correct");

        for (uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalMinted;
            if (totalMinted < MAX_TOKENS) {
                _safeMint(msg.sender, mintIndex);
                numberHumans++;
                totalMinted++;
            }
        }
    }

    function mintWithBloodRune(uint numberOfTokens) public onlyEOA {
        require(saleIsActive, "Sale must be active to mint tokens");
        require(numberOfTokens <= maxTokenPurchase, "Exceeded max token purchase");
        require(totalMinted + numberOfTokens <= MAX_TOKENS, "Purchase would exceed max supply of tokens");

        // Require the owner has enough blood runes
        IBloodRune bloodRuneContract = IBloodRune(bloodRuneAddress);
        require(numberOfTokens <= bloodRuneContract.balanceOf(_msgSender()), "Not enough Blood Runes");

        for (uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalMinted;
            if (totalMinted < MAX_TOKENS) {
                uint bloodRuneId = bloodRuneContract.tokenOfOwnerByIndex(_msgSender(), 0);
                bloodRuneContract.redeemBloodRune(bloodRuneId);
                _safeMint(msg.sender, mintIndex);
                numberHumans++;
                totalMinted++;
            }
        }
    }

    function setHumanURI(string memory newHumanURI) public onlyOwner {
        humanURI = newHumanURI;
    }

    function setVampireURI(string memory newVampireURI) public onlyOwner {
        vampireURI = newVampireURI;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        if (tokenIdIsVampire[tokenId]) {
            return string(abi.encodePacked(vampireURI, Strings.toString(tokenId)));
        } else {
            return string(abi.encodePacked(humanURI, Strings.toString(tokenId)));
        }
    }

    function _didSurviveDracula(uint256 tokenId) private view returns (bool) {
        uint256 randomNum = uint256(
            keccak256(
                abi.encode(
                    tx.gasprice,
                    block.number,
                    block.timestamp,
                    block.difficulty,
                    blockhash(block.number - 1),
                    address(this),
                    tokenId
                )
            )
        );

        return randomNum % 10 == 1;
    }

    function _visitDracula(uint256 tokenId) private {
        bool survived = _didSurviveDracula(tokenId);
        if (survived) {
            tokenIdIsVampire[tokenId] = true;
            numberVampires++;
            emit HumanBecameVampire(tokenId);
        } else {
            _burn(tokenId);
            emit HumanKilled(tokenId);
        }

        numberHumans--;
    }

    function visitDracula(uint256[] calldata tokenIds) public onlyEOA {
        for (uint i = 0; i < tokenIds.length; i++) {
            require(ownerOf(tokenIds[i]) == _msgSender(), "You must own an NFT to visit Dracula");
            require(!tokenIdIsVampire[tokenIds[i]], "You cannot visit dracula if you are already a vampire");
        }

        for (uint i = 0; i < tokenIds.length; i++) {
            _visitDracula(tokenIds[i]);
        }
    }

    function isVampire(uint256 tokenId) public view returns (bool) {
        return tokenIdIsVampire[tokenId];
    }

    function storyURI(uint256 tokenId) public view returns (string memory) {
        return tokenIdToStoryURI[tokenId];
    }

    function setStoryURI(uint256 tokenId, string memory newStoryURI) public {
        require(ownerOf(tokenId) == _msgSender(), "You must own this NFT to visit set the story");
        tokenIdToStoryURI[tokenId] = newStoryURI;
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"HumanBecameVampire","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"HumanKilled","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":"MAX_TOKENS","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":"bloodRuneAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isVampire","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintWithBloodRune","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberHumans","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberVampires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setBloodRuneContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newHumanURI","type":"string"}],"name":"setHumanURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newStoryURI","type":"string"}],"name":"setStoryURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newVampireURI","type":"string"}],"name":"setVampireURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"storyURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"visitDracula","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

612710600b556000600c819055600d805460ff1916905560a0604081905260808290526200003191600e91906200015a565b506040805160208101918290526000908190526200005291600f916200015a565b506000601255600060135566354a6ba7a1800060145560966015553480156200007a57600080fd5b50604080518082018252600b81526a43727970746f76616e696160a81b602080830191825283518085019094526005845264109313d3d160da1b908401528151919291620000cb916000916200015a565b508051620000e19060019060208401906200015a565b505050620000fe620000f86200010460201b60201c565b62000108565b6200023d565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001689062000200565b90600052602060002090601f0160209004810192826200018c5760008555620001d7565b82601f10620001a757805160ff1916838001178555620001d7565b82800160010185558215620001d7579182015b82811115620001d7578251825591602001919060010190620001ba565b50620001e5929150620001e9565b5090565b5b80821115620001e55760008155600101620001ea565b600181811c908216806200021557607f821691505b602082108114156200023757634e487b7160e01b600052602260045260246000fd5b50919050565b6136fb806200024d6000396000f3fe6080604052600436106102a05760003560e01c806387c98b1f1161016e578063b442e9d7116100cb578063e985e9c51161007f578063f1e9b0a511610064578063f1e9b0a514610727578063f2fde38b1461073d578063f47c84c51461075d57600080fd5b8063e985e9c5146106c4578063eb8d24441461070d57600080fd5b8063c02b90ee116100b0578063c02b90ee14610664578063c87b56dd14610684578063e29af007146106a457600080fd5b8063b442e9d714610614578063b88d4fde1461064457600080fd5b806395d89b4111610122578063a1f25d9111610107578063a1f25d91146105be578063a22cb465146105de578063a2309ff8146105fe57600080fd5b806395d89b4114610596578063a0712d68146105ab57600080fd5b80638d564fe2116101535780638d564fe2146105425780638da5cb5b1461055857806391b7f5ed1461057657600080fd5b806387c98b1f146105025780638d37fd2d1461052257600080fd5b806334918dfd1161021c5780636352211e116101d057806370a08231116101b557806370a08231146104ad578063715018a6146104cd57806383b55791146104e257600080fd5b80636352211e1461046d5780636494f8931461048d57600080fd5b80633ccfd60b116102015780633ccfd60b1461041857806342842e0e1461042d5780634f6ccce71461044d57600080fd5b806334918dfd146103e35780633b997958146103f857600080fd5b806309aa3dcf1161027357806323b872dd1161025857806323b872dd1461038e57806327ac36c4146103ae5780632f745c59146103c357600080fd5b806309aa3dcf1461035657806318160ddd1461037957600080fd5b806301ffc9a7146102a557806306fdde03146102da578063081812fc146102fc578063095ea7b314610334575b600080fd5b3480156102b157600080fd5b506102c56102c0366004612f2a565b610773565b60405190151581526020015b60405180910390f35b3480156102e657600080fd5b506102ef610784565b6040516102d19190612fc4565b34801561030857600080fd5b5061031c610317366004612fd7565b610816565b6040516001600160a01b0390911681526020016102d1565b34801561034057600080fd5b5061035461034f366004613007565b6108c1565b005b34801561036257600080fd5b5061036b600a81565b6040519081526020016102d1565b34801561038557600080fd5b5060085461036b565b34801561039a57600080fd5b506103546103a9366004613031565b6109f3565b3480156103ba57600080fd5b50610354610a7a565b3480156103cf57600080fd5b5061036b6103de366004613007565b610bf2565b3480156103ef57600080fd5b50610354610c9a565b34801561040457600080fd5b50610354610413366004613150565b610d26565b34801561042457600080fd5b50610354610d97565b34801561043957600080fd5b50610354610448366004613031565b610e20565b34801561045957600080fd5b5061036b610468366004612fd7565b610e3b565b34801561047957600080fd5b5061031c610488366004612fd7565b610edf565b34801561049957600080fd5b506103546104a8366004613185565b610f6a565b3480156104b957600080fd5b5061036b6104c83660046131cc565b61100f565b3480156104d957600080fd5b506103546110a9565b3480156104ee57600080fd5b506103546104fd3660046131e7565b61110f565b34801561050e57600080fd5b5061035461051d3660046131cc565b6112fd565b34801561052e57600080fd5b5061035461053d366004612fd7565b611391565b34801561054e57600080fd5b5061036b60125481565b34801561056457600080fd5b50600a546001600160a01b031661031c565b34801561058257600080fd5b50610354610591366004612fd7565b61179e565b3480156105a257600080fd5b506102ef6117fd565b6103546105b9366004612fd7565b61180c565b3480156105ca57600080fd5b506103546105d9366004613150565b611a17565b3480156105ea57600080fd5b506103546105f936600461325c565b611a84565b34801561060a57600080fd5b5061036b600c5481565b34801561062057600080fd5b506102c561062f366004612fd7565b60009081526010602052604090205460ff1690565b34801561065057600080fd5b5061035461065f366004613298565b611a8f565b34801561067057600080fd5b5060165461031c906001600160a01b031681565b34801561069057600080fd5b506102ef61069f366004612fd7565b611b1d565b3480156106b057600080fd5b506102ef6106bf366004612fd7565b611c03565b3480156106d057600080fd5b506102c56106df366004613314565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561071957600080fd5b50600d546102c59060ff1681565b34801561073357600080fd5b5061036b60135481565b34801561074957600080fd5b506103546107583660046131cc565b611ca5565b34801561076957600080fd5b5061036b600b5481565b600061077e82611d84565b92915050565b60606000805461079390613347565b80601f01602080910402602001604051908101604052809291908181526020018280546107bf90613347565b801561080c5780601f106107e15761010080835404028352916020019161080c565b820191906000526020600020905b8154815290600101906020018083116107ef57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108a55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108cc82610edf565b9050806001600160a01b0316836001600160a01b031614156109565760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161089c565b336001600160a01b0382161480610972575061097281336106df565b6109e45760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161089c565b6109ee8383611dda565b505050565b6109fd3382611e60565b610a6f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161089c565b6109ee838383611f68565b600a546001600160a01b03163314610ad45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b610b126040518060400160405280600d81526020017f68656c6c6f207265736572766500000000000000000000000000000000000000815250612158565b600b54601554600c54610b2591906133ca565b10610b985760405162461bcd60e51b815260206004820152602560248201527f5765206861766520616c7265616479206869742074686520726573657276652060448201527f6c696d6974000000000000000000000000000000000000000000000000000000606482015260840161089c565b60005b6096811015610bef57600c54610bb133826121e7565b60128054906000610bc1836133e2565b9091555050600c8054906000610bd6836133e2565b9190505550508080610be7906133e2565b915050610b9b565b50565b6000610bfd8361100f565b8210610c715760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161089c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610cf45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b600a546001600160a01b03163314610d805760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b8051610d9390600e906020840190612e63565b5050565b600a546001600160a01b03163314610df15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b6040514790339082156108fc029083906000818181858888f19350505050158015610d93573d6000803e3d6000fd5b6109ee83838360405180602001604052806000815250611a8f565b6000610e4660085490565b8210610eba5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161089c565b60088281548110610ecd57610ecd61341b565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061077e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161089c565b33610f7483610edf565b6001600160a01b031614610ff05760405162461bcd60e51b815260206004820152602c60248201527f596f75206d757374206f776e2074686973204e465420746f207669736974207360448201527f6574207468652073746f72790000000000000000000000000000000000000000606482015260840161089c565b600082815260116020908152604090912082516109ee92840190612e63565b60006001600160a01b03821661108d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161089c565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146111035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b61110d6000612201565b565b333b1561115e5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f410000000000000000000000000000000000604482015260640161089c565b60005b818110156112be573361118b84848481811061117f5761117f61341b565b90506020020135610edf565b6001600160a01b0316146112065760405162461bcd60e51b8152602060048201526024808201527f596f75206d757374206f776e20616e204e465420746f2076697369742044726160448201527f63756c6100000000000000000000000000000000000000000000000000000000606482015260840161089c565b6010600084848481811061121c5761121c61341b565b602090810292909201358352508101919091526040016000205460ff16156112ac5760405162461bcd60e51b815260206004820152603560248201527f596f752063616e6e6f742076697369742064726163756c6120696620796f752060448201527f61726520616c726561647920612076616d706972650000000000000000000000606482015260840161089c565b806112b6816133e2565b915050611161565b5060005b818110156109ee576112eb8383838181106112df576112df61341b565b9050602002013561226b565b806112f5816133e2565b9150506112c2565b600a546001600160a01b031633146113575760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b601680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b333b156113e05760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f410000000000000000000000000000000000604482015260640161089c565b600d5460ff166114585760405162461bcd60e51b815260206004820152602260248201527f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560448201527f6e73000000000000000000000000000000000000000000000000000000000000606482015260840161089c565b600a8111156114a95760405162461bcd60e51b815260206004820152601b60248201527f4578636565646564206d617820746f6b656e2070757263686173650000000000604482015260640161089c565b600b5481600c546114ba91906133ca565b111561152e5760405162461bcd60e51b815260206004820152602a60248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201527f206f6620746f6b656e7300000000000000000000000000000000000000000000606482015260840161089c565b6016546001600160a01b0316806370a08231336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561159857600080fd5b505afa1580156115ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d0919061344a565b82111561161f5760405162461bcd60e51b815260206004820152601660248201527f4e6f7420656e6f75676820426c6f6f642052756e657300000000000000000000604482015260640161089c565b60005b828110156109ee57600c54600b5481101561178b5760006001600160a01b038416632f745c59336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526000602482015260440160206040518083038186803b1580156116a757600080fd5b505afa1580156116bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116df919061344a565b6040517fdec9791d000000000000000000000000000000000000000000000000000000008152600481018290529091506001600160a01b0385169063dec9791d90602401600060405180830381600087803b15801561173d57600080fd5b505af1158015611751573d6000803e3d6000fd5b5050505061175f33836121e7565b6012805490600061176f836133e2565b9091555050600c8054906000611784836133e2565b9190505550505b5080611796816133e2565b915050611622565b600a546001600160a01b031633146117f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b601455565b60606001805461079390613347565b600d5460ff166118845760405162461bcd60e51b815260206004820152602260248201527f53616c65206d7573742062652061637469766520746f206d696e7420546f6b6560448201527f6e73000000000000000000000000000000000000000000000000000000000000606482015260840161089c565b600a8111156118d55760405162461bcd60e51b815260206004820152601b60248201527f4578636565646564206d617820746f6b656e2070757263686173650000000000604482015260640161089c565b600b5481600c546118e691906133ca565b111561195a5760405162461bcd60e51b815260206004820152602a60248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201527f206f6620746f6b656e7300000000000000000000000000000000000000000000606482015260840161089c565b34816014546119699190613463565b11156119b75760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161089c565b60005b81811015610d9357600c54600b54811015611a04576119d933826121e7565b601280549060006119e9836133e2565b9091555050600c80549060006119fe836133e2565b91905055505b5080611a0f816133e2565b9150506119ba565b600a546001600160a01b03163314611a715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b8051610d9390600f906020840190612e63565b610d93338383612356565b611a993383611e60565b611b0b5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161089c565b611b1784848484612443565b50505050565b6000818152600260205260409020546060906001600160a01b0316611baa5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161089c565b60008281526010602052604090205460ff1615611bf357600e611bcc836124cc565b604051602001611bdd9291906134bc565b6040516020818303038152906040529050919050565b600f611bcc836124cc565b919050565b6000818152601160205260409020805460609190611c2090613347565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4c90613347565b8015611c995780601f10611c6e57610100808354040283529160200191611c99565b820191906000526020600020905b815481529060010190602001808311611c7c57829003601f168201915b50505050509050919050565b600a546001600160a01b03163314611cff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b6001600160a01b038116611d7b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161089c565b610bef81612201565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061077e575061077e826125fe565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190611e2782610edf565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611eea5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161089c565b6000611ef583610edf565b9050806001600160a01b0316846001600160a01b03161480611f3c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80611f605750836001600160a01b0316611f5584610816565b6001600160a01b0316145b949350505050565b826001600160a01b0316611f7b82610edf565b6001600160a01b031614611ff75760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161089c565b6001600160a01b0382166120725760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161089c565b61207d8383836126e1565b612088600082611dda565b6001600160a01b03831660009081526003602052604081208054600192906120b190849061359a565b90915550506001600160a01b03821660009081526003602052604081208054600192906120df9084906133ca565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610bef8160405160240161216c9190612fc4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f41304fac000000000000000000000000000000000000000000000000000000001790526126ec565b610d9382826040518060200160405280600081525061270d565b600a80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061227682612796565b9050801561230057600082815260106020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560138054916122c3836133e2565b90915550506040518281527fa55912b8afb41b5d1308cde6e066bb200b452051ef06fa3ecdb7943fd4259e069060200160405180910390a161233d565b6123098261282b565b6040518281527ffe8c49819c4d3101316cbcba4871527a391659acc75db7f84f47b7cb00a2de459060200160405180910390a15b6012805490600061234d836135b1565b91905055505050565b816001600160a01b0316836001600160a01b031614156123b85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161089c565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61244e848484611f68565b61245a848484846128ea565b611b175760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161089c565b60608161250c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156125365780612520816133e2565b915061252f9050600a83613615565b9150612510565b60008167ffffffffffffffff8111156125515761255161306d565b6040519080825280601f01601f19166020018201604052801561257b576020820181803683370190505b5090505b8415611f605761259060018361359a565b915061259d600a86613629565b6125a89060306133ca565b60f81b8183815181106125bd576125bd61341b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506125f7600a86613615565b945061257f565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061269157507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061077e57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461077e565b6109ee838383612ab5565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b6127178383612b6d565b61272460008484846128ea565b6109ee5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161089c565b6000803a4342446127a860018461359a565b604080516020810196909652850193909352606084019190915260808301524060a08201523060c082015260e0810184905261010001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209050612821600a82613629565b6001149392505050565b600061283682610edf565b9050612844816000846126e1565b61284f600083611dda565b6001600160a01b038116600090815260036020526040812080546001929061287890849061359a565b909155505060008281526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160a01b0384163b15612aaa576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a029061294790339089908890889060040161363d565b602060405180830381600087803b15801561296157600080fd5b505af19250505080156129af575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526129ac91810190613679565b60015b612a5f573d8080156129dd576040519150601f19603f3d011682016040523d82523d6000602084013e6129e2565b606091505b508051612a575760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161089c565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611f60565b506001949350505050565b6001600160a01b038316612b1057612b0b81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b33565b816001600160a01b0316836001600160a01b031614612b3357612b338382612cd3565b6001600160a01b038216612b4a576109ee81612d70565b826001600160a01b0316826001600160a01b0316146109ee576109ee8282612e1f565b6001600160a01b038216612bc35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161089c565b6000818152600260205260409020546001600160a01b031615612c285760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161089c565b612c34600083836126e1565b6001600160a01b0382166000908152600360205260408120805460019290612c5d9084906133ca565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612ce08461100f565b612cea919061359a565b600083815260076020526040902054909150808214612d3d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612d829060019061359a565b60008381526009602052604081205460088054939450909284908110612daa57612daa61341b565b906000526020600020015490508060088381548110612dcb57612dcb61341b565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612e0357612e03613696565b6001900381819060005260206000200160009055905550505050565b6000612e2a8361100f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612e6f90613347565b90600052602060002090601f016020900481019282612e915760008555612ed7565b82601f10612eaa57805160ff1916838001178555612ed7565b82800160010185558215612ed7579182015b82811115612ed7578251825591602001919060010190612ebc565b50612ee3929150612ee7565b5090565b5b80821115612ee35760008155600101612ee8565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610bef57600080fd5b600060208284031215612f3c57600080fd5b8135612f4781612efc565b9392505050565b60005b83811015612f69578181015183820152602001612f51565b83811115611b175750506000910152565b60008151808452612f92816020860160208601612f4e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612f476020830184612f7a565b600060208284031215612fe957600080fd5b5035919050565b80356001600160a01b0381168114611bfe57600080fd5b6000806040838503121561301a57600080fd5b61302383612ff0565b946020939093013593505050565b60008060006060848603121561304657600080fd5b61304f84612ff0565b925061305d60208501612ff0565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff808411156130b7576130b761306d565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156130fd576130fd61306d565b8160405280935085815286868601111561311657600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261314157600080fd5b612f478383356020850161309c565b60006020828403121561316257600080fd5b813567ffffffffffffffff81111561317957600080fd5b611f6084828501613130565b6000806040838503121561319857600080fd5b82359150602083013567ffffffffffffffff8111156131b657600080fd5b6131c285828601613130565b9150509250929050565b6000602082840312156131de57600080fd5b612f4782612ff0565b600080602083850312156131fa57600080fd5b823567ffffffffffffffff8082111561321257600080fd5b818501915085601f83011261322657600080fd5b81358181111561323557600080fd5b8660208260051b850101111561324a57600080fd5b60209290920196919550909350505050565b6000806040838503121561326f57600080fd5b61327883612ff0565b91506020830135801515811461328d57600080fd5b809150509250929050565b600080600080608085870312156132ae57600080fd5b6132b785612ff0565b93506132c560208601612ff0565b925060408501359150606085013567ffffffffffffffff8111156132e857600080fd5b8501601f810187136132f957600080fd5b6133088782356020840161309c565b91505092959194509250565b6000806040838503121561332757600080fd5b61333083612ff0565b915061333e60208401612ff0565b90509250929050565b600181811c9082168061335b57607f821691505b60208210811415613395577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156133dd576133dd61339b565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134145761341461339b565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561345c57600080fd5b5051919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561349b5761349b61339b565b500290565b600081516134b2818560208601612f4e565b9290920192915050565b600080845481600182811c9150808316806134d857607f831692505b6020808410821415613511577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015613525576001811461355457613581565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613581565b60008b81526020902060005b868110156135795781548b820152908501908301613560565b505084890196505b50505050505061359181856134a0565b95945050505050565b6000828210156135ac576135ac61339b565b500390565b6000816135c0576135c061339b565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613624576136246135e6565b500490565b600082613638576136386135e6565b500690565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261366f6080830184612f7a565b9695505050505050565b60006020828403121561368b57600080fd5b8151612f4781612efc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122064b193782e59970858453a3ba35067e01849fba513258e5d1d09be61bce4be3764736f6c63430008090033

Deployed Bytecode

0x6080604052600436106102a05760003560e01c806387c98b1f1161016e578063b442e9d7116100cb578063e985e9c51161007f578063f1e9b0a511610064578063f1e9b0a514610727578063f2fde38b1461073d578063f47c84c51461075d57600080fd5b8063e985e9c5146106c4578063eb8d24441461070d57600080fd5b8063c02b90ee116100b0578063c02b90ee14610664578063c87b56dd14610684578063e29af007146106a457600080fd5b8063b442e9d714610614578063b88d4fde1461064457600080fd5b806395d89b4111610122578063a1f25d9111610107578063a1f25d91146105be578063a22cb465146105de578063a2309ff8146105fe57600080fd5b806395d89b4114610596578063a0712d68146105ab57600080fd5b80638d564fe2116101535780638d564fe2146105425780638da5cb5b1461055857806391b7f5ed1461057657600080fd5b806387c98b1f146105025780638d37fd2d1461052257600080fd5b806334918dfd1161021c5780636352211e116101d057806370a08231116101b557806370a08231146104ad578063715018a6146104cd57806383b55791146104e257600080fd5b80636352211e1461046d5780636494f8931461048d57600080fd5b80633ccfd60b116102015780633ccfd60b1461041857806342842e0e1461042d5780634f6ccce71461044d57600080fd5b806334918dfd146103e35780633b997958146103f857600080fd5b806309aa3dcf1161027357806323b872dd1161025857806323b872dd1461038e57806327ac36c4146103ae5780632f745c59146103c357600080fd5b806309aa3dcf1461035657806318160ddd1461037957600080fd5b806301ffc9a7146102a557806306fdde03146102da578063081812fc146102fc578063095ea7b314610334575b600080fd5b3480156102b157600080fd5b506102c56102c0366004612f2a565b610773565b60405190151581526020015b60405180910390f35b3480156102e657600080fd5b506102ef610784565b6040516102d19190612fc4565b34801561030857600080fd5b5061031c610317366004612fd7565b610816565b6040516001600160a01b0390911681526020016102d1565b34801561034057600080fd5b5061035461034f366004613007565b6108c1565b005b34801561036257600080fd5b5061036b600a81565b6040519081526020016102d1565b34801561038557600080fd5b5060085461036b565b34801561039a57600080fd5b506103546103a9366004613031565b6109f3565b3480156103ba57600080fd5b50610354610a7a565b3480156103cf57600080fd5b5061036b6103de366004613007565b610bf2565b3480156103ef57600080fd5b50610354610c9a565b34801561040457600080fd5b50610354610413366004613150565b610d26565b34801561042457600080fd5b50610354610d97565b34801561043957600080fd5b50610354610448366004613031565b610e20565b34801561045957600080fd5b5061036b610468366004612fd7565b610e3b565b34801561047957600080fd5b5061031c610488366004612fd7565b610edf565b34801561049957600080fd5b506103546104a8366004613185565b610f6a565b3480156104b957600080fd5b5061036b6104c83660046131cc565b61100f565b3480156104d957600080fd5b506103546110a9565b3480156104ee57600080fd5b506103546104fd3660046131e7565b61110f565b34801561050e57600080fd5b5061035461051d3660046131cc565b6112fd565b34801561052e57600080fd5b5061035461053d366004612fd7565b611391565b34801561054e57600080fd5b5061036b60125481565b34801561056457600080fd5b50600a546001600160a01b031661031c565b34801561058257600080fd5b50610354610591366004612fd7565b61179e565b3480156105a257600080fd5b506102ef6117fd565b6103546105b9366004612fd7565b61180c565b3480156105ca57600080fd5b506103546105d9366004613150565b611a17565b3480156105ea57600080fd5b506103546105f936600461325c565b611a84565b34801561060a57600080fd5b5061036b600c5481565b34801561062057600080fd5b506102c561062f366004612fd7565b60009081526010602052604090205460ff1690565b34801561065057600080fd5b5061035461065f366004613298565b611a8f565b34801561067057600080fd5b5060165461031c906001600160a01b031681565b34801561069057600080fd5b506102ef61069f366004612fd7565b611b1d565b3480156106b057600080fd5b506102ef6106bf366004612fd7565b611c03565b3480156106d057600080fd5b506102c56106df366004613314565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561071957600080fd5b50600d546102c59060ff1681565b34801561073357600080fd5b5061036b60135481565b34801561074957600080fd5b506103546107583660046131cc565b611ca5565b34801561076957600080fd5b5061036b600b5481565b600061077e82611d84565b92915050565b60606000805461079390613347565b80601f01602080910402602001604051908101604052809291908181526020018280546107bf90613347565b801561080c5780601f106107e15761010080835404028352916020019161080c565b820191906000526020600020905b8154815290600101906020018083116107ef57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108a55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108cc82610edf565b9050806001600160a01b0316836001600160a01b031614156109565760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161089c565b336001600160a01b0382161480610972575061097281336106df565b6109e45760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161089c565b6109ee8383611dda565b505050565b6109fd3382611e60565b610a6f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161089c565b6109ee838383611f68565b600a546001600160a01b03163314610ad45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b610b126040518060400160405280600d81526020017f68656c6c6f207265736572766500000000000000000000000000000000000000815250612158565b600b54601554600c54610b2591906133ca565b10610b985760405162461bcd60e51b815260206004820152602560248201527f5765206861766520616c7265616479206869742074686520726573657276652060448201527f6c696d6974000000000000000000000000000000000000000000000000000000606482015260840161089c565b60005b6096811015610bef57600c54610bb133826121e7565b60128054906000610bc1836133e2565b9091555050600c8054906000610bd6836133e2565b9190505550508080610be7906133e2565b915050610b9b565b50565b6000610bfd8361100f565b8210610c715760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161089c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610cf45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b600a546001600160a01b03163314610d805760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b8051610d9390600e906020840190612e63565b5050565b600a546001600160a01b03163314610df15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b6040514790339082156108fc029083906000818181858888f19350505050158015610d93573d6000803e3d6000fd5b6109ee83838360405180602001604052806000815250611a8f565b6000610e4660085490565b8210610eba5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161089c565b60088281548110610ecd57610ecd61341b565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061077e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161089c565b33610f7483610edf565b6001600160a01b031614610ff05760405162461bcd60e51b815260206004820152602c60248201527f596f75206d757374206f776e2074686973204e465420746f207669736974207360448201527f6574207468652073746f72790000000000000000000000000000000000000000606482015260840161089c565b600082815260116020908152604090912082516109ee92840190612e63565b60006001600160a01b03821661108d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161089c565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146111035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b61110d6000612201565b565b333b1561115e5760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f410000000000000000000000000000000000604482015260640161089c565b60005b818110156112be573361118b84848481811061117f5761117f61341b565b90506020020135610edf565b6001600160a01b0316146112065760405162461bcd60e51b8152602060048201526024808201527f596f75206d757374206f776e20616e204e465420746f2076697369742044726160448201527f63756c6100000000000000000000000000000000000000000000000000000000606482015260840161089c565b6010600084848481811061121c5761121c61341b565b602090810292909201358352508101919091526040016000205460ff16156112ac5760405162461bcd60e51b815260206004820152603560248201527f596f752063616e6e6f742076697369742064726163756c6120696620796f752060448201527f61726520616c726561647920612076616d706972650000000000000000000000606482015260840161089c565b806112b6816133e2565b915050611161565b5060005b818110156109ee576112eb8383838181106112df576112df61341b565b9050602002013561226b565b806112f5816133e2565b9150506112c2565b600a546001600160a01b031633146113575760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b601680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b333b156113e05760405162461bcd60e51b815260206004820152600f60248201527f4163636f756e74206e6f7420454f410000000000000000000000000000000000604482015260640161089c565b600d5460ff166114585760405162461bcd60e51b815260206004820152602260248201527f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560448201527f6e73000000000000000000000000000000000000000000000000000000000000606482015260840161089c565b600a8111156114a95760405162461bcd60e51b815260206004820152601b60248201527f4578636565646564206d617820746f6b656e2070757263686173650000000000604482015260640161089c565b600b5481600c546114ba91906133ca565b111561152e5760405162461bcd60e51b815260206004820152602a60248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201527f206f6620746f6b656e7300000000000000000000000000000000000000000000606482015260840161089c565b6016546001600160a01b0316806370a08231336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561159857600080fd5b505afa1580156115ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d0919061344a565b82111561161f5760405162461bcd60e51b815260206004820152601660248201527f4e6f7420656e6f75676820426c6f6f642052756e657300000000000000000000604482015260640161089c565b60005b828110156109ee57600c54600b5481101561178b5760006001600160a01b038416632f745c59336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526000602482015260440160206040518083038186803b1580156116a757600080fd5b505afa1580156116bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116df919061344a565b6040517fdec9791d000000000000000000000000000000000000000000000000000000008152600481018290529091506001600160a01b0385169063dec9791d90602401600060405180830381600087803b15801561173d57600080fd5b505af1158015611751573d6000803e3d6000fd5b5050505061175f33836121e7565b6012805490600061176f836133e2565b9091555050600c8054906000611784836133e2565b9190505550505b5080611796816133e2565b915050611622565b600a546001600160a01b031633146117f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b601455565b60606001805461079390613347565b600d5460ff166118845760405162461bcd60e51b815260206004820152602260248201527f53616c65206d7573742062652061637469766520746f206d696e7420546f6b6560448201527f6e73000000000000000000000000000000000000000000000000000000000000606482015260840161089c565b600a8111156118d55760405162461bcd60e51b815260206004820152601b60248201527f4578636565646564206d617820746f6b656e2070757263686173650000000000604482015260640161089c565b600b5481600c546118e691906133ca565b111561195a5760405162461bcd60e51b815260206004820152602a60248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201527f206f6620746f6b656e7300000000000000000000000000000000000000000000606482015260840161089c565b34816014546119699190613463565b11156119b75760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161089c565b60005b81811015610d9357600c54600b54811015611a04576119d933826121e7565b601280549060006119e9836133e2565b9091555050600c80549060006119fe836133e2565b91905055505b5080611a0f816133e2565b9150506119ba565b600a546001600160a01b03163314611a715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b8051610d9390600f906020840190612e63565b610d93338383612356565b611a993383611e60565b611b0b5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161089c565b611b1784848484612443565b50505050565b6000818152600260205260409020546060906001600160a01b0316611baa5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161089c565b60008281526010602052604090205460ff1615611bf357600e611bcc836124cc565b604051602001611bdd9291906134bc565b6040516020818303038152906040529050919050565b600f611bcc836124cc565b919050565b6000818152601160205260409020805460609190611c2090613347565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4c90613347565b8015611c995780601f10611c6e57610100808354040283529160200191611c99565b820191906000526020600020905b815481529060010190602001808311611c7c57829003601f168201915b50505050509050919050565b600a546001600160a01b03163314611cff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089c565b6001600160a01b038116611d7b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161089c565b610bef81612201565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061077e575061077e826125fe565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190611e2782610edf565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611eea5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161089c565b6000611ef583610edf565b9050806001600160a01b0316846001600160a01b03161480611f3c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80611f605750836001600160a01b0316611f5584610816565b6001600160a01b0316145b949350505050565b826001600160a01b0316611f7b82610edf565b6001600160a01b031614611ff75760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161089c565b6001600160a01b0382166120725760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161089c565b61207d8383836126e1565b612088600082611dda565b6001600160a01b03831660009081526003602052604081208054600192906120b190849061359a565b90915550506001600160a01b03821660009081526003602052604081208054600192906120df9084906133ca565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610bef8160405160240161216c9190612fc4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f41304fac000000000000000000000000000000000000000000000000000000001790526126ec565b610d9382826040518060200160405280600081525061270d565b600a80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061227682612796565b9050801561230057600082815260106020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560138054916122c3836133e2565b90915550506040518281527fa55912b8afb41b5d1308cde6e066bb200b452051ef06fa3ecdb7943fd4259e069060200160405180910390a161233d565b6123098261282b565b6040518281527ffe8c49819c4d3101316cbcba4871527a391659acc75db7f84f47b7cb00a2de459060200160405180910390a15b6012805490600061234d836135b1565b91905055505050565b816001600160a01b0316836001600160a01b031614156123b85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161089c565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61244e848484611f68565b61245a848484846128ea565b611b175760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161089c565b60608161250c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156125365780612520816133e2565b915061252f9050600a83613615565b9150612510565b60008167ffffffffffffffff8111156125515761255161306d565b6040519080825280601f01601f19166020018201604052801561257b576020820181803683370190505b5090505b8415611f605761259060018361359a565b915061259d600a86613629565b6125a89060306133ca565b60f81b8183815181106125bd576125bd61341b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506125f7600a86613615565b945061257f565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061269157507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061077e57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461077e565b6109ee838383612ab5565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b6127178383612b6d565b61272460008484846128ea565b6109ee5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161089c565b6000803a4342446127a860018461359a565b604080516020810196909652850193909352606084019190915260808301524060a08201523060c082015260e0810184905261010001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209050612821600a82613629565b6001149392505050565b600061283682610edf565b9050612844816000846126e1565b61284f600083611dda565b6001600160a01b038116600090815260036020526040812080546001929061287890849061359a565b909155505060008281526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160a01b0384163b15612aaa576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a029061294790339089908890889060040161363d565b602060405180830381600087803b15801561296157600080fd5b505af19250505080156129af575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526129ac91810190613679565b60015b612a5f573d8080156129dd576040519150601f19603f3d011682016040523d82523d6000602084013e6129e2565b606091505b508051612a575760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161089c565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611f60565b506001949350505050565b6001600160a01b038316612b1057612b0b81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b33565b816001600160a01b0316836001600160a01b031614612b3357612b338382612cd3565b6001600160a01b038216612b4a576109ee81612d70565b826001600160a01b0316826001600160a01b0316146109ee576109ee8282612e1f565b6001600160a01b038216612bc35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161089c565b6000818152600260205260409020546001600160a01b031615612c285760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161089c565b612c34600083836126e1565b6001600160a01b0382166000908152600360205260408120805460019290612c5d9084906133ca565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612ce08461100f565b612cea919061359a565b600083815260076020526040902054909150808214612d3d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612d829060019061359a565b60008381526009602052604081205460088054939450909284908110612daa57612daa61341b565b906000526020600020015490508060088381548110612dcb57612dcb61341b565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612e0357612e03613696565b6001900381819060005260206000200160009055905550505050565b6000612e2a8361100f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612e6f90613347565b90600052602060002090601f016020900481019282612e915760008555612ed7565b82601f10612eaa57805160ff1916838001178555612ed7565b82800160010185558215612ed7579182015b82811115612ed7578251825591602001919060010190612ebc565b50612ee3929150612ee7565b5090565b5b80821115612ee35760008155600101612ee8565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610bef57600080fd5b600060208284031215612f3c57600080fd5b8135612f4781612efc565b9392505050565b60005b83811015612f69578181015183820152602001612f51565b83811115611b175750506000910152565b60008151808452612f92816020860160208601612f4e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612f476020830184612f7a565b600060208284031215612fe957600080fd5b5035919050565b80356001600160a01b0381168114611bfe57600080fd5b6000806040838503121561301a57600080fd5b61302383612ff0565b946020939093013593505050565b60008060006060848603121561304657600080fd5b61304f84612ff0565b925061305d60208501612ff0565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff808411156130b7576130b761306d565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156130fd576130fd61306d565b8160405280935085815286868601111561311657600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261314157600080fd5b612f478383356020850161309c565b60006020828403121561316257600080fd5b813567ffffffffffffffff81111561317957600080fd5b611f6084828501613130565b6000806040838503121561319857600080fd5b82359150602083013567ffffffffffffffff8111156131b657600080fd5b6131c285828601613130565b9150509250929050565b6000602082840312156131de57600080fd5b612f4782612ff0565b600080602083850312156131fa57600080fd5b823567ffffffffffffffff8082111561321257600080fd5b818501915085601f83011261322657600080fd5b81358181111561323557600080fd5b8660208260051b850101111561324a57600080fd5b60209290920196919550909350505050565b6000806040838503121561326f57600080fd5b61327883612ff0565b91506020830135801515811461328d57600080fd5b809150509250929050565b600080600080608085870312156132ae57600080fd5b6132b785612ff0565b93506132c560208601612ff0565b925060408501359150606085013567ffffffffffffffff8111156132e857600080fd5b8501601f810187136132f957600080fd5b6133088782356020840161309c565b91505092959194509250565b6000806040838503121561332757600080fd5b61333083612ff0565b915061333e60208401612ff0565b90509250929050565b600181811c9082168061335b57607f821691505b60208210811415613395577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156133dd576133dd61339b565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134145761341461339b565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561345c57600080fd5b5051919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561349b5761349b61339b565b500290565b600081516134b2818560208601612f4e565b9290920192915050565b600080845481600182811c9150808316806134d857607f831692505b6020808410821415613511577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015613525576001811461355457613581565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613581565b60008b81526020902060005b868110156135795781548b820152908501908301613560565b505084890196505b50505050505061359181856134a0565b95945050505050565b6000828210156135ac576135ac61339b565b500390565b6000816135c0576135c061339b565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613624576136246135e6565b500490565b600082613638576136386135e6565b500690565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261366f6080830184612f7a565b9695505050505050565b60006020828403121561368b57600080fd5b8151612f4781612efc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122064b193782e59970858453a3ba35067e01849fba513258e5d1d09be61bce4be3764736f6c63430008090033

Deployed Bytecode Sourcemap

110191:6510:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111403:179;;;;;;;;;;-1:-1:-1;111403:179:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;111403:179:0;;;;;;;;22705:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24265:221::-;;;;;;;;;;-1:-1:-1;24265:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1819:55:1;;;1801:74;;1789:2;1774:18;24265:221:0;1655:226:1;23788:411:0;;;;;;;;;;-1:-1:-1;23788:411:0;;;;;:::i;:::-;;:::i;:::-;;110262:42;;;;;;;;;;;;110302:2;110262:42;;;;;2492:25:1;;;2480:2;2465:18;110262:42:0;2346:177:1;40148:113:0;;;;;;;;;;-1:-1:-1;40236:10:0;:17;40148:113;;25015:339;;;;;;;;;;-1:-1:-1;25015:339:0;;;;;:::i;:::-;;:::i;111798:397::-;;;;;;;;;;;;;:::i;39816:256::-;;;;;;;;;;-1:-1:-1;39816:256:0;;;;;:::i;:::-;;:::i;112203:89::-;;;;;;;;;;;;;:::i;114133:114::-;;;;;;;;;;-1:-1:-1;114133:114:0;;;;;:::i;:::-;;:::i;116556:140::-;;;;;;;;;;;;;:::i;25425:185::-;;;;;;;;;;-1:-1:-1;25425:185:0;;;;;:::i;:::-;;:::i;40338:233::-;;;;;;;;;;-1:-1:-1;40338:233:0;;;;;:::i;:::-;;:::i;22399:239::-;;;;;;;;;;-1:-1:-1;22399:239:0;;;;;:::i;:::-;;:::i;116317:231::-;;;;;;;;;;-1:-1:-1;116317:231:0;;;;;:::i;:::-;;:::i;22129:208::-;;;;;;;;;;-1:-1:-1;22129:208:0;;;;;:::i;:::-;;:::i;36592:103::-;;;;;;;;;;;;;:::i;115598:458::-;;;;;;;;;;-1:-1:-1;115598:458:0;;;;;:::i;:::-;;:::i;111687:103::-;;;;;;;;;;-1:-1:-1;111687:103:0;;;;;:::i;:::-;;:::i;113005:1006::-;;;;;;;;;;-1:-1:-1;113005:1006:0;;;;;:::i;:::-;;:::i;110604:31::-;;;;;;;;;;;;;;;;35941:87;;;;;;;;;;-1:-1:-1;36014:6:0;;-1:-1:-1;;;;;36014:6:0;35941:87;;111590:89;;;;;;;;;;-1:-1:-1;111590:89:0;;;;;:::i;:::-;;:::i;22874:104::-;;;;;;;;;;;;;:::i;112300:697::-;;;;;;:::i;:::-;;:::i;114019:106::-;;;;;;;;;;-1:-1:-1;114019:106:0;;;;;:::i;:::-;;:::i;24558:155::-;;;;;;;;;;-1:-1:-1;24558:155:0;;;;;:::i;:::-;;:::i;110351:30::-;;;;;;;;;;;;;;;;116064:114;;;;;;;;;;-1:-1:-1;116064:114:0;;;;;:::i;:::-;116121:4;116145:25;;;:16;:25;;;;;;;;;116064:114;25681:328;;;;;;;;;;-1:-1:-1;25681:328:0;;;;;:::i;:::-;;:::i;110829:31::-;;;;;;;;;;-1:-1:-1;110829:31:0;;;;-1:-1:-1;;;;;110829:31:0;;;114255:416;;;;;;;;;;-1:-1:-1;114255:416:0;;;;;:::i;:::-;;:::i;116186:123::-;;;;;;;;;;-1:-1:-1;116186:123:0;;;;;:::i;:::-;;:::i;24784:164::-;;;;;;;;;;-1:-1:-1;24784:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24905:25:0;;;24881:4;24905:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24784:164;110388:32;;;;;;;;;;-1:-1:-1;110388:32:0;;;;;;;;110642:33;;;;;;;;;;;;;;;;36850:201;;;;;;;;;;-1:-1:-1;36850:201:0;;;;;:::i;:::-;;:::i;110311:33::-;;;;;;;;;;;;;;;;111403:179;111514:4;111538:36;111562:11;111538:23;:36::i;:::-;111531:43;111403:179;-1:-1:-1;;111403:179:0:o;22705:100::-;22759:13;22792:5;22785:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22705:100;:::o;24265:221::-;24341:7;27608:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27608:16:0;24361:73;;;;-1:-1:-1;;;24361:73:0;;7439:2:1;24361:73:0;;;7421:21:1;7478:2;7458:18;;;7451:30;7517:34;7497:18;;;7490:62;7588:14;7568:18;;;7561:42;7620:19;;24361:73:0;;;;;;;;;-1:-1:-1;24454:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24454:24:0;;24265:221::o;23788:411::-;23869:13;23885:23;23900:7;23885:14;:23::i;:::-;23869:39;;23933:5;-1:-1:-1;;;;;23927:11:0;:2;-1:-1:-1;;;;;23927:11:0;;;23919:57;;;;-1:-1:-1;;;23919:57:0;;7852:2:1;23919:57:0;;;7834:21:1;7891:2;7871:18;;;7864:30;7930:34;7910:18;;;7903:62;8001:3;7981:18;;;7974:31;8022:19;;23919:57:0;7650:397:1;23919:57:0;17052:10;-1:-1:-1;;;;;24011:21:0;;;;:62;;-1:-1:-1;24036:37:0;24053:5;17052:10;24784:164;:::i;24036:37::-;23989:168;;;;-1:-1:-1;;;23989:168:0;;8254:2:1;23989:168:0;;;8236:21:1;8293:2;8273:18;;;8266:30;8332:34;8312:18;;;8305:62;8403:26;8383:18;;;8376:54;8447:19;;23989:168:0;8052:420:1;23989:168:0;24170:21;24179:2;24183:7;24170:8;:21::i;:::-;23858:341;23788:411;;:::o;25015:339::-;25210:41;17052:10;25243:7;25210:18;:41::i;:::-;25202:103;;;;-1:-1:-1;;;25202:103:0;;8679:2:1;25202:103:0;;;8661:21:1;8718:2;8698:18;;;8691:30;8757:34;8737:18;;;8730:62;8828:19;8808:18;;;8801:47;8865:19;;25202:103:0;8477:413:1;25202:103:0;25318:28;25328:4;25334:2;25338:7;25318:9;:28::i;111798:397::-;36014:6;;-1:-1:-1;;;;;36014:6:0;17052:10;36161:23;36153:68;;;;-1:-1:-1;;;36153:68:0;;9097:2:1;36153:68:0;;;9079:21:1;;;9116:18;;;9109:30;9175:34;9155:18;;;9148:62;9227:18;;36153:68:0;8895:356:1;36153:68:0;111851:28:::1;;;;;;;;;;;;;;;;;::::0;:11:::1;:28::i;:::-;111923:10;;111912:8;;111898:11;;:22;;;;:::i;:::-;:35;111890:85;;;::::0;-1:-1:-1;;;111890:85:0;;9780:2:1;111890:85:0::1;::::0;::::1;9762:21:1::0;9819:2;9799:18;;;9792:30;9858:34;9838:18;;;9831:62;9929:7;9909:18;;;9902:35;9954:19;;111890:85:0::1;9578:401:1::0;111890:85:0::1;111986:6;112003:185;112019:3;112015:1;:7;112003:185;;;112061:11;::::0;112087:32:::1;112097:10;112061:11:::0;112087:9:::1;:32::i;:::-;112134:12;:14:::0;;;:12:::1;:14;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;112163:11:0::1;:13:::0;;;:11:::1;:13;::::0;::::1;:::i;:::-;;;;;;112029:159;112024:3;;;;;:::i;:::-;;;;112003:185;;;111840:355;111798:397::o:0;39816:256::-;39913:7;39949:23;39966:5;39949:16;:23::i;:::-;39941:5;:31;39933:87;;;;-1:-1:-1;;;39933:87:0;;10386:2:1;39933:87:0;;;10368:21:1;10425:2;10405:18;;;10398:30;10464:34;10444:18;;;10437:62;10535:13;10515:18;;;10508:41;10566:19;;39933:87:0;10184:407:1;39933:87:0;-1:-1:-1;;;;;;40038:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;39816:256::o;112203:89::-;36014:6;;-1:-1:-1;;;;;36014:6:0;17052:10;36161:23;36153:68;;;;-1:-1:-1;;;36153:68:0;;9097:2:1;36153:68:0;;;9079:21:1;;;9116:18;;;9109:30;9175:34;9155:18;;;9148:62;9227:18;;36153:68:0;8895:356:1;36153:68:0;112272:12:::1;::::0;;112256:28;;::::1;112272:12;::::0;;::::1;112271:13;112256:28;::::0;;112203:89::o;114133:114::-;36014:6;;-1:-1:-1;;;;;36014:6:0;17052:10;36161:23;36153:68;;;;-1:-1:-1;;;36153:68:0;;9097:2:1;36153:68:0;;;9079:21:1;;;9116:18;;;9109:30;9175:34;9155:18;;;9148:62;9227:18;;36153:68:0;8895:356:1;36153:68:0;114213:26;;::::1;::::0;:10:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;:::-;;114133:114:::0;:::o;116556:140::-;36014:6;;-1:-1:-1;;;;;36014:6:0;17052:10;36161:23;36153:68;;;;-1:-1:-1;;;36153:68:0;;9097:2:1;36153:68:0;;;9079:21:1;;;9116:18;;;9109:30;9175:34;9155:18;;;9148:62;9227:18;;36153:68:0;8895:356:1;36153:68:0;116651:37:::1;::::0;116619:21:::1;::::0;116659:10:::1;::::0;116651:37;::::1;;;::::0;116619:21;;116604:12:::1;116651:37:::0;116604:12;116651:37;116619:21;116659:10;116651:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;25425:185:::0;25563:39;25580:4;25586:2;25590:7;25563:39;;;;;;;;;;;;:16;:39::i;40338:233::-;40413:7;40449:30;40236:10;:17;;40148:113;40449:30;40441:5;:38;40433:95;;;;-1:-1:-1;;;40433:95:0;;10798:2:1;40433:95:0;;;10780:21:1;10837:2;10817:18;;;10810:30;10876:34;10856:18;;;10849:62;10947:14;10927:18;;;10920:42;10979:19;;40433:95:0;10596:408:1;40433:95:0;40546:10;40557:5;40546:17;;;;;;;;:::i;:::-;;;;;;;;;40539:24;;40338:233;;;:::o;22399:239::-;22471:7;22507:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22507:16:0;22542:19;22534:73;;;;-1:-1:-1;;;22534:73:0;;11400:2:1;22534:73:0;;;11382:21:1;11439:2;11419:18;;;11412:30;11478:34;11458:18;;;11451:62;11549:11;11529:18;;;11522:39;11578:19;;22534:73:0;11198:405:1;116317:231:0;17052:10;116408:16;116416:7;116408;:16::i;:::-;-1:-1:-1;;;;;116408:32:0;;116400:89;;;;-1:-1:-1;;;116400:89:0;;11810:2:1;116400:89:0;;;11792:21:1;11849:2;11829:18;;;11822:30;11888:34;11868:18;;;11861:62;11959:14;11939:18;;;11932:42;11991:19;;116400:89:0;11608:408:1;116400:89:0;116500:26;;;;:17;:26;;;;;;;;:40;;;;;;;;:::i;22129:208::-;22201:7;-1:-1:-1;;;;;22229:19:0;;22221:74;;;;-1:-1:-1;;;22221:74:0;;12223:2:1;22221:74:0;;;12205:21:1;12262:2;12242:18;;;12235:30;12301:34;12281:18;;;12274:62;12372:12;12352:18;;;12345:40;12402:19;;22221:74:0;12021:406:1;22221:74:0;-1:-1:-1;;;;;;22313:16:0;;;;;:9;:16;;;;;;;22129:208::o;36592:103::-;36014:6;;-1:-1:-1;;;;;36014:6:0;17052:10;36161:23;36153:68;;;;-1:-1:-1;;;36153:68:0;;9097:2:1;36153:68:0;;;9079:21:1;;;9116:18;;;9109:30;9175:34;9155:18;;;9148:62;9227:18;;36153:68:0;8895:356:1;36153:68:0;36657:30:::1;36684:1;36657:18;:30::i;:::-;36592:103::o:0;115598:458::-;111155:10;9312:19;:23;111127:59;;;;-1:-1:-1;;;111127:59:0;;12634:2:1;111127:59:0;;;12616:21:1;12673:2;12653:18;;;12646:30;12712:17;12692:18;;;12685:45;12747:18;;111127:59:0;12432:339:1;111127:59:0;115680:6:::1;115675:266;115692:19:::0;;::::1;115675:266;;;17052:10:::0;115741:20:::1;115749:8:::0;;115758:1;115749:11;;::::1;;;;;:::i;:::-;;;;;;;115741:7;:20::i;:::-;-1:-1:-1::0;;;;;115741:36:0::1;;115733:85;;;::::0;-1:-1:-1;;;115733:85:0;;12978:2:1;115733:85:0::1;::::0;::::1;12960:21:1::0;13017:2;12997:18;;;12990:30;13056:34;13036:18;;;13029:62;13127:6;13107:18;;;13100:34;13151:19;;115733:85:0::1;12776:400:1::0;115733:85:0::1;115842:16;:29;115859:8;;115868:1;115859:11;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;115842:29:::0;;-1:-1:-1;115842:29:0;::::1;::::0;;;;;;-1:-1:-1;115842:29:0;;::::1;;115841:30;115833:96;;;::::0;-1:-1:-1;;;115833:96:0;;13383:2:1;115833:96:0::1;::::0;::::1;13365:21:1::0;13422:2;13402:18;;;13395:30;13461:34;13441:18;;;13434:62;13532:23;13512:18;;;13505:51;13573:19;;115833:96:0::1;13181:417:1::0;115833:96:0::1;115713:3:::0;::::1;::::0;::::1;:::i;:::-;;;;115675:266;;;;115958:6;115953:96;115970:19:::0;;::::1;115953:96;;;116011:26;116025:8;;116034:1;116025:11;;;;;;;:::i;:::-;;;;;;;116011:13;:26::i;:::-;115991:3:::0;::::1;::::0;::::1;:::i;:::-;;;;115953:96;;111687:103:::0;36014:6;;-1:-1:-1;;;;;36014:6:0;17052:10;36161:23;36153:68;;;;-1:-1:-1;;;36153:68:0;;9097:2:1;36153:68:0;;;9079:21:1;;;9116:18;;;9109:30;9175:34;9155:18;;;9148:62;9227:18;;36153:68:0;8895:356:1;36153:68:0;111759:16:::1;:23:::0;;;::::1;-1:-1:-1::0;;;;;111759:23:0;;;::::1;::::0;;;::::1;::::0;;111687:103::o;113005:1006::-;111155:10;9312:19;:23;111127:59;;;;-1:-1:-1;;;111127:59:0;;12634:2:1;111127:59:0;;;12616:21:1;12673:2;12653:18;;;12646:30;12712:17;12692:18;;;12685:45;12747:18;;111127:59:0;12432:339:1;111127:59:0;113087:12:::1;::::0;::::1;;113079:59;;;::::0;-1:-1:-1;;;113079:59:0;;13805:2:1;113079:59:0::1;::::0;::::1;13787:21:1::0;13844:2;13824:18;;;13817:30;13883:34;13863:18;;;13856:62;13954:4;13934:18;;;13927:32;13976:19;;113079:59:0::1;13603:398:1::0;113079:59:0::1;110302:2;113157:14;:34;;113149:74;;;::::0;-1:-1:-1;;;113149:74:0;;14208:2:1;113149:74:0::1;::::0;::::1;14190:21:1::0;14247:2;14227:18;;;14220:30;14286:29;14266:18;;;14259:57;14333:18;;113149:74:0::1;14006:351:1::0;113149:74:0::1;113274:10;;113256:14;113242:11;;:28;;;;:::i;:::-;:42;;113234:97;;;::::0;-1:-1:-1;;;113234:97:0;;14564:2:1;113234:97:0::1;::::0;::::1;14546:21:1::0;14603:2;14583:18;;;14576:30;14642:34;14622:18;;;14615:62;14713:12;14693:18;;;14686:40;14743:19;;113234:97:0::1;14362:406:1::0;113234:97:0::1;113439:16;::::0;-1:-1:-1;;;;;113439:16:0::1;::::0;113493:27:::1;17052:10:::0;113493:41:::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;1819:55:1;;;113493:41:0::1;::::0;::::1;1801:74:1::0;1774:18;;113493:41:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;113475:14;:59;;113467:94;;;::::0;-1:-1:-1;;;113467:94:0;;15164:2:1;113467:94:0::1;::::0;::::1;15146:21:1::0;15203:2;15183:18;;;15176:30;15242:24;15222:18;;;15215:52;15284:18;;113467:94:0::1;14962:346:1::0;113467:94:0::1;113579:6;113574:430;113595:14;113591:1;:18;113574:430;;;113648:11;::::0;113692:10:::1;::::0;113678:24;::::1;113674:319;;;113723:16;-1:-1:-1::0;;;;;113742:37:0;::::1;;17052:10:::0;113742:54:::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;15513:55:1;;;113742:54:0::1;::::0;::::1;15495:74:1::0;113794:1:0::1;15585:18:1::0;;;15578:34;15468:18;;113742:54:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;113815:46;::::0;;;;::::1;::::0;::::1;2492:25:1::0;;;113723:73:0;;-1:-1:-1;;;;;;113815:33:0;::::1;::::0;::::1;::::0;2465:18:1;;113815:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;113880:32;113890:10;113902:9;113880;:32::i;:::-;113931:12;:14:::0;;;:12:::1;:14;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;113964:11:0::1;:13:::0;;;:11:::1;:13;::::0;::::1;:::i;:::-;;;;;;113704:289;113674:319;-1:-1:-1::0;113611:3:0;::::1;::::0;::::1;:::i;:::-;;;;113574:430;;111590:89:::0;36014:6;;-1:-1:-1;;;;;36014:6:0;17052:10;36161:23;36153:68;;;;-1:-1:-1;;;36153:68:0;;9097:2:1;36153:68:0;;;9079:21:1;;;9116:18;;;9109:30;9175:34;9155:18;;;9148:62;9227:18;;36153:68:0;8895:356:1;36153:68:0;111654:6:::1;:17:::0;111590:89::o;22874:104::-;22930:13;22963:7;22956:14;;;;;:::i;112300:697::-;112369:12;;;;112361:59;;;;-1:-1:-1;;;112361:59:0;;15825:2:1;112361:59:0;;;15807:21:1;15864:2;15844:18;;;15837:30;15903:34;15883:18;;;15876:62;15974:4;15954:18;;;15947:32;15996:19;;112361:59:0;15623:398:1;112361:59:0;110302:2;112439:14;:34;;112431:74;;;;-1:-1:-1;;;112431:74:0;;14208:2:1;112431:74:0;;;14190:21:1;14247:2;14227:18;;;14220:30;14286:29;14266:18;;;14259:57;14333:18;;112431:74:0;14006:351:1;112431:74:0;112556:10;;112538:14;112524:11;;:28;;;;:::i;:::-;:42;;112516:97;;;;-1:-1:-1;;;112516:97:0;;14564:2:1;112516:97:0;;;14546:21:1;14603:2;14583:18;;;14576:30;14642:34;14622:18;;;14615:62;14713:12;14693:18;;;14686:40;14743:19;;112516:97:0;14362:406:1;112516:97:0;112659:9;112641:14;112632:6;;:23;;;;:::i;:::-;:36;;112624:80;;;;-1:-1:-1;;;112624:80:0;;16461:2:1;112624:80:0;;;16443:21:1;16500:2;16480:18;;;16473:30;16539:33;16519:18;;;16512:61;16590:18;;112624:80:0;16259:355:1;112624:80:0;112722:6;112717:273;112738:14;112734:1;:18;112717:273;;;112791:11;;112835:10;;112821:24;;112817:162;;;112866:32;112876:10;112888:9;112866;:32::i;:::-;112917:12;:14;;;:12;:14;;;:::i;:::-;;;;-1:-1:-1;;112950:11:0;:13;;;:11;:13;;;:::i;:::-;;;;;;112817:162;-1:-1:-1;112754:3:0;;;;:::i;:::-;;;;112717:273;;114019:106;36014:6;;-1:-1:-1;;;;;36014:6:0;17052:10;36161:23;36153:68;;;;-1:-1:-1;;;36153:68:0;;9097:2:1;36153:68:0;;;9079:21:1;;;9116:18;;;9109:30;9175:34;9155:18;;;9148:62;9227:18;;36153:68:0;8895:356:1;36153:68:0;114095:22;;::::1;::::0;:8:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;24558:155::-:0;24653:52;17052:10;24686:8;24696;24653:18;:52::i;25681:328::-;25856:41;17052:10;25889:7;25856:18;:41::i;:::-;25848:103;;;;-1:-1:-1;;;25848:103:0;;8679:2:1;25848:103:0;;;8661:21:1;8718:2;8698:18;;;8691:30;8757:34;8737:18;;;8730:62;8828:19;8808:18;;;8801:47;8865:19;;25848:103:0;8477:413:1;25848:103:0;25962:39;25976:4;25982:2;25986:7;25995:5;25962:13;:39::i;:::-;25681:328;;;;:::o;114255:416::-;27584:4;27608:16;;;:7;:16;;;;;;114320:13;;-1:-1:-1;;;;;27608:16:0;114346:76;;;;-1:-1:-1;;;114346:76:0;;16821:2:1;114346:76:0;;;16803:21:1;16860:2;16840:18;;;16833:30;16899:34;16879:18;;;16872:62;16970:17;16950:18;;;16943:45;17005:19;;114346:76:0;16619:411:1;114346:76:0;114439:25;;;;:16;:25;;;;;;;;114435:229;;;114512:10;114524:25;114541:7;114524:16;:25::i;:::-;114495:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;114481:70;;114255:416;;;:::o;114435:229::-;114615:8;114625:25;114642:7;114625:16;:25::i;114435:229::-;114255:416;;;:::o;116186:123::-;116275:26;;;;:17;:26;;;;;116268:33;;116242:13;;116275:26;116268:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;116186:123;;;:::o;36850:201::-;36014:6;;-1:-1:-1;;;;;36014:6:0;17052:10;36161:23;36153:68;;;;-1:-1:-1;;;36153:68:0;;9097:2:1;36153:68:0;;;9079:21:1;;;9116:18;;;9109:30;9175:34;9155:18;;;9148:62;9227:18;;36153:68:0;8895:356:1;36153:68:0;-1:-1:-1;;;;;36939:22:0;::::1;36931:73;;;::::0;-1:-1:-1;;;36931:73:0;;18847:2:1;36931:73:0::1;::::0;::::1;18829:21:1::0;18886:2;18866:18;;;18859:30;18925:34;18905:18;;;18898:62;18996:8;18976:18;;;18969:36;19022:19;;36931:73:0::1;18645:402:1::0;36931:73:0::1;37015:28;37034:8;37015:18;:28::i;39508:224::-:0;39610:4;39634:50;;;39649:35;39634:50;;:90;;;39688:36;39712:11;39688:23;:36::i;31665:174::-;31740:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;31740:29:0;;;;;;;;:24;;31794:23;31740:24;31794:14;:23::i;:::-;-1:-1:-1;;;;;31785:46:0;;;;;;;;;;;31665:174;;:::o;27813:348::-;27906:4;27608:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27608:16:0;27923:73;;;;-1:-1:-1;;;27923:73:0;;19254:2:1;27923:73:0;;;19236:21:1;19293:2;19273:18;;;19266:30;19332:34;19312:18;;;19305:62;19403:14;19383:18;;;19376:42;19435:19;;27923:73:0;19052:408:1;27923:73:0;28007:13;28023:23;28038:7;28023:14;:23::i;:::-;28007:39;;28076:5;-1:-1:-1;;;;;28065:16:0;:7;-1:-1:-1;;;;;28065:16:0;;:52;;;-1:-1:-1;;;;;;24905:25:0;;;24881:4;24905:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28085:32;28065:87;;;;28145:7;-1:-1:-1;;;;;28121:31:0;:20;28133:7;28121:11;:20::i;:::-;-1:-1:-1;;;;;28121:31:0;;28065:87;28057:96;27813:348;-1:-1:-1;;;;27813:348:0:o;30922:625::-;31081:4;-1:-1:-1;;;;;31054:31:0;:23;31069:7;31054:14;:23::i;:::-;-1:-1:-1;;;;;31054:31:0;;31046:81;;;;-1:-1:-1;;;31046:81:0;;19667:2:1;31046:81:0;;;19649:21:1;19706:2;19686:18;;;19679:30;19745:34;19725:18;;;19718:62;19816:7;19796:18;;;19789:35;19841:19;;31046:81:0;19465:401:1;31046:81:0;-1:-1:-1;;;;;31146:16:0;;31138:65;;;;-1:-1:-1;;;31138:65:0;;20073:2:1;31138:65:0;;;20055:21:1;20112:2;20092:18;;;20085:30;20151:34;20131:18;;;20124:62;20222:6;20202:18;;;20195:34;20246:19;;31138:65:0;19871:400:1;31138:65:0;31216:39;31237:4;31243:2;31247:7;31216:20;:39::i;:::-;31320:29;31337:1;31341:7;31320:8;:29::i;:::-;-1:-1:-1;;;;;31362:15:0;;;;;;:9;:15;;;;;:20;;31381:1;;31362:15;:20;;31381:1;;31362:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31393:13:0;;;;;;:9;:13;;;;;:18;;31410:1;;31393:13;:18;;31410:1;;31393:18;:::i;:::-;;;;-1:-1:-1;;31422:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;31422:21:0;;;;;;;;;31461:27;;31422:16;;31461:27;;;;;;;23858:341;23788:411;;:::o;51295:114::-;51345:59;51400:2;51361:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;51345:15;:59::i;28503:110::-;28579:26;28589:2;28593:7;28579:26;;;;;;;;;;;;:9;:26::i;37211:191::-;37304:6;;;-1:-1:-1;;;;;37321:17:0;;;;;;;;;;;37354:40;;37304:6;;;37321:17;37304:6;;37354:40;;37285:16;;37354:40;37274:128;37211:191;:::o;115205:385::-;115264:13;115280:27;115299:7;115280:18;:27::i;:::-;115264:43;;115322:8;115318:238;;;115347:25;;;;:16;:25;;;;;:32;;;;115375:4;115347:32;;;115394:14;:16;;;;;;:::i;:::-;;;;-1:-1:-1;;115430:27:0;;2492:25:1;;;115430:27:0;;2480:2:1;2465:18;115430:27:0;;;;;;;115318:238;;;115490:14;115496:7;115490:5;:14::i;:::-;115524:20;;2492:25:1;;;115524:20:0;;2480:2:1;2465:18;115524:20:0;;;;;;;115318:238;115568:12;:14;;;:12;:14;;;:::i;:::-;;;;;;115253:337;115205:385;:::o;31981:315::-;32136:8;-1:-1:-1;;;;;32127:17:0;:5;-1:-1:-1;;;;;32127:17:0;;;32119:55;;;;-1:-1:-1;;;32119:55:0;;20809:2:1;32119:55:0;;;20791:21:1;20848:2;20828:18;;;20821:30;20887:27;20867:18;;;20860:55;20932:18;;32119:55:0;20607:349:1;32119:55:0;-1:-1:-1;;;;;32185:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;32247:41;;586::1;;;32247::0;;559:18:1;32247:41:0;;;;;;;31981:315;;;:::o;26891:::-;27048:28;27058:4;27064:2;27068:7;27048:9;:28::i;:::-;27095:48;27118:4;27124:2;27128:7;27137:5;27095:22;:48::i;:::-;27087:111;;;;-1:-1:-1;;;27087:111:0;;21163:2:1;27087:111:0;;;21145:21:1;21202:2;21182:18;;;21175:30;21241:34;21221:18;;;21214:62;21312:20;21292:18;;;21285:48;21350:19;;27087:111:0;20961:414:1;17557:723:0;17613:13;17834:10;17830:53;;-1:-1:-1;;17861:10:0;;;;;;;;;;;;;;;;;;17557:723::o;17830:53::-;17908:5;17893:12;17949:78;17956:9;;17949:78;;17982:8;;;;:::i;:::-;;-1:-1:-1;18005:10:0;;-1:-1:-1;18013:2:0;18005:10;;:::i;:::-;;;17949:78;;;18037:19;18069:6;18059:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18059:17:0;;18037:39;;18087:154;18094:10;;18087:154;;18121:11;18131:1;18121:11;;:::i;:::-;;-1:-1:-1;18190:10:0;18198:2;18190:5;:10;:::i;:::-;18177:24;;:2;:24;:::i;:::-;18164:39;;18147:6;18154;18147:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;18218:11:0;18227:2;18218:11;;:::i;:::-;;;18087:154;;21760:305;21862:4;21899:40;;;21914:25;21899:40;;:105;;-1:-1:-1;21956:48:0;;;21971:33;21956:48;21899:105;:158;;;-1:-1:-1;20309:25:0;20294:40;;;;22021:36;20185:157;111214:181;111342:45;111369:4;111375:2;111379:7;111342:26;:45::i;46248:295::-;46337:14;;46199:42;46449:2;46436:16;;46313:21;;46337:14;46436:16;46199:42;46477:5;46466:68;46457:77;;46410:129;;46248:295;:::o;28840:321::-;28970:18;28976:2;28980:7;28970:5;:18::i;:::-;29021:54;29052:1;29056:2;29060:7;29069:5;29021:22;:54::i;:::-;28999:154;;;;-1:-1:-1;;;28999:154:0;;21163:2:1;28999:154:0;;;21145:21:1;21202:2;21182:18;;;21175:30;21241:34;21221:18;;;21214:62;21312:20;21292:18;;;21285:48;21350:19;;28999:154:0;20961:414:1;114679:518:0;114746:4;;114866:11;114900:12;114935:15;114973:16;115022;115037:1;114900:12;115022:16;:::i;:::-;114833:291;;;;;;22126:25:1;;;;22167:18;;22160:34;;;;22210:18;;;22203:34;;;;22253:18;;;22246:34;115012:27:0;22296:19:1;;;22289:35;115070:4:0;22340:19:1;;;22333:84;22433:19;;;22426:35;;;22098:19;;114833:291:0;;;;;;;;;;;;;114805:334;;114833:291;114805:334;;;;;-1:-1:-1;115170:14:0;115182:2;114805:334;115170:14;:::i;:::-;115188:1;115170:19;;114679:518;-1:-1:-1;;;114679:518:0:o;30165:420::-;30225:13;30241:23;30256:7;30241:14;:23::i;:::-;30225:39;;30277:48;30298:5;30313:1;30317:7;30277:20;:48::i;:::-;30366:29;30383:1;30387:7;30366:8;:29::i;:::-;-1:-1:-1;;;;;30408:16:0;;;;;;:9;:16;;;;;:21;;30428:1;;30408:16;:21;;30428:1;;30408:21;:::i;:::-;;;;-1:-1:-1;;30447:16:0;;;;:7;:16;;;;;;30440:23;;;;;;30481:36;30455:7;;30447:16;-1:-1:-1;;;;;30481:36:0;;;;;30447:16;;30481:36;114213:26:::1;114133:114:::0;:::o;32861:799::-;33016:4;-1:-1:-1;;;;;33037:13:0;;9312:19;:23;33033:620;;33073:72;;;;;-1:-1:-1;;;;;33073:36:0;;;;;:72;;17052:10;;33124:4;;33130:7;;33139:5;;33073:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33073:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33069:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33315:13:0;;33311:272;;33358:60;;-1:-1:-1;;;33358:60:0;;21163:2:1;33358:60:0;;;21145:21:1;21202:2;21182:18;;;21175:30;21241:34;21221:18;;;21214:62;21312:20;21292:18;;;21285:48;21350:19;;33358:60:0;20961:414:1;33311:272:0;33533:6;33527:13;33518:6;33514:2;33510:15;33503:38;33069:529;33196:51;;33206:41;33196:51;;-1:-1:-1;33189:58:0;;33033:620;-1:-1:-1;33637:4:0;32861:799;;;;;;:::o;41184:589::-;-1:-1:-1;;;;;41390:18:0;;41386:187;;41425:40;41457:7;42600:10;:17;;42573:24;;;;:15;:24;;;;;:44;;;42628:24;;;;;;;;;;;;42496:164;41425:40;41386:187;;;41495:2;-1:-1:-1;;;;;41487:10:0;:4;-1:-1:-1;;;;;41487:10:0;;41483:90;;41514:47;41547:4;41553:7;41514:32;:47::i;:::-;-1:-1:-1;;;;;41587:16:0;;41583:183;;41620:45;41657:7;41620:36;:45::i;41583:183::-;41693:4;-1:-1:-1;;;;;41687:10:0;:2;-1:-1:-1;;;;;41687:10:0;;41683:83;;41714:40;41742:2;41746:7;41714:27;:40::i;29497:439::-;-1:-1:-1;;;;;29577:16:0;;29569:61;;;;-1:-1:-1;;;29569:61:0;;23456:2:1;29569:61:0;;;23438:21:1;;;23475:18;;;23468:30;23534:34;23514:18;;;23507:62;23586:18;;29569:61:0;23254:356:1;29569:61:0;27584:4;27608:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27608:16:0;:30;29641:58;;;;-1:-1:-1;;;29641:58:0;;23817:2:1;29641:58:0;;;23799:21:1;23856:2;23836:18;;;23829:30;23895;23875:18;;;23868:58;23943:18;;29641:58:0;23615:352:1;29641:58:0;29712:45;29741:1;29745:2;29749:7;29712:20;:45::i;:::-;-1:-1:-1;;;;;29770:13:0;;;;;;:9;:13;;;;;:18;;29787:1;;29770:13;:18;;29787:1;;29770:18;:::i;:::-;;;;-1:-1:-1;;29799:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;29799:21:0;;;;;;;;29838:33;;29799:16;;;29838:33;;29799:16;;29838:33;114213:26:::1;114133:114:::0;:::o;43287:988::-;43553:22;43603:1;43578:22;43595:4;43578:16;:22::i;:::-;:26;;;;:::i;:::-;43615:18;43636:26;;;:17;:26;;;;;;43553:51;;-1:-1:-1;43769:28:0;;;43765:328;;-1:-1:-1;;;;;43836:18:0;;43814:19;43836:18;;;:12;:18;;;;;;;;:34;;;;;;;;;43887:30;;;;;;:44;;;44004:30;;:17;:30;;;;;:43;;;43765:328;-1:-1:-1;44189:26:0;;;;:17;:26;;;;;;;;44182:33;;;-1:-1:-1;;;;;44233:18:0;;;;;:12;:18;;;;;:34;;;;;;;44226:41;43287:988::o;44570:1079::-;44848:10;:17;44823:22;;44848:21;;44868:1;;44848:21;:::i;:::-;44880:18;44901:24;;;:15;:24;;;;;;45274:10;:26;;44823:46;;-1:-1:-1;44901:24:0;;44823:46;;45274:26;;;;;;:::i;:::-;;;;;;;;;45252:48;;45338:11;45313:10;45324;45313:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;45418:28;;;:15;:28;;;;;;;:41;;;45590:24;;;;;45583:31;45625:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;44641:1008;;;44570:1079;:::o;42074:221::-;42159:14;42176:20;42193:2;42176:16;:20::i;:::-;-1:-1:-1;;;;;42207:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;42252:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;42074:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;:::-;430:5;196:245;-1:-1:-1;;;196:245:1:o;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:328::-;954:3;992:5;986:12;1019:6;1014:3;1007:19;1035:63;1091:6;1084:4;1079:3;1075:14;1068:4;1061:5;1057:16;1035:63;:::i;:::-;1143:2;1131:15;1148:66;1127:88;1118:98;;;;1218:4;1114:109;;901:328;-1:-1:-1;;901:328:1:o;1234:231::-;1383:2;1372:9;1365:21;1346:4;1403:56;1455:2;1444:9;1440:18;1432:6;1403:56;:::i;1470:180::-;1529:6;1582:2;1570:9;1561:7;1557:23;1553:32;1550:52;;;1598:1;1595;1588:12;1550:52;-1:-1:-1;1621:23:1;;1470:180;-1:-1:-1;1470:180:1:o;1886:196::-;1954:20;;-1:-1:-1;;;;;2003:54:1;;1993:65;;1983:93;;2072:1;2069;2062:12;2087:254;2155:6;2163;2216:2;2204:9;2195:7;2191:23;2187:32;2184:52;;;2232:1;2229;2222:12;2184:52;2255:29;2274:9;2255:29;:::i;:::-;2245:39;2331:2;2316:18;;;;2303:32;;-1:-1:-1;;;2087:254:1:o;2528:328::-;2605:6;2613;2621;2674:2;2662:9;2653:7;2649:23;2645:32;2642:52;;;2690:1;2687;2680:12;2642:52;2713:29;2732:9;2713:29;:::i;:::-;2703:39;;2761:38;2795:2;2784:9;2780:18;2761:38;:::i;:::-;2751:48;;2846:2;2835:9;2831:18;2818:32;2808:42;;2528:328;;;;;:::o;2861:184::-;2913:77;2910:1;2903:88;3010:4;3007:1;3000:15;3034:4;3031:1;3024:15;3050:691;3115:5;3145:18;3186:2;3178:6;3175:14;3172:40;;;3192:18;;:::i;:::-;3326:2;3320:9;3392:2;3380:15;;3231:66;3376:24;;;3402:2;3372:33;3368:42;3356:55;;;3426:18;;;3446:22;;;3423:46;3420:72;;;3472:18;;:::i;:::-;3512:10;3508:2;3501:22;3541:6;3532:15;;3571:6;3563;3556:22;3611:3;3602:6;3597:3;3593:16;3590:25;3587:45;;;3628:1;3625;3618:12;3587:45;3678:6;3673:3;3666:4;3658:6;3654:17;3641:44;3733:1;3726:4;3717:6;3709;3705:19;3701:30;3694:41;;;;3050:691;;;;;:::o;3746:222::-;3789:5;3842:3;3835:4;3827:6;3823:17;3819:27;3809:55;;3860:1;3857;3850:12;3809:55;3882:80;3958:3;3949:6;3936:20;3929:4;3921:6;3917:17;3882:80;:::i;3973:322::-;4042:6;4095:2;4083:9;4074:7;4070:23;4066:32;4063:52;;;4111:1;4108;4101:12;4063:52;4151:9;4138:23;4184:18;4176:6;4173:30;4170:50;;;4216:1;4213;4206:12;4170:50;4239;4281:7;4272:6;4261:9;4257:22;4239:50;:::i;4300:390::-;4378:6;4386;4439:2;4427:9;4418:7;4414:23;4410:32;4407:52;;;4455:1;4452;4445:12;4407:52;4491:9;4478:23;4468:33;;4552:2;4541:9;4537:18;4524:32;4579:18;4571:6;4568:30;4565:50;;;4611:1;4608;4601:12;4565:50;4634;4676:7;4667:6;4656:9;4652:22;4634:50;:::i;:::-;4624:60;;;4300:390;;;;;:::o;4695:186::-;4754:6;4807:2;4795:9;4786:7;4782:23;4778:32;4775:52;;;4823:1;4820;4813:12;4775:52;4846:29;4865:9;4846:29;:::i;4886:615::-;4972:6;4980;5033:2;5021:9;5012:7;5008:23;5004:32;5001:52;;;5049:1;5046;5039:12;5001:52;5089:9;5076:23;5118:18;5159:2;5151:6;5148:14;5145:34;;;5175:1;5172;5165:12;5145:34;5213:6;5202:9;5198:22;5188:32;;5258:7;5251:4;5247:2;5243:13;5239:27;5229:55;;5280:1;5277;5270:12;5229:55;5320:2;5307:16;5346:2;5338:6;5335:14;5332:34;;;5362:1;5359;5352:12;5332:34;5415:7;5410:2;5400:6;5397:1;5393:14;5389:2;5385:23;5381:32;5378:45;5375:65;;;5436:1;5433;5426:12;5375:65;5467:2;5459:11;;;;;5489:6;;-1:-1:-1;4886:615:1;;-1:-1:-1;;;;4886:615:1:o;5506:347::-;5571:6;5579;5632:2;5620:9;5611:7;5607:23;5603:32;5600:52;;;5648:1;5645;5638:12;5600:52;5671:29;5690:9;5671:29;:::i;:::-;5661:39;;5750:2;5739:9;5735:18;5722:32;5797:5;5790:13;5783:21;5776:5;5773:32;5763:60;;5819:1;5816;5809:12;5763:60;5842:5;5832:15;;;5506:347;;;;;:::o;5858:667::-;5953:6;5961;5969;5977;6030:3;6018:9;6009:7;6005:23;6001:33;5998:53;;;6047:1;6044;6037:12;5998:53;6070:29;6089:9;6070:29;:::i;:::-;6060:39;;6118:38;6152:2;6141:9;6137:18;6118:38;:::i;:::-;6108:48;;6203:2;6192:9;6188:18;6175:32;6165:42;;6258:2;6247:9;6243:18;6230:32;6285:18;6277:6;6274:30;6271:50;;;6317:1;6314;6307:12;6271:50;6340:22;;6393:4;6385:13;;6381:27;-1:-1:-1;6371:55:1;;6422:1;6419;6412:12;6371:55;6445:74;6511:7;6506:2;6493:16;6488:2;6484;6480:11;6445:74;:::i;:::-;6435:84;;;5858:667;;;;;;;:::o;6530:260::-;6598:6;6606;6659:2;6647:9;6638:7;6634:23;6630:32;6627:52;;;6675:1;6672;6665:12;6627:52;6698:29;6717:9;6698:29;:::i;:::-;6688:39;;6746:38;6780:2;6769:9;6765:18;6746:38;:::i;:::-;6736:48;;6530:260;;;;;:::o;6795:437::-;6874:1;6870:12;;;;6917;;;6938:61;;6992:4;6984:6;6980:17;6970:27;;6938:61;7045:2;7037:6;7034:14;7014:18;7011:38;7008:218;;;7082:77;7079:1;7072:88;7183:4;7180:1;7173:15;7211:4;7208:1;7201:15;7008:218;;6795:437;;;:::o;9256:184::-;9308:77;9305:1;9298:88;9405:4;9402:1;9395:15;9429:4;9426:1;9419:15;9445:128;9485:3;9516:1;9512:6;9509:1;9506:13;9503:39;;;9522:18;;:::i;:::-;-1:-1:-1;9558:9:1;;9445:128::o;9984:195::-;10023:3;10054:66;10047:5;10044:77;10041:103;;;10124:18;;:::i;:::-;-1:-1:-1;10171:1:1;10160:13;;9984:195::o;11009:184::-;11061:77;11058:1;11051:88;11158:4;11155:1;11148:15;11182:4;11179:1;11172:15;14773:184;14843:6;14896:2;14884:9;14875:7;14871:23;14867:32;14864:52;;;14912:1;14909;14902:12;14864:52;-1:-1:-1;14935:16:1;;14773:184;-1:-1:-1;14773:184:1:o;16026:228::-;16066:7;16192:1;16124:66;16120:74;16117:1;16114:81;16109:1;16102:9;16095:17;16091:105;16088:131;;;16199:18;;:::i;:::-;-1:-1:-1;16239:9:1;;16026:228::o;17161:185::-;17203:3;17241:5;17235:12;17256:52;17301:6;17296:3;17289:4;17282:5;17278:16;17256:52;:::i;:::-;17324:16;;;;;17161:185;-1:-1:-1;;17161:185:1:o;17351:1289::-;17527:3;17556:1;17589:6;17583:13;17619:3;17641:1;17669:9;17665:2;17661:18;17651:28;;17729:2;17718:9;17714:18;17751;17741:61;;17795:4;17787:6;17783:17;17773:27;;17741:61;17821:2;17869;17861:6;17858:14;17838:18;17835:38;17832:222;;;17908:77;17903:3;17896:90;18009:4;18006:1;17999:15;18039:4;18034:3;18027:17;17832:222;18070:18;18097:162;;;;18273:1;18268:320;;;;18063:525;;18097:162;18145:66;18134:9;18130:82;18125:3;18118:95;18242:6;18237:3;18233:16;18226:23;;18097:162;;18268:320;17108:1;17101:14;;;17145:4;17132:18;;18363:1;18377:165;18391:6;18388:1;18385:13;18377:165;;;18469:14;;18456:11;;;18449:35;18512:16;;;;18406:10;;18377:165;;;18381:3;;18571:6;18566:3;18562:16;18555:23;;18063:525;;;;;;;18604:30;18630:3;18622:6;18604:30;:::i;:::-;18597:37;17351:1289;-1:-1:-1;;;;;17351:1289:1:o;20276:125::-;20316:4;20344:1;20341;20338:8;20335:34;;;20349:18;;:::i;:::-;-1:-1:-1;20386:9:1;;20276:125::o;20406:196::-;20445:3;20473:5;20463:39;;20482:18;;:::i;:::-;-1:-1:-1;20529:66:1;20518:78;;20406:196::o;21380:184::-;21432:77;21429:1;21422:88;21529:4;21526:1;21519:15;21553:4;21550:1;21543:15;21569:120;21609:1;21635;21625:35;;21640:18;;:::i;:::-;-1:-1:-1;21674:9:1;;21569:120::o;21694:112::-;21726:1;21752;21742:35;;21757:18;;:::i;:::-;-1:-1:-1;21791:9:1;;21694:112::o;22472:523::-;22666:4;-1:-1:-1;;;;;22776:2:1;22768:6;22764:15;22753:9;22746:34;22828:2;22820:6;22816:15;22811:2;22800:9;22796:18;22789:43;;22868:6;22863:2;22852:9;22848:18;22841:34;22911:3;22906:2;22895:9;22891:18;22884:31;22932:57;22984:3;22973:9;22969:19;22961:6;22932:57;:::i;:::-;22924:65;22472:523;-1:-1:-1;;;;;;22472:523:1:o;23000:249::-;23069:6;23122:2;23110:9;23101:7;23097:23;23093:32;23090:52;;;23138:1;23135;23128:12;23090:52;23170:9;23164:16;23189:30;23213:5;23189:30;:::i;23972:184::-;24024:77;24021:1;24014:88;24121:4;24118:1;24111:15;24145:4;24142:1;24135:15

Swarm Source

ipfs://64b193782e59970858453a3ba35067e01849fba513258e5d1d09be61bce4be37
[ 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.