ETH Price: $3,215.04 (+1.65%)

Token

MCS:Art (MCSA)
 

Overview

Max Total Supply

0 MCSA

Holders

26

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 MCSA
0x46c1794df805bfb5761726c60a8148158dab87e2
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
NFTPlus

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-05-22
*/

// File openzeppelin-solidity/contracts/utils/introspection/[email protected]


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


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`, 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


// File openzeppelin-solidity/contracts/token/ERC721/[email protected]


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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}


// File openzeppelin-solidity/contracts/token/ERC721/extensions/[email protected]


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


pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File openzeppelin-solidity/contracts/utils/[email protected]


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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


// File openzeppelin-solidity/contracts/utils/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}


// File openzeppelin-solidity/contracts/utils/introspection/[email protected]


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


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}. Empty by default, can be overriden
     * 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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 || getApproved(tokenId) == spender || isApprovedForAll(owner, 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);
    }

    /**
     * @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);
    }

    /**
     * @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 of token that is not own");
        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);
    }

    /**
     * @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 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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` 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 { }
}


// File openzeppelin-solidity/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}


// File openzeppelin-solidity/contracts/access/[email protected]


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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// File openzeppelin-solidity/contracts/access/[email protected]


pragma solidity ^0.8.0;


/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    function hasRole(bytes32 role, address account) external view returns (bool);
    function getRoleAdmin(bytes32 role) external view returns (bytes32);
    function grantRole(bytes32 role, address account) external;
    function revokeRole(bytes32 role, address account) external;
    function renounceRole(bytes32 role, address account) external;
}

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping (address => bool) members;
        bytes32 adminRole;
    }

    mapping (bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override {
        require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to grant");

        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override {
        require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to revoke");

        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
        _roles[role].adminRole = adminRole;
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


// File contracts/IApprovalProxy.sol

pragma solidity ^0.8.0;

interface IApprovalProxy {
    function setApprovalForAll(
        address _owner,
        address _spender,
        bool _approved
    ) external;

    function isApprovedForAll(
        address _owner,
        address _spender,
        bool _original
    ) external view returns (bool);
}


// 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/NFTPlusV1.sol

pragma solidity ^0.8.0;





abstract contract NFTPlusV1 is AccessControl, ERC721URIStorage, Ownable {
    using Strings for uint256;

    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");

    string private baseURI;
    IApprovalProxy public approvalProxy;

    event UpdateApprovalProxy(address _newProxyContract);

    constructor(string memory _name, string memory _symbol)
        ERC721(_name, _symbol)
    {
        _setRoleAdmin(MINTER_ROLE, MINTER_ROLE);
        _setupRole(MINTER_ROLE, _msgSender());
    }

    // mintable
    function mint(address to, uint256 tokenId) public {
        require(
            hasRole(MINTER_ROLE, _msgSender()),
            "ERC721Mintble: must have minter role to mint"
        );

        _mint(to, tokenId);
    }

    function mint(address[] memory _toList, uint256[] memory _tokenIdList)
        external
    {
        require(
            _toList.length == _tokenIdList.length,
            "input length must be same"
        );
        for (uint256 i = 0; i < _tokenIdList.length; i++) {
            mint(_toList[i], _tokenIdList[i]);
        }
    }

    function mintFor(
        address to,
        uint256 tokenId,
        bytes calldata mintingBlob // solhint-disable-line
    ) public {
        mint(to, tokenId);
    }

    function exists(uint256 tokenId) public view returns (bool) {
        return _exists(tokenId);
    }

    function setBaseURI(string memory __baseURI) external onlyOwner {
        baseURI = __baseURI;
    }

    function _baseURI() internal view override returns (string memory) {
        if (bytes(baseURI).length > 0) {
            return baseURI;
        }
        return
            string(
                abi.encodePacked(
                    "https://metadata.nftplus.io/metadata/",
                    symbol(),
                    "/"
                )
            );
    }

    function setApprovalProxy(address _new) public onlyOwner {
        approvalProxy = IApprovalProxy(_new);
        emit UpdateApprovalProxy(_new);
    }

    function setApprovalForAll(address _spender, bool _approved)
        public
        virtual
        override
    {
        if (
            address(approvalProxy) != address(0x0) &&
            Address.isContract(_spender)
        ) {
            approvalProxy.setApprovalForAll(msg.sender, _spender, _approved);
        }
        super.setApprovalForAll(_spender, _approved);
    }

    function isApprovedForAll(address _owner, address _spender)
        public
        view
        override
        returns (bool)
    {
        bool original = super.isApprovedForAll(_owner, _spender);
        if (address(approvalProxy) != address(0x0)) {
            return approvalProxy.isApprovedForAll(_owner, _spender, original);
        }
        return original;
    }

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


// File contracts/NFTPlus.sol

pragma solidity 0.8.3;

contract NFTPlus is NFTPlusV1 {
    constructor(string memory name, string memory symbol, address approvalProxy, address _owner) NFTPlusV1(name, symbol) {
        if (approvalProxy != address(0x0)) {
            setApprovalProxy(approvalProxy);
        }
        if (_owner != address(0x0)) {
            grantRole(MINTER_ROLE, _owner);
            transferOwnership(_owner);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"approvalProxy","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"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":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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newProxyContract","type":"address"}],"name":"UpdateApprovalProxy","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"approvalProxy","outputs":[{"internalType":"contract IApprovalProxy","name":"","type":"address"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_toList","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIdList","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"mintingBlob","type":"bytes"}],"name":"mintFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new","type":"address"}],"name":"setApprovalProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"__baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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"}]

60806040523480156200001157600080fd5b5060405162002a9438038062002a94833981016040819052620000349162000607565b8383818181600190805190602001906200005092919062000496565b5080516200006690600290602084019062000496565b50505060006200007b6200014b60201b60201c565b600880546001600160a01b0319166001600160a01b0383169081179091556040519192509060009060008051602062002a54833981519152908290a350620000d360008051602062002a74833981519152806200014f565b620000ee60008051602062002a74833981519152336200019b565b50506001600160a01b038216156200010b576200010b82620001ab565b6001600160a01b0381161562000141576200013660008051602062002a74833981519152826200024e565b6200014181620002e1565b50505050620006e6565b3390565b806200015b83620003de565b60405184907fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff90600090a460009182526020829052604090912060010155565b620001a78282620003f6565b5050565b6008546001600160a01b03163314620001fa5760405162461bcd60e51b8152602060048201819052602482015260008051602062002a3483398151915260448201526064015b60405180910390fd5b600a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f12be4820d03362d1f48434d870b2fc1549b3a3d16d891eeaac7c3073f3ded8b79060200160405180910390a150565b6200027b6200025d83620003de565b60009081526020818152604080832033845290915290205460ff1690565b6200019b5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526e0818591b5a5b881d1bc819dc985b9d608a1b6064820152608401620001f1565b6008546001600160a01b031633146200032c5760405162461bcd60e51b8152602060048201819052602482015260008051602062002a348339815191526044820152606401620001f1565b6001600160a01b038116620003935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620001f1565b6008546040516001600160a01b0380841692169060008051602062002a5483398151915290600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152602081905260409020600101545b919050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620001a7576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620004523390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b828054620004a49062000693565b90600052602060002090601f016020900481019282620004c8576000855562000513565b82601f10620004e357805160ff191683800117855562000513565b8280016001018555821562000513579182015b8281111562000513578251825591602001919060010190620004f6565b506200052192915062000525565b5090565b5b8082111562000521576000815560010162000526565b80516001600160a01b0381168114620003f157600080fd5b600082601f83011262000565578081fd5b81516001600160401b0380821115620005825762000582620006d0565b604051601f8301601f19908116603f01168101908282118183101715620005ad57620005ad620006d0565b81604052838152602092508683858801011115620005c9578485fd5b8491505b83821015620005ec5785820183015181830184015290820190620005cd565b83821115620005fd57848385830101525b9695505050505050565b600080600080608085870312156200061d578384fd5b84516001600160401b038082111562000634578586fd5b620006428883890162000554565b9550602087015191508082111562000658578485fd5b50620006678782880162000554565b93505062000678604086016200053c565b915062000688606086016200053c565b905092959194509250565b600181811c90821680620006a857607f821691505b60208210811415620006ca57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61233e80620006f66000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063a22cb465116100a2578063d547741f11610071578063d547741f1461040d578063e467f7e014610420578063e985e9c514610433578063f2fde38b14610446576101da565b8063a22cb465146103ad578063b88d4fde146103c0578063c87b56dd146103d3578063d5391393146103e6576101da565b806391d14854116100de57806391d148541461037757806395d89b411461038a5780639bb5c9c314610392578063a217fddf146103a5576101da565b806370a082311461034b578063715018a61461035e5780638da5cb5b14610366576101da565b80632f2ff15d1161017c5780634dd09f331161014b5780634dd09f33146102ff5780634f558e791461031257806355f804b3146103255780636352211e14610338576101da565b80632f2ff15d146102b357806336568abe146102c657806340c10f19146102d957806342842e0e146102ec576101da565b8063095ea7b3116101b8578063095ea7b31461024757806319ee6e3f1461025c57806323b872dd1461026f578063248a9ca314610282576101da565b806301ffc9a7146101df57806306fdde0314610207578063081812fc1461021c575b600080fd5b6101f26101ed366004611f12565b610459565b60405190151581526020015b60405180910390f35b61020f61047b565b6040516101fe9190612086565b61022f61022a366004611ed8565b61050e565b6040516001600160a01b0390911681526020016101fe565b61025a610255366004611d50565b61059b565b005b61025a61026a366004611d79565b6106b1565b61025a61027d366004611c66565b6106c1565b6102a5610290366004611ed8565b60009081526020819052604090206001015490565b6040519081526020016101fe565b61025a6102c1366004611ef0565b6106f2565b61025a6102d4366004611ef0565b610781565b61025a6102e7366004611d50565b6107fb565b61025a6102fa366004611c66565b610890565b600a5461022f906001600160a01b031681565b6101f2610320366004611ed8565b6108ab565b61025a610333366004611f4a565b6108b6565b61022f610346366004611ed8565b6108f3565b6102a5610359366004611c1a565b61096a565b61025a6109f1565b6008546001600160a01b031661022f565b6101f2610385366004611ef0565b610a65565b61020f610a90565b61025a6103a0366004611c1a565b610a9f565b6102a5600081565b61025a6103bb366004611d1a565b610b1d565b61025a6103ce366004611ca1565b610bb4565b61020f6103e1366004611ed8565b610be6565b6102a57f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61025a61041b366004611ef0565b610d51565b61025a61042e366004611dfb565b610dd1565b6101f2610441366004611c34565b610e98565b61025a610454366004611c1a565b610f6c565b600061046482611057565b8061047357506104738261108c565b90505b919050565b60606001805461048a90612235565b80601f01602080910402602001604051908101604052809291908181526020018280546104b690612235565b80156105035780601f106104d857610100808354040283529160200191610503565b820191906000526020600020905b8154815290600101906020018083116104e657829003601f168201915b505050505090505b90565b6000610519826110cc565b61057f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006105a6826108f3565b9050806001600160a01b0316836001600160a01b031614156106145760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610576565b336001600160a01b038216148061063057506106308133610441565b6106a25760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610576565b6106ac83836110e9565b505050565b6106bb84846107fb565b50505050565b6106cb3382611157565b6106e75760405162461bcd60e51b815260040161057690612120565b6106ac838383611219565b60008281526020819052604090206001015461070f905b33610385565b6107735760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526e0818591b5a5b881d1bc819dc985b9d608a1b6064820152608401610576565b61077d82826113b9565b5050565b6001600160a01b03811633146107f15760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610576565b61077d828261143d565b6108257f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610385565b6108865760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d696e74626c653a206d7573742068617665206d696e7465722060448201526b1c9bdb19481d1bc81b5a5b9d60a21b6064820152608401610576565b61077d82826114a2565b6106ac83838360405180602001604052806000815250610bb4565b6000610473826110cc565b6008546001600160a01b031633146108e05760405162461bcd60e51b8152600401610576906120eb565b805161077d906009906020840190611aa3565b6000818152600360205260408120546001600160a01b0316806104735760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610576565b60006001600160a01b0382166109d55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610576565b506001600160a01b031660009081526004602052604090205490565b6008546001600160a01b03163314610a1b5760405162461bcd60e51b8152600401610576906120eb565b6008546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600880546001600160a01b0319169055565b6000828152602081815260408083206001600160a01b038516845290915290205460ff165b92915050565b60606002805461048a90612235565b6008546001600160a01b03163314610ac95760405162461bcd60e51b8152600401610576906120eb565b600a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f12be4820d03362d1f48434d870b2fc1549b3a3d16d891eeaac7c3073f3ded8b79060200160405180910390a150565b600a546001600160a01b031615801590610b375750813b15155b15610baa57600a54604051631b3b02e560e11b81523360048201526001600160a01b03848116602483015283151560448301529091169063367605ca90606401600060405180830381600087803b158015610b9157600080fd5b505af1158015610ba5573d6000803e3d6000fd5b505050505b61077d82826115d5565b610bbe3383611157565b610bda5760405162461bcd60e51b815260040161057690612120565b6106bb848484846116a7565b6060610bf1826110cc565b610c575760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610576565b60008281526007602052604081208054610c7090612235565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9c90612235565b8015610ce95780601f10610cbe57610100808354040283529160200191610ce9565b820191906000526020600020905b815481529060010190602001808311610ccc57829003601f168201915b505050505090506000610cfa6116da565b9050805160001415610d0e57509050610476565b815115610d40578082604051602001610d28929190611fbc565b60405160208183030381529060405292505050610476565b610d49846117b1565b949350505050565b600082815260208190526040902060010154610d6c90610709565b6107f15760405162461bcd60e51b815260206004820152603060248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526f2061646d696e20746f207265766f6b6560801b6064820152608401610576565b8051825114610e225760405162461bcd60e51b815260206004820152601960248201527f696e707574206c656e677468206d7573742062652073616d65000000000000006044820152606401610576565b60005b81518110156106ac57610e86838281518110610e5157634e487b7160e01b600052603260045260246000fd5b6020026020010151838381518110610e7957634e487b7160e01b600052603260045260246000fd5b60200260200101516107fb565b80610e9081612270565b915050610e25565b6001600160a01b0382811660009081526006602090815260408083208585168452909152812054600a54919260ff909116911615610f6557600a546040516346e67e2960e11b81526001600160a01b0386811660048301528581166024830152831515604483015290911690638dccfc529060640160206040518083038186803b158015610f2557600080fd5b505afa158015610f39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5d9190611ebc565b915050610a8a565b9392505050565b6008546001600160a01b03163314610f965760405162461bcd60e51b8152600401610576906120eb565b6001600160a01b038116610ffb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610576565b6008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b03198216637965db0b60e01b148061047357506301ffc9a760e01b6001600160e01b0319831614610473565b60006001600160e01b031982166380ac58cd60e01b14806110bd57506001600160e01b03198216635b5e139f60e01b145b80610473575061047382611057565b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061111e826108f3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611162826110cc565b6111c35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610576565b60006111ce836108f3565b9050806001600160a01b0316846001600160a01b031614806112095750836001600160a01b03166111fe8461050e565b6001600160a01b0316145b80610d495750610d498185610e98565b826001600160a01b031661122c826108f3565b6001600160a01b0316146112945760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610576565b6001600160a01b0382166112f65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610576565b6113016000826110e9565b6001600160a01b038316600090815260046020526040812080546001929061132a9084906121f2565b90915550506001600160a01b03821660009081526004602052604081208054600192906113589084906121c6565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6113c38282610a65565b61077d576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556113f93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6114478282610a65565b1561077d576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b0382166114f85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610576565b611501816110cc565b1561154e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610576565b6001600160a01b03821660009081526004602052604081208054600192906115779084906121c6565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b03821633141561162e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610576565b3360008181526006602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161169b911515815260200190565b60405180910390a35050565b6116b2848484611219565b6116be8484848461187b565b6106bb5760405162461bcd60e51b815260040161057690612099565b60606000600980546116eb90612235565b90501115611785576009805461170090612235565b80601f016020809104026020016040519081016040528092919081815260200182805461172c90612235565b80156117795780601f1061174e57610100808354040283529160200191611779565b820191906000526020600020905b81548152906001019060200180831161175c57829003601f168201915b5050505050905061050b565b61178d610a90565b60405160200161179d9190611feb565b604051602081830303815290604052905090565b60606117bc826110cc565b6118205760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610576565b600061182a6116da565b9050600081511161184a5760405180602001604052806000815250610f65565b8061185484611988565b604051602001611865929190611fbc565b6040516020818303038152906040529392505050565b60006001600160a01b0384163b1561197d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118bf903390899088908890600401612049565b602060405180830381600087803b1580156118d957600080fd5b505af1925050508015611909575060408051601f3d908101601f1916820190925261190691810190611f2e565b60015b611963573d808015611937576040519150601f19603f3d011682016040523d82523d6000602084013e61193c565b606091505b50805161195b5760405162461bcd60e51b815260040161057690612099565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610d49565b506001949350505050565b6060816119ad57506040805180820190915260018152600360fc1b6020820152610476565b8160005b81156119d757806119c181612270565b91506119d09050600a836121de565b91506119b1565b60008167ffffffffffffffff811115611a0057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611a2a576020820181803683370190505b5090505b8415610d4957611a3f6001836121f2565b9150611a4c600a8661228b565b611a579060306121c6565b60f81b818381518110611a7a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611a9c600a866121de565b9450611a2e565b828054611aaf90612235565b90600052602060002090601f016020900481019282611ad15760008555611b17565b82601f10611aea57805160ff1916838001178555611b17565b82800160010185558215611b17579182015b82811115611b17578251825591602001919060010190611afc565b50611b23929150611b27565b5090565b5b80821115611b235760008155600101611b28565b600067ffffffffffffffff831115611b5657611b566122cb565b611b69601f8401601f1916602001612171565b9050828152838383011115611b7d57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461047657600080fd5b600082601f830112611bbb578081fd5b81356020611bd0611bcb836121a2565b612171565b80838252828201915082860187848660051b8901011115611bef578586fd5b855b85811015611c0d57813584529284019290840190600101611bf1565b5090979650505050505050565b600060208284031215611c2b578081fd5b610f6582611b94565b60008060408385031215611c46578081fd5b611c4f83611b94565b9150611c5d60208401611b94565b90509250929050565b600080600060608486031215611c7a578081fd5b611c8384611b94565b9250611c9160208501611b94565b9150604084013590509250925092565b60008060008060808587031215611cb6578081fd5b611cbf85611b94565b9350611ccd60208601611b94565b925060408501359150606085013567ffffffffffffffff811115611cef578182fd5b8501601f81018713611cff578182fd5b611d0e87823560208401611b3c565b91505092959194509250565b60008060408385031215611d2c578182fd5b611d3583611b94565b91506020830135611d45816122e1565b809150509250929050565b60008060408385031215611d62578182fd5b611d6b83611b94565b946020939093013593505050565b60008060008060608587031215611d8e578384fd5b611d9785611b94565b935060208501359250604085013567ffffffffffffffff80821115611dba578384fd5b818701915087601f830112611dcd578384fd5b813581811115611ddb578485fd5b886020828501011115611dec578485fd5b95989497505060200194505050565b60008060408385031215611e0d578182fd5b823567ffffffffffffffff80821115611e24578384fd5b818501915085601f830112611e37578384fd5b81356020611e47611bcb836121a2565b8083825282820191508286018a848660051b8901011115611e66578889fd5b8896505b84871015611e8f57611e7b81611b94565b835260019690960195918301918301611e6a565b5096505086013592505080821115611ea5578283fd5b50611eb285828601611bab565b9150509250929050565b600060208284031215611ecd578081fd5b8151610f65816122e1565b600060208284031215611ee9578081fd5b5035919050565b60008060408385031215611f02578182fd5b82359150611c5d60208401611b94565b600060208284031215611f23578081fd5b8135610f65816122f2565b600060208284031215611f3f578081fd5b8151610f65816122f2565b600060208284031215611f5b578081fd5b813567ffffffffffffffff811115611f71578182fd5b8201601f81018413611f81578182fd5b610d4984823560208401611b3c565b60008151808452611fa8816020860160208601612209565b601f01601f19169290920160200192915050565b60008351611fce818460208801612209565b835190830190611fe2818360208801612209565b01949350505050565b60007f68747470733a2f2f6d657461646174612e6e6674706c75732e696f2f6d657461825264646174612f60d81b60208301528251612031816025850160208701612209565b602f60f81b6025939091019283015250602601919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061207c90830184611f90565b9695505050505050565b600060208252610f656020830184611f90565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561219a5761219a6122cb565b604052919050565b600067ffffffffffffffff8211156121bc576121bc6122cb565b5060051b60200190565b600082198211156121d9576121d961229f565b500190565b6000826121ed576121ed6122b5565b500490565b6000828210156122045761220461229f565b500390565b60005b8381101561222457818101518382015260200161220c565b838111156106bb5750506000910152565b600181811c9082168061224957607f821691505b6020821081141561226a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156122845761228461229f565b5060010190565b60008261229a5761229a6122b5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b80151581146122ef57600080fd5b50565b6001600160e01b0319811681146122ef57600080fdfea2646970667358221220773152cd1025e700b7464c72ee0a049c8f0cb31add246f346212ba4d8c96ea2a64736f6c634300080300334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000004837a72e5adf08a82775044e6f7f3918767147af000000000000000000000000a39388c49b9cfc6d7710181a3d71d81b9103f3bb00000000000000000000000000000000000000000000000000000000000000074d43533a4172740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d43534100000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063a22cb465116100a2578063d547741f11610071578063d547741f1461040d578063e467f7e014610420578063e985e9c514610433578063f2fde38b14610446576101da565b8063a22cb465146103ad578063b88d4fde146103c0578063c87b56dd146103d3578063d5391393146103e6576101da565b806391d14854116100de57806391d148541461037757806395d89b411461038a5780639bb5c9c314610392578063a217fddf146103a5576101da565b806370a082311461034b578063715018a61461035e5780638da5cb5b14610366576101da565b80632f2ff15d1161017c5780634dd09f331161014b5780634dd09f33146102ff5780634f558e791461031257806355f804b3146103255780636352211e14610338576101da565b80632f2ff15d146102b357806336568abe146102c657806340c10f19146102d957806342842e0e146102ec576101da565b8063095ea7b3116101b8578063095ea7b31461024757806319ee6e3f1461025c57806323b872dd1461026f578063248a9ca314610282576101da565b806301ffc9a7146101df57806306fdde0314610207578063081812fc1461021c575b600080fd5b6101f26101ed366004611f12565b610459565b60405190151581526020015b60405180910390f35b61020f61047b565b6040516101fe9190612086565b61022f61022a366004611ed8565b61050e565b6040516001600160a01b0390911681526020016101fe565b61025a610255366004611d50565b61059b565b005b61025a61026a366004611d79565b6106b1565b61025a61027d366004611c66565b6106c1565b6102a5610290366004611ed8565b60009081526020819052604090206001015490565b6040519081526020016101fe565b61025a6102c1366004611ef0565b6106f2565b61025a6102d4366004611ef0565b610781565b61025a6102e7366004611d50565b6107fb565b61025a6102fa366004611c66565b610890565b600a5461022f906001600160a01b031681565b6101f2610320366004611ed8565b6108ab565b61025a610333366004611f4a565b6108b6565b61022f610346366004611ed8565b6108f3565b6102a5610359366004611c1a565b61096a565b61025a6109f1565b6008546001600160a01b031661022f565b6101f2610385366004611ef0565b610a65565b61020f610a90565b61025a6103a0366004611c1a565b610a9f565b6102a5600081565b61025a6103bb366004611d1a565b610b1d565b61025a6103ce366004611ca1565b610bb4565b61020f6103e1366004611ed8565b610be6565b6102a57f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61025a61041b366004611ef0565b610d51565b61025a61042e366004611dfb565b610dd1565b6101f2610441366004611c34565b610e98565b61025a610454366004611c1a565b610f6c565b600061046482611057565b8061047357506104738261108c565b90505b919050565b60606001805461048a90612235565b80601f01602080910402602001604051908101604052809291908181526020018280546104b690612235565b80156105035780601f106104d857610100808354040283529160200191610503565b820191906000526020600020905b8154815290600101906020018083116104e657829003601f168201915b505050505090505b90565b6000610519826110cc565b61057f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006105a6826108f3565b9050806001600160a01b0316836001600160a01b031614156106145760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610576565b336001600160a01b038216148061063057506106308133610441565b6106a25760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610576565b6106ac83836110e9565b505050565b6106bb84846107fb565b50505050565b6106cb3382611157565b6106e75760405162461bcd60e51b815260040161057690612120565b6106ac838383611219565b60008281526020819052604090206001015461070f905b33610385565b6107735760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526e0818591b5a5b881d1bc819dc985b9d608a1b6064820152608401610576565b61077d82826113b9565b5050565b6001600160a01b03811633146107f15760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610576565b61077d828261143d565b6108257f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610385565b6108865760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d696e74626c653a206d7573742068617665206d696e7465722060448201526b1c9bdb19481d1bc81b5a5b9d60a21b6064820152608401610576565b61077d82826114a2565b6106ac83838360405180602001604052806000815250610bb4565b6000610473826110cc565b6008546001600160a01b031633146108e05760405162461bcd60e51b8152600401610576906120eb565b805161077d906009906020840190611aa3565b6000818152600360205260408120546001600160a01b0316806104735760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610576565b60006001600160a01b0382166109d55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610576565b506001600160a01b031660009081526004602052604090205490565b6008546001600160a01b03163314610a1b5760405162461bcd60e51b8152600401610576906120eb565b6008546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600880546001600160a01b0319169055565b6000828152602081815260408083206001600160a01b038516845290915290205460ff165b92915050565b60606002805461048a90612235565b6008546001600160a01b03163314610ac95760405162461bcd60e51b8152600401610576906120eb565b600a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f12be4820d03362d1f48434d870b2fc1549b3a3d16d891eeaac7c3073f3ded8b79060200160405180910390a150565b600a546001600160a01b031615801590610b375750813b15155b15610baa57600a54604051631b3b02e560e11b81523360048201526001600160a01b03848116602483015283151560448301529091169063367605ca90606401600060405180830381600087803b158015610b9157600080fd5b505af1158015610ba5573d6000803e3d6000fd5b505050505b61077d82826115d5565b610bbe3383611157565b610bda5760405162461bcd60e51b815260040161057690612120565b6106bb848484846116a7565b6060610bf1826110cc565b610c575760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610576565b60008281526007602052604081208054610c7090612235565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9c90612235565b8015610ce95780601f10610cbe57610100808354040283529160200191610ce9565b820191906000526020600020905b815481529060010190602001808311610ccc57829003601f168201915b505050505090506000610cfa6116da565b9050805160001415610d0e57509050610476565b815115610d40578082604051602001610d28929190611fbc565b60405160208183030381529060405292505050610476565b610d49846117b1565b949350505050565b600082815260208190526040902060010154610d6c90610709565b6107f15760405162461bcd60e51b815260206004820152603060248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526f2061646d696e20746f207265766f6b6560801b6064820152608401610576565b8051825114610e225760405162461bcd60e51b815260206004820152601960248201527f696e707574206c656e677468206d7573742062652073616d65000000000000006044820152606401610576565b60005b81518110156106ac57610e86838281518110610e5157634e487b7160e01b600052603260045260246000fd5b6020026020010151838381518110610e7957634e487b7160e01b600052603260045260246000fd5b60200260200101516107fb565b80610e9081612270565b915050610e25565b6001600160a01b0382811660009081526006602090815260408083208585168452909152812054600a54919260ff909116911615610f6557600a546040516346e67e2960e11b81526001600160a01b0386811660048301528581166024830152831515604483015290911690638dccfc529060640160206040518083038186803b158015610f2557600080fd5b505afa158015610f39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5d9190611ebc565b915050610a8a565b9392505050565b6008546001600160a01b03163314610f965760405162461bcd60e51b8152600401610576906120eb565b6001600160a01b038116610ffb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610576565b6008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b03198216637965db0b60e01b148061047357506301ffc9a760e01b6001600160e01b0319831614610473565b60006001600160e01b031982166380ac58cd60e01b14806110bd57506001600160e01b03198216635b5e139f60e01b145b80610473575061047382611057565b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061111e826108f3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611162826110cc565b6111c35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610576565b60006111ce836108f3565b9050806001600160a01b0316846001600160a01b031614806112095750836001600160a01b03166111fe8461050e565b6001600160a01b0316145b80610d495750610d498185610e98565b826001600160a01b031661122c826108f3565b6001600160a01b0316146112945760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610576565b6001600160a01b0382166112f65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610576565b6113016000826110e9565b6001600160a01b038316600090815260046020526040812080546001929061132a9084906121f2565b90915550506001600160a01b03821660009081526004602052604081208054600192906113589084906121c6565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6113c38282610a65565b61077d576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556113f93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6114478282610a65565b1561077d576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b0382166114f85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610576565b611501816110cc565b1561154e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610576565b6001600160a01b03821660009081526004602052604081208054600192906115779084906121c6565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b03821633141561162e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610576565b3360008181526006602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161169b911515815260200190565b60405180910390a35050565b6116b2848484611219565b6116be8484848461187b565b6106bb5760405162461bcd60e51b815260040161057690612099565b60606000600980546116eb90612235565b90501115611785576009805461170090612235565b80601f016020809104026020016040519081016040528092919081815260200182805461172c90612235565b80156117795780601f1061174e57610100808354040283529160200191611779565b820191906000526020600020905b81548152906001019060200180831161175c57829003601f168201915b5050505050905061050b565b61178d610a90565b60405160200161179d9190611feb565b604051602081830303815290604052905090565b60606117bc826110cc565b6118205760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610576565b600061182a6116da565b9050600081511161184a5760405180602001604052806000815250610f65565b8061185484611988565b604051602001611865929190611fbc565b6040516020818303038152906040529392505050565b60006001600160a01b0384163b1561197d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118bf903390899088908890600401612049565b602060405180830381600087803b1580156118d957600080fd5b505af1925050508015611909575060408051601f3d908101601f1916820190925261190691810190611f2e565b60015b611963573d808015611937576040519150601f19603f3d011682016040523d82523d6000602084013e61193c565b606091505b50805161195b5760405162461bcd60e51b815260040161057690612099565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610d49565b506001949350505050565b6060816119ad57506040805180820190915260018152600360fc1b6020820152610476565b8160005b81156119d757806119c181612270565b91506119d09050600a836121de565b91506119b1565b60008167ffffffffffffffff811115611a0057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611a2a576020820181803683370190505b5090505b8415610d4957611a3f6001836121f2565b9150611a4c600a8661228b565b611a579060306121c6565b60f81b818381518110611a7a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611a9c600a866121de565b9450611a2e565b828054611aaf90612235565b90600052602060002090601f016020900481019282611ad15760008555611b17565b82601f10611aea57805160ff1916838001178555611b17565b82800160010185558215611b17579182015b82811115611b17578251825591602001919060010190611afc565b50611b23929150611b27565b5090565b5b80821115611b235760008155600101611b28565b600067ffffffffffffffff831115611b5657611b566122cb565b611b69601f8401601f1916602001612171565b9050828152838383011115611b7d57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461047657600080fd5b600082601f830112611bbb578081fd5b81356020611bd0611bcb836121a2565b612171565b80838252828201915082860187848660051b8901011115611bef578586fd5b855b85811015611c0d57813584529284019290840190600101611bf1565b5090979650505050505050565b600060208284031215611c2b578081fd5b610f6582611b94565b60008060408385031215611c46578081fd5b611c4f83611b94565b9150611c5d60208401611b94565b90509250929050565b600080600060608486031215611c7a578081fd5b611c8384611b94565b9250611c9160208501611b94565b9150604084013590509250925092565b60008060008060808587031215611cb6578081fd5b611cbf85611b94565b9350611ccd60208601611b94565b925060408501359150606085013567ffffffffffffffff811115611cef578182fd5b8501601f81018713611cff578182fd5b611d0e87823560208401611b3c565b91505092959194509250565b60008060408385031215611d2c578182fd5b611d3583611b94565b91506020830135611d45816122e1565b809150509250929050565b60008060408385031215611d62578182fd5b611d6b83611b94565b946020939093013593505050565b60008060008060608587031215611d8e578384fd5b611d9785611b94565b935060208501359250604085013567ffffffffffffffff80821115611dba578384fd5b818701915087601f830112611dcd578384fd5b813581811115611ddb578485fd5b886020828501011115611dec578485fd5b95989497505060200194505050565b60008060408385031215611e0d578182fd5b823567ffffffffffffffff80821115611e24578384fd5b818501915085601f830112611e37578384fd5b81356020611e47611bcb836121a2565b8083825282820191508286018a848660051b8901011115611e66578889fd5b8896505b84871015611e8f57611e7b81611b94565b835260019690960195918301918301611e6a565b5096505086013592505080821115611ea5578283fd5b50611eb285828601611bab565b9150509250929050565b600060208284031215611ecd578081fd5b8151610f65816122e1565b600060208284031215611ee9578081fd5b5035919050565b60008060408385031215611f02578182fd5b82359150611c5d60208401611b94565b600060208284031215611f23578081fd5b8135610f65816122f2565b600060208284031215611f3f578081fd5b8151610f65816122f2565b600060208284031215611f5b578081fd5b813567ffffffffffffffff811115611f71578182fd5b8201601f81018413611f81578182fd5b610d4984823560208401611b3c565b60008151808452611fa8816020860160208601612209565b601f01601f19169290920160200192915050565b60008351611fce818460208801612209565b835190830190611fe2818360208801612209565b01949350505050565b60007f68747470733a2f2f6d657461646174612e6e6674706c75732e696f2f6d657461825264646174612f60d81b60208301528251612031816025850160208701612209565b602f60f81b6025939091019283015250602601919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061207c90830184611f90565b9695505050505050565b600060208252610f656020830184611f90565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561219a5761219a6122cb565b604052919050565b600067ffffffffffffffff8211156121bc576121bc6122cb565b5060051b60200190565b600082198211156121d9576121d961229f565b500190565b6000826121ed576121ed6122b5565b500490565b6000828210156122045761220461229f565b500390565b60005b8381101561222457818101518382015260200161220c565b838111156106bb5750506000910152565b600181811c9082168061224957607f821691505b6020821081141561226a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156122845761228461229f565b5060010190565b60008261229a5761229a6122b5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b80151581146122ef57600080fd5b50565b6001600160e01b0319811681146122ef57600080fdfea2646970667358221220773152cd1025e700b7464c72ee0a049c8f0cb31add246f346212ba4d8c96ea2a64736f6c63430008030033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000004837a72e5adf08a82775044e6f7f3918767147af000000000000000000000000a39388c49b9cfc6d7710181a3d71d81b9103f3bb00000000000000000000000000000000000000000000000000000000000000074d43533a4172740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d43534100000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): MCS:Art
Arg [1] : symbol (string): MCSA
Arg [2] : approvalProxy (address): 0x4837a72E5ADf08A82775044E6F7f3918767147Af
Arg [3] : _owner (address): 0xa39388c49B9CfC6d7710181A3D71D81B9103F3Bb

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000004837a72e5adf08a82775044e6f7f3918767147af
Arg [3] : 000000000000000000000000a39388c49b9cfc6d7710181a3d71d81b9103f3bb
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [5] : 4d43533a41727400000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 4d43534100000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

111612:403:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111243:301;;;;;;:::i;:::-;;:::i;:::-;;;9993:14:1;;9986:22;9968:41;;9956:2;9941:18;111243:301:0;;;;;;;;21614:100;;;:::i;:::-;;;;;;;:::i;23074:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8901:32:1;;;8883:51;;8871:2;8856:18;23074:221:0;8838:102:1;22611:397:0;;;;;;:::i;:::-;;:::i;:::-;;109495:175;;;;;;:::i;:::-;;:::i;23964:305::-;;;;;;:::i;:::-;;:::i;41002:123::-;;;;;;:::i;:::-;41068:7;41095:12;;;;;;;;;;:22;;;;41002:123;;;;10166:25:1;;;10154:2;10139:18;41002:123:0;10121:76:1;41387:232:0;;;;;;:::i;:::-;;:::i;42606:218::-;;;;;;:::i;:::-;;:::i;108906:228::-;;;;;;:::i;:::-;;:::i;24340:151::-;;;;;;:::i;:::-;;:::i;108577:35::-;;;;;-1:-1:-1;;;;;108577:35:0;;;109678:102;;;;;;:::i;:::-;;:::i;109788:::-;;;;;;:::i;:::-;;:::i;21308:239::-;;;;;;:::i;:::-;;:::i;21038:208::-;;;;;;:::i;:::-;;:::i;36182:148::-;;;:::i;35531:87::-;35604:6;;-1:-1:-1;;;;;35604:6:0;35531:87;;40674:139;;;;;;:::i;:::-;;:::i;21783:104::-;;;:::i;110288:153::-;;;;;;:::i;:::-;;:::i;39130:49::-;;39175:4;39130:49;;110449:394;;;;;;:::i;:::-;;:::i;24562:285::-;;;;;;:::i;:::-;;:::i;32929:679::-;;;;;;:::i;:::-;;:::i;108477:62::-;;108515:24;108477:62;;41864:235;;;;;;:::i;:::-;;:::i;109142:345::-;;;;;;:::i;:::-;;:::i;110851:384::-;;;;;;:::i;:::-;;:::i;36485:244::-;;;;;;:::i;:::-;;:::i;111243:301::-;111396:4;111438:44;111470:11;111438:31;:44::i;:::-;:98;;;;111499:37;111524:11;111499:24;:37::i;:::-;111418:118;;111243:301;;;;:::o;21614:100::-;21668:13;21701:5;21694:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21614:100;;:::o;23074:221::-;23150:7;23178:16;23186:7;23178;:16::i;:::-;23170:73;;;;-1:-1:-1;;;23170:73:0;;16072:2:1;23170:73:0;;;16054:21:1;16111:2;16091:18;;;16084:30;16150:34;16130:18;;;16123:62;-1:-1:-1;;;16201:18:1;;;16194:42;16253:19;;23170:73:0;;;;;;;;;-1:-1:-1;23263:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23263:24:0;;23074:221::o;22611:397::-;22692:13;22708:23;22723:7;22708:14;:23::i;:::-;22692:39;;22756:5;-1:-1:-1;;;;;22750:11:0;:2;-1:-1:-1;;;;;22750:11:0;;;22742:57;;;;-1:-1:-1;;;22742:57:0;;17672:2:1;22742:57:0;;;17654:21:1;17711:2;17691:18;;;17684:30;17750:34;17730:18;;;17723:62;-1:-1:-1;;;17801:18:1;;;17794:31;17842:19;;22742:57:0;17644:223:1;22742:57:0;16012:10;-1:-1:-1;;;;;22820:21:0;;;;:62;;-1:-1:-1;22845:37:0;22862:5;16012:10;22869:12;15932:98;22845:37;22812:154;;;;-1:-1:-1;;;22812:154:0;;14047:2:1;22812:154:0;;;14029:21:1;14086:2;14066:18;;;14059:30;14125:34;14105:18;;;14098:62;14196:26;14176:18;;;14169:54;14240:19;;22812:154:0;14019:246:1;22812:154:0;22979:21;22988:2;22992:7;22979:8;:21::i;:::-;22611:397;;;:::o;109495:175::-;109645:17;109650:2;109654:7;109645:4;:17::i;:::-;109495:175;;;;:::o;23964:305::-;24125:41;16012:10;24158:7;24125:18;:41::i;:::-;24117:103;;;;-1:-1:-1;;;24117:103:0;;;;;;;:::i;:::-;24233:28;24243:4;24249:2;24253:7;24233:9;:28::i;41387:232::-;41068:7;41095:12;;;;;;;;;;:22;;;41480:41;;41488:18;16012:10;41508:12;15932:98;41480:41;41472:101;;;;-1:-1:-1;;;41472:101:0;;10859:2:1;41472:101:0;;;10841:21:1;10898:2;10878:18;;;10871:30;10937:34;10917:18;;;10910:62;-1:-1:-1;;;10988:18:1;;;10981:45;11043:19;;41472:101:0;10831:237:1;41472:101:0;41586:25;41597:4;41603:7;41586:10;:25::i;:::-;41387:232;;:::o;42606:218::-;-1:-1:-1;;;;;42702:23:0;;16012:10;42702:23;42694:83;;;;-1:-1:-1;;;42694:83:0;;19259:2:1;42694:83:0;;;19241:21:1;19298:2;19278:18;;;19271:30;19337:34;19317:18;;;19310:62;-1:-1:-1;;;19388:18:1;;;19381:45;19443:19;;42694:83:0;19231:237:1;42694:83:0;42790:26;42802:4;42808:7;42790:11;:26::i;108906:228::-;108989:34;108515:24;16012:10;109010:12;15932:98;108989:34;108967:128;;;;-1:-1:-1;;;108967:128:0;;18846:2:1;108967:128:0;;;18828:21:1;18885:2;18865:18;;;18858:30;18924:34;18904:18;;;18897:62;-1:-1:-1;;;18975:18:1;;;18968:42;19027:19;;108967:128:0;18818:234:1;108967:128:0;109108:18;109114:2;109118:7;109108:5;:18::i;24340:151::-;24444:39;24461:4;24467:2;24471:7;24444:39;;;;;;;;;;;;:16;:39::i;109678:102::-;109732:4;109756:16;109764:7;109756;:16::i;109788:102::-;35604:6;;-1:-1:-1;;;;;35604:6:0;16012:10;35751:23;35743:68;;;;-1:-1:-1;;;35743:68:0;;;;;;;:::i;:::-;109863:19;;::::1;::::0;:7:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;21308:239::-:0;21380:7;21416:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21416:16:0;21451:19;21443:73;;;;-1:-1:-1;;;21443:73:0;;14883:2:1;21443:73:0;;;14865:21:1;14922:2;14902:18;;;14895:30;14961:34;14941:18;;;14934:62;-1:-1:-1;;;15012:18:1;;;15005:39;15061:19;;21443:73:0;14855:231:1;21038:208:0;21110:7;-1:-1:-1;;;;;21138:19:0;;21130:74;;;;-1:-1:-1;;;21130:74:0;;14472:2:1;21130:74:0;;;14454:21:1;14511:2;14491:18;;;14484:30;14550:34;14530:18;;;14523:62;-1:-1:-1;;;14601:18:1;;;14594:40;14651:19;;21130:74:0;14444:232:1;21130:74:0;-1:-1:-1;;;;;;21222:16:0;;;;;:9;:16;;;;;;;21038:208::o;36182:148::-;35604:6;;-1:-1:-1;;;;;35604:6:0;16012:10;35751:23;35743:68;;;;-1:-1:-1;;;35743:68:0;;;;;;;:::i;:::-;36273:6:::1;::::0;36252:40:::1;::::0;36289:1:::1;::::0;-1:-1:-1;;;;;36273:6:0::1;::::0;36252:40:::1;::::0;36289:1;;36252:40:::1;36303:6;:19:::0;;-1:-1:-1;;;;;;36303:19:0::1;::::0;;36182:148::o;40674:139::-;40752:4;40776:12;;;;;;;;;;;-1:-1:-1;;;;;40776:29:0;;;;;;;;;;;;40674:139;;;;;:::o;21783:104::-;21839:13;21872:7;21865:14;;;;;:::i;110288:153::-;35604:6;;-1:-1:-1;;;;;35604:6:0;16012:10;35751:23;35743:68;;;;-1:-1:-1;;;35743:68:0;;;;;;;:::i;:::-;110356:13:::1;:36:::0;;-1:-1:-1;;;;;;110356:36:0::1;-1:-1:-1::0;;;;;110356:36:0;::::1;::::0;;::::1;::::0;;;110408:25:::1;::::0;8883:51:1;;;110408:25:0::1;::::0;8871:2:1;8856:18;110408:25:0::1;;;;;;;110288:153:::0;:::o;110449:394::-;110603:13;;-1:-1:-1;;;;;110603:13:0;110595:38;;;;:83;;-1:-1:-1;8402:20:0;;8441:8;;110650:28;110577:204;;;110705:13;;:64;;-1:-1:-1;;;110705:64:0;;110737:10;110705:64;;;9179:34:1;-1:-1:-1;;;;;9249:15:1;;;9229:18;;;9222:43;9308:14;;9301:22;9281:18;;;9274:50;110705:13:0;;;;:31;;9114:18:1;;110705:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;110577:204;110791:44;110815:8;110825:9;110791:23;:44::i;24562:285::-;24694:41;16012:10;24727:7;24694:18;:41::i;:::-;24686:103;;;;-1:-1:-1;;;24686:103:0;;;;;;;:::i;:::-;24800:39;24814:4;24820:2;24824:7;24833:5;24800:13;:39::i;32929:679::-;33002:13;33036:16;33044:7;33036;:16::i;:::-;33028:78;;;;-1:-1:-1;;;33028:78:0;;15654:2:1;33028:78:0;;;15636:21:1;15693:2;15673:18;;;15666:30;15732:34;15712:18;;;15705:62;-1:-1:-1;;;15783:18:1;;;15776:47;15840:19;;33028:78:0;15626:239:1;33028:78:0;33119:23;33145:19;;;:10;:19;;;;;33119:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33175:18;33196:10;:8;:10::i;:::-;33175:31;;33288:4;33282:18;33304:1;33282:23;33278:72;;;-1:-1:-1;33329:9:0;-1:-1:-1;33322:16:0;;33278:72;33454:23;;:27;33450:108;;33529:4;33535:9;33512:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33498:48;;;;;;33450:108;33577:23;33592:7;33577:14;:23::i;:::-;33570:30;32929:679;-1:-1:-1;;;;32929:679:0:o;41864:235::-;41068:7;41095:12;;;;;;;;;;:22;;;41958:41;;41966:18;41002:123;41958:41;41950:102;;;;-1:-1:-1;;;41950:102:0;;13630:2:1;41950:102:0;;;13612:21:1;13669:2;13649:18;;;13642:30;13708:34;13688:18;;;13681:62;-1:-1:-1;;;13759:18:1;;;13752:46;13815:19;;41950:102:0;13602:238:1;109142:345:0;109287:12;:19;109269:7;:14;:37;109247:112;;;;-1:-1:-1;;;109247:112:0;;18492:2:1;109247:112:0;;;18474:21:1;18531:2;18511:18;;;18504:30;18570:27;18550:18;;;18543:55;18615:18;;109247:112:0;18464:175:1;109247:112:0;109375:9;109370:110;109394:12;:19;109390:1;:23;109370:110;;;109435:33;109440:7;109448:1;109440:10;;;;;;-1:-1:-1;;;109440:10:0;;;;;;;;;;;;;;;109452:12;109465:1;109452:15;;;;;;-1:-1:-1;;;109452:15:0;;;;;;;;;;;;;;;109435:4;:33::i;:::-;109415:3;;;;:::i;:::-;;;;109370:110;;110851:384;-1:-1:-1;;;;;23854:25:0;;;110977:4;23854:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;111078:13;;110977:4;;23854:35;;;;;111078:13;111070:38;111066:136;;111132:13;;:58;;-1:-1:-1;;;111132:58:0;;-1:-1:-1;;;;;9197:15:1;;;111132:58:0;;;9179:34:1;9249:15;;;9229:18;;;9222:43;9308:14;;9301:22;9281:18;;;9274:50;111132:13:0;;;;:30;;9114:18:1;;111132:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;111125:65;;;;;111066:136;111219:8;110851:384;-1:-1:-1;;;110851:384:0:o;36485:244::-;35604:6;;-1:-1:-1;;;;;35604:6:0;16012:10;35751:23;35743:68;;;;-1:-1:-1;;;35743:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36574:22:0;::::1;36566:73;;;::::0;-1:-1:-1;;;36566:73:0;;11694:2:1;36566:73:0::1;::::0;::::1;11676:21:1::0;11733:2;11713:18;;;11706:30;11772:34;11752:18;;;11745:62;-1:-1:-1;;;11823:18:1;;;11816:36;11869:19;;36566:73:0::1;11666:228:1::0;36566:73:0::1;36676:6;::::0;36655:38:::1;::::0;-1:-1:-1;;;;;36655:38:0;;::::1;::::0;36676:6:::1;::::0;36655:38:::1;::::0;36676:6:::1;::::0;36655:38:::1;36704:6;:17:::0;;-1:-1:-1;;;;;;36704:17:0::1;-1:-1:-1::0;;;;;36704:17:0;;;::::1;::::0;;;::::1;::::0;;36485:244::o;40365:217::-;40450:4;-1:-1:-1;;;;;;40474:47:0;;-1:-1:-1;;;40474:47:0;;:100;;-1:-1:-1;;;;;;;;;;19277:40:0;;;40538:36;19168:157;20682:292;20784:4;-1:-1:-1;;;;;;20808:40:0;;-1:-1:-1;;;20808:40:0;;:105;;-1:-1:-1;;;;;;;20865:48:0;;-1:-1:-1;;;20865:48:0;20808:105;:158;;;;20930:36;20954:11;20930:23;:36::i;26314:127::-;26379:4;26403:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26403:16:0;:30;;;26314:127::o;30191:174::-;30266:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30266:29:0;-1:-1:-1;;;;;30266:29:0;;;;;;;;:24;;30320:23;30266:24;30320:14;:23::i;:::-;-1:-1:-1;;;;;30311:46:0;;;;;;;;;;;30191:174;;:::o;26608:348::-;26701:4;26726:16;26734:7;26726;:16::i;:::-;26718:73;;;;-1:-1:-1;;;26718:73:0;;13217:2:1;26718:73:0;;;13199:21:1;13256:2;13236:18;;;13229:30;13295:34;13275:18;;;13268:62;-1:-1:-1;;;13346:18:1;;;13339:42;13398:19;;26718:73:0;13189:234:1;26718:73:0;26802:13;26818:23;26833:7;26818:14;:23::i;:::-;26802:39;;26871:5;-1:-1:-1;;;;;26860:16:0;:7;-1:-1:-1;;;;;26860:16:0;;:51;;;;26904:7;-1:-1:-1;;;;;26880:31:0;:20;26892:7;26880:11;:20::i;:::-;-1:-1:-1;;;;;26880:31:0;;26860:51;:87;;;;26915:32;26932:5;26939:7;26915:16;:32::i;29529:544::-;29654:4;-1:-1:-1;;;;;29627:31:0;:23;29642:7;29627:14;:23::i;:::-;-1:-1:-1;;;;;29627:31:0;;29619:85;;;;-1:-1:-1;;;29619:85:0;;16846:2:1;29619:85:0;;;16828:21:1;16885:2;16865:18;;;16858:30;16924:34;16904:18;;;16897:62;-1:-1:-1;;;16975:18:1;;;16968:39;17024:19;;29619:85:0;16818:231:1;29619:85:0;-1:-1:-1;;;;;29723:16:0;;29715:65;;;;-1:-1:-1;;;29715:65:0;;12458:2:1;29715:65:0;;;12440:21:1;12497:2;12477:18;;;12470:30;12536:34;12516:18;;;12509:62;-1:-1:-1;;;12587:18:1;;;12580:34;12631:19;;29715:65:0;12430:226:1;29715:65:0;29897:29;29914:1;29918:7;29897:8;:29::i;:::-;-1:-1:-1;;;;;29939:15:0;;;;;;:9;:15;;;;;:20;;29958:1;;29939:15;:20;;29958:1;;29939:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29970:13:0;;;;;;:9;:13;;;;;:18;;29987:1;;29970:13;:18;;29987:1;;29970:18;:::i;:::-;;;;-1:-1:-1;;29999:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29999:21:0;-1:-1:-1;;;;;29999:21:0;;;;;;;;;30038:27;;29999:16;;30038:27;;;;;;;29529:544;;;:::o;43854:229::-;43929:22;43937:4;43943:7;43929;:22::i;:::-;43924:152;;43968:6;:12;;;;;;;;;;;-1:-1:-1;;;;;43968:29:0;;;;;;;;;:36;;-1:-1:-1;;43968:36:0;44000:4;43968:36;;;44051:12;16012:10;15932:98;;44051:12;-1:-1:-1;;;;;44024:40:0;44042:7;-1:-1:-1;;;;;44024:40:0;44036:4;44024:40;;;;;;;;;;43854:229;;:::o;44091:230::-;44166:22;44174:4;44180:7;44166;:22::i;:::-;44162:152;;;44237:5;44205:12;;;;;;;;;;;-1:-1:-1;;;;;44205:29:0;;;;;;;;;;:37;;-1:-1:-1;;44205:37:0;;;44262:40;16012:10;;44205:12;;44262:40;;44237:5;44262:40;44091:230;;:::o;28221:382::-;-1:-1:-1;;;;;28301:16:0;;28293:61;;;;-1:-1:-1;;;28293:61:0;;15293:2:1;28293:61:0;;;15275:21:1;;;15312:18;;;15305:30;15371:34;15351:18;;;15344:62;15423:18;;28293:61:0;15265:182:1;28293:61:0;28374:16;28382:7;28374;:16::i;:::-;28373:17;28365:58;;;;-1:-1:-1;;;28365:58:0;;12101:2:1;28365:58:0;;;12083:21:1;12140:2;12120:18;;;12113:30;12179;12159:18;;;12152:58;12227:18;;28365:58:0;12073:178:1;28365:58:0;-1:-1:-1;;;;;28494:13:0;;;;;;:9;:13;;;;;:18;;28511:1;;28494:13;:18;;28511:1;;28494:18;:::i;:::-;;;;-1:-1:-1;;28523:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28523:21:0;-1:-1:-1;;;;;28523:21:0;;;;;;;;28562:33;;28523:16;;;28562:33;;28523:16;;28562:33;28221:382;;:::o;23367:295::-;-1:-1:-1;;;;;23470:24:0;;16012:10;23470:24;;23462:62;;;;-1:-1:-1;;;23462:62:0;;12863:2:1;23462:62:0;;;12845:21:1;12902:2;12882:18;;;12875:30;12941:27;12921:18;;;12914:55;12986:18;;23462:62:0;12835:175:1;23462:62:0;16012:10;23537:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23537:42:0;;;;;;;;;;:53;;-1:-1:-1;;23537:53:0;;;;;;;:42;-1:-1:-1;;;;;23606:48:0;;23645:8;23606:48;;;;9993:14:1;9986:22;9968:41;;9956:2;9941:18;;9923:92;23606:48:0;;;;;;;;23367:295;;:::o;25729:272::-;25843:28;25853:4;25859:2;25863:7;25843:9;:28::i;:::-;25890:48;25913:4;25919:2;25923:7;25932:5;25890:22;:48::i;:::-;25882:111;;;;-1:-1:-1;;;25882:111:0;;;;;;;:::i;109898:382::-;109950:13;110004:1;109986:7;109980:21;;;;;:::i;:::-;;;:25;109976:72;;;110029:7;110022:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109976:72;110204:8;:6;:8::i;:::-;110103:154;;;;;;;;:::i;:::-;;;;;;;;;;;;;110058:214;;109898:382;:::o;21958:360::-;22031:13;22065:16;22073:7;22065;:16::i;:::-;22057:76;;;;-1:-1:-1;;;22057:76:0;;17256:2:1;22057:76:0;;;17238:21:1;17295:2;17275:18;;;17268:30;17334:34;17314:18;;;17307:62;-1:-1:-1;;;17385:18:1;;;17378:45;17440:19;;22057:76:0;17228:237:1;22057:76:0;22146:21;22170:10;:8;:10::i;:::-;22146:34;;22222:1;22204:7;22198:21;:25;:112;;;;;;;;;;;;;;;;;22263:7;22272:18;:7;:16;:18::i;:::-;22246:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22191:119;21958:360;-1:-1:-1;;;21958:360:0:o;30930:843::-;31051:4;-1:-1:-1;;;;;31077:13:0;;8402:20;8441:8;31073:693;;31113:72;;-1:-1:-1;;;31113:72:0;;-1:-1:-1;;;;;31113:36:0;;;;;:72;;16012:10;;31164:4;;31170:7;;31179:5;;31113:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31113:72:0;;;;;;;;-1:-1:-1;;31113:72:0;;;;;;;;;;;;:::i;:::-;;;31109:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31359:13:0;;31355:341;;31402:60;;-1:-1:-1;;;31402:60:0;;;;;;;:::i;31355:341::-;31646:6;31640:13;31631:6;31627:2;31623:15;31616:38;31109:602;-1:-1:-1;;;;;;31236:55:0;-1:-1:-1;;;31236:55:0;;-1:-1:-1;31229:62:0;;31073:693;-1:-1:-1;31750:4:0;30930:843;;;;;;:::o;16601:723::-;16657:13;16878:10;16874:53;;-1:-1:-1;16905:10:0;;;;;;;;;;;;-1:-1:-1;;;16905:10:0;;;;;;16874:53;16952:5;16937:12;16993:78;17000:9;;16993:78;;17026:8;;;;:::i;:::-;;-1:-1:-1;17049:10:0;;-1:-1:-1;17057:2:0;17049:10;;:::i;:::-;;;16993:78;;;17081:19;17113:6;17103:17;;;;;;-1:-1:-1;;;17103:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17103:17:0;;17081:39;;17131:154;17138:10;;17131:154;;17165:11;17175:1;17165:11;;:::i;:::-;;-1:-1:-1;17234:10:0;17242:2;17234:5;:10;:::i;:::-;17221:24;;:2;:24;:::i;:::-;17208:39;;17191:6;17198;17191:14;;;;;;-1:-1:-1;;;17191:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17191:56:0;;;;;;;;-1:-1:-1;17262:11:0;17271:2;17262:11;;:::i;:::-;;;17131:154;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:2;;588:1;585;578:12;603:693;;710:3;703:4;695:6;691:17;687:27;677:2;;732:5;725;718:20;677:2;772:6;759:20;798:4;822:60;838:43;878:2;838:43;:::i;:::-;822:60;:::i;:::-;904:3;928:2;923:3;916:15;956:2;951:3;947:12;940:19;;991:2;983:6;979:15;1043:3;1038:2;1032;1029:1;1025:10;1017:6;1013:23;1009:32;1006:41;1003:2;;;1064:5;1057;1050:20;1003:2;1090:5;1104:163;1118:2;1115:1;1112:9;1104:163;;;1175:17;;1163:30;;1213:12;;;;1245;;;;1136:1;1129:9;1104:163;;;-1:-1:-1;1285:5:1;;667:629;-1:-1:-1;;;;;;;667:629:1:o;1301:196::-;;1413:2;1401:9;1392:7;1388:23;1384:32;1381:2;;;1434:6;1426;1419:22;1381:2;1462:29;1481:9;1462:29;:::i;1502:270::-;;;1631:2;1619:9;1610:7;1606:23;1602:32;1599:2;;;1652:6;1644;1637:22;1599:2;1680:29;1699:9;1680:29;:::i;:::-;1670:39;;1728:38;1762:2;1751:9;1747:18;1728:38;:::i;:::-;1718:48;;1589:183;;;;;:::o;1777:338::-;;;;1923:2;1911:9;1902:7;1898:23;1894:32;1891:2;;;1944:6;1936;1929:22;1891:2;1972:29;1991:9;1972:29;:::i;:::-;1962:39;;2020:38;2054:2;2043:9;2039:18;2020:38;:::i;:::-;2010:48;;2105:2;2094:9;2090:18;2077:32;2067:42;;1881:234;;;;;:::o;2120:696::-;;;;;2292:3;2280:9;2271:7;2267:23;2263:33;2260:2;;;2314:6;2306;2299:22;2260:2;2342:29;2361:9;2342:29;:::i;:::-;2332:39;;2390:38;2424:2;2413:9;2409:18;2390:38;:::i;:::-;2380:48;;2475:2;2464:9;2460:18;2447:32;2437:42;;2530:2;2519:9;2515:18;2502:32;2557:18;2549:6;2546:30;2543:2;;;2594:6;2586;2579:22;2543:2;2622:22;;2675:4;2667:13;;2663:27;-1:-1:-1;2653:2:1;;2709:6;2701;2694:22;2653:2;2737:73;2802:7;2797:2;2784:16;2779:2;2775;2771:11;2737:73;:::i;:::-;2727:83;;;2250:566;;;;;;;:::o;2821:325::-;;;2947:2;2935:9;2926:7;2922:23;2918:32;2915:2;;;2968:6;2960;2953:22;2915:2;2996:29;3015:9;2996:29;:::i;:::-;2986:39;;3075:2;3064:9;3060:18;3047:32;3088:28;3110:5;3088:28;:::i;:::-;3135:5;3125:15;;;2905:241;;;;;:::o;3151:264::-;;;3280:2;3268:9;3259:7;3255:23;3251:32;3248:2;;;3301:6;3293;3286:22;3248:2;3329:29;3348:9;3329:29;:::i;:::-;3319:39;3405:2;3390:18;;;;3377:32;;-1:-1:-1;;;3238:177:1:o;3420:783::-;;;;;3585:2;3573:9;3564:7;3560:23;3556:32;3553:2;;;3606:6;3598;3591:22;3553:2;3634:29;3653:9;3634:29;:::i;:::-;3624:39;;3710:2;3699:9;3695:18;3682:32;3672:42;;3765:2;3754:9;3750:18;3737:32;3788:18;3829:2;3821:6;3818:14;3815:2;;;3850:6;3842;3835:22;3815:2;3893:6;3882:9;3878:22;3868:32;;3938:7;3931:4;3927:2;3923:13;3919:27;3909:2;;3965:6;3957;3950:22;3909:2;4010;3997:16;4036:2;4028:6;4025:14;4022:2;;;4057:6;4049;4042:22;4022:2;4107:7;4102:2;4093:6;4089:2;4085:15;4081:24;4078:37;4075:2;;;4133:6;4125;4118:22;4075:2;3543:660;;;;-1:-1:-1;;4169:2:1;4161:11;;-1:-1:-1;;;3543:660:1:o;4208:1212::-;;;4387:2;4375:9;4366:7;4362:23;4358:32;4355:2;;;4408:6;4400;4393:22;4355:2;4453:9;4440:23;4482:18;4523:2;4515:6;4512:14;4509:2;;;4544:6;4536;4529:22;4509:2;4587:6;4576:9;4572:22;4562:32;;4632:7;4625:4;4621:2;4617:13;4613:27;4603:2;;4659:6;4651;4644:22;4603:2;4700;4687:16;4722:4;4746:60;4762:43;4802:2;4762:43;:::i;4746:60::-;4828:3;4852:2;4847:3;4840:15;4880:2;4875:3;4871:12;4864:19;;4911:2;4907;4903:11;4959:7;4954:2;4948;4945:1;4941:10;4937:2;4933:19;4929:28;4926:41;4923:2;;;4985:6;4977;4970:22;4923:2;5012:6;5003:15;;5027:169;5041:2;5038:1;5035:9;5027:169;;;5098:23;5117:3;5098:23;:::i;:::-;5086:36;;5059:1;5052:9;;;;;5142:12;;;;5174;;5027:169;;;-1:-1:-1;5215:5:1;-1:-1:-1;;5258:18:1;;5245:32;;-1:-1:-1;;5289:16:1;;;5286:2;;;5323:6;5315;5308:22;5286:2;;5351:63;5406:7;5395:8;5384:9;5380:24;5351:63;:::i;:::-;5341:73;;;4345:1075;;;;;:::o;5425:255::-;;5545:2;5533:9;5524:7;5520:23;5516:32;5513:2;;;5566:6;5558;5551:22;5513:2;5603:9;5597:16;5622:28;5644:5;5622:28;:::i;5685:190::-;;5797:2;5785:9;5776:7;5772:23;5768:32;5765:2;;;5818:6;5810;5803:22;5765:2;-1:-1:-1;5846:23:1;;5755:120;-1:-1:-1;5755:120:1:o;5880:264::-;;;6009:2;5997:9;5988:7;5984:23;5980:32;5977:2;;;6030:6;6022;6015:22;5977:2;6071:9;6058:23;6048:33;;6100:38;6134:2;6123:9;6119:18;6100:38;:::i;6149:255::-;;6260:2;6248:9;6239:7;6235:23;6231:32;6228:2;;;6281:6;6273;6266:22;6228:2;6325:9;6312:23;6344:30;6368:5;6344:30;:::i;6409:259::-;;6531:2;6519:9;6510:7;6506:23;6502:32;6499:2;;;6552:6;6544;6537:22;6499:2;6589:9;6583:16;6608:30;6632:5;6608:30;:::i;6673:480::-;;6795:2;6783:9;6774:7;6770:23;6766:32;6763:2;;;6816:6;6808;6801:22;6763:2;6861:9;6848:23;6894:18;6886:6;6883:30;6880:2;;;6931:6;6923;6916:22;6880:2;6959:22;;7012:4;7004:13;;7000:27;-1:-1:-1;6990:2:1;;7046:6;7038;7031:22;6990:2;7074:73;7139:7;7134:2;7121:16;7116:2;7112;7108:11;7074:73;:::i;7353:257::-;;7432:5;7426:12;7459:6;7454:3;7447:19;7475:63;7531:6;7524:4;7519:3;7515:14;7508:4;7501:5;7497:16;7475:63;:::i;:::-;7592:2;7571:15;-1:-1:-1;;7567:29:1;7558:39;;;;7599:4;7554:50;;7402:208;-1:-1:-1;;7402:208:1:o;7615:470::-;;7832:6;7826:13;7848:53;7894:6;7889:3;7882:4;7874:6;7870:17;7848:53;:::i;:::-;7964:13;;7923:16;;;;7986:57;7964:13;7923:16;8020:4;8008:17;;7986:57;:::i;:::-;8059:20;;7802:283;-1:-1:-1;;;;7802:283:1:o;8090:642::-;;8453:34;8448:3;8441:47;-1:-1:-1;;;8513:2:1;8508:3;8504:12;8497:29;8555:6;8549:13;8571:60;8624:6;8619:2;8614:3;8610:12;8605:2;8597:6;8593:15;8571:60;:::i;:::-;-1:-1:-1;;;8690:2:1;8650:16;;;;8682:11;;;8675:24;-1:-1:-1;8723:2:1;8715:11;;8431:301;-1:-1:-1;8431:301:1:o;9335:488::-;-1:-1:-1;;;;;9604:15:1;;;9586:34;;9656:15;;9651:2;9636:18;;9629:43;9703:2;9688:18;;9681:34;;;9751:3;9746:2;9731:18;;9724:31;;;9335:488;;9772:45;;9797:19;;9789:6;9772:45;:::i;:::-;9764:53;9538:285;-1:-1:-1;;;;;;9538:285:1:o;10433:219::-;;10582:2;10571:9;10564:21;10602:44;10642:2;10631:9;10627:18;10619:6;10602:44;:::i;11073:414::-;11275:2;11257:21;;;11314:2;11294:18;;;11287:30;11353:34;11348:2;11333:18;;11326:62;-1:-1:-1;;;11419:2:1;11404:18;;11397:48;11477:3;11462:19;;11247:240::o;16283:356::-;16485:2;16467:21;;;16504:18;;;16497:30;16563:34;16558:2;16543:18;;16536:62;16630:2;16615:18;;16457:182::o;17872:413::-;18074:2;18056:21;;;18113:2;18093:18;;;18086:30;18152:34;18147:2;18132:18;;18125:62;-1:-1:-1;;;18218:2:1;18203:18;;18196:47;18275:3;18260:19;;18046:239::o;19655:275::-;19726:2;19720:9;19791:2;19772:13;;-1:-1:-1;;19768:27:1;19756:40;;19826:18;19811:34;;19847:22;;;19808:62;19805:2;;;19873:18;;:::i;:::-;19909:2;19902:22;19700:230;;-1:-1:-1;19700:230:1:o;19935:183::-;;20028:18;20020:6;20017:30;20014:2;;;20050:18;;:::i;:::-;-1:-1:-1;20095:1:1;20091:14;20107:4;20087:25;;20004:114::o;20123:128::-;;20194:1;20190:6;20187:1;20184:13;20181:2;;;20200:18;;:::i;:::-;-1:-1:-1;20236:9:1;;20171:80::o;20256:120::-;;20322:1;20312:2;;20327:18;;:::i;:::-;-1:-1:-1;20361:9:1;;20302:74::o;20381:125::-;;20449:1;20446;20443:8;20440:2;;;20454:18;;:::i;:::-;-1:-1:-1;20491:9:1;;20430:76::o;20511:258::-;20583:1;20593:113;20607:6;20604:1;20601:13;20593:113;;;20683:11;;;20677:18;20664:11;;;20657:39;20629:2;20622:10;20593:113;;;20724:6;20721:1;20718:13;20715:2;;;-1:-1:-1;;20759:1:1;20741:16;;20734:27;20564:205::o;20774:380::-;20853:1;20849:12;;;;20896;;;20917:2;;20971:4;20963:6;20959:17;20949:27;;20917:2;21024;21016:6;21013:14;20993:18;20990:38;20987:2;;;21070:10;21065:3;21061:20;21058:1;21051:31;21105:4;21102:1;21095:15;21133:4;21130:1;21123:15;20987:2;;20829:325;;;:::o;21159:135::-;;-1:-1:-1;;21219:17:1;;21216:2;;;21239:18;;:::i;:::-;-1:-1:-1;21286:1:1;21275:13;;21206:88::o;21299:112::-;;21357:1;21347:2;;21362:18;;:::i;:::-;-1:-1:-1;21396:9:1;;21337:74::o;21416:127::-;21477:10;21472:3;21468:20;21465:1;21458:31;21508:4;21505:1;21498:15;21532:4;21529:1;21522:15;21548:127;21609:10;21604:3;21600:20;21597:1;21590:31;21640:4;21637:1;21630:15;21664:4;21661:1;21654:15;21680:127;21741:10;21736:3;21732:20;21729:1;21722:31;21772:4;21769:1;21762:15;21796:4;21793:1;21786:15;21812:118;21898:5;21891:13;21884:21;21877:5;21874:32;21864:2;;21920:1;21917;21910:12;21864:2;21854:76;:::o;21935:131::-;-1:-1:-1;;;;;;22009:32:1;;21999:43;;21989:2;;22056:1;22053;22046:12

Swarm Source

ipfs://773152cd1025e700b7464c72ee0a049c8f0cb31add246f346212ba4d8c96ea2a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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