ETH Price: $3,308.66 (-3.02%)
Gas: 22 Gwei

Token

Art For N (ARTN)
 

Overview

Max Total Supply

6,068 ARTN

Holders

2,165

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ARTN
0x17a1615422fde0daaa329944080e6ac66168f7e9
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:
ArtForN

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-06
*/

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

// File @openzeppelin/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/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/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/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/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;
    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');

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

  /**
   * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
   */
  function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
    bytes memory buffer = new bytes(2 * length + 2);
    buffer[0] = '0';
    buffer[1] = 'x';
    for (uint256 i = 2 * length + 1; i > 1; --i) {
      buffer[i] = _HEX_SYMBOLS[value & 0xf];
      value >>= 4;
    }
    require(value == 0, 'Strings: hex length insufficient');
    return string(buffer);
  }
}

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

  /**
   * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
   * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
   * by default, can be 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.onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert('ERC721: transfer to non ERC721Receiver implementer');
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

  /**
   * @dev Hook that is called before any token transfer. This includes minting
   * and burning.
   *
   * Calling conditions:
   *
   * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
   * transferred to `to`.
   * - When `from` is zero, `tokenId` will be minted for `to`.
   * - When `to` is zero, ``from``'s `tokenId` will be burned.
   * - `from` cannot be the zero address.
   * - `to` cannot be the zero address.
   *
   * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
   */
  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 tokenId
  ) internal virtual override {
    super._beforeTokenTransfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

// File @openzeppelin/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() {
    _setOwner(_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 {
    _setOwner(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');
    _setOwner(newOwner);
  }

  function _setOwner(address newOwner) private {
    address oldOwner = _owner;
    _owner = newOwner;
    emit OwnershipTransferred(oldOwner, newOwner);
  }
}

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

pragma solidity ^0.8.0;

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

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

  uint256 private _status;

  constructor() {
    _status = _NOT_ENTERED;
  }

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

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

    _;

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

// File contracts/ArtForN.sol

pragma solidity ^0.8.4;

interface NInterface {
  function ownerOf(uint256 tokenId) external view returns (address owner);
}

contract ArtForN is ERC721Enumerable, Ownable, ReentrancyGuard {
  using Address for address;

  address public nAddress = 0x05a46f1E545526FB803FF974C790aCeA34D1f2D6;
  NInterface nContract = NInterface(nAddress);

  bool public presaleActive = false;
  bool public publicSaleActive = false;

  uint256 public presalePrice = 0.015 ether;
  uint256 public publicPrice = 0.05 ether;

  string public baseTokenURI;

  constructor(string memory _newBaseURI) ERC721('Art For N', 'ARTN') {
    setBaseURI(_newBaseURI);
  }

  // Override so the openzeppelin tokenURI() method will use this method to create the full tokenURI instead
  function _baseURI() internal view virtual override returns (string memory) {
    return baseTokenURI;
  }

  // See which address owns which tokens
  function tokensOfOwner(address _ownerAddress) public view returns (uint256[] memory) {
    uint256 tokenCount = balanceOf(_ownerAddress);
    uint256[] memory tokenIds = new uint256[](tokenCount);
    for (uint256 i; i < tokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_ownerAddress, i);
    }
    return tokenIds;
  }

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

    return super.tokenURI(tokenId);
  }

  // Exclusive presale minting with N
  function mintWithN(uint256 _nId) public payable nonReentrant {
    require(presaleActive, 'Presale not started');
    require(msg.value == presalePrice, 'Wrong amount of ETH sent');
    require(nContract.ownerOf(_nId) == msg.sender, 'Not the owner of this N');

    _safeMint(msg.sender, _nId);
  }

  // Standard mint function
  function mint(uint256 _nId) public payable {
    require(publicSaleActive, 'Public sale not started');
    require(msg.value == publicPrice, 'Ether value sent is not correct');
    require(_nId > 0 && _nId <= 8888, 'Token ID invalid');

    _safeMint(msg.sender, _nId);
  }

  // Start and stop presale
  function setPresaleActive(bool _presaleActive) public onlyOwner {
    presaleActive = _presaleActive;
  }

  // Start and stop public sale
  function setPublicSaleActive(bool _publicSaleActive) public onlyOwner {
    publicSaleActive = _publicSaleActive;
  }

  // Set new baseURI
  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    baseTokenURI = _newBaseURI;
  }

  function withdraw(uint256 _amount) public onlyOwner {
    (bool success, ) = msg.sender.call{value: _amount}('');
    require(success, 'Transfer failed.');
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"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":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nId","type":"uint256"}],"name":"mintWithN","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"nAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_presaleActive","type":"bool"}],"name":"setPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicSaleActive","type":"bool"}],"name":"setPublicSaleActive","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600c80546001600160a01b0319167305a46f1e545526fb803ff974c790acea34d1f2d6908117909155600d80546001600160b01b031916909117905566354a6ba7a18000600e5566b1a2bc2ec50000600f553480156200006357600080fd5b5060405162002c5138038062002c51833981016040819052620000869162000291565b604080518082018252600981526820b93a102337b9102760b91b60208083019182528351808501909452600484526320a92a2760e11b908401528151919291620000d391600091620001eb565b508051620000e9906001906020840190620001eb565b50505062000106620001006200011d60201b60201c565b62000121565b6001600b55620001168162000173565b50620003ba565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b03163314620001d25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b8051620001e7906010906020840190620001eb565b5050565b828054620001f99062000367565b90600052602060002090601f0160209004810192826200021d576000855562000268565b82601f106200023857805160ff191683800117855562000268565b8280016001018555821562000268579182015b82811115620002685782518255916020019190600101906200024b565b50620002769291506200027a565b5090565b5b808211156200027657600081556001016200027b565b60006020808385031215620002a4578182fd5b82516001600160401b0380821115620002bb578384fd5b818501915085601f830112620002cf578384fd5b815181811115620002e457620002e4620003a4565b604051601f8201601f19908116603f011681019083821181831017156200030f576200030f620003a4565b81604052828152888684870101111562000327578687fd5b8693505b828410156200034a57848401860151818501870152928501926200032b565b828411156200035b57868684830101525b98975050505050505050565b600181811c908216806200037c57607f821691505b602082108114156200039e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61288780620003ca6000396000f3fe6080604052600436106101e25760003560e01c806370a0823111610102578063b88d4fde11610095578063d547cfb711610064578063d547cfb714610564578063e2e06fa314610579578063e985e9c514610599578063f2fde38b146105e257600080fd5b8063b88d4fde146104e3578063bc8893b414610503578063c87b56dd14610524578063d333232c1461054457600080fd5b806395d89b41116100d157806395d89b4114610485578063a0712d681461049a578063a22cb465146104ad578063a945bf80146104cd57600080fd5b806370a0823114610405578063715018a6146104255780638462151c1461043a5780638da5cb5b1461046757600080fd5b80632e1a7d4d1161017a5780634f6ccce7116101495780634f6ccce71461038457806353135ca0146103a457806355f804b3146103c55780636352211e146103e557600080fd5b80632e1a7d4d146103045780632f745c59146103245780633f8121a21461034457806342842e0e1461036457600080fd5b80630860b12c116101b65780630860b12c1461029a578063095ea7b3146102af57806318160ddd146102cf57806323b872dd146102e457600080fd5b80620e7fa8146101e757806301ffc9a71461021057806306fdde0314610240578063081812fc14610262575b600080fd5b3480156101f357600080fd5b506101fd600e5481565b6040519081526020015b60405180910390f35b34801561021c57600080fd5b5061023061022b366004612587565b610602565b6040519015158152602001610207565b34801561024c57600080fd5b50610255610646565b60405161020791906126f8565b34801561026e57600080fd5b5061028261027d366004612605565b6106d8565b6040516001600160a01b039091168152602001610207565b6102ad6102a8366004612605565b610772565b005b3480156102bb57600080fd5b506102ad6102ca366004612542565b610971565b3480156102db57600080fd5b506008546101fd565b3480156102f057600080fd5b506102ad6102ff366004612451565b610aa3565b34801561031057600080fd5b506102ad61031f366004612605565b610b2a565b34801561033057600080fd5b506101fd61033f366004612542565b610c20565b34801561035057600080fd5b506102ad61035f36600461256d565b610cc8565b34801561037057600080fd5b506102ad61037f366004612451565b610d5b565b34801561039057600080fd5b506101fd61039f366004612605565b610d76565b3480156103b057600080fd5b50600d5461023090600160a01b900460ff1681565b3480156103d157600080fd5b506102ad6103e03660046125bf565b610e28565b3480156103f157600080fd5b50610282610400366004612605565b610e95565b34801561041157600080fd5b506101fd6104203660046123e1565b610f20565b34801561043157600080fd5b506102ad610fba565b34801561044657600080fd5b5061045a6104553660046123e1565b611020565b60405161020791906126b4565b34801561047357600080fd5b50600a546001600160a01b0316610282565b34801561049157600080fd5b506102556110de565b6102ad6104a8366004612605565b6110ed565b3480156104b957600080fd5b506102ad6104c836600461250e565b611202565b3480156104d957600080fd5b506101fd600f5481565b3480156104ef57600080fd5b506102ad6104fe366004612491565b6112c7565b34801561050f57600080fd5b50600d5461023090600160a81b900460ff1681565b34801561053057600080fd5b5061025561053f366004612605565b611355565b34801561055057600080fd5b50600c54610282906001600160a01b031681565b34801561057057600080fd5b506102556113eb565b34801561058557600080fd5b506102ad61059436600461256d565b611479565b3480156105a557600080fd5b506102306105b4366004612419565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105ee57600080fd5b506102ad6105fd3660046123e1565b61150c565b60006001600160e01b031982167f780e9d630000000000000000000000000000000000000000000000000000000014806106405750610640826115eb565b92915050565b6060600080546106559061277a565b80601f01602080910402602001604051908101604052809291908181526020018280546106819061277a565b80156106ce5780601f106106a3576101008083540402835291602001916106ce565b820191906000526020600020905b8154815290600101906020018083116106b157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107565760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6002600b5414156107c55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161074d565b6002600b55600d54600160a01b900460ff166108235760405162461bcd60e51b815260206004820152601360248201527f50726573616c65206e6f74207374617274656400000000000000000000000000604482015260640161074d565b600e5434146108745760405162461bcd60e51b815260206004820152601860248201527f57726f6e6720616d6f756e74206f66204554482073656e740000000000000000604482015260640161074d565b600d546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b1580156108d157600080fd5b505afa1580156108e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090991906123fd565b6001600160a01b03161461095f5760405162461bcd60e51b815260206004820152601760248201527f4e6f7420746865206f776e6572206f662074686973204e000000000000000000604482015260640161074d565b6109693382611686565b506001600b55565b600061097c82610e95565b9050806001600160a01b0316836001600160a01b03161415610a065760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161074d565b336001600160a01b0382161480610a225750610a2281336105b4565b610a945760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161074d565b610a9e83836116a0565b505050565b610aad338261171b565b610b1f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161074d565b610a9e838383611812565b600a546001600160a01b03163314610b845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074d565b604051600090339083908381818185875af1925050503d8060008114610bc6576040519150601f19603f3d011682016040523d82523d6000602084013e610bcb565b606091505b5050905080610c1c5760405162461bcd60e51b815260206004820152601060248201527f5472616e73666572206661696c65642e00000000000000000000000000000000604482015260640161074d565b5050565b6000610c2b83610f20565b8210610c9f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161074d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610d225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074d565b600d8054911515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610a9e838383604051806020016040528060008152506112c7565b6000610d8160085490565b8210610df55760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161074d565b60088281548110610e1657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610e825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074d565b8051610c1c9060109060208401906122bd565b6000818152600260205260408120546001600160a01b0316806106405760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161074d565b60006001600160a01b038216610f9e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161074d565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146110145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074d565b61101e60006119f7565b565b6060600061102d83610f20565b905060008167ffffffffffffffff81111561105857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611081578160200160208202803683370190505b50905060005b828110156110d6576110998582610c20565b8282815181106110b957634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806110ce816127b5565b915050611087565b509392505050565b6060600180546106559061277a565b600d54600160a81b900460ff166111465760405162461bcd60e51b815260206004820152601760248201527f5075626c69632073616c65206e6f742073746172746564000000000000000000604482015260640161074d565b600f5434146111975760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161074d565b6000811180156111a957506122b88111155b6111f55760405162461bcd60e51b815260206004820152601060248201527f546f6b656e20494420696e76616c696400000000000000000000000000000000604482015260640161074d565b6111ff3382611686565b50565b6001600160a01b03821633141561125b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161074d565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112d1338361171b565b6113435760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161074d565b61134f84848484611a56565b50505050565b6000818152600260205260409020546060906001600160a01b03166113e25760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161074d565b61064082611ad4565b601080546113f89061277a565b80601f01602080910402602001604051908101604052809291908181526020018280546114249061277a565b80156114715780601f1061144657610100808354040283529160200191611471565b820191906000526020600020905b81548152906001019060200180831161145457829003601f168201915b505050505081565b600a546001600160a01b031633146114d35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074d565b600d8054911515600160a81b027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909216919091179055565b600a546001600160a01b031633146115665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074d565b6001600160a01b0381166115e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161074d565b6111ff816119f7565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061164e57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061064057507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610640565b610c1c828260405180602001604052806000815250611bbd565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906116e282610e95565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166117945760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161074d565b600061179f83610e95565b9050806001600160a01b0316846001600160a01b031614806117da5750836001600160a01b03166117cf846106d8565b6001600160a01b0316145b8061180a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661182582610e95565b6001600160a01b0316146118a15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161074d565b6001600160a01b03821661191c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161074d565b611927838383611c3b565b6119326000826116a0565b6001600160a01b038316600090815260036020526040812080546001929061195b908490612737565b90915550506001600160a01b038216600090815260036020526040812080546001929061198990849061270b565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611a61848484611812565b611a6d84848484611cf3565b61134f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161074d565b6000818152600260205260409020546060906001600160a01b0316611b615760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161074d565b6000611b6b611e4b565b90506000815111611b8b5760405180602001604052806000815250611bb6565b80611b9584611e5a565b604051602001611ba6929190612649565b6040516020818303038152906040525b9392505050565b611bc78383611fa8565b611bd46000848484611cf3565b610a9e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161074d565b6001600160a01b038316611c9657611c9181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611cb9565b816001600160a01b0316836001600160a01b031614611cb957611cb98382612103565b6001600160a01b038216611cd057610a9e816121a0565b826001600160a01b0316826001600160a01b031614610a9e57610a9e8282612279565b60006001600160a01b0384163b15611e4057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d37903390899088908890600401612678565b602060405180830381600087803b158015611d5157600080fd5b505af1925050508015611d81575060408051601f3d908101601f19168201909252611d7e918101906125a3565b60015b611e26573d808015611daf576040519150601f19603f3d011682016040523d82523d6000602084013e611db4565b606091505b508051611e1e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161074d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061180a565b506001949350505050565b6060601080546106559061277a565b606081611e9a57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611ec45780611eae816127b5565b9150611ebd9050600a83612723565b9150611e9e565b60008167ffffffffffffffff811115611eed57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f17576020820181803683370190505b5090505b841561180a57611f2c600183612737565b9150611f39600a866127d0565b611f4490603061270b565b60f81b818381518110611f6757634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611fa1600a86612723565b9450611f1b565b6001600160a01b038216611ffe5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161074d565b6000818152600260205260409020546001600160a01b0316156120635760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161074d565b61206f60008383611c3b565b6001600160a01b038216600090815260036020526040812080546001929061209890849061270b565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161211084610f20565b61211a9190612737565b60008381526007602052604090205490915080821461216d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906121b290600190612737565b600083815260096020526040812054600880549394509092849081106121e857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061221757634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061225d57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061228483610f20565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8280546122c99061277a565b90600052602060002090601f0160209004810192826122eb5760008555612331565b82601f1061230457805160ff1916838001178555612331565b82800160010185558215612331579182015b82811115612331578251825591602001919060010190612316565b5061233d929150612341565b5090565b5b8082111561233d5760008155600101612342565b600067ffffffffffffffff8084111561237157612371612810565b604051601f8501601f19908116603f0116810190828211818310171561239957612399612810565b816040528093508581528686860111156123b257600080fd5b858560208301376000602087830101525050509392505050565b803580151581146123dc57600080fd5b919050565b6000602082840312156123f2578081fd5b8135611bb681612826565b60006020828403121561240e578081fd5b8151611bb681612826565b6000806040838503121561242b578081fd5b823561243681612826565b9150602083013561244681612826565b809150509250929050565b600080600060608486031215612465578081fd5b833561247081612826565b9250602084013561248081612826565b929592945050506040919091013590565b600080600080608085870312156124a6578081fd5b84356124b181612826565b935060208501356124c181612826565b925060408501359150606085013567ffffffffffffffff8111156124e3578182fd5b8501601f810187136124f3578182fd5b61250287823560208401612356565b91505092959194509250565b60008060408385031215612520578182fd5b823561252b81612826565b9150612539602084016123cc565b90509250929050565b60008060408385031215612554578182fd5b823561255f81612826565b946020939093013593505050565b60006020828403121561257e578081fd5b611bb6826123cc565b600060208284031215612598578081fd5b8135611bb68161283b565b6000602082840312156125b4578081fd5b8151611bb68161283b565b6000602082840312156125d0578081fd5b813567ffffffffffffffff8111156125e6578182fd5b8201601f810184136125f6578182fd5b61180a84823560208401612356565b600060208284031215612616578081fd5b5035919050565b6000815180845261263581602086016020860161274e565b601f01601f19169290920160200192915050565b6000835161265b81846020880161274e565b83519083019061266f81836020880161274e565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526126aa608083018461261d565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156126ec578351835292840192918401916001016126d0565b50909695505050505050565b602081526000611bb6602083018461261d565b6000821982111561271e5761271e6127e4565b500190565b600082612732576127326127fa565b500490565b600082821015612749576127496127e4565b500390565b60005b83811015612769578181015183820152602001612751565b8381111561134f5750506000910152565b600181811c9082168061278e57607f821691505b602082108114156127af57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127c9576127c96127e4565b5060010190565b6000826127df576127df6127fa565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146111ff57600080fd5b6001600160e01b0319811681146111ff57600080fdfea264697066735822122075759e0f8ccba546196e8d738cc028247ea0803c418591f6145b4751e5bdbf1064736f6c634300080400330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d554c36725455765941444e41555876314a4e4d726b32365247734b7148464a72394b327a55467a3276556d5a2f000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101e25760003560e01c806370a0823111610102578063b88d4fde11610095578063d547cfb711610064578063d547cfb714610564578063e2e06fa314610579578063e985e9c514610599578063f2fde38b146105e257600080fd5b8063b88d4fde146104e3578063bc8893b414610503578063c87b56dd14610524578063d333232c1461054457600080fd5b806395d89b41116100d157806395d89b4114610485578063a0712d681461049a578063a22cb465146104ad578063a945bf80146104cd57600080fd5b806370a0823114610405578063715018a6146104255780638462151c1461043a5780638da5cb5b1461046757600080fd5b80632e1a7d4d1161017a5780634f6ccce7116101495780634f6ccce71461038457806353135ca0146103a457806355f804b3146103c55780636352211e146103e557600080fd5b80632e1a7d4d146103045780632f745c59146103245780633f8121a21461034457806342842e0e1461036457600080fd5b80630860b12c116101b65780630860b12c1461029a578063095ea7b3146102af57806318160ddd146102cf57806323b872dd146102e457600080fd5b80620e7fa8146101e757806301ffc9a71461021057806306fdde0314610240578063081812fc14610262575b600080fd5b3480156101f357600080fd5b506101fd600e5481565b6040519081526020015b60405180910390f35b34801561021c57600080fd5b5061023061022b366004612587565b610602565b6040519015158152602001610207565b34801561024c57600080fd5b50610255610646565b60405161020791906126f8565b34801561026e57600080fd5b5061028261027d366004612605565b6106d8565b6040516001600160a01b039091168152602001610207565b6102ad6102a8366004612605565b610772565b005b3480156102bb57600080fd5b506102ad6102ca366004612542565b610971565b3480156102db57600080fd5b506008546101fd565b3480156102f057600080fd5b506102ad6102ff366004612451565b610aa3565b34801561031057600080fd5b506102ad61031f366004612605565b610b2a565b34801561033057600080fd5b506101fd61033f366004612542565b610c20565b34801561035057600080fd5b506102ad61035f36600461256d565b610cc8565b34801561037057600080fd5b506102ad61037f366004612451565b610d5b565b34801561039057600080fd5b506101fd61039f366004612605565b610d76565b3480156103b057600080fd5b50600d5461023090600160a01b900460ff1681565b3480156103d157600080fd5b506102ad6103e03660046125bf565b610e28565b3480156103f157600080fd5b50610282610400366004612605565b610e95565b34801561041157600080fd5b506101fd6104203660046123e1565b610f20565b34801561043157600080fd5b506102ad610fba565b34801561044657600080fd5b5061045a6104553660046123e1565b611020565b60405161020791906126b4565b34801561047357600080fd5b50600a546001600160a01b0316610282565b34801561049157600080fd5b506102556110de565b6102ad6104a8366004612605565b6110ed565b3480156104b957600080fd5b506102ad6104c836600461250e565b611202565b3480156104d957600080fd5b506101fd600f5481565b3480156104ef57600080fd5b506102ad6104fe366004612491565b6112c7565b34801561050f57600080fd5b50600d5461023090600160a81b900460ff1681565b34801561053057600080fd5b5061025561053f366004612605565b611355565b34801561055057600080fd5b50600c54610282906001600160a01b031681565b34801561057057600080fd5b506102556113eb565b34801561058557600080fd5b506102ad61059436600461256d565b611479565b3480156105a557600080fd5b506102306105b4366004612419565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105ee57600080fd5b506102ad6105fd3660046123e1565b61150c565b60006001600160e01b031982167f780e9d630000000000000000000000000000000000000000000000000000000014806106405750610640826115eb565b92915050565b6060600080546106559061277a565b80601f01602080910402602001604051908101604052809291908181526020018280546106819061277a565b80156106ce5780601f106106a3576101008083540402835291602001916106ce565b820191906000526020600020905b8154815290600101906020018083116106b157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107565760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6002600b5414156107c55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161074d565b6002600b55600d54600160a01b900460ff166108235760405162461bcd60e51b815260206004820152601360248201527f50726573616c65206e6f74207374617274656400000000000000000000000000604482015260640161074d565b600e5434146108745760405162461bcd60e51b815260206004820152601860248201527f57726f6e6720616d6f756e74206f66204554482073656e740000000000000000604482015260640161074d565b600d546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b1580156108d157600080fd5b505afa1580156108e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090991906123fd565b6001600160a01b03161461095f5760405162461bcd60e51b815260206004820152601760248201527f4e6f7420746865206f776e6572206f662074686973204e000000000000000000604482015260640161074d565b6109693382611686565b506001600b55565b600061097c82610e95565b9050806001600160a01b0316836001600160a01b03161415610a065760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161074d565b336001600160a01b0382161480610a225750610a2281336105b4565b610a945760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161074d565b610a9e83836116a0565b505050565b610aad338261171b565b610b1f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161074d565b610a9e838383611812565b600a546001600160a01b03163314610b845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074d565b604051600090339083908381818185875af1925050503d8060008114610bc6576040519150601f19603f3d011682016040523d82523d6000602084013e610bcb565b606091505b5050905080610c1c5760405162461bcd60e51b815260206004820152601060248201527f5472616e73666572206661696c65642e00000000000000000000000000000000604482015260640161074d565b5050565b6000610c2b83610f20565b8210610c9f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161074d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610d225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074d565b600d8054911515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610a9e838383604051806020016040528060008152506112c7565b6000610d8160085490565b8210610df55760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161074d565b60088281548110610e1657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610e825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074d565b8051610c1c9060109060208401906122bd565b6000818152600260205260408120546001600160a01b0316806106405760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161074d565b60006001600160a01b038216610f9e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161074d565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146110145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074d565b61101e60006119f7565b565b6060600061102d83610f20565b905060008167ffffffffffffffff81111561105857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611081578160200160208202803683370190505b50905060005b828110156110d6576110998582610c20565b8282815181106110b957634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806110ce816127b5565b915050611087565b509392505050565b6060600180546106559061277a565b600d54600160a81b900460ff166111465760405162461bcd60e51b815260206004820152601760248201527f5075626c69632073616c65206e6f742073746172746564000000000000000000604482015260640161074d565b600f5434146111975760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161074d565b6000811180156111a957506122b88111155b6111f55760405162461bcd60e51b815260206004820152601060248201527f546f6b656e20494420696e76616c696400000000000000000000000000000000604482015260640161074d565b6111ff3382611686565b50565b6001600160a01b03821633141561125b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161074d565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112d1338361171b565b6113435760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161074d565b61134f84848484611a56565b50505050565b6000818152600260205260409020546060906001600160a01b03166113e25760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161074d565b61064082611ad4565b601080546113f89061277a565b80601f01602080910402602001604051908101604052809291908181526020018280546114249061277a565b80156114715780601f1061144657610100808354040283529160200191611471565b820191906000526020600020905b81548152906001019060200180831161145457829003601f168201915b505050505081565b600a546001600160a01b031633146114d35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074d565b600d8054911515600160a81b027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909216919091179055565b600a546001600160a01b031633146115665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074d565b6001600160a01b0381166115e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161074d565b6111ff816119f7565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061164e57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061064057507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610640565b610c1c828260405180602001604052806000815250611bbd565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906116e282610e95565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166117945760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161074d565b600061179f83610e95565b9050806001600160a01b0316846001600160a01b031614806117da5750836001600160a01b03166117cf846106d8565b6001600160a01b0316145b8061180a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661182582610e95565b6001600160a01b0316146118a15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161074d565b6001600160a01b03821661191c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161074d565b611927838383611c3b565b6119326000826116a0565b6001600160a01b038316600090815260036020526040812080546001929061195b908490612737565b90915550506001600160a01b038216600090815260036020526040812080546001929061198990849061270b565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611a61848484611812565b611a6d84848484611cf3565b61134f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161074d565b6000818152600260205260409020546060906001600160a01b0316611b615760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161074d565b6000611b6b611e4b565b90506000815111611b8b5760405180602001604052806000815250611bb6565b80611b9584611e5a565b604051602001611ba6929190612649565b6040516020818303038152906040525b9392505050565b611bc78383611fa8565b611bd46000848484611cf3565b610a9e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161074d565b6001600160a01b038316611c9657611c9181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611cb9565b816001600160a01b0316836001600160a01b031614611cb957611cb98382612103565b6001600160a01b038216611cd057610a9e816121a0565b826001600160a01b0316826001600160a01b031614610a9e57610a9e8282612279565b60006001600160a01b0384163b15611e4057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d37903390899088908890600401612678565b602060405180830381600087803b158015611d5157600080fd5b505af1925050508015611d81575060408051601f3d908101601f19168201909252611d7e918101906125a3565b60015b611e26573d808015611daf576040519150601f19603f3d011682016040523d82523d6000602084013e611db4565b606091505b508051611e1e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161074d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061180a565b506001949350505050565b6060601080546106559061277a565b606081611e9a57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611ec45780611eae816127b5565b9150611ebd9050600a83612723565b9150611e9e565b60008167ffffffffffffffff811115611eed57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f17576020820181803683370190505b5090505b841561180a57611f2c600183612737565b9150611f39600a866127d0565b611f4490603061270b565b60f81b818381518110611f6757634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611fa1600a86612723565b9450611f1b565b6001600160a01b038216611ffe5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161074d565b6000818152600260205260409020546001600160a01b0316156120635760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161074d565b61206f60008383611c3b565b6001600160a01b038216600090815260036020526040812080546001929061209890849061270b565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161211084610f20565b61211a9190612737565b60008381526007602052604090205490915080821461216d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906121b290600190612737565b600083815260096020526040812054600880549394509092849081106121e857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061221757634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061225d57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061228483610f20565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8280546122c99061277a565b90600052602060002090601f0160209004810192826122eb5760008555612331565b82601f1061230457805160ff1916838001178555612331565b82800160010185558215612331579182015b82811115612331578251825591602001919060010190612316565b5061233d929150612341565b5090565b5b8082111561233d5760008155600101612342565b600067ffffffffffffffff8084111561237157612371612810565b604051601f8501601f19908116603f0116810190828211818310171561239957612399612810565b816040528093508581528686860111156123b257600080fd5b858560208301376000602087830101525050509392505050565b803580151581146123dc57600080fd5b919050565b6000602082840312156123f2578081fd5b8135611bb681612826565b60006020828403121561240e578081fd5b8151611bb681612826565b6000806040838503121561242b578081fd5b823561243681612826565b9150602083013561244681612826565b809150509250929050565b600080600060608486031215612465578081fd5b833561247081612826565b9250602084013561248081612826565b929592945050506040919091013590565b600080600080608085870312156124a6578081fd5b84356124b181612826565b935060208501356124c181612826565b925060408501359150606085013567ffffffffffffffff8111156124e3578182fd5b8501601f810187136124f3578182fd5b61250287823560208401612356565b91505092959194509250565b60008060408385031215612520578182fd5b823561252b81612826565b9150612539602084016123cc565b90509250929050565b60008060408385031215612554578182fd5b823561255f81612826565b946020939093013593505050565b60006020828403121561257e578081fd5b611bb6826123cc565b600060208284031215612598578081fd5b8135611bb68161283b565b6000602082840312156125b4578081fd5b8151611bb68161283b565b6000602082840312156125d0578081fd5b813567ffffffffffffffff8111156125e6578182fd5b8201601f810184136125f6578182fd5b61180a84823560208401612356565b600060208284031215612616578081fd5b5035919050565b6000815180845261263581602086016020860161274e565b601f01601f19169290920160200192915050565b6000835161265b81846020880161274e565b83519083019061266f81836020880161274e565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526126aa608083018461261d565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156126ec578351835292840192918401916001016126d0565b50909695505050505050565b602081526000611bb6602083018461261d565b6000821982111561271e5761271e6127e4565b500190565b600082612732576127326127fa565b500490565b600082821015612749576127496127e4565b500390565b60005b83811015612769578181015183820152602001612751565b8381111561134f5750506000910152565b600181811c9082168061278e57607f821691505b602082108114156127af57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127c9576127c96127e4565b5060010190565b6000826127df576127df6127fa565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146111ff57600080fd5b6001600160e01b0319811681146111ff57600080fdfea264697066735822122075759e0f8ccba546196e8d738cc028247ea0803c418591f6145b4751e5bdbf1064736f6c63430008040033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d554c36725455765941444e41555876314a4e4d726b32365247734b7148464a72394b327a55467a3276556d5a2f000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _newBaseURI (string): https://gateway.pinata.cloud/ipfs/QmUL6rTUvYADNAUXv1JNMrk26RGsKqHFJr9K2zUFz2vUmZ/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [2] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [3] : 732f516d554c36725455765941444e41555876314a4e4d726b32365247734b71
Arg [4] : 48464a72394b327a55467a3276556d5a2f000000000000000000000000000000


Deployed Bytecode Sourcemap

43291:2626:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43595:41;;;;;;;;;;;;;;;;;;;18023:25:1;;;18011:2;17996:18;43595:41:0;;;;;;;;32544:218;;;;;;;;;;-1:-1:-1;32544:218:0;;;;;:::i;:::-;;:::i;:::-;;;7604:14:1;;7597:22;7579:41;;7567:2;7552:18;32544:218:0;7534:92:1;20393:94:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21821:211::-;;;;;;;;;;-1:-1:-1;21821:211:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6216:55:1;;;6198:74;;6186:2;6171:18;21821:211:0;6153:125:1;44697:304:0;;;;;;:::i;:::-;;:::i;:::-;;21407:356;;;;;;;;;;-1:-1:-1;21407:356:0;;;;;:::i;:::-;;:::i;33152:107::-;;;;;;;;;;-1:-1:-1;33236:10:0;:17;33152:107;;22657:311;;;;;;;;;;-1:-1:-1;22657:311:0;;;;;:::i;:::-;;:::i;45752:162::-;;;;;;;;;;-1:-1:-1;45752:162:0;;;;;:::i;:::-;;:::i;32838:246::-;;;;;;;;;;-1:-1:-1;32838:246:0;;;;;:::i;:::-;;:::i;45350:107::-;;;;;;;;;;-1:-1:-1;45350:107:0;;;;;:::i;:::-;;:::i;23031:165::-;;;;;;;;;;-1:-1:-1;23031:165:0;;;;;:::i;:::-;;:::i;33328:223::-;;;;;;;;;;-1:-1:-1;33328:223:0;;;;;:::i;:::-;;:::i;43514:33::-;;;;;;;;;;-1:-1:-1;43514:33:0;;;;-1:-1:-1;;;43514:33:0;;;;;;45643:103;;;;;;;;;;-1:-1:-1;45643:103:0;;;;;:::i;:::-;;:::i;20109:225::-;;;;;;;;;;-1:-1:-1;20109:225:0;;;;;:::i;:::-;;:::i;19857:198::-;;;;;;;;;;-1:-1:-1;19857:198:0;;;;;:::i;:::-;;:::i;39929:88::-;;;;;;;;;;;;;:::i;44094:336::-;;;;;;;;;;-1:-1:-1;44094:336:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;39318:81::-;;;;;;;;;;-1:-1:-1;39387:6:0;;-1:-1:-1;;;;;39387:6:0;39318:81;;20548:98;;;;;;;;;;;;;:::i;45036:279::-;;;;;;:::i;:::-;;:::i;22096:281::-;;;;;;;;;;-1:-1:-1;22096:281:0;;;;;:::i;:::-;;:::i;43641:39::-;;;;;;;;;;;;;;;;23259:300;;;;;;;;;;-1:-1:-1;23259:300:0;;;;;:::i;:::-;;:::i;43552:36::-;;;;;;;;;;-1:-1:-1;43552:36:0;;;;-1:-1:-1;;;43552:36:0;;;;;;44436:216;;;;;;;;;;-1:-1:-1;44436:216:0;;;;;:::i;:::-;;:::i;43391:68::-;;;;;;;;;;-1:-1:-1;43391:68:0;;;;-1:-1:-1;;;;;43391:68:0;;;43687:26;;;;;;;;;;;;;:::i;45496:119::-;;;;;;;;;;-1:-1:-1;45496:119:0;;;;;:::i;:::-;;:::i;22440:158::-;;;;;;;;;;-1:-1:-1;22440:158:0;;;;;:::i;:::-;-1:-1:-1;;;;;22557:25:0;;;22537:4;22557:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;22440:158;40162:182;;;;;;;;;;-1:-1:-1;40162:182:0;;;;;:::i;:::-;;:::i;32544:218::-;32646:4;-1:-1:-1;;;;;;32666:50:0;;32681:35;32666:50;;:90;;;32720:36;32744:11;32720:23;:36::i;:::-;32659:97;32544:218;-1:-1:-1;;32544:218:0:o;20393:94::-;20447:13;20476:5;20469:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20393:94;:::o;21821:211::-;21897:7;25070:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25070:16:0;21913:73;;;;-1:-1:-1;;;21913:73:0;;13843:2:1;21913:73:0;;;13825:21:1;13882:2;13862:18;;;13855:30;13921:34;13901:18;;;13894:62;-1:-1:-1;;;13972:18:1;;;13965:42;14024:19;;21913:73:0;;;;;;;;;-1:-1:-1;22002:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22002:24:0;;21821:211::o;44697:304::-;42241:1;42803:7;;:19;;42795:63;;;;-1:-1:-1;;;42795:63:0;;17366:2:1;42795:63:0;;;17348:21:1;17405:2;17385:18;;;17378:30;17444:33;17424:18;;;17417:61;17495:18;;42795:63:0;17338:181:1;42795:63:0;42241:1;42928:7;:18;44773:13:::1;::::0;-1:-1:-1;;;44773:13:0;::::1;;;44765:45;;;::::0;-1:-1:-1;;;44765:45:0;;13134:2:1;44765:45:0::1;::::0;::::1;13116:21:1::0;13173:2;13153:18;;;13146:30;13212:21;13192:18;;;13185:49;13251:18;;44765:45:0::1;13106:169:1::0;44765:45:0::1;44838:12;;44825:9;:25;44817:62;;;::::0;-1:-1:-1;;;44817:62:0;;17726:2:1;44817:62:0::1;::::0;::::1;17708:21:1::0;17765:2;17745:18;;;17738:30;17804:26;17784:18;;;17777:54;17848:18;;44817:62:0::1;17698:174:1::0;44817:62:0::1;44894:9;::::0;:23:::1;::::0;;;;::::1;::::0;::::1;18023:25:1::0;;;44921:10:0::1;::::0;-1:-1:-1;;;;;44894:9:0::1;::::0;:17:::1;::::0;17996:18:1;;44894:23:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44894:37:0::1;;44886:73;;;::::0;-1:-1:-1;;;44886:73:0;;11536:2:1;44886:73:0::1;::::0;::::1;11518:21:1::0;11575:2;11555:18;;;11548:30;11614:25;11594:18;;;11587:53;11657:18;;44886:73:0::1;11508:173:1::0;44886:73:0::1;44968:27;44978:10;44990:4;44968:9;:27::i;:::-;-1:-1:-1::0;42199:1:0;43091:7;:22;44697:304::o;21407:356::-;21484:13;21500:23;21515:7;21500:14;:23::i;:::-;21484:39;;21544:5;-1:-1:-1;;;;;21538:11:0;:2;-1:-1:-1;;;;;21538:11:0;;;21530:57;;;;-1:-1:-1;;;21530:57:0;;15788:2:1;21530:57:0;;;15770:21:1;15827:2;15807:18;;;15800:30;15866:34;15846:18;;;15839:62;15937:3;15917:18;;;15910:31;15958:19;;21530:57:0;15760:223:1;21530:57:0;15333:10;-1:-1:-1;;;;;21604:21:0;;;;:62;;-1:-1:-1;21629:37:0;21646:5;15333:10;22440:158;:::i;21629:37::-;21596:131;;;;-1:-1:-1;;;21596:131:0;;11888:2:1;21596:131:0;;;11870:21:1;11927:2;11907:18;;;11900:30;11966:34;11946:18;;;11939:62;12037:26;12017:18;;;12010:54;12081:19;;21596:131:0;11860:246:1;21596:131:0;21736:21;21745:2;21749:7;21736:8;:21::i;:::-;21407:356;;;:::o;22657:311::-;22830:41;15333:10;22863:7;22830:18;:41::i;:::-;22822:103;;;;-1:-1:-1;;;22822:103:0;;16535:2:1;22822:103:0;;;16517:21:1;16574:2;16554:18;;;16547:30;16613:34;16593:18;;;16586:62;16684:19;16664:18;;;16657:47;16721:19;;22822:103:0;16507:239:1;22822:103:0;22934:28;22944:4;22950:2;22954:7;22934:9;:28::i;45752:162::-;39387:6;;-1:-1:-1;;;;;39387:6:0;15333:10;39520:23;39512:68;;;;-1:-1:-1;;;39512:68:0;;14256:2:1;39512:68:0;;;14238:21:1;;;14275:18;;;14268:30;14334:34;14314:18;;;14307:62;14386:18;;39512:68:0;14228:182:1;39512:68:0;45830:35:::1;::::0;45812:12:::1;::::0;45830:10:::1;::::0;45853:7;;45812:12;45830:35;45812:12;45830:35;45853:7;45830:10;:35:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45811:54;;;45880:7;45872:36;;;::::0;-1:-1:-1;;;45872:36:0;;16190:2:1;45872:36:0::1;::::0;::::1;16172:21:1::0;16229:2;16209:18;;;16202:30;16268:18;16248;;;16241:46;16304:18;;45872:36:0::1;16162:166:1::0;45872:36:0::1;39587:1;45752:162:::0;:::o;32838:246::-;32935:7;32967:23;32984:5;32967:16;:23::i;:::-;32959:5;:31;32951:87;;;;-1:-1:-1;;;32951:87:0;;8057:2:1;32951:87:0;;;8039:21:1;8096:2;8076:18;;;8069:30;8135:34;8115:18;;;8108:62;8206:13;8186:18;;;8179:41;8237:19;;32951:87:0;8029:233:1;32951:87:0;-1:-1:-1;;;;;;33052:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;32838:246::o;45350:107::-;39387:6;;-1:-1:-1;;;;;39387:6:0;15333:10;39520:23;39512:68;;;;-1:-1:-1;;;39512:68:0;;14256:2:1;39512:68:0;;;14238:21:1;;;14275:18;;;14268:30;14334:34;14314:18;;;14307:62;14386:18;;39512:68:0;14228:182:1;39512:68:0;45421:13:::1;:30:::0;;;::::1;;-1:-1:-1::0;;;45421:30:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;45350:107::o;23031:165::-;23151:39;23168:4;23174:2;23178:7;23151:39;;;;;;;;;;;;:16;:39::i;33328:223::-;33403:7;33435:30;33236:10;:17;;33152:107;33435:30;33427:5;:38;33419:95;;;;-1:-1:-1;;;33419:95:0;;16953:2:1;33419:95:0;;;16935:21:1;16992:2;16972:18;;;16965:30;17031:34;17011:18;;;17004:62;17102:14;17082:18;;;17075:42;17134:19;;33419:95:0;16925:234:1;33419:95:0;33528:10;33539:5;33528:17;;;;;;-1:-1:-1;;;33528:17:0;;;;;;;;;;;;;;;;;33521:24;;33328:223;;;:::o;45643:103::-;39387:6;;-1:-1:-1;;;;;39387:6:0;15333:10;39520:23;39512:68;;;;-1:-1:-1;;;39512:68:0;;14256:2:1;39512:68:0;;;14238:21:1;;;14275:18;;;14268:30;14334:34;14314:18;;;14307:62;14386:18;;39512:68:0;14228:182:1;39512:68:0;45714:26;;::::1;::::0;:12:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;20109:225::-:0;20181:7;20213:16;;;:7;:16;;;;;;-1:-1:-1;;;;;20213:16:0;20244:19;20236:73;;;;-1:-1:-1;;;20236:73:0;;12724:2:1;20236:73:0;;;12706:21:1;12763:2;12743:18;;;12736:30;12802:34;12782:18;;;12775:62;12873:11;12853:18;;;12846:39;12902:19;;20236:73:0;12696:231:1;19857:198:0;19929:7;-1:-1:-1;;;;;19953:19:0;;19945:74;;;;-1:-1:-1;;;19945:74:0;;12313:2:1;19945:74:0;;;12295:21:1;12352:2;12332:18;;;12325:30;12391:34;12371:18;;;12364:62;12462:12;12442:18;;;12435:40;12492:19;;19945:74:0;12285:232:1;19945:74:0;-1:-1:-1;;;;;;20033:16:0;;;;;:9;:16;;;;;;;19857:198::o;39929:88::-;39387:6;;-1:-1:-1;;;;;39387:6:0;15333:10;39520:23;39512:68;;;;-1:-1:-1;;;39512:68:0;;14256:2:1;39512:68:0;;;14238:21:1;;;14275:18;;;14268:30;14334:34;14314:18;;;14307:62;14386:18;;39512:68:0;14228:182:1;39512:68:0;39990:21:::1;40008:1;39990:9;:21::i;:::-;39929:88::o:0;44094:336::-;44161:16;44186:18;44207:24;44217:13;44207:9;:24::i;:::-;44186:45;;44238:25;44280:10;44266:25;;;;;;-1:-1:-1;;;44266:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44266:25:0;;44238:53;;44303:9;44298:105;44318:10;44314:1;:14;44298:105;;;44358:37;44378:13;44393:1;44358:19;:37::i;:::-;44344:8;44353:1;44344:11;;;;;;-1:-1:-1;;;44344:11:0;;;;;;;;;;;;;;;;;;:51;44330:3;;;;:::i;:::-;;;;44298:105;;;-1:-1:-1;44416:8:0;44094:336;-1:-1:-1;;;44094:336:0:o;20548:98::-;20604:13;20633:7;20626:14;;;;;:::i;45036:279::-;45094:16;;-1:-1:-1;;;45094:16:0;;;;45086:52;;;;-1:-1:-1;;;45086:52:0;;10411:2:1;45086:52:0;;;10393:21:1;10450:2;10430:18;;;10423:30;10489:25;10469:18;;;10462:53;10532:18;;45086:52:0;10383:173:1;45086:52:0;45166:11;;45153:9;:24;45145:68;;;;-1:-1:-1;;;45145:68:0;;10763:2:1;45145:68:0;;;10745:21:1;10802:2;10782:18;;;10775:30;10841:33;10821:18;;;10814:61;10892:18;;45145:68:0;10735:181:1;45145:68:0;45235:1;45228:4;:8;:24;;;;;45248:4;45240;:12;;45228:24;45220:53;;;;-1:-1:-1;;;45220:53:0;;14617:2:1;45220:53:0;;;14599:21:1;14656:2;14636:18;;;14629:30;14695:18;14675;;;14668:46;14731:18;;45220:53:0;14589:166:1;45220:53:0;45282:27;45292:10;45304:4;45282:9;:27::i;:::-;45036:279;:::o;22096:281::-;-1:-1:-1;;;;;22195:24:0;;15333:10;22195:24;;22187:62;;;;-1:-1:-1;;;22187:62:0;;10057:2:1;22187:62:0;;;10039:21:1;10096:2;10076:18;;;10069:30;10135:27;10115:18;;;10108:55;10180:18;;22187:62:0;10029:175:1;22187:62:0;15333:10;22258:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;22258:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;22258:53:0;;;;;;;;;;22323:48;;7579:41:1;;;22258:42:0;;15333:10;22323:48;;7552:18:1;22323:48:0;;;;;;;22096:281;;:::o;23259:300::-;23412:41;15333:10;23445:7;23412:18;:41::i;:::-;23404:103;;;;-1:-1:-1;;;23404:103:0;;16535:2:1;23404:103:0;;;16517:21:1;16574:2;16554:18;;;16547:30;16613:34;16593:18;;;16586:62;16684:19;16664:18;;;16657:47;16721:19;;23404:103:0;16507:239:1;23404:103:0;23514:39;23528:4;23534:2;23538:7;23547:5;23514:13;:39::i;:::-;23259:300;;;;:::o;44436:216::-;25050:4;25070:16;;;:7;:16;;;;;;44509:13;;-1:-1:-1;;;;;25070:16:0;44531:76;;;;-1:-1:-1;;;44531:76:0;;15372:2:1;44531:76:0;;;15354:21:1;15411:2;15391:18;;;15384:30;15450:34;15430:18;;;15423:62;15521:17;15501:18;;;15494:45;15556:19;;44531:76:0;15344:237:1;44531:76:0;44623:23;44638:7;44623:14;:23::i;43687:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45496:119::-;39387:6;;-1:-1:-1;;;;;39387:6:0;15333:10;39520:23;39512:68;;;;-1:-1:-1;;;39512:68:0;;14256:2:1;39512:68:0;;;14238:21:1;;;14275:18;;;14268:30;14334:34;14314:18;;;14307:62;14386:18;;39512:68:0;14228:182:1;39512:68:0;45573:16:::1;:36:::0;;;::::1;;-1:-1:-1::0;;;45573:36:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;45496:119::o;40162:182::-;39387:6;;-1:-1:-1;;;;;39387:6:0;15333:10;39520:23;39512:68;;;;-1:-1:-1;;;39512:68:0;;14256:2:1;39512:68:0;;;14238:21:1;;;14275:18;;;14268:30;14334:34;14314:18;;;14307:62;14386:18;;39512:68:0;14228:182:1;39512:68:0;-1:-1:-1;;;;;40247:22:0;::::1;40239:73;;;::::0;-1:-1:-1;;;40239:73:0;;8888:2:1;40239:73:0::1;::::0;::::1;8870:21:1::0;8927:2;8907:18;;;8900:30;8966:34;8946:18;;;8939:62;9037:8;9017:18;;;9010:36;9063:19;;40239:73:0::1;8860:228:1::0;40239:73:0::1;40319:19;40329:8;40319:9;:19::i;19541:260::-:0;19643:4;-1:-1:-1;;;;;;19663:40:0;;19678:25;19663:40;;:92;;-1:-1:-1;;;;;;;19707:48:0;;19722:33;19707:48;19663:92;:132;;;-1:-1:-1;18237:25:0;-1:-1:-1;;;;;;18222:40:0;;;19759:36;18117:151;25911:104;25983:26;25993:2;25997:7;25983:26;;;;;;;;;;;;:9;:26::i;28640:164::-;28711:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;28711:29:0;-1:-1:-1;;;;;28711:29:0;;;;;;;;:24;;28761:23;28711:24;28761:14;:23::i;:::-;-1:-1:-1;;;;;28752:46:0;;;;;;;;;;;28640:164;;:::o;25257:334::-;25350:4;25070:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25070:16:0;25363:73;;;;-1:-1:-1;;;25363:73:0;;11123:2:1;25363:73:0;;;11105:21:1;11162:2;11142:18;;;11135:30;11201:34;11181:18;;;11174:62;-1:-1:-1;;;11252:18:1;;;11245:42;11304:19;;25363:73:0;11095:234:1;25363:73:0;25443:13;25459:23;25474:7;25459:14;:23::i;:::-;25443:39;;25508:5;-1:-1:-1;;;;;25497:16:0;:7;-1:-1:-1;;;;;25497:16:0;;:51;;;;25541:7;-1:-1:-1;;;;;25517:31:0;:20;25529:7;25517:11;:20::i;:::-;-1:-1:-1;;;;;25517:31:0;;25497:51;:87;;;-1:-1:-1;;;;;;22557:25:0;;;22537:4;22557:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;25552:32;25489:96;25257:334;-1:-1:-1;;;;25257:334:0:o;28008:526::-;28149:4;-1:-1:-1;;;;;28122:31:0;:23;28137:7;28122:14;:23::i;:::-;-1:-1:-1;;;;;28122:31:0;;28114:85;;;;-1:-1:-1;;;28114:85:0;;14962:2:1;28114:85:0;;;14944:21:1;15001:2;14981:18;;;14974:30;15040:34;15020:18;;;15013:62;15111:11;15091:18;;;15084:39;15140:19;;28114:85:0;14934:231:1;28114:85:0;-1:-1:-1;;;;;28214:16:0;;28206:65;;;;-1:-1:-1;;;28206:65:0;;9652:2:1;28206:65:0;;;9634:21:1;9691:2;9671:18;;;9664:30;9730:34;9710:18;;;9703:62;9801:6;9781:18;;;9774:34;9825:19;;28206:65:0;9624:226:1;28206:65:0;28280:39;28301:4;28307:2;28311:7;28280:20;:39::i;:::-;28376:29;28393:1;28397:7;28376:8;:29::i;:::-;-1:-1:-1;;;;;28414:15:0;;;;;;:9;:15;;;;;:20;;28433:1;;28414:15;:20;;28433:1;;28414:20;:::i;:::-;;;;-1:-1:-1;;;;;;;28441:13:0;;;;;;:9;:13;;;;;:18;;28458:1;;28441:13;:18;;28458:1;;28441:18;:::i;:::-;;;;-1:-1:-1;;28466:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;28466:21:0;-1:-1:-1;;;;;28466:21:0;;;;;;;;;28501:27;;28466:16;;28501:27;;;;;;;28008:526;;;:::o;40350:159::-;40421:6;;;-1:-1:-1;;;;;40434:17:0;;;-1:-1:-1;;40434:17:0;;;;;;;40463:40;;40421:6;;;40434:17;40421:6;;40463:40;;40402:16;;40463:40;40350:159;;:::o;24403:287::-;24538:28;24548:4;24554:2;24558:7;24538:9;:28::i;:::-;24581:48;24604:4;24610:2;24614:7;24623:5;24581:22;:48::i;:::-;24573:111;;;;-1:-1:-1;;;24573:111:0;;8469:2:1;24573:111:0;;;8451:21:1;8508:2;8488:18;;;8481:30;8547:34;8527:18;;;8520:62;-1:-1:-1;;;8598:18:1;;;8591:48;8656:19;;24573:111:0;8441:240:1;20709:320:0;25050:4;25070:16;;;:7;:16;;;;;;20782:13;;-1:-1:-1;;;;;25070:16:0;20804:76;;;;-1:-1:-1;;;20804:76:0;;15372:2:1;20804:76:0;;;15354:21:1;15411:2;15391:18;;;15384:30;15450:34;15430:18;;;15423:62;15521:17;15501:18;;;15494:45;15556:19;;20804:76:0;15344:237:1;20804:76:0;20889:21;20913:10;:8;:10::i;:::-;20889:34;;20961:1;20943:7;20937:21;:25;:86;;;;;;;;;;;;;;;;;20989:7;20998:18;:7;:16;:18::i;:::-;20972:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20937:86;20930:93;20709:320;-1:-1:-1;;;20709:320:0:o;26232:260::-;26344:18;26350:2;26354:7;26344:5;:18::i;:::-;26377:54;26408:1;26412:2;26416:7;26425:5;26377:22;:54::i;:::-;26369:117;;;;-1:-1:-1;;;26369:117:0;;8469:2:1;26369:117:0;;;8451:21:1;8508:2;8488:18;;;8481:30;8547:34;8527:18;;;8520:62;-1:-1:-1;;;8598:18:1;;;8591:48;8656:19;;26369:117:0;8441:240:1;34132:521:0;-1:-1:-1;;;;;34316:18:0;;34312:167;;34345:40;34377:7;35440:10;:17;;35413:24;;;;:15;:24;;;;;:44;;;35464:24;;;;;;;;;;;;35340:154;34345:40;34312:167;;;34411:2;-1:-1:-1;;;;;34403:10:0;:4;-1:-1:-1;;;;;34403:10:0;;34399:80;;34424:47;34457:4;34463:7;34424:32;:47::i;:::-;-1:-1:-1;;;;;34489:16:0;;34485:163;;34516:45;34553:7;34516:36;:45::i;34485:163::-;34585:4;-1:-1:-1;;;;;34579:10:0;:2;-1:-1:-1;;;;;34579:10:0;;34575:73;;34600:40;34628:2;34632:7;34600:27;:40::i;29347:669::-;29484:4;-1:-1:-1;;;;;29501:13:0;;8102:20;8142:8;29497:514;;29531:72;;-1:-1:-1;;;29531:72:0;;-1:-1:-1;;;;;29531:36:0;;;;;:72;;15333:10;;29582:4;;29588:7;;29597:5;;29531:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29531:72:0;;;;;;;;-1:-1:-1;;29531:72:0;;;;;;;;;;;;:::i;:::-;;;29527:443;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29751:13:0;;29747:214;;29784:60;;-1:-1:-1;;;29784:60:0;;8469:2:1;29784:60:0;;;8451:21:1;8508:2;8488:18;;;8481:30;8547:34;8527:18;;;8520:62;-1:-1:-1;;;8598:18:1;;;8591:48;8656:19;;29784:60:0;8441:240:1;29747:214:0;29929:6;29923:13;29914:6;29910:2;29906:15;29899:38;29527:443;-1:-1:-1;;;;;;29646:51:0;-1:-1:-1;;;29646:51:0;;-1:-1:-1;29639:58:0;;29497:514;-1:-1:-1;29999:4:0;29347:669;;;;;;:::o;43939:107::-;43999:13;44028:12;44021:19;;;;;:::i;15760:637::-;15816:13;16025:10;16021:43;;-1:-1:-1;;16046:10:0;;;;;;;;;;;;;;;;;;15760:637::o;16021:43::-;16085:5;16070:12;16118:62;16125:9;;16118:62;;16145:8;;;;:::i;:::-;;-1:-1:-1;16162:10:0;;-1:-1:-1;16170:2:0;16162:10;;:::i;:::-;;;16118:62;;;16186:19;16218:6;16208:17;;;;;;-1:-1:-1;;;16208:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16208:17:0;;16186:39;;16232:132;16239:10;;16232:132;;16260:11;16270:1;16260:11;;:::i;:::-;;-1:-1:-1;16323:10:0;16331:2;16323:5;:10;:::i;:::-;16310:24;;:2;:24;:::i;:::-;16297:39;;16280:6;16287;16280:14;;;;;;-1:-1:-1;;;16280:14:0;;;;;;;;;;;;:56;;;;;;;;;;-1:-1:-1;16345:11:0;16354:2;16345:11;;:::i;:::-;;;16232:132;;26802:356;-1:-1:-1;;;;;26878:16:0;;26870:61;;;;-1:-1:-1;;;26870:61:0;;13482:2:1;26870:61:0;;;13464:21:1;;;13501:18;;;13494:30;13560:34;13540:18;;;13533:62;13612:18;;26870:61:0;13454:182:1;26870:61:0;25050:4;25070:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25070:16:0;:30;26938:58;;;;-1:-1:-1;;;26938:58:0;;9295:2:1;26938:58:0;;;9277:21:1;9334:2;9314:18;;;9307:30;9373;9353:18;;;9346:58;9421:18;;26938:58:0;9267:178:1;26938:58:0;27005:45;27034:1;27038:2;27042:7;27005:20;:45::i;:::-;-1:-1:-1;;;;;27059:13:0;;;;;;:9;:13;;;;;:18;;27076:1;;27059:13;:18;;27076:1;;27059:18;:::i;:::-;;;;-1:-1:-1;;27084:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;27084:21:0;-1:-1:-1;;;;;27084:21:0;;;;;;;;27119:33;;27084:16;;;27119:33;;27084:16;;27119:33;26802:356;;:::o;36103:928::-;36357:22;36407:1;36382:22;36399:4;36382:16;:22::i;:::-;:26;;;;:::i;:::-;36415:18;36436:26;;;:17;:26;;;;;;36357:51;;-1:-1:-1;36561:28:0;;;36557:306;;-1:-1:-1;;;;;36622:18:0;;36600:19;36622:18;;;:12;:18;;;;;;;;:34;;;;;;;;;36667:30;;;;;;:44;;;36778:30;;:17;:30;;;;;:43;;;36557:306;-1:-1:-1;36951:26:0;;;;:17;:26;;;;;;;;36944:33;;;-1:-1:-1;;;;;36991:18:0;;;;;:12;:18;;;;;:34;;;;;;;36984:41;36103:928::o;37314:1025::-;37580:10;:17;37555:22;;37580:21;;37600:1;;37580:21;:::i;:::-;37608:18;37629:24;;;:15;:24;;;;;;37986:10;:26;;37555:46;;-1:-1:-1;37629:24:0;;37555:46;;37986:26;;;;-1:-1:-1;;;37986:26:0;;;;;;;;;;;;;;;;;37964:48;;38046:11;38021:10;38032;38021:22;;;;;;-1:-1:-1;;;38021:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;38122:28;;;:15;:28;;;;;;;:41;;;38286:24;;;;;38279:31;38317:10;:16;;;;;-1:-1:-1;;;38317:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;37314:1025;;;;:::o;34942:207::-;35023:14;35040:20;35057:2;35040:16;:20::i;:::-;-1:-1:-1;;;;;35067:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;35108:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;34942:207:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:160::-;715:20;;771:13;;764:21;754:32;;744:2;;800:1;797;790:12;744:2;696:114;;;:::o;815:257::-;874:6;927:2;915:9;906:7;902:23;898:32;895:2;;;948:6;940;933:22;895:2;992:9;979:23;1011:31;1036:5;1011:31;:::i;1077:261::-;1147:6;1200:2;1188:9;1179:7;1175:23;1171:32;1168:2;;;1221:6;1213;1206:22;1168:2;1258:9;1252:16;1277:31;1302:5;1277:31;:::i;1343:398::-;1411:6;1419;1472:2;1460:9;1451:7;1447:23;1443:32;1440:2;;;1493:6;1485;1478:22;1440:2;1537:9;1524:23;1556:31;1581:5;1556:31;:::i;:::-;1606:5;-1:-1:-1;1663:2:1;1648:18;;1635:32;1676:33;1635:32;1676:33;:::i;:::-;1728:7;1718:17;;;1430:311;;;;;:::o;1746:466::-;1823:6;1831;1839;1892:2;1880:9;1871:7;1867:23;1863:32;1860:2;;;1913:6;1905;1898:22;1860:2;1957:9;1944:23;1976:31;2001:5;1976:31;:::i;:::-;2026:5;-1:-1:-1;2083:2:1;2068:18;;2055:32;2096:33;2055:32;2096:33;:::i;:::-;1850:362;;2148:7;;-1:-1:-1;;;2202:2:1;2187:18;;;;2174:32;;1850:362::o;2217:824::-;2312:6;2320;2328;2336;2389:3;2377:9;2368:7;2364:23;2360:33;2357:2;;;2411:6;2403;2396:22;2357:2;2455:9;2442:23;2474:31;2499:5;2474:31;:::i;:::-;2524:5;-1:-1:-1;2581:2:1;2566:18;;2553:32;2594:33;2553:32;2594:33;:::i;:::-;2646:7;-1:-1:-1;2700:2:1;2685:18;;2672:32;;-1:-1:-1;2755:2:1;2740:18;;2727:32;2782:18;2771:30;;2768:2;;;2819:6;2811;2804:22;2768:2;2847:22;;2900:4;2892:13;;2888:27;-1:-1:-1;2878:2:1;;2934:6;2926;2919:22;2878:2;2962:73;3027:7;3022:2;3009:16;3004:2;3000;2996:11;2962:73;:::i;:::-;2952:83;;;2347:694;;;;;;;:::o;3046:325::-;3111:6;3119;3172:2;3160:9;3151:7;3147:23;3143:32;3140:2;;;3193:6;3185;3178:22;3140:2;3237:9;3224:23;3256:31;3281:5;3256:31;:::i;:::-;3306:5;-1:-1:-1;3330:35:1;3361:2;3346:18;;3330:35;:::i;:::-;3320:45;;3130:241;;;;;:::o;3376:325::-;3444:6;3452;3505:2;3493:9;3484:7;3480:23;3476:32;3473:2;;;3526:6;3518;3511:22;3473:2;3570:9;3557:23;3589:31;3614:5;3589:31;:::i;:::-;3639:5;3691:2;3676:18;;;;3663:32;;-1:-1:-1;;;3463:238:1:o;3706:190::-;3762:6;3815:2;3803:9;3794:7;3790:23;3786:32;3783:2;;;3836:6;3828;3821:22;3783:2;3864:26;3880:9;3864:26;:::i;3901:255::-;3959:6;4012:2;4000:9;3991:7;3987:23;3983:32;3980:2;;;4033:6;4025;4018:22;3980:2;4077:9;4064:23;4096:30;4120:5;4096:30;:::i;4161:259::-;4230:6;4283:2;4271:9;4262:7;4258:23;4254:32;4251:2;;;4304:6;4296;4289:22;4251:2;4341:9;4335:16;4360:30;4384:5;4360:30;:::i;4425:480::-;4494:6;4547:2;4535:9;4526:7;4522:23;4518:32;4515:2;;;4568:6;4560;4553:22;4515:2;4613:9;4600:23;4646:18;4638:6;4635:30;4632:2;;;4683:6;4675;4668:22;4632:2;4711:22;;4764:4;4756:13;;4752:27;-1:-1:-1;4742:2:1;;4798:6;4790;4783:22;4742:2;4826:73;4891:7;4886:2;4873:16;4868:2;4864;4860:11;4826:73;:::i;4910:190::-;4969:6;5022:2;5010:9;5001:7;4997:23;4993:32;4990:2;;;5043:6;5035;5028:22;4990:2;-1:-1:-1;5071:23:1;;4980:120;-1:-1:-1;4980:120:1:o;5105:257::-;5146:3;5184:5;5178:12;5211:6;5206:3;5199:19;5227:63;5283:6;5276:4;5271:3;5267:14;5260:4;5253:5;5249:16;5227:63;:::i;:::-;5344:2;5323:15;-1:-1:-1;;5319:29:1;5310:39;;;;5351:4;5306:50;;5154:208;-1:-1:-1;;5154:208:1:o;5367:470::-;5546:3;5584:6;5578:13;5600:53;5646:6;5641:3;5634:4;5626:6;5622:17;5600:53;:::i;:::-;5716:13;;5675:16;;;;5738:57;5716:13;5675:16;5772:4;5760:17;;5738:57;:::i;:::-;5811:20;;5554:283;-1:-1:-1;;;;5554:283:1:o;6283:511::-;6477:4;-1:-1:-1;;;;;6587:2:1;6579:6;6575:15;6564:9;6557:34;6639:2;6631:6;6627:15;6622:2;6611:9;6607:18;6600:43;;6679:6;6674:2;6663:9;6659:18;6652:34;6722:3;6717:2;6706:9;6702:18;6695:31;6743:45;6783:3;6772:9;6768:19;6760:6;6743:45;:::i;:::-;6735:53;6486:308;-1:-1:-1;;;;;;6486:308:1:o;6799:635::-;6970:2;7022:21;;;7092:13;;6995:18;;;7114:22;;;6941:4;;6970:2;7193:15;;;;7167:2;7152:18;;;6941:4;7239:169;7253:6;7250:1;7247:13;7239:169;;;7314:13;;7302:26;;7383:15;;;;7348:12;;;;7275:1;7268:9;7239:169;;;-1:-1:-1;7425:3:1;;6950:484;-1:-1:-1;;;;;;6950:484:1:o;7631:219::-;7780:2;7769:9;7762:21;7743:4;7800:44;7840:2;7829:9;7825:18;7817:6;7800:44;:::i;18059:128::-;18099:3;18130:1;18126:6;18123:1;18120:13;18117:2;;;18136:18;;:::i;:::-;-1:-1:-1;18172:9:1;;18107:80::o;18192:120::-;18232:1;18258;18248:2;;18263:18;;:::i;:::-;-1:-1:-1;18297:9:1;;18238:74::o;18317:125::-;18357:4;18385:1;18382;18379:8;18376:2;;;18390:18;;:::i;:::-;-1:-1:-1;18427:9:1;;18366:76::o;18447:258::-;18519:1;18529:113;18543:6;18540:1;18537:13;18529:113;;;18619:11;;;18613:18;18600:11;;;18593:39;18565:2;18558:10;18529:113;;;18660:6;18657:1;18654:13;18651:2;;;-1:-1:-1;;18695:1:1;18677:16;;18670:27;18500:205::o;18710:437::-;18789:1;18785:12;;;;18832;;;18853:2;;18907:4;18899:6;18895:17;18885:27;;18853:2;18960;18952:6;18949:14;18929:18;18926:38;18923:2;;;-1:-1:-1;;;18994:1:1;18987:88;19098:4;19095:1;19088:15;19126:4;19123:1;19116:15;18923:2;;18765:382;;;:::o;19152:135::-;19191:3;-1:-1:-1;;19212:17:1;;19209:2;;;19232:18;;:::i;:::-;-1:-1:-1;19279:1:1;19268:13;;19199:88::o;19292:112::-;19324:1;19350;19340:2;;19355:18;;:::i;:::-;-1:-1:-1;19389:9:1;;19330:74::o;19409:184::-;-1:-1:-1;;;19458:1:1;19451:88;19558:4;19555:1;19548:15;19582:4;19579:1;19572:15;19598:184;-1:-1:-1;;;19647:1:1;19640:88;19747:4;19744:1;19737:15;19771:4;19768:1;19761:15;19787:184;-1:-1:-1;;;19836:1:1;19829:88;19936:4;19933:1;19926:15;19960:4;19957:1;19950:15;19976:154;-1:-1:-1;;;;;20055:5:1;20051:54;20044:5;20041:65;20031:2;;20120:1;20117;20110:12;20135:177;-1:-1:-1;;;;;;20213:5:1;20209:78;20202:5;20199:89;20189:2;;20302:1;20299;20292:12

Swarm Source

ipfs://75759e0f8ccba546196e8d738cc028247ea0803c418591f6145b4751e5bdbf10
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.