ETH Price: $3,267.34 (+0.05%)
Gas: 1 Gwei

Token

Actual Genesis (ACTUAL)
 

Overview

Max Total Supply

5,000 ACTUAL

Holders

64

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
neuregime.eth
Balance
22 ACTUAL
0xe06442F60F00Eb1a46AeDe52a246F8CC3ecD9D56
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:
ActualGenesis

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-12
*/

// ##############################################################
// ##############################################################
// ##############################################################
// ######"          ""### "" "###################################
// ####                        ##### ------------------------- ##
// #### ........              ###### ACTUAL            GENESIS ##
// ###########"             ######## BY           NEU × REGIME ##
// ########"        .      #########                           ##
// ######       .###        ########    https://actual.gallery ##
// #####        ####        "#######            @actualgallery ##
// ####       #####          "######                           ##
// ###         ""              #####        https://neuregi.me ##
// ###               #          "###               @neuxregime ##
// ###.           .#####.       .### ------------------------- ##
// #####........#########......##################################
// ##############################################################
// ##############################################################
// ##     "NEVER BEFORE HAS THERE BEEN SO MUCH LIGHT" - M.     ##
// ##############################################################
// ##############################################################

// SPDX-License-Identifier: Unlicensed

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

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

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

pragma solidity ^0.8.0;

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

  /**
   * @dev Safely transfers `tokenId` token from `from` to `to`, 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]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
  /**
   * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
   * by `operator` from `from`, this function is called.
   *
   * It must return its Solidity selector to confirm the token transfer.
   * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
   *
   * The selector can be obtained in Solidity with `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]

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

pragma solidity ^0.8.0;

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

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

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

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

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

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]

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

  /**
   * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
   * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
   * by default, can be 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
  {
    _setApprovalForAll(_msgSender(), operator, approved);
  }

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

  /**
   * @dev See {IERC721-transferFrom}.
   */
  function transferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public virtual override {
    //solhint-disable-next-line max-line-length
    require(
      _isApprovedOrOwner(_msgSender(), tokenId),
      'ERC721: transfer caller is not owner nor approved'
    );

    _transfer(from, to, tokenId);
  }

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public virtual override {
    require(
      _isApprovedOrOwner(_msgSender(), tokenId),
      'ERC721: transfer caller is not owner nor approved'
    );
    _safeTransfer(from, to, tokenId, _data);
  }

  /**
   * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
   * are aware of the ERC721 protocol to prevent tokens from being forever locked.
   *
   * `_data` is additional data, it has no specified format and it is sent in call to `to`.
   *
   * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
   * implement alternative mechanisms to perform token transfer, such as signature-based.
   *
   * Requirements:
   *
   * - `from` cannot be the zero address.
   * - `to` cannot be the zero address.
   * - `tokenId` token must exist and be owned by `from`.
   * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
   *
   * Emits a {Transfer} event.
   */
  function _safeTransfer(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) internal virtual {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      'ERC721: transfer to non ERC721Receiver implementer'
    );
  }

  /**
   * @dev Returns whether `tokenId` exists.
   *
   * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
   *
   * Tokens start existing when they are minted (`_mint`),
   * and stop existing when they are burned (`_burn`).
   */
  function _exists(uint256 tokenId) internal view virtual returns (bool) {
    return _owners[tokenId] != address(0);
  }

  /**
   * @dev Returns whether `spender` is allowed to manage `tokenId`.
   *
   * Requirements:
   *
   * - `tokenId` must exist.
   */
  function _isApprovedOrOwner(address spender, uint256 tokenId)
    internal
    view
    virtual
    returns (bool)
  {
    require(_exists(tokenId), 'ERC721: operator query for nonexistent token');
    address owner = ERC721.ownerOf(tokenId);
    return (spender == owner ||
      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 Approve `operator` to operate on all of `owner` tokens
   *
   * Emits a {ApprovalForAll} event.
   */
  function _setApprovalForAll(
    address owner,
    address operator,
    bool approved
  ) internal virtual {
    require(owner != operator, 'ERC721: approve to caller');
    _operatorApprovals[owner][operator] = approved;
    emit ApprovalForAll(owner, operator, approved);
  }

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

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

  function _throwError(RecoverError error) private pure {
    if (error == RecoverError.NoError) {
      return; // no error: do nothing
    } else if (error == RecoverError.InvalidSignature) {
      revert('ECDSA: invalid signature');
    } else if (error == RecoverError.InvalidSignatureLength) {
      revert('ECDSA: invalid signature length');
    } else if (error == RecoverError.InvalidSignatureS) {
      revert("ECDSA: invalid signature 's' value");
    } else if (error == RecoverError.InvalidSignatureV) {
      revert("ECDSA: invalid signature 'v' value");
    }
  }

  /**
   * @dev Returns the address that signed a hashed message (`hash`) with
   * `signature` or error string. This address can then be used for verification purposes.
   *
   * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
   * this function rejects them by requiring the `s` value to be in the lower
   * half order, and the `v` value to be either 27 or 28.
   *
   * IMPORTANT: `hash` _must_ be the result of a hash operation for the
   * verification to be secure: it is possible to craft signatures that
   * recover to arbitrary addresses for non-hashed data. A safe way to ensure
   * this is by receiving a hash of the original message (which may otherwise
   * be too long), and then calling {toEthSignedMessageHash} on it.
   *
   * Documentation for signature generation:
   * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
   * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
   *
   * _Available since v4.3._
   */
  function tryRecover(bytes32 hash, bytes memory signature)
    internal
    pure
    returns (address, RecoverError)
  {
    // Check the signature length
    // - case 65: r,s,v signature (standard)
    // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
    if (signature.length == 65) {
      bytes32 r;
      bytes32 s;
      uint8 v;
      // ecrecover takes the signature parameters, and the only way to get them
      // currently is to use assembly.
      assembly {
        r := mload(add(signature, 0x20))
        s := mload(add(signature, 0x40))
        v := byte(0, mload(add(signature, 0x60)))
      }
      return tryRecover(hash, v, r, s);
    } else if (signature.length == 64) {
      bytes32 r;
      bytes32 vs;
      // ecrecover takes the signature parameters, and the only way to get them
      // currently is to use assembly.
      assembly {
        r := mload(add(signature, 0x20))
        vs := mload(add(signature, 0x40))
      }
      return tryRecover(hash, r, vs);
    } else {
      return (address(0), RecoverError.InvalidSignatureLength);
    }
  }

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

  /**
   * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
   *
   * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
   *
   * _Available since v4.3._
   */
  function tryRecover(
    bytes32 hash,
    bytes32 r,
    bytes32 vs
  ) internal pure returns (address, RecoverError) {
    bytes32 s;
    uint8 v;
    assembly {
      s := and(
        vs,
        0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
      )
      v := add(shr(255, vs), 27)
    }
    return tryRecover(hash, v, r, s);
  }

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

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

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

    return (signer, RecoverError.NoError);
  }

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

  /**
   * @dev Returns an Ethereum Signed Message, created from a `hash`. This
   * produces hash corresponding to the one signed with the
   * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
   * JSON-RPC method as part of EIP-191.
   *
   * See {recover}.
   */
  function toEthSignedMessageHash(bytes32 hash)
    internal
    pure
    returns (bytes32)
  {
    // 32 is the length in bytes of hash,
    // enforced by the type signature above
    return
      keccak256(abi.encodePacked('\x19Ethereum Signed Message:\n32', hash));
  }

  /**
   * @dev Returns an Ethereum Signed Message, created from `s`. This
   * produces hash corresponding to the one signed with the
   * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
   * JSON-RPC method as part of EIP-191.
   *
   * See {recover}.
   */
  function toEthSignedMessageHash(bytes memory s)
    internal
    pure
    returns (bytes32)
  {
    return
      keccak256(
        abi.encodePacked(
          '\x19Ethereum Signed Message:\n',
          Strings.toString(s.length),
          s
        )
      );
  }

  /**
   * @dev Returns an Ethereum Signed Typed Data, created from a
   * `domainSeparator` and a `structHash`. This produces hash corresponding
   * to the one signed with the
   * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
   * JSON-RPC method as part of EIP-712.
   *
   * See {recover}.
   */
  function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash)
    internal
    pure
    returns (bytes32)
  {
    return keccak256(abi.encodePacked('\x19\x01', domainSeparator, structHash));
  }
}

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

// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;

/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
  /* solhint-disable var-name-mixedcase */
  // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
  // invalidate the cached domain separator if the chain id changes.
  bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
  uint256 private immutable _CACHED_CHAIN_ID;
  address private immutable _CACHED_THIS;

  bytes32 private immutable _HASHED_NAME;
  bytes32 private immutable _HASHED_VERSION;
  bytes32 private immutable _TYPE_HASH;

  /* solhint-enable var-name-mixedcase */

  /**
   * @dev Initializes the domain separator and parameter caches.
   *
   * The meaning of `name` and `version` is specified in
   * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
   *
   * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
   * - `version`: the current major version of the signing domain.
   *
   * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
   * contract upgrade].
   */
  constructor(string memory name, string memory version) {
    bytes32 hashedName = keccak256(bytes(name));
    bytes32 hashedVersion = keccak256(bytes(version));
    bytes32 typeHash = keccak256(
      'EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'
    );
    _HASHED_NAME = hashedName;
    _HASHED_VERSION = hashedVersion;
    _CACHED_CHAIN_ID = block.chainid;
    _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(
      typeHash,
      hashedName,
      hashedVersion
    );
    _CACHED_THIS = address(this);
    _TYPE_HASH = typeHash;
  }

  /**
   * @dev Returns the domain separator for the current chain.
   */
  function _domainSeparatorV4() internal view returns (bytes32) {
    if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
      return _CACHED_DOMAIN_SEPARATOR;
    } else {
      return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
    }
  }

  function _buildDomainSeparator(
    bytes32 typeHash,
    bytes32 nameHash,
    bytes32 versionHash
  ) private view returns (bytes32) {
    return
      keccak256(
        abi.encode(
          typeHash,
          nameHash,
          versionHash,
          block.chainid,
          address(this)
        )
      );
  }

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

// File contracts/ActualGenesis.sol

// ███████████████████████████████
// █████▀╝╙`    ``╙▀▀███▓▀▀╝▀█████
// ███                       ║████
// ███▓▄▄▄▄▄▄▄▄,           ╓▓█████
// ██████████▀`           ╓███████
// ███████▀^     ╓▓▄      ████████
// █████▌      ▄███▌      ║███████
// ████╨     ,▓████M       ▀██████
// ███       █████╛         ▀█████
// ██M       ╨▀▀'            ╚████
// ██              ╓█▓         ▀██
// ██           ,▄█████,        ██
// ██▓▄     ,▄▄█████████▓▄,   ▄▓██
// ███████████████████████████████
// ██▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀██
// ██ █▀▀▀▀▀█ █  ▄▄▄▀▀█ █▀▀▀▀▀█ ██
// ██ █ ███ █ ██▄ █▄▄██ █ ███ █ ██
// ██ █ ▀▀▀ █ ▄██ ▀▄▀▀█ █ ▀▀▀ █ ██
// ██ ▀▀▀▀▀▀▀ ▀ █▄▀ ▀ ▀ ▀▀▀▀▀▀▀ ██
// ██ ▀█▄▄▀▀▀ ▄ ▀ ▀▄▄▄▄  ▀▄█▀█▀ ██
// ██ ▀█▄██ ▀█ █▀ ▄ █▀▀▀▄▀ ▀█▄  ██
// ██ █ ▄▀ ▄▀█▄ ▄▀▄▄ █ █▀▀▄▀▀█▀ ██
// ██   ▄▀█▄▀▄▄ ██▀▀ █▀▄ ██▀█▄  ██
// ██ ▀▀ ▀▀ ▀▀█   ▀  ▀█▀▀▀█▀▀   ██
// ██ █▀▀▀▀▀█ ▄▀  ▄ ▄ █ ▀ █▄▄▄▄ ██
// ██ █ ███ █ ▀▄▀▀▄▀█▄▀███▀▀███ ██
// ██ █ ▀▀▀ █ ▄█ █▀█▀█▀ ▀▄▄█▄█  ██
// ██ ▀▀▀▀▀▀▀ ▀   ▀▀ ▀ ▀▀   ▀▀▀ ██
// ██ ------------------------- ██
// ██ ACTUAL            GENESIS ██
// ██ BY           NEU × REGIME ██
// ██                           ██
// ██    https://actual.gallery ██
// ██            @actualgallery ██
// ██                           ██
// ██        https://neuregi.me ██
// ██               @neuxregime ██
// ██ ------------------------- ██
// ██▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄██
// ███████████████████████████████
// ██ "NEVER BEFORE, HAS THERE  ██
// ██ BEEN SO MUCH LIGHT" ████████
// ██ -M. ████████████████████████
// ██████████ ENCODING REQUIRES ██
// ██ POWERLINE SUPPORTING FONT ██
// ███████████████████████████████
// ███████████████ JAN. 6, 2022 ██
// ███████████████████████████████

pragma solidity ^0.8.4;

error TokenURILocked();
error ArweaveIDLocked();
error SaleIsLocked();
error AllArtworksSold();
error ArtworkAlreadyMinted();
error ArtworkDoesNotExist();
error NewMaxNumberLowerThanCurrentNumberOfMintedArtworks();
error NewMaxNumberGreaterThanTotalSupply();
error AmountMoreThanSetPrice();
error AmountLessThanSetPrice();
error MoreThanOneArtworkExistsAlready();
error SenderIsDifferentFromOwner();
error ArtworkWithProvidedTokenIdDoesNotExist();
error DirectMintDisallowedSignatureMismatch();
error WithdrawalFailed();

contract ActualGenesis is ERC721, EIP712, Ownable {
  string public tokenBaseURI;
  bool public tokenURILocked;

  string public arweaveID;
  bool public arweaveIDLocked;

  string public tokenURISuffix = '';

  bool public saleLocked;
  uint256 public totalSupply;
  uint256 public maxNumberOfArtworks;
  uint256 public numberOfMintedArtworks;
  uint256 public pricePerArtwork;
  uint256 public artistProofs = 10;

  mapping(uint256 => bool) private tokenIdToIsArtworkPrivate;
  mapping(uint256 => address) private tokenIdToAddressArtworkIsLentTo;

  event Purchase(address indexed buyer, uint256 price, uint256 indexed tokenId);
  event Gift(address indexed receiver, uint256 indexed tokenId);
  event Lend(
    address indexed from,
    address indexed receiver,
    uint256 indexed tokenId
  );
  event ArweaveIdUpdated(string newArweaveId);

  constructor(
    string memory _tokenBaseURI,
    bool _saleLocked,
    uint256 _totalSupply,
    uint256 _maxNumberOfArtworks,
    uint256 _pricePerArtwork
  ) ERC721('Actual Genesis', 'ACTUAL') EIP712('Actual Genesis', '1.0.0') {
    tokenBaseURI = _tokenBaseURI;
    saleLocked = _saleLocked;
    totalSupply = _totalSupply;
    maxNumberOfArtworks = _maxNumberOfArtworks;
    pricePerArtwork = _pricePerArtwork;
  }

  /**
   * @dev Checks whether th eprovided `tokenId` exists.
   *
   * @param tokenId artwork token id
   *
   * @return true if artwork exists (has been minted
   * already), false otherwise
   */
  function exists(uint256 tokenId) public view returns (bool) {
    return _exists(tokenId);
  }

  /**
   * @dev Base URI for computing {tokenURI}. The resulting
   * tokenURI for each token will be the concatenation of
   * the `baseURI` and the `tokenId`.
   */
  function _baseURI() internal view override returns (string memory) {
    return tokenBaseURI;
  }

  /**
   * @dev Changes `baseURI`, useful when freezing the
   * contract.
   *
   * @notice that value cannot be changed if `tokenURILocked`
   * is locked.
   *
   * @param newBaseURI new URI replacing the old one
   */
  function setTokenBaseURI(string memory newBaseURI) public onlyOwner {
    if (tokenURILocked == true) revert TokenURILocked();
    tokenBaseURI = newBaseURI;
  }

  /**
   * @dev Overriden `tokenURI` with the ability to add a
   * suffix to URI. This is particularly helpful if
   * if metadata is "baked" as static .json files.
   *
   * @notice calls ERC721 `tokenURI` first and concatenates
   * the returned value with `tokenURISuffix`
   *
   * @param tokenId id of token to retrive URI for
   */
  function tokenURI(uint256 tokenId)
    public
    view
    override
    returns (string memory)
  {
    string memory tokenURIBasename = super.tokenURI(tokenId);

    return
      bytes(tokenURIBasename).length > 0
        ? string(abi.encodePacked(tokenURIBasename, tokenURISuffix))
        : '';
  }

  /**
   * @dev Lock the `baseURI` preventing any changes to
   * be committed to it. Useful when freezing the contract.
   */
  function lockTokenURI() public onlyOwner {
    tokenURILocked = true;
  }

  /**
   * @dev Changes `tokenURISuffix`, useful when freezing the
   * contract after all assets have been decentralized.
   *
   * @param newTokenURISuffix new suffix replacing the old one
   */
  function setTokenURISuffix(string memory newTokenURISuffix) public onlyOwner {
    tokenURISuffix = newTokenURISuffix;
  }

  /**
   * @dev Changes `arweaveID`, useful when freezing the
   * contract after all assets have been decentralized.
   *
   * @notice that value cannot be changed if `arweaveIDLocked`
   * is locked.
   *
   * @param newArweaveID new ID replacing the old one
   */
  function setArweaveID(string memory newArweaveID) public onlyOwner {
    if (arweaveIDLocked == true) revert ArweaveIDLocked();
    arweaveID = newArweaveID;
  }

  /**
   * @dev Lock the `arweaveID` preventing any changes to be
   * committed to it. Useful when freezing the contract.
   */
  function lockArweaveID() public onlyOwner {
    arweaveIDLocked = true;
  }

  /**
   * @dev Collects balance sum and transfers to sender.
   */
  function collectSum() public onlyOwner {
    (bool success, ) = payable(msg.sender).call{value: address(this).balance}(
      ''
    );
    if (success == false) revert WithdrawalFailed();
  }

  /**
   * @dev Permits lending of an artwork to an arbitrary
   * address 'addressToLendTo'. This functionality is to be
   * used in conjuction with setArtworkPublic/Private
   *
   * Requirements:
   * - `tokenID` must be owned by msg.sender
   * - `tokenID` must be already minted
   *
   * @param tokenID id of token that will be lent
   * @param addressToLendTo address of the borrower
   *
   * Emits a {Lend} event.
   */
  function lend(uint256 tokenID, address addressToLendTo) public {
    if (!_exists(tokenID)) revert ArtworkDoesNotExist();
    if (ownerOf(tokenID) != msg.sender) revert SenderIsDifferentFromOwner();

    emit Lend(ownerOf(tokenID), addressToLendTo, tokenID);
    tokenIdToAddressArtworkIsLentTo[tokenID] = addressToLendTo;
  }

  /**
   * @dev Checks the address to which `tokenID` is lent to.
   *
   * Requirements:
   * - `tokenID` must be already minted
   *
   * @param tokenID id of token that is lent
   * @return address of the borrower of `tokenID`
   */
  function getLentToAddress(uint256 tokenID) public view returns (address) {
    if (!_exists(tokenID)) revert ArtworkDoesNotExist();
    return tokenIdToAddressArtworkIsLentTo[tokenID];
  }

  /**
   * @dev Makes an artwork with `tokenID` public
   *
   * Requirements:
   * - `tokenID` must be owned by msg.sender
   * - `tokenID` must be already minted
   *
   * @param tokenID id of token that will be made public
   */
  function setArtworkPublic(uint256 tokenID) public {
    setArtworkPrivateState(tokenID, false);
  }

  /**
   * @dev Makes an artwork with `tokenID` private
   *
   * Requirements:
   * - `tokenID` must be owned by msg.sender
   * - `tokenID` must be already minted
   *
   * @param tokenID id of token that will be made private
   */
  function setArtworkPrivate(uint256 tokenID) public {
    setArtworkPrivateState(tokenID, true);
  }

  /**
   * @dev Checks if an artwork with `tokenID` is public or
   * private.
   *
   * Requirements:
   * - `tokenID` must be already minted
   *
   * @param tokenID id of artwork to check
   * @return true if private, false if public
   */
  function isArtworkPrivate(uint256 tokenID) public view returns (bool) {
    if (!_exists(tokenID)) revert ArtworkDoesNotExist();
    return tokenIdToIsArtworkPrivate[tokenID];
  }

  /**
   * @dev Helper function to modify the private/public state
   * of `tokenID`.
   *
   * Requirements:
   * - `tokenID` must be owned by msg.sender
   * - `tokenID` must be already minted
   *
   * @param tokenID id of token to be made private/public
   * @param flag true to make private, false to make public
   */
  function setArtworkPrivateState(uint256 tokenID, bool flag) private {
    if (!_exists(tokenID)) revert ArtworkDoesNotExist();
    if (ownerOf(tokenID) != msg.sender) revert SenderIsDifferentFromOwner();

    tokenIdToIsArtworkPrivate[tokenID] = flag;
  }

  /**
   * @dev Checks the number of artworks available for minting.
   *
   * @return the number of artworks available for minting
   */
  function artworksLeft() public view returns (uint256) {
    return maxNumberOfArtworks - numberOfMintedArtworks;
  }

  /**
   * @dev Changes the maximum number of artworks available for
   * minting.
   *
   * Requirements:
   * - new maximum must be < than total number of artworks
   * - new maximum must be > than  artworks minted so far
   *
   * @param newMaxNumberOfArtworks new maximum
   */
  function setMaxNumberOfArtworks(uint256 newMaxNumberOfArtworks)
    public
    onlyOwner
  {
    if (newMaxNumberOfArtworks < numberOfMintedArtworks)
      revert NewMaxNumberLowerThanCurrentNumberOfMintedArtworks();
    if (newMaxNumberOfArtworks >= totalSupply)
      revert NewMaxNumberGreaterThanTotalSupply();

    maxNumberOfArtworks = newMaxNumberOfArtworks;
  }

  /**
   * @dev Modifier ensuring that the minting tx is valid.
   *
   * Requirements:
   * - sale is not locked
   * - there are artworks left to be minted
   * - artwork is not already minted
   * - artwork `tokenId` is valid and <= total supply
   * - transaction value is exactly same as the base price
   *
   * @param newTokenId new token ID that will be minted
   */
  modifier isSaleValid(uint256 newTokenId) {
    if (msg.sender != owner() && saleLocked == true) revert SaleIsLocked();

    if (artworksLeft() == 0) revert AllArtworksSold();

    if (_exists(newTokenId)) revert ArtworkAlreadyMinted();

    if (newTokenId > totalSupply)
      revert ArtworkWithProvidedTokenIdDoesNotExist();

    if (msg.value < pricePerArtwork && msg.sender != owner())
      revert AmountLessThanSetPrice();

    if (msg.value > pricePerArtwork && msg.sender != owner())
      revert AmountMoreThanSetPrice();

    _;
  }

  /**
   * @dev Mints `artistProofs` number of artworks with
   * `tokenID` starting at 1 (inclusive) and increasing
   * to `artistProofs` (inclusive).
   *
   * Requirements:
   * - No artworks have been sold/minted already
   */
  function mintArtistProofs() public onlyOwner {
    if (numberOfMintedArtworks > 0) revert MoreThanOneArtworkExistsAlready();
    for (uint256 i = 1; i <= artistProofs; i++) {
      mintArtistProof(i);
    }
  }

  /**
   * @dev Helper function to mint artist proofs
   */
  function mintArtistProof(uint256 newTokenId) private isSaleValid(newTokenId) {
    emit Purchase(msg.sender, msg.value, newTokenId);
    _mintPiece(newTokenId, msg.sender);
  }

  /**
   * @dev Computes EIP 712 hash of typed structure of
   * `account` and `tokenID`
   *
   * @param account msg.sender of minting transaction
   * @param newTokenId artwork to be minted
   *
   * @return the hash of the fully encoded EIP712 message
   * for this domain.
   */
  function _hash(address account, uint256 newTokenId)
    internal
    view
    returns (bytes32)
  {
    return
      _hashTypedDataV4(
        keccak256(
          abi.encode(
            keccak256('NFT(uint256 Artwork,address Buyer)'),
            newTokenId,
            account
          )
        )
      );
  }

  /**
   * @dev Compares an EIP 712 signed message of
   * `account`and `newTokenId` with one provided by the `buy`
   * function (incoming from client/wallet app).
   *
   * @param account msg.sender of minting transaction
   * @param newTokenId artwork to be minted
   * @param signature provided by the client/wallet
   *
   * @return true if contract-computed signature matches the
   * client/wallet signature, otherwise false, meaning that
   * the msg.sender is different from the wallet account that
   * signed the message.
   */
  function matchAddressSigner(
    address account,
    uint256 newTokenId,
    bytes memory signature
  ) private view returns (bool) {
    return account == ECDSA.recover(_hash(account, newTokenId), signature);
    // return _hash(account, newTokenId) == signature;
  }

  /**
   * @dev Mints an artwork with `newTokenId`
   *
   * Requirements:
   * - see isSaleValid(uint256 newTokenId)
   * - see matchAddressSigner(...)
   *
   * @param signature client-provided wallet-signed keccak256
   * hash of msg.sender and `newTokenId`
   * @param newTokenId artwork to be minted
   *
   * Emits a {Transfer} and {Purchase} event.
   */
  function buy(bytes memory signature, uint256 newTokenId)
    public
    payable
    isSaleValid(newTokenId)
  {
    if (matchAddressSigner(msg.sender, newTokenId, signature) == false)
      revert DirectMintDisallowedSignatureMismatch();

    emit Purchase(msg.sender, msg.value, newTokenId);
    _mintPiece(newTokenId, msg.sender);
  }

  /**
   * @dev Gifting/airdrop functionality for owner
   *
   * Requirements:
   * - see isSaleValid(uint256 newTokenId)
   * - see onlyOwner(...)
   *
   * @param receiver address that will receive the artwork
   * @param newTokenId artwork to be minted
   *
   * Emits a {Transfer} and {Gift} event.
   */
  function gift(uint256 newTokenId, address receiver)
    public
    payable
    onlyOwner
    isSaleValid(newTokenId)
  {
    emit Gift(receiver, newTokenId);
    _mintPiece(newTokenId, receiver);
  }

  /**
   * @dev Helper function to mint artworks. Used in gift, buy,
   *and mintArtistProof.
   *
   * By defaults sets:
   * - the artwork to be public
   * - lent to the address of the owner (msg.sender)
   * - increments `numberOfMintedArtworks`, the number of
   *   artworks minted so far
   *
   * @param toAddress address that will own the artwork
   * @param newTokenId artwork to be minted
   *
   * Emits a {Transfer} event.
   */
  function _mintPiece(uint256 newTokenId, address toAddress) private {
    tokenIdToIsArtworkPrivate[newTokenId] = false;
    tokenIdToAddressArtworkIsLentTo[newTokenId] = msg.sender;
    numberOfMintedArtworks += 1;

    _safeMint(toAddress, newTokenId);
  }

  /**
   * @dev Locks public sale
   *
   * Requirements:
   * - see onlyOwner(...)
   */
  function lockSale() public onlyOwner {
    saleLocked = true;
  }

  /**
   * @dev Unlocks public sale
   *
   * Requirements:
   * - see onlyOwner(...)
   */
  function unlockSale() public onlyOwner {
    saleLocked = false;
  }

  /**
   * @dev Getter function to determine if public sale is
   * locked or not.
   *
   * @return true if sale is locked, false otherwise
   */
  function getSaleLocked() public view returns (bool) {
    return saleLocked;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenBaseURI","type":"string"},{"internalType":"bool","name":"_saleLocked","type":"bool"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"uint256","name":"_maxNumberOfArtworks","type":"uint256"},{"internalType":"uint256","name":"_pricePerArtwork","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllArtworksSold","type":"error"},{"inputs":[],"name":"AmountLessThanSetPrice","type":"error"},{"inputs":[],"name":"AmountMoreThanSetPrice","type":"error"},{"inputs":[],"name":"ArtworkAlreadyMinted","type":"error"},{"inputs":[],"name":"ArtworkDoesNotExist","type":"error"},{"inputs":[],"name":"ArtworkWithProvidedTokenIdDoesNotExist","type":"error"},{"inputs":[],"name":"ArweaveIDLocked","type":"error"},{"inputs":[],"name":"DirectMintDisallowedSignatureMismatch","type":"error"},{"inputs":[],"name":"MoreThanOneArtworkExistsAlready","type":"error"},{"inputs":[],"name":"NewMaxNumberGreaterThanTotalSupply","type":"error"},{"inputs":[],"name":"NewMaxNumberLowerThanCurrentNumberOfMintedArtworks","type":"error"},{"inputs":[],"name":"SaleIsLocked","type":"error"},{"inputs":[],"name":"SenderIsDifferentFromOwner","type":"error"},{"inputs":[],"name":"TokenURILocked","type":"error"},{"inputs":[],"name":"WithdrawalFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newArweaveId","type":"string"}],"name":"ArweaveIdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Gift","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Lend","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":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Purchase","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":[],"name":"artistProofs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"artworksLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"arweaveID","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"arweaveIDLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"newTokenId","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"collectSum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"getLentToAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSaleLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"gift","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"isArtworkPrivate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"},{"internalType":"address","name":"addressToLendTo","type":"address"}],"name":"lend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockArweaveID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxNumberOfArtworks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintArtistProofs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberOfMintedArtworks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePerArtwork","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"saleLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"setArtworkPrivate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"setArtworkPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newArweaveID","type":"string"}],"name":"setArweaveID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxNumberOfArtworks","type":"uint256"}],"name":"setMaxNumberOfArtworks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setTokenBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newTokenURISuffix","type":"string"}],"name":"setTokenURISuffix","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":[],"name":"tokenBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURILocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURISuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockSale","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610160604081905260006101408190526200001d91600b9162000244565b50600a6011553480156200003057600080fd5b50604051620032cc380380620032cc833981016040819052620000539162000300565b6040518060400160405280600e81526020016d41637475616c2047656e6573697360901b815250604051806040016040528060058152602001640312e302e360dc1b8152506040518060400160405280600e81526020016d41637475616c2047656e6573697360901b815250604051806040016040528060068152602001651050d515505360d21b8152508160009080519060200190620000f692919062000244565b5080516200010c90600190602084019062000244565b5050825160208085019190912083518483012060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281830187905260608201869052608082019490945230818401528151808203909301835260c0019052805194019390932091935091906080523060601b60c0526101205250620001b79250620001b19150503390565b620001f2565b8451620001cc90600790602088019062000244565b50600c805460ff191694151594909417909355600d91909155600e556010555062000459565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620002529062000406565b90600052602060002090601f016020900481019282620002765760008555620002c1565b82601f106200029157805160ff1916838001178555620002c1565b82800160010185558215620002c1579182015b82811115620002c1578251825591602001919060010190620002a4565b50620002cf929150620002d3565b5090565b5b80821115620002cf5760008155600101620002d4565b80518015158114620002fb57600080fd5b919050565b600080600080600060a0868803121562000318578081fd5b85516001600160401b03808211156200032f578283fd5b818801915088601f83011262000343578283fd5b81518181111562000358576200035862000443565b604051601f8201601f19908116603f0116810190838211818310171562000383576200038362000443565b81604052828152602093508b848487010111156200039f578586fd5b8591505b82821015620003c25784820184015181830185015290830190620003a3565b82821115620003d357858484830101525b9850620003e5915050888201620002ea565b604089015160608a01516080909a0151989b919a5098979650945050505050565b600181811c908216806200041b57607f821691505b602082108114156200043d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160a05160c05160601c60e0516101005161012051612e20620004ac6000396000612406015260006124550152600061243001526000612389015260006123b3015260006123dd0152612e206000f3fe6080604052600436106102885760003560e01c806370a082311161015a578063b1884744116100c1578063dbbc853b1161007a578063dbbc853b14610715578063e136a84d1461072a578063e985e9c514610740578063eb23482714610789578063edbf3fde146107a9578063f2fde38b146107c957600080fd5b8063b188474414610675578063b7f4863114610695578063b88d4fde146106aa578063bdd6a7f3146106ca578063bf26069f146106df578063c87b56dd146106f557600080fd5b80638ef79e91116101135780638ef79e91146105d05780639452cd17146105f057806395d89b4114610606578063a22cb4651461061b578063a9852bfb1461063b578063ac998f451461065b57600080fd5b806370a082311461053b578063715018a61461055b5780637e90e28b1461057057806383a076be1461058a5780638da5cb5b1461059d5780638dea7225146105bb57600080fd5b806323b872dd116101fe5780634ab45d54116101b75780634ab45d54146104915780634e99b800146104b15780634f558e79146104c65780635e5a9e30146104e65780635fb338ae146104fb5780636352211e1461051b57600080fd5b806323b872dd146103ef57806324d788091461040f57806325867d421461042f57806342842e0e1461044457806342b588f514610464578063485ec9941461047c57600080fd5b8063095ea7b311610250578063095ea7b31461034857806312822a751461036857806312c40f9e1461038257806318160ddd146103a25780631d758668146103c65780631f62197c146103d957600080fd5b806301ffc9a71461028d57806305ea13fb146102c257806306fdde03146102d957806307c60dac146102fb578063081812fc14610310575b600080fd5b34801561029957600080fd5b506102ad6102a836600461298c565b6107e9565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d761083b565b005b3480156102e557600080fd5b506102ee6108b9565b6040516102b99190612bce565b34801561030757600080fd5b506102d761094b565b34801561031c57600080fd5b5061033061032b366004612a4d565b610984565b6040516001600160a01b0390911681526020016102b9565b34801561035457600080fd5b506102d7610363366004612963565b610a0c565b34801561037457600080fd5b50600c546102ad9060ff1681565b34801561038e57600080fd5b506102d761039d366004612a4d565b610b22565b3480156103ae57600080fd5b506103b8600d5481565b6040519081526020016102b9565b6102d76103d43660046129c4565b610b96565b3480156103e557600080fd5b506103b8600f5481565b3480156103fb57600080fd5b506102d761040a366004612888565b610d3b565b34801561041b57600080fd5b5061033061042a366004612a4d565b610d6c565b34801561043b57600080fd5b506102d7610db0565b34801561045057600080fd5b506102d761045f366004612888565b610de6565b34801561047057600080fd5b50600c5460ff166102ad565b34801561048857600080fd5b506102ee610e01565b34801561049d57600080fd5b506102d76104ac366004612a07565b610e8f565b3480156104bd57600080fd5b506102ee610ef9565b3480156104d257600080fd5b506102ad6104e1366004612a4d565b610f06565b3480156104f257600080fd5b506102d7610f11565b34801561050757600080fd5b506102d7610516366004612a4d565b610f4a565b34801561052757600080fd5b50610330610536366004612a4d565b610f55565b34801561054757600080fd5b506103b861055636600461283c565b610fcc565b34801561056757600080fd5b506102d7611053565b34801561057c57600080fd5b50600a546102ad9060ff1681565b6102d7610598366004612a65565b611089565b3480156105a957600080fd5b506006546001600160a01b0316610330565b3480156105c757600080fd5b506102d761122f565b3480156105dc57600080fd5b506102d76105eb366004612a07565b611268565b3480156105fc57600080fd5b506103b860105481565b34801561061257600080fd5b506102ee6112ce565b34801561062757600080fd5b506102d7610636366004612929565b6112dd565b34801561064757600080fd5b506102d7610656366004612a07565b6112e8565b34801561066757600080fd5b506008546102ad9060ff1681565b34801561068157600080fd5b506102d7610690366004612a65565b611325565b3480156106a157600080fd5b506103b86113f3565b3480156106b657600080fd5b506102d76106c53660046128c3565b61140a565b3480156106d657600080fd5b506102d7611442565b3480156106eb57600080fd5b506103b8600e5481565b34801561070157600080fd5b506102ee610710366004612a4d565b6114d6565b34801561072157600080fd5b506102ee61152e565b34801561073657600080fd5b506103b860115481565b34801561074c57600080fd5b506102ad61075b366004612856565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561079557600080fd5b506102ad6107a4366004612a4d565b61153b565b3480156107b557600080fd5b506102d76107c4366004612a4d565b611579565b3480156107d557600080fd5b506102d76107e436600461283c565b611584565b60006001600160e01b031982166380ac58cd60e01b148061081a57506001600160e01b03198216635b5e139f60e01b145b8061083557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b0316331461086e5760405162461bcd60e51b815260040161086590612c33565b60405180910390fd5b600f541561088f57604051636bface7960e01b815260040160405180910390fd5b60015b60115481116108b6576108a48161161c565b806108ae81612d63565b915050610892565b50565b6060600080546108c890612d28565b80601f01602080910402602001604051908101604052809291908181526020018280546108f490612d28565b80156109415780601f1061091657610100808354040283529160200191610941565b820191906000526020600020905b81548152906001019060200180831161092457829003601f168201915b5050505050905090565b6006546001600160a01b031633146109755760405162461bcd60e51b815260040161086590612c33565b600c805460ff19166001179055565b600061098f82611799565b6109f05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610865565b506000908152600460205260409020546001600160a01b031690565b6000610a1782610f55565b9050806001600160a01b0316836001600160a01b03161415610a855760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610865565b336001600160a01b0382161480610aa15750610aa1813361075b565b610b135760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610865565b610b1d83836117b6565b505050565b6006546001600160a01b03163314610b4c5760405162461bcd60e51b815260040161086590612c33565b600f54811015610b6f576040516360de586960e01b815260040160405180910390fd5b600d548110610b915760405163358ff9d360e01b815260040160405180910390fd5b600e55565b80610ba96006546001600160a01b031690565b6001600160a01b0316336001600160a01b031614158015610bd15750600c5460ff1615156001145b15610bef576040516307f140fd60e41b815260040160405180910390fd5b610bf76113f3565b610c145760405163338b50d560e11b815260040160405180910390fd5b610c1d81611799565b15610c3b5760405163d7b986a760e01b815260040160405180910390fd5b600d54811115610c5e57604051630a8b60d760e41b815260040160405180910390fd5b60105434108015610c7a57506006546001600160a01b03163314155b15610c98576040516307211edf60e51b815260040160405180910390fd5b60105434118015610cb457506006546001600160a01b03163314155b15610cd257604051638761ad8960e01b815260040160405180910390fd5b610cdd338385611824565b610cfa576040516370bebd4960e01b815260040160405180910390fd5b604051348152829033907f12cb4648cf3058b17ceeb33e579f8b0bc269fe0843f3900b8e24b6c54871703c9060200160405180910390a3610b1d8233611856565b610d4533826118a9565b610d615760405162461bcd60e51b815260040161086590612c68565b610b1d838383611993565b6000610d7782611799565b610d9457604051637e69f04160e11b815260040160405180910390fd5b506000908152601360205260409020546001600160a01b031690565b6006546001600160a01b03163314610dda5760405162461bcd60e51b815260040161086590612c33565b600c805460ff19169055565b610b1d8383836040518060200160405280600081525061140a565b60098054610e0e90612d28565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3a90612d28565b8015610e875780601f10610e5c57610100808354040283529160200191610e87565b820191906000526020600020905b815481529060010190602001808311610e6a57829003601f168201915b505050505081565b6006546001600160a01b03163314610eb95760405162461bcd60e51b815260040161086590612c33565b600a5460ff16151560011415610ee25760405163e42582d960e01b815260040160405180910390fd5b8051610ef59060099060208401906126f2565b5050565b60078054610e0e90612d28565b600061083582611799565b6006546001600160a01b03163314610f3b5760405162461bcd60e51b815260040161086590612c33565b6008805460ff19166001179055565b6108b6816001611b33565b6000818152600260205260408120546001600160a01b0316806108355760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610865565b60006001600160a01b0382166110375760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610865565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461107d5760405162461bcd60e51b815260040161086590612c33565b6110876000611baa565b565b6006546001600160a01b031633146110b35760405162461bcd60e51b815260040161086590612c33565b816110c66006546001600160a01b031690565b6001600160a01b0316336001600160a01b0316141580156110ee5750600c5460ff1615156001145b1561110c576040516307f140fd60e41b815260040160405180910390fd5b6111146113f3565b6111315760405163338b50d560e11b815260040160405180910390fd5b61113a81611799565b156111585760405163d7b986a760e01b815260040160405180910390fd5b600d5481111561117b57604051630a8b60d760e41b815260040160405180910390fd5b6010543410801561119757506006546001600160a01b03163314155b156111b5576040516307211edf60e51b815260040160405180910390fd5b601054341180156111d157506006546001600160a01b03163314155b156111ef57604051638761ad8960e01b815260040160405180910390fd5b60405183906001600160a01b038416907fef33e970549489dd2e75c841935709372f2926e3b90b56af4040186e9b83b3e490600090a3610b1d8383611856565b6006546001600160a01b031633146112595760405162461bcd60e51b815260040161086590612c33565b600a805460ff19166001179055565b6006546001600160a01b031633146112925760405162461bcd60e51b815260040161086590612c33565b60085460ff161515600114156112bb5760405163a16ef1d560e01b815260040160405180910390fd5b8051610ef59060079060208401906126f2565b6060600180546108c890612d28565b610ef5338383611bfc565b6006546001600160a01b031633146113125760405162461bcd60e51b815260040161086590612c33565b8051610ef590600b9060208401906126f2565b61132e82611799565b61134b57604051637e69f04160e11b815260040160405180910390fd5b3361135583610f55565b6001600160a01b03161461137c576040516313e8695b60e11b815260040160405180910390fd5b81816001600160a01b031661139084610f55565b6001600160a01b03167f11dd72a5d477527ee1cbe309212bb368745a98cf1dc3befcac7eef4988a957c260405160405180910390a460009182526013602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6000600f54600e546114059190612ce5565b905090565b61141433836118a9565b6114305760405162461bcd60e51b815260040161086590612c68565b61143c84848484611ccb565b50505050565b6006546001600160a01b0316331461146c5760405162461bcd60e51b815260040161086590612c33565b604051600090339047908381818185875af1925050503d80600081146114ae576040519150601f19603f3d011682016040523d82523d6000602084013e6114b3565b606091505b5090915050806108b6576040516327fcd9d160e01b815260040160405180910390fd5b606060006114e383611cfe565b905060008151116115035760405180602001604052806000815250611527565b80600b604051602001611517929190612ae2565b6040516020818303038152906040525b9392505050565b600b8054610e0e90612d28565b600061154682611799565b61156357604051637e69f04160e11b815260040160405180910390fd5b5060009081526012602052604090205460ff1690565b6108b6816000611b33565b6006546001600160a01b031633146115ae5760405162461bcd60e51b815260040161086590612c33565b6001600160a01b0381166116135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610865565b6108b681611baa565b8061162f6006546001600160a01b031690565b6001600160a01b0316336001600160a01b0316141580156116575750600c5460ff1615156001145b15611675576040516307f140fd60e41b815260040160405180910390fd5b61167d6113f3565b61169a5760405163338b50d560e11b815260040160405180910390fd5b6116a381611799565b156116c15760405163d7b986a760e01b815260040160405180910390fd5b600d548111156116e457604051630a8b60d760e41b815260040160405180910390fd5b6010543410801561170057506006546001600160a01b03163314155b1561171e576040516307211edf60e51b815260040160405180910390fd5b6010543411801561173a57506006546001600160a01b03163314155b1561175857604051638761ad8960e01b815260040160405180910390fd5b604051348152829033907f12cb4648cf3058b17ceeb33e579f8b0bc269fe0843f3900b8e24b6c54871703c9060200160405180910390a3610ef58233611856565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117eb82610f55565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118396118338585611db2565b83611e16565b6001600160a01b0316846001600160a01b03161490509392505050565b6000828152601260209081526040808320805460ff191690556013909152812080546001600160a01b03191633179055600f805460019290611899908490612cb9565b90915550610ef590508183611e3a565b60006118b482611799565b6119155760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610865565b600061192083610f55565b9050806001600160a01b0316846001600160a01b0316148061195b5750836001600160a01b031661195084610984565b6001600160a01b0316145b8061198b57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166119a682610f55565b6001600160a01b031614611a0e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610865565b6001600160a01b038216611a705760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610865565b611a7b6000826117b6565b6001600160a01b0383166000908152600360205260408120805460019290611aa4908490612ce5565b90915550506001600160a01b0382166000908152600360205260408120805460019290611ad2908490612cb9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611b3c82611799565b611b5957604051637e69f04160e11b815260040160405180910390fd5b33611b6383610f55565b6001600160a01b031614611b8a576040516313e8695b60e11b815260040160405180910390fd5b600091825260126020526040909120805460ff1916911515919091179055565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611c5e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610865565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611cd6848484611993565b611ce284848484611e54565b61143c5760405162461bcd60e51b815260040161086590612be1565b6060611d0982611799565b611d6d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610865565b6000611d77611f61565b90506000815111611d975760405180602001604052806000815250611527565b80611da184611f70565b604051602001611517929190612ab3565b604080517f7b76ebe097c2232d1e5413981327cbbf542564a9f1fe9ad07a725272b00030bb60208201529081018290526001600160a01b0383166060820152600090611527906080016040516020818303038152906040528051906020012061208a565b6000806000611e2585856120d8565b91509150611e3281612148565b509392505050565b610ef5828260405180602001604052806000815250612349565b60006001600160a01b0384163b15611f5657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e98903390899088908890600401612b91565b602060405180830381600087803b158015611eb257600080fd5b505af1925050508015611ee2575060408051601f3d908101601f19168201909252611edf918101906129a8565b60015b611f3c573d808015611f10576040519150601f19603f3d011682016040523d82523d6000602084013e611f15565b606091505b508051611f345760405162461bcd60e51b815260040161086590612be1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061198b565b506001949350505050565b6060600780546108c890612d28565b606081611f945750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fbe5780611fa881612d63565b9150611fb79050600a83612cd1565b9150611f98565b60008167ffffffffffffffff811115611fe757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612011576020820181803683370190505b5090505b841561198b57612026600183612ce5565b9150612033600a86612d7e565b61203e906030612cb9565b60f81b81838151811061206157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612083600a86612cd1565b9450612015565b600061083561209761237c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008082516041141561210f5760208301516040840151606085015160001a612103878285856124a3565b94509450505050612141565b825160401415612139576020830151604084015161212e868383612590565b935093505050612141565b506000905060025b9250929050565b600081600481111561216a57634e487b7160e01b600052602160045260246000fd5b14156121735750565b600181600481111561219557634e487b7160e01b600052602160045260246000fd5b14156121e35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610865565b600281600481111561220557634e487b7160e01b600052602160045260246000fd5b14156122535760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610865565b600381600481111561227557634e487b7160e01b600052602160045260246000fd5b14156122ce5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610865565b60048160048111156122f057634e487b7160e01b600052602160045260246000fd5b14156108b65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610865565b61235383836125bf565b6123606000848484611e54565b610b1d5760405162461bcd60e51b815260040161086590612be1565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156123d557507f000000000000000000000000000000000000000000000000000000000000000046145b156123ff57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156124da5750600090506003612587565b8460ff16601b141580156124f257508460ff16601c14155b156125035750600090506004612587565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612557573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661258057600060019250925050612587565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016125b1878288856124a3565b935093505050935093915050565b6001600160a01b0382166126155760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610865565b61261e81611799565b1561266b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610865565b6001600160a01b0382166000908152600360205260408120805460019290612694908490612cb9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546126fe90612d28565b90600052602060002090601f0160209004810192826127205760008555612766565b82601f1061273957805160ff1916838001178555612766565b82800160010185558215612766579182015b8281111561276657825182559160200191906001019061274b565b50612772929150612776565b5090565b5b808211156127725760008155600101612777565b600067ffffffffffffffff808411156127a6576127a6612dbe565b604051601f8501601f19908116603f011681019082821181831017156127ce576127ce612dbe565b816040528093508581528686860111156127e757600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461281857600080fd5b919050565b600082601f83011261282d578081fd5b6115278383356020850161278b565b60006020828403121561284d578081fd5b61152782612801565b60008060408385031215612868578081fd5b61287183612801565b915061287f60208401612801565b90509250929050565b60008060006060848603121561289c578081fd5b6128a584612801565b92506128b360208501612801565b9150604084013590509250925092565b600080600080608085870312156128d8578081fd5b6128e185612801565b93506128ef60208601612801565b925060408501359150606085013567ffffffffffffffff811115612911578182fd5b61291d8782880161281d565b91505092959194509250565b6000806040838503121561293b578182fd5b61294483612801565b915060208301358015158114612958578182fd5b809150509250929050565b60008060408385031215612975578182fd5b61297e83612801565b946020939093013593505050565b60006020828403121561299d578081fd5b813561152781612dd4565b6000602082840312156129b9578081fd5b815161152781612dd4565b600080604083850312156129d6578182fd5b823567ffffffffffffffff8111156129ec578283fd5b6129f88582860161281d565b95602094909401359450505050565b600060208284031215612a18578081fd5b813567ffffffffffffffff811115612a2e578182fd5b8201601f81018413612a3e578182fd5b61198b8482356020840161278b565b600060208284031215612a5e578081fd5b5035919050565b60008060408385031215612a77578182fd5b8235915061287f60208401612801565b60008151808452612a9f816020860160208601612cfc565b601f01601f19169290920160200192915050565b60008351612ac5818460208801612cfc565b835190830190612ad9818360208801612cfc565b01949350505050565b600083516020612af58285838901612cfc565b8454918401918390600181811c9080831680612b1257607f831692505b858310811415612b3057634e487b7160e01b88526022600452602488fd5b808015612b445760018114612b5557612b81565b60ff19851688528388019550612b81565b60008b815260209020895b85811015612b795781548a820152908401908801612b60565b505083880195505b50939a9950505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bc490830184612a87565b9695505050505050565b6020815260006115276020830184612a87565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612ccc57612ccc612d92565b500190565b600082612ce057612ce0612da8565b500490565b600082821015612cf757612cf7612d92565b500390565b60005b83811015612d17578181015183820152602001612cff565b8381111561143c5750506000910152565b600181811c90821680612d3c57607f821691505b60208210811415612d5d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612d7757612d77612d92565b5060010190565b600082612d8d57612d8d612da8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146108b657600080fdfea2646970667358221220800119f736278e36e67325cdfc629e6a4d2071dea7eb8fc0466406af58b12d7564736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000000000000000002068747470733a2f2f646170702e61637475616c2e67616c6c6572792f6170692f

Deployed Bytecode

0x6080604052600436106102885760003560e01c806370a082311161015a578063b1884744116100c1578063dbbc853b1161007a578063dbbc853b14610715578063e136a84d1461072a578063e985e9c514610740578063eb23482714610789578063edbf3fde146107a9578063f2fde38b146107c957600080fd5b8063b188474414610675578063b7f4863114610695578063b88d4fde146106aa578063bdd6a7f3146106ca578063bf26069f146106df578063c87b56dd146106f557600080fd5b80638ef79e91116101135780638ef79e91146105d05780639452cd17146105f057806395d89b4114610606578063a22cb4651461061b578063a9852bfb1461063b578063ac998f451461065b57600080fd5b806370a082311461053b578063715018a61461055b5780637e90e28b1461057057806383a076be1461058a5780638da5cb5b1461059d5780638dea7225146105bb57600080fd5b806323b872dd116101fe5780634ab45d54116101b75780634ab45d54146104915780634e99b800146104b15780634f558e79146104c65780635e5a9e30146104e65780635fb338ae146104fb5780636352211e1461051b57600080fd5b806323b872dd146103ef57806324d788091461040f57806325867d421461042f57806342842e0e1461044457806342b588f514610464578063485ec9941461047c57600080fd5b8063095ea7b311610250578063095ea7b31461034857806312822a751461036857806312c40f9e1461038257806318160ddd146103a25780631d758668146103c65780631f62197c146103d957600080fd5b806301ffc9a71461028d57806305ea13fb146102c257806306fdde03146102d957806307c60dac146102fb578063081812fc14610310575b600080fd5b34801561029957600080fd5b506102ad6102a836600461298c565b6107e9565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d761083b565b005b3480156102e557600080fd5b506102ee6108b9565b6040516102b99190612bce565b34801561030757600080fd5b506102d761094b565b34801561031c57600080fd5b5061033061032b366004612a4d565b610984565b6040516001600160a01b0390911681526020016102b9565b34801561035457600080fd5b506102d7610363366004612963565b610a0c565b34801561037457600080fd5b50600c546102ad9060ff1681565b34801561038e57600080fd5b506102d761039d366004612a4d565b610b22565b3480156103ae57600080fd5b506103b8600d5481565b6040519081526020016102b9565b6102d76103d43660046129c4565b610b96565b3480156103e557600080fd5b506103b8600f5481565b3480156103fb57600080fd5b506102d761040a366004612888565b610d3b565b34801561041b57600080fd5b5061033061042a366004612a4d565b610d6c565b34801561043b57600080fd5b506102d7610db0565b34801561045057600080fd5b506102d761045f366004612888565b610de6565b34801561047057600080fd5b50600c5460ff166102ad565b34801561048857600080fd5b506102ee610e01565b34801561049d57600080fd5b506102d76104ac366004612a07565b610e8f565b3480156104bd57600080fd5b506102ee610ef9565b3480156104d257600080fd5b506102ad6104e1366004612a4d565b610f06565b3480156104f257600080fd5b506102d7610f11565b34801561050757600080fd5b506102d7610516366004612a4d565b610f4a565b34801561052757600080fd5b50610330610536366004612a4d565b610f55565b34801561054757600080fd5b506103b861055636600461283c565b610fcc565b34801561056757600080fd5b506102d7611053565b34801561057c57600080fd5b50600a546102ad9060ff1681565b6102d7610598366004612a65565b611089565b3480156105a957600080fd5b506006546001600160a01b0316610330565b3480156105c757600080fd5b506102d761122f565b3480156105dc57600080fd5b506102d76105eb366004612a07565b611268565b3480156105fc57600080fd5b506103b860105481565b34801561061257600080fd5b506102ee6112ce565b34801561062757600080fd5b506102d7610636366004612929565b6112dd565b34801561064757600080fd5b506102d7610656366004612a07565b6112e8565b34801561066757600080fd5b506008546102ad9060ff1681565b34801561068157600080fd5b506102d7610690366004612a65565b611325565b3480156106a157600080fd5b506103b86113f3565b3480156106b657600080fd5b506102d76106c53660046128c3565b61140a565b3480156106d657600080fd5b506102d7611442565b3480156106eb57600080fd5b506103b8600e5481565b34801561070157600080fd5b506102ee610710366004612a4d565b6114d6565b34801561072157600080fd5b506102ee61152e565b34801561073657600080fd5b506103b860115481565b34801561074c57600080fd5b506102ad61075b366004612856565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561079557600080fd5b506102ad6107a4366004612a4d565b61153b565b3480156107b557600080fd5b506102d76107c4366004612a4d565b611579565b3480156107d557600080fd5b506102d76107e436600461283c565b611584565b60006001600160e01b031982166380ac58cd60e01b148061081a57506001600160e01b03198216635b5e139f60e01b145b8061083557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b0316331461086e5760405162461bcd60e51b815260040161086590612c33565b60405180910390fd5b600f541561088f57604051636bface7960e01b815260040160405180910390fd5b60015b60115481116108b6576108a48161161c565b806108ae81612d63565b915050610892565b50565b6060600080546108c890612d28565b80601f01602080910402602001604051908101604052809291908181526020018280546108f490612d28565b80156109415780601f1061091657610100808354040283529160200191610941565b820191906000526020600020905b81548152906001019060200180831161092457829003601f168201915b5050505050905090565b6006546001600160a01b031633146109755760405162461bcd60e51b815260040161086590612c33565b600c805460ff19166001179055565b600061098f82611799565b6109f05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610865565b506000908152600460205260409020546001600160a01b031690565b6000610a1782610f55565b9050806001600160a01b0316836001600160a01b03161415610a855760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610865565b336001600160a01b0382161480610aa15750610aa1813361075b565b610b135760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610865565b610b1d83836117b6565b505050565b6006546001600160a01b03163314610b4c5760405162461bcd60e51b815260040161086590612c33565b600f54811015610b6f576040516360de586960e01b815260040160405180910390fd5b600d548110610b915760405163358ff9d360e01b815260040160405180910390fd5b600e55565b80610ba96006546001600160a01b031690565b6001600160a01b0316336001600160a01b031614158015610bd15750600c5460ff1615156001145b15610bef576040516307f140fd60e41b815260040160405180910390fd5b610bf76113f3565b610c145760405163338b50d560e11b815260040160405180910390fd5b610c1d81611799565b15610c3b5760405163d7b986a760e01b815260040160405180910390fd5b600d54811115610c5e57604051630a8b60d760e41b815260040160405180910390fd5b60105434108015610c7a57506006546001600160a01b03163314155b15610c98576040516307211edf60e51b815260040160405180910390fd5b60105434118015610cb457506006546001600160a01b03163314155b15610cd257604051638761ad8960e01b815260040160405180910390fd5b610cdd338385611824565b610cfa576040516370bebd4960e01b815260040160405180910390fd5b604051348152829033907f12cb4648cf3058b17ceeb33e579f8b0bc269fe0843f3900b8e24b6c54871703c9060200160405180910390a3610b1d8233611856565b610d4533826118a9565b610d615760405162461bcd60e51b815260040161086590612c68565b610b1d838383611993565b6000610d7782611799565b610d9457604051637e69f04160e11b815260040160405180910390fd5b506000908152601360205260409020546001600160a01b031690565b6006546001600160a01b03163314610dda5760405162461bcd60e51b815260040161086590612c33565b600c805460ff19169055565b610b1d8383836040518060200160405280600081525061140a565b60098054610e0e90612d28565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3a90612d28565b8015610e875780601f10610e5c57610100808354040283529160200191610e87565b820191906000526020600020905b815481529060010190602001808311610e6a57829003601f168201915b505050505081565b6006546001600160a01b03163314610eb95760405162461bcd60e51b815260040161086590612c33565b600a5460ff16151560011415610ee25760405163e42582d960e01b815260040160405180910390fd5b8051610ef59060099060208401906126f2565b5050565b60078054610e0e90612d28565b600061083582611799565b6006546001600160a01b03163314610f3b5760405162461bcd60e51b815260040161086590612c33565b6008805460ff19166001179055565b6108b6816001611b33565b6000818152600260205260408120546001600160a01b0316806108355760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610865565b60006001600160a01b0382166110375760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610865565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461107d5760405162461bcd60e51b815260040161086590612c33565b6110876000611baa565b565b6006546001600160a01b031633146110b35760405162461bcd60e51b815260040161086590612c33565b816110c66006546001600160a01b031690565b6001600160a01b0316336001600160a01b0316141580156110ee5750600c5460ff1615156001145b1561110c576040516307f140fd60e41b815260040160405180910390fd5b6111146113f3565b6111315760405163338b50d560e11b815260040160405180910390fd5b61113a81611799565b156111585760405163d7b986a760e01b815260040160405180910390fd5b600d5481111561117b57604051630a8b60d760e41b815260040160405180910390fd5b6010543410801561119757506006546001600160a01b03163314155b156111b5576040516307211edf60e51b815260040160405180910390fd5b601054341180156111d157506006546001600160a01b03163314155b156111ef57604051638761ad8960e01b815260040160405180910390fd5b60405183906001600160a01b038416907fef33e970549489dd2e75c841935709372f2926e3b90b56af4040186e9b83b3e490600090a3610b1d8383611856565b6006546001600160a01b031633146112595760405162461bcd60e51b815260040161086590612c33565b600a805460ff19166001179055565b6006546001600160a01b031633146112925760405162461bcd60e51b815260040161086590612c33565b60085460ff161515600114156112bb5760405163a16ef1d560e01b815260040160405180910390fd5b8051610ef59060079060208401906126f2565b6060600180546108c890612d28565b610ef5338383611bfc565b6006546001600160a01b031633146113125760405162461bcd60e51b815260040161086590612c33565b8051610ef590600b9060208401906126f2565b61132e82611799565b61134b57604051637e69f04160e11b815260040160405180910390fd5b3361135583610f55565b6001600160a01b03161461137c576040516313e8695b60e11b815260040160405180910390fd5b81816001600160a01b031661139084610f55565b6001600160a01b03167f11dd72a5d477527ee1cbe309212bb368745a98cf1dc3befcac7eef4988a957c260405160405180910390a460009182526013602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6000600f54600e546114059190612ce5565b905090565b61141433836118a9565b6114305760405162461bcd60e51b815260040161086590612c68565b61143c84848484611ccb565b50505050565b6006546001600160a01b0316331461146c5760405162461bcd60e51b815260040161086590612c33565b604051600090339047908381818185875af1925050503d80600081146114ae576040519150601f19603f3d011682016040523d82523d6000602084013e6114b3565b606091505b5090915050806108b6576040516327fcd9d160e01b815260040160405180910390fd5b606060006114e383611cfe565b905060008151116115035760405180602001604052806000815250611527565b80600b604051602001611517929190612ae2565b6040516020818303038152906040525b9392505050565b600b8054610e0e90612d28565b600061154682611799565b61156357604051637e69f04160e11b815260040160405180910390fd5b5060009081526012602052604090205460ff1690565b6108b6816000611b33565b6006546001600160a01b031633146115ae5760405162461bcd60e51b815260040161086590612c33565b6001600160a01b0381166116135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610865565b6108b681611baa565b8061162f6006546001600160a01b031690565b6001600160a01b0316336001600160a01b0316141580156116575750600c5460ff1615156001145b15611675576040516307f140fd60e41b815260040160405180910390fd5b61167d6113f3565b61169a5760405163338b50d560e11b815260040160405180910390fd5b6116a381611799565b156116c15760405163d7b986a760e01b815260040160405180910390fd5b600d548111156116e457604051630a8b60d760e41b815260040160405180910390fd5b6010543410801561170057506006546001600160a01b03163314155b1561171e576040516307211edf60e51b815260040160405180910390fd5b6010543411801561173a57506006546001600160a01b03163314155b1561175857604051638761ad8960e01b815260040160405180910390fd5b604051348152829033907f12cb4648cf3058b17ceeb33e579f8b0bc269fe0843f3900b8e24b6c54871703c9060200160405180910390a3610ef58233611856565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117eb82610f55565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118396118338585611db2565b83611e16565b6001600160a01b0316846001600160a01b03161490509392505050565b6000828152601260209081526040808320805460ff191690556013909152812080546001600160a01b03191633179055600f805460019290611899908490612cb9565b90915550610ef590508183611e3a565b60006118b482611799565b6119155760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610865565b600061192083610f55565b9050806001600160a01b0316846001600160a01b0316148061195b5750836001600160a01b031661195084610984565b6001600160a01b0316145b8061198b57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166119a682610f55565b6001600160a01b031614611a0e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610865565b6001600160a01b038216611a705760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610865565b611a7b6000826117b6565b6001600160a01b0383166000908152600360205260408120805460019290611aa4908490612ce5565b90915550506001600160a01b0382166000908152600360205260408120805460019290611ad2908490612cb9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611b3c82611799565b611b5957604051637e69f04160e11b815260040160405180910390fd5b33611b6383610f55565b6001600160a01b031614611b8a576040516313e8695b60e11b815260040160405180910390fd5b600091825260126020526040909120805460ff1916911515919091179055565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611c5e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610865565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611cd6848484611993565b611ce284848484611e54565b61143c5760405162461bcd60e51b815260040161086590612be1565b6060611d0982611799565b611d6d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610865565b6000611d77611f61565b90506000815111611d975760405180602001604052806000815250611527565b80611da184611f70565b604051602001611517929190612ab3565b604080517f7b76ebe097c2232d1e5413981327cbbf542564a9f1fe9ad07a725272b00030bb60208201529081018290526001600160a01b0383166060820152600090611527906080016040516020818303038152906040528051906020012061208a565b6000806000611e2585856120d8565b91509150611e3281612148565b509392505050565b610ef5828260405180602001604052806000815250612349565b60006001600160a01b0384163b15611f5657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e98903390899088908890600401612b91565b602060405180830381600087803b158015611eb257600080fd5b505af1925050508015611ee2575060408051601f3d908101601f19168201909252611edf918101906129a8565b60015b611f3c573d808015611f10576040519150601f19603f3d011682016040523d82523d6000602084013e611f15565b606091505b508051611f345760405162461bcd60e51b815260040161086590612be1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061198b565b506001949350505050565b6060600780546108c890612d28565b606081611f945750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fbe5780611fa881612d63565b9150611fb79050600a83612cd1565b9150611f98565b60008167ffffffffffffffff811115611fe757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612011576020820181803683370190505b5090505b841561198b57612026600183612ce5565b9150612033600a86612d7e565b61203e906030612cb9565b60f81b81838151811061206157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612083600a86612cd1565b9450612015565b600061083561209761237c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008082516041141561210f5760208301516040840151606085015160001a612103878285856124a3565b94509450505050612141565b825160401415612139576020830151604084015161212e868383612590565b935093505050612141565b506000905060025b9250929050565b600081600481111561216a57634e487b7160e01b600052602160045260246000fd5b14156121735750565b600181600481111561219557634e487b7160e01b600052602160045260246000fd5b14156121e35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610865565b600281600481111561220557634e487b7160e01b600052602160045260246000fd5b14156122535760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610865565b600381600481111561227557634e487b7160e01b600052602160045260246000fd5b14156122ce5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610865565b60048160048111156122f057634e487b7160e01b600052602160045260246000fd5b14156108b65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610865565b61235383836125bf565b6123606000848484611e54565b610b1d5760405162461bcd60e51b815260040161086590612be1565b6000306001600160a01b037f00000000000000000000000034ff3cf6c2615a41de98be7c606f0389f034124f161480156123d557507f000000000000000000000000000000000000000000000000000000000000000146145b156123ff57507fc366cfc3a4a5190c9d25a29685ca93a0c0d66a267dbcef5d200da46315c8bf9990565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f705ecd3f3e0d5503a81837f9de3e55e604851ae564716d30d0d588f7cab99676828401527f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c60608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156124da5750600090506003612587565b8460ff16601b141580156124f257508460ff16601c14155b156125035750600090506004612587565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612557573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661258057600060019250925050612587565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016125b1878288856124a3565b935093505050935093915050565b6001600160a01b0382166126155760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610865565b61261e81611799565b1561266b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610865565b6001600160a01b0382166000908152600360205260408120805460019290612694908490612cb9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546126fe90612d28565b90600052602060002090601f0160209004810192826127205760008555612766565b82601f1061273957805160ff1916838001178555612766565b82800160010185558215612766579182015b8281111561276657825182559160200191906001019061274b565b50612772929150612776565b5090565b5b808211156127725760008155600101612777565b600067ffffffffffffffff808411156127a6576127a6612dbe565b604051601f8501601f19908116603f011681019082821181831017156127ce576127ce612dbe565b816040528093508581528686860111156127e757600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461281857600080fd5b919050565b600082601f83011261282d578081fd5b6115278383356020850161278b565b60006020828403121561284d578081fd5b61152782612801565b60008060408385031215612868578081fd5b61287183612801565b915061287f60208401612801565b90509250929050565b60008060006060848603121561289c578081fd5b6128a584612801565b92506128b360208501612801565b9150604084013590509250925092565b600080600080608085870312156128d8578081fd5b6128e185612801565b93506128ef60208601612801565b925060408501359150606085013567ffffffffffffffff811115612911578182fd5b61291d8782880161281d565b91505092959194509250565b6000806040838503121561293b578182fd5b61294483612801565b915060208301358015158114612958578182fd5b809150509250929050565b60008060408385031215612975578182fd5b61297e83612801565b946020939093013593505050565b60006020828403121561299d578081fd5b813561152781612dd4565b6000602082840312156129b9578081fd5b815161152781612dd4565b600080604083850312156129d6578182fd5b823567ffffffffffffffff8111156129ec578283fd5b6129f88582860161281d565b95602094909401359450505050565b600060208284031215612a18578081fd5b813567ffffffffffffffff811115612a2e578182fd5b8201601f81018413612a3e578182fd5b61198b8482356020840161278b565b600060208284031215612a5e578081fd5b5035919050565b60008060408385031215612a77578182fd5b8235915061287f60208401612801565b60008151808452612a9f816020860160208601612cfc565b601f01601f19169290920160200192915050565b60008351612ac5818460208801612cfc565b835190830190612ad9818360208801612cfc565b01949350505050565b600083516020612af58285838901612cfc565b8454918401918390600181811c9080831680612b1257607f831692505b858310811415612b3057634e487b7160e01b88526022600452602488fd5b808015612b445760018114612b5557612b81565b60ff19851688528388019550612b81565b60008b815260209020895b85811015612b795781548a820152908401908801612b60565b505083880195505b50939a9950505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bc490830184612a87565b9695505050505050565b6020815260006115276020830184612a87565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612ccc57612ccc612d92565b500190565b600082612ce057612ce0612da8565b500490565b600082821015612cf757612cf7612d92565b500390565b60005b83811015612d17578181015183820152602001612cff565b8381111561143c5750506000910152565b600181811c90821680612d3c57607f821691505b60208210811415612d5d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612d7757612d77612d92565b5060010190565b600082612d8d57612d8d612da8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146108b657600080fdfea2646970667358221220800119f736278e36e67325cdfc629e6a4d2071dea7eb8fc0466406af58b12d7564736f6c63430008040033

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

00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000000000000000002068747470733a2f2f646170702e61637475616c2e67616c6c6572792f6170692f

-----Decoded View---------------
Arg [0] : _tokenBaseURI (string): https://dapp.actual.gallery/api/
Arg [1] : _saleLocked (bool): True
Arg [2] : _totalSupply (uint256): 5000
Arg [3] : _maxNumberOfArtworks (uint256): 2000
Arg [4] : _pricePerArtwork (uint256): 125000000000000000

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [3] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [4] : 00000000000000000000000000000000000000000000000001bc16d674ec8000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [6] : 68747470733a2f2f646170702e61637475616c2e67616c6c6572792f6170692f


Deployed Bytecode Sourcemap

53771:14051:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21835:309;;;;;;;;;;-1:-1:-1;21835:309:0;;;;;:::i;:::-;;:::i;:::-;;;8523:14:1;;8516:22;8498:41;;8486:2;8471:18;21835:309:0;;;;;;;;63320:215;;;;;;;;;;;;;:::i;:::-;;22792:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;67337:67::-;;;;;;;;;;;;;:::i;24315:239::-;;;;;;;;;;-1:-1:-1;24315:239:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7821:32:1;;;7803:51;;7791:2;7776:18;24315:239:0;7758:102:1;23880:377:0;;;;;;;;;;-1:-1:-1;23880:377:0;;;;;:::i;:::-;;:::i;53992:22::-;;;;;;;;;;-1:-1:-1;53992:22:0;;;;;;;;61744:379;;;;;;;;;;-1:-1:-1;61744:379:0;;;;;:::i;:::-;;:::i;54019:26::-;;;;;;;;;;;;;;;;;;;18068:25:1;;;18056:2;18041:18;54019:26:0;18023:76:1;65628:346:0;;;;;;:::i;:::-;;:::i;54089:37::-;;;;;;;;;;;;;;;;25093:332;;;;;;;;;;-1:-1:-1;25093:332:0;;;;;:::i;:::-;;:::i;59248:191::-;;;;;;;;;;-1:-1:-1;59248:191:0;;;;;:::i;:::-;;:::i;67508:70::-;;;;;;;;;;;;;:::i;25488:165::-;;;;;;;;;;-1:-1:-1;25488:165:0;;;;;:::i;:::-;;:::i;67737:82::-;;;;;;;;;;-1:-1:-1;67803:10:0;;;;67737:82;;53890:23;;;;;;;;;;;;;:::i;57561:164::-;;;;;;;;;;-1:-1:-1;57561:164:0;;;;;:::i;:::-;;:::i;53826:26::-;;;;;;;;;;;;;:::i;55292:96::-;;;;;;;;;;-1:-1:-1;55292:96:0;;;;;:::i;:::-;;:::i;56871:75::-;;;;;;;;;;;;;:::i;60036:101::-;;;;;;;;;;-1:-1:-1;60036:101:0;;;;;:::i;:::-;;:::i;22480:253::-;;;;;;;;;;-1:-1:-1;22480:253:0;;;;;:::i;:::-;;:::i;22200:226::-;;;;;;;;;;-1:-1:-1;22200:226:0;;;;;:::i;:::-;;:::i;35352:97::-;;;;;;;;;;;;;:::i;53918:27::-;;;;;;;;;;-1:-1:-1;53918:27:0;;;;;;;;66302:207;;;;;;:::i;:::-;;:::i;34741:81::-;;;;;;;;;;-1:-1:-1;34810:6:0;;-1:-1:-1;;;;;34810:6:0;34741:81;;57864:77;;;;;;;;;;;;;:::i;55902:164::-;;;;;;;;;;-1:-1:-1;55902:164:0;;;;;:::i;:::-;;:::i;54131:30::-;;;;;;;;;;;;;;;;22947:98;;;;;;;;;;;;;:::i;24618:167::-;;;;;;;;;;-1:-1:-1;24618:167:0;;;;;:::i;:::-;;:::i;57155:124::-;;;;;;;;;;-1:-1:-1;57155:124:0;;;;;:::i;:::-;;:::i;53857:26::-;;;;;;;;;;-1:-1:-1;53857:26:0;;;;;;;;58665:332;;;;;;;;;;-1:-1:-1;58665:332:0;;;;;:::i;:::-;;:::i;61328:118::-;;;;;;;;;;;;;:::i;25716:321::-;;;;;;;;;;-1:-1:-1;25716:321:0;;;;;:::i;:::-;;:::i;58018:197::-;;;;;;;;;;;;;:::i;54050:34::-;;;;;;;;;;;;;;;;56421:313;;;;;;;;;;-1:-1:-1;56421:313:0;;;;;:::i;:::-;;:::i;53952:33::-;;;;;;;;;;;;;:::i;54166:32::-;;;;;;;;;;;;;;;;24848:186;;;;;;;;;;-1:-1:-1;24848:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;24993:25:0;;;24970:4;24993:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24848:186;60396:182;;;;;;;;;;-1:-1:-1;60396:182:0;;;;;:::i;:::-;;:::i;59686:101::-;;;;;;;;;;-1:-1:-1;59686:101:0;;;;;:::i;:::-;;:::i;35594:191::-;;;;;;;;;;-1:-1:-1;35594:191:0;;;;;:::i;:::-;;:::i;21835:309::-;21962:4;-1:-1:-1;;;;;;21992:40:0;;-1:-1:-1;;;21992:40:0;;:99;;-1:-1:-1;;;;;;;22043:48:0;;-1:-1:-1;;;22043:48:0;21992:99;:146;;;-1:-1:-1;;;;;;;;;;20454:40:0;;;22102:36;21978:160;21835:309;-1:-1:-1;;21835:309:0:o;63320:215::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;;;;;;;;;63376:22:::1;::::0;:26;63372:72:::1;;63411:33;;-1:-1:-1::0;;;63411:33:0::1;;;;;;;;;;;63372:72;63468:1;63451:79;63476:12;;63471:1;:17;63451:79;;63504:18;63520:1;63504:15;:18::i;:::-;63490:3:::0;::::1;::::0;::::1;:::i;:::-;;;;63451:79;;;;63320:215::o:0;22792:94::-;22846:13;22875:5;22868:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22792:94;:::o;67337:67::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;67381:10:::1;:17:::0;;-1:-1:-1;;67381:17:0::1;67394:4;67381:17;::::0;;67337:67::o;24315:239::-;24416:7;24443:16;24451:7;24443;:16::i;:::-;24435:73;;;;-1:-1:-1;;;24435:73:0;;15704:2:1;24435:73:0;;;15686:21:1;15743:2;15723:18;;;15716:30;15782:34;15762:18;;;15755:62;-1:-1:-1;;;15833:18:1;;;15826:42;15885:19;;24435:73:0;15676:234:1;24435:73:0;-1:-1:-1;24524:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24524:24:0;;24315:239::o;23880:377::-;23957:13;23973:23;23988:7;23973:14;:23::i;:::-;23957:39;;24017:5;-1:-1:-1;;;;;24011:11:0;:2;-1:-1:-1;;;;;24011:11:0;;;24003:57;;;;-1:-1:-1;;;24003:57:0;;17304:2:1;24003:57:0;;;17286:21:1;17343:2;17323:18;;;17316:30;17382:34;17362:18;;;17355:62;-1:-1:-1;;;17433:18:1;;;17426:31;17474:19;;24003:57:0;17276:223:1;24003:57:0;17394:10;-1:-1:-1;;;;;24085:21:0;;;;:62;;-1:-1:-1;24110:37:0;24127:5;17394:10;24848:186;:::i;24110:37::-;24069:152;;;;-1:-1:-1;;;24069:152:0;;13694:2:1;24069:152:0;;;13676:21:1;13733:2;13713:18;;;13706:30;13772:34;13752:18;;;13745:62;13843:26;13823:18;;;13816:54;13887:19;;24069:152:0;13666:246:1;24069:152:0;24230:21;24239:2;24243:7;24230:8;:21::i;:::-;23880:377;;;:::o;61744:379::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;61874:22:::1;;61849;:47;61845:119;;;61912:52;;-1:-1:-1::0;;;61912:52:0::1;;;;;;;;;;;61845:119;62001:11;;61975:22;:37;61971:93;;62028:36;;-1:-1:-1::0;;;62028:36:0::1;;;;;;;;;;;61971:93;62073:19;:44:::0;61744:379::o;65628:346::-;65727:10;62582:7;34810:6;;-1:-1:-1;;;;;34810:6:0;;34741:81;62582:7;-1:-1:-1;;;;;62568:21:0;:10;-1:-1:-1;;;;;62568:21:0;;;:43;;;;-1:-1:-1;62593:10:0;;;;:18;;:10;:18;62568:43;62564:70;;;62620:14;;-1:-1:-1;;;62620:14:0;;;;;;;;;;;62564:70;62647:14;:12;:14::i;:::-;62643:49;;62675:17;;-1:-1:-1;;;62675:17:0;;;;;;;;;;;62643:49;62705:19;62713:10;62705:7;:19::i;:::-;62701:54;;;62733:22;;-1:-1:-1;;;62733:22:0;;;;;;;;;;;62701:54;62781:11;;62768:10;:24;62764:84;;;62808:40;;-1:-1:-1;;;62808:40:0;;;;;;;;;;;62764:84;62873:15;;62861:9;:27;:52;;;;-1:-1:-1;34810:6:0;;-1:-1:-1;;;;;34810:6:0;62892:10;:21;;62861:52;62857:96;;;62929:24;;-1:-1:-1;;;62929:24:0;;;;;;;;;;;62857:96;62978:15;;62966:9;:27;:52;;;;-1:-1:-1;34810:6:0;;-1:-1:-1;;;;;34810:6:0;62997:10;:21;;62966:52;62962:96;;;63034:24;;-1:-1:-1;;;63034:24:0;;;;;;;;;;;62962:96;65753:53:::1;65772:10;65784;65796:9;65753:18;:53::i;:::-;65749:121;;65831:39;;-1:-1:-1::0;;;65831:39:0::1;;;;;;;;;;;65749:121;65884:43;::::0;65905:9:::1;18068:25:1::0;;65916:10:0;;65893::::1;::::0;65884:43:::1;::::0;18056:2:1;18041:18;65884:43:0::1;;;;;;;65934:34;65945:10;65957;65934;:34::i;25093:332::-:0;25274:41;17394:10;25307:7;25274:18;:41::i;:::-;25258:124;;;;-1:-1:-1;;;25258:124:0;;;;;;;:::i;:::-;25391:28;25401:4;25407:2;25411:7;25391:9;:28::i;59248:191::-;59312:7;59333:16;59341:7;59333;:16::i;:::-;59328:51;;59358:21;;-1:-1:-1;;;59358:21:0;;;;;;;;;;;59328:51;-1:-1:-1;59393:40:0;;;;:31;:40;;;;;;-1:-1:-1;;;;;59393:40:0;;59248:191::o;67508:70::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;67554:10:::1;:18:::0;;-1:-1:-1;;67554:18:0::1;::::0;;67508:70::o;25488:165::-;25608:39;25625:4;25631:2;25635:7;25608:39;;;;;;;;;;;;:16;:39::i;53890:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57561:164::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;57639:15:::1;::::0;::::1;;:23;;:15:::0;:23:::1;57635:53;;;57671:17;;-1:-1:-1::0;;;57671:17:0::1;;;;;;;;;;;57635:53;57695:24:::0;;::::1;::::0;:9:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;:::-;;57561:164:::0;:::o;53826:26::-;;;;;;;:::i;55292:96::-;55346:4;55366:16;55374:7;55366;:16::i;56871:75::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;56919:14:::1;:21:::0;;-1:-1:-1;;56919:21:0::1;56936:4;56919:21;::::0;;56871:75::o;60036:101::-;60094:37;60117:7;60126:4;60094:22;:37::i;22480:253::-;22577:7;22612:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22612:16:0;22643:19;22635:73;;;;-1:-1:-1;;;22635:73:0;;14530:2:1;22635:73:0;;;14512:21:1;14569:2;14549:18;;;14542:30;14608:34;14588:18;;;14581:62;-1:-1:-1;;;14659:18:1;;;14652:39;14708:19;;22635:73:0;14502:231:1;22200:226:0;22297:7;-1:-1:-1;;;;;22324:19:0;;22316:74;;;;-1:-1:-1;;;22316:74:0;;14119:2:1;22316:74:0;;;14101:21:1;14158:2;14138:18;;;14131:30;14197:34;14177:18;;;14170:62;-1:-1:-1;;;14248:18:1;;;14241:40;14298:19;;22316:74:0;14091:232:1;22316:74:0;-1:-1:-1;;;;;;22404:16:0;;;;;:9;:16;;;;;;;22200:226::o;35352:97::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;35413:30:::1;35440:1;35413:18;:30::i;:::-;35352:97::o:0;66302:207::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;66411:10:::1;62582:7;34810:6:::0;;-1:-1:-1;;;;;34810:6:0;;34741:81;62582:7:::1;-1:-1:-1::0;;;;;62568:21:0::1;:10;-1:-1:-1::0;;;;;62568:21:0::1;;;:43;;;;-1:-1:-1::0;62593:10:0::1;::::0;::::1;;:18;;:10:::0;:18:::1;62568:43;62564:70;;;62620:14;;-1:-1:-1::0;;;62620:14:0::1;;;;;;;;;;;62564:70;62647:14;:12;:14::i;:::-;62643:49;;62675:17;;-1:-1:-1::0;;;62675:17:0::1;;;;;;;;;;;62643:49;62705:19;62713:10;62705:7;:19::i;:::-;62701:54;;;62733:22;;-1:-1:-1::0;;;62733:22:0::1;;;;;;;;;;;62701:54;62781:11;;62768:10;:24;62764:84;;;62808:40;;-1:-1:-1::0;;;62808:40:0::1;;;;;;;;;;;62764:84;62873:15;;62861:9;:27;:52;;;;-1:-1:-1::0;34810:6:0;;-1:-1:-1;;;;;34810:6:0;62892:10:::1;:21;;62861:52;62857:96;;;62929:24;;-1:-1:-1::0;;;62929:24:0::1;;;;;;;;;;;62857:96;62978:15;;62966:9;:27;:52;;;;-1:-1:-1::0;34810:6:0;;-1:-1:-1;;;;;34810:6:0;62997:10:::1;:21;;62966:52;62962:96;;;63034:24;;-1:-1:-1::0;;;63034:24:0::1;;;;;;;;;;;62962:96;66438:26:::2;::::0;66453:10;;-1:-1:-1;;;;;66438:26:0;::::2;::::0;::::2;::::0;;;::::2;66471:32;66482:10;66494:8;66471:10;:32::i;57864:77::-:0;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;57913:15:::1;:22:::0;;-1:-1:-1;;57913:22:0::1;57931:4;57913:22;::::0;;57864:77::o;55902:164::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;55981:14:::1;::::0;::::1;;:22;;:14:::0;:22:::1;55977:51;;;56012:16;;-1:-1:-1::0;;;56012:16:0::1;;;;;;;;;;;55977:51;56035:25:::0;;::::1;::::0;:12:::1;::::0;:25:::1;::::0;::::1;::::0;::::1;:::i;22947:98::-:0;23003:13;23032:7;23025:14;;;;;:::i;24618:167::-;24727:52;17394:10;24760:8;24770;24727:18;:52::i;57155:124::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;57239:34;;::::1;::::0;:14:::1;::::0;:34:::1;::::0;::::1;::::0;::::1;:::i;58665:332::-:0;58740:16;58748:7;58740;:16::i;:::-;58735:51;;58765:21;;-1:-1:-1;;;58765:21:0;;;;;;;;;;;58735:51;58817:10;58797:16;58805:7;58797;:16::i;:::-;-1:-1:-1;;;;;58797:30:0;;58793:71;;58836:28;;-1:-1:-1;;;58836:28:0;;;;;;;;;;;58793:71;58918:7;58901:15;-1:-1:-1;;;;;58878:48:0;58883:16;58891:7;58883;:16::i;:::-;-1:-1:-1;;;;;58878:48:0;;;;;;;;;;;58933:40;;;;:31;:40;;;;;;:58;;-1:-1:-1;;;;;;58933:58:0;-1:-1:-1;;;;;58933:58:0;;;;;;;;;58665:332::o;61328:118::-;61373:7;61418:22;;61396:19;;:44;;;;:::i;:::-;61389:51;;61328:118;:::o;25716:321::-;25877:41;17394:10;25910:7;25877:18;:41::i;:::-;25861:124;;;;-1:-1:-1;;;25861:124:0;;;;;;;:::i;:::-;25992:39;26006:4;26012:2;26016:7;26025:5;25992:13;:39::i;:::-;25716:321;;;;:::o;58018:197::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;58083:72:::1;::::0;58065:12:::1;::::0;58091:10:::1;::::0;58115:21:::1;::::0;58065:12;58083:72;58065:12;58083:72;58115:21;58091:10;58083:72:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;58064:91:0;;-1:-1:-1;;58166:16:0;58162:47:::1;;58191:18;;-1:-1:-1::0;;;58191:18:0::1;;;;;;;;;;;56421:313:::0;56506:13;56531:30;56564:23;56579:7;56564:14;:23::i;:::-;56531:56;;56643:1;56616:16;56610:30;:34;:118;;;;;;;;;;;;;;;;;56680:16;56698:14;56663:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56610:118;56596:132;56421:313;-1:-1:-1;;;56421:313:0:o;53952:33::-;;;;;;;:::i;60396:182::-;60460:4;60478:16;60486:7;60478;:16::i;:::-;60473:51;;60503:21;;-1:-1:-1;;;60503:21:0;;;;;;;;;;;60473:51;-1:-1:-1;60538:34:0;;;;:25;:34;;;;;;;;;60396:182::o;59686:101::-;59743:38;59766:7;59775:5;59743:22;:38::i;35594:191::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35679:22:0;::::1;35671:73;;;::::0;-1:-1:-1;;;35671:73:0;;11355:2:1;35671:73:0::1;::::0;::::1;11337:21:1::0;11394:2;11374:18;;;11367:30;11433:34;11413:18;;;11406:62;-1:-1:-1;;;11484:18:1;;;11477:36;11530:19;;35671:73:0::1;11327:228:1::0;35671:73:0::1;35751:28;35770:8;35751:18;:28::i;63604:179::-:0;63669:10;62582:7;34810:6;;-1:-1:-1;;;;;34810:6:0;;34741:81;62582:7;-1:-1:-1;;;;;62568:21:0;:10;-1:-1:-1;;;;;62568:21:0;;;:43;;;;-1:-1:-1;62593:10:0;;;;:18;;:10;:18;62568:43;62564:70;;;62620:14;;-1:-1:-1;;;62620:14:0;;;;;;;;;;;62564:70;62647:14;:12;:14::i;:::-;62643:49;;62675:17;;-1:-1:-1;;;62675:17:0;;;;;;;;;;;62643:49;62705:19;62713:10;62705:7;:19::i;:::-;62701:54;;;62733:22;;-1:-1:-1;;;62733:22:0;;;;;;;;;;;62701:54;62781:11;;62768:10;:24;62764:84;;;62808:40;;-1:-1:-1;;;62808:40:0;;;;;;;;;;;62764:84;62873:15;;62861:9;:27;:52;;;;-1:-1:-1;34810:6:0;;-1:-1:-1;;;;;34810:6:0;62892:10;:21;;62861:52;62857:96;;;62929:24;;-1:-1:-1;;;62929:24:0;;;;;;;;;;;62857:96;62978:15;;62966:9;:27;:52;;;;-1:-1:-1;34810:6:0;;-1:-1:-1;;;;;34810:6:0;62997:10;:21;;62966:52;62962:96;;;63034:24;;-1:-1:-1;;;63034:24:0;;;;;;;;;;;62962:96;63693:43:::1;::::0;63714:9:::1;18068:25:1::0;;63725:10:0;;63702::::1;::::0;63693:43:::1;::::0;18056:2:1;18041:18;63693:43:0::1;;;;;;;63743:34;63754:10;63766;63743;:34::i;27484:121::-:0;27549:4;27569:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27569:16:0;:30;;;27484:121::o;31218:164::-;31289:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31289:29:0;-1:-1:-1;;;;;31289:29:0;;;;;;;;:24;;31339:23;31289:24;31339:14;:23::i;:::-;-1:-1:-1;;;;;31330:46:0;;;;;;;;;;;31218:164;;:::o;64971:276::-;65102:4;65133:52;65147:26;65153:7;65162:10;65147:5;:26::i;:::-;65175:9;65133:13;:52::i;:::-;-1:-1:-1;;;;;65122:63:0;:7;-1:-1:-1;;;;;65122:63:0;;65115:70;;64971:276;;;;;:::o;66972:263::-;67086:5;67046:37;;;:25;:37;;;;;;;;:45;;-1:-1:-1;;67046:45:0;;;67098:31;:43;;;;;:56;;-1:-1:-1;;;;;;67098:56:0;67144:10;67098:56;;;67161:22;:27;;67046:45;;67086:5;67161:27;;67046:45;;67161:27;:::i;:::-;;;;-1:-1:-1;67197:32:0;;-1:-1:-1;67207:9:0;67218:10;67197:9;:32::i;27756:371::-;27869:4;27893:16;27901:7;27893;:16::i;:::-;27885:73;;;;-1:-1:-1;;;27885:73:0;;13281:2:1;27885:73:0;;;13263:21:1;13320:2;13300:18;;;13293:30;13359:34;13339:18;;;13332:62;-1:-1:-1;;;13410:18:1;;;13403:42;13462:19;;27885:73:0;13253:234:1;27885:73:0;27965:13;27981:23;27996:7;27981:14;:23::i;:::-;27965:39;;28030:5;-1:-1:-1;;;;;28019:16:0;:7;-1:-1:-1;;;;;28019:16:0;;:58;;;;28070:7;-1:-1:-1;;;;;28046:31:0;:20;28058:7;28046:11;:20::i;:::-;-1:-1:-1;;;;;28046:31:0;;28019:58;:101;;;-1:-1:-1;;;;;;24993:25:0;;;24970:4;24993:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28088:32;28011:110;27756:371;-1:-1:-1;;;;27756:371:0:o;30565:547::-;30714:4;-1:-1:-1;;;;;30687:31:0;:23;30702:7;30687:14;:23::i;:::-;-1:-1:-1;;;;;30687:31:0;;30671:106;;;;-1:-1:-1;;;30671:106:0;;16478:2:1;30671:106:0;;;16460:21:1;16517:2;16497:18;;;16490:30;16556:34;16536:18;;;16529:62;-1:-1:-1;;;16607:18:1;;;16600:39;16656:19;;30671:106:0;16450:231:1;30671:106:0;-1:-1:-1;;;;;30792:16:0;;30784:65;;;;-1:-1:-1;;;30784:65:0;;12119:2:1;30784:65:0;;;12101:21:1;12158:2;12138:18;;;12131:30;12197:34;12177:18;;;12170:62;-1:-1:-1;;;12248:18:1;;;12241:34;12292:19;;30784:65:0;12091:226:1;30784:65:0;30954:29;30971:1;30975:7;30954:8;:29::i;:::-;-1:-1:-1;;;;;30992:15:0;;;;;;:9;:15;;;;;:20;;31011:1;;30992:15;:20;;31011:1;;30992:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31019:13:0;;;;;;:9;:13;;;;;:18;;31036:1;;31019:13;:18;;31036:1;;31019:18;:::i;:::-;;;;-1:-1:-1;;31044:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31044:21:0;-1:-1:-1;;;;;31044:21:0;;;;;;;;;31079:27;;31044:16;;31079:27;;;;;;;30565:547;;;:::o;60919:260::-;60999:16;61007:7;60999;:16::i;:::-;60994:51;;61024:21;;-1:-1:-1;;;61024:21:0;;;;;;;;;;;60994:51;61076:10;61056:16;61064:7;61056;:16::i;:::-;-1:-1:-1;;;;;61056:30:0;;61052:71;;61095:28;;-1:-1:-1;;;61095:28:0;;;;;;;;;;;61052:71;61132:34;;;;:25;:34;;;;;;:41;;-1:-1:-1;;61132:41:0;;;;;;;;;;60919:260::o;35935:177::-;36024:6;;;-1:-1:-1;;;;;36037:17:0;;;-1:-1:-1;;;;;;36037:17:0;;;;;;;36066:40;;36024:6;;;36037:17;36024:6;;36066:40;;36005:16;;36066:40;35935:177;;:::o;31512:287::-;31649:8;-1:-1:-1;;;;;31640:17:0;:5;-1:-1:-1;;;;;31640:17:0;;;31632:55;;;;-1:-1:-1;;;31632:55:0;;12524:2:1;31632:55:0;;;12506:21:1;12563:2;12543:18;;;12536:30;12602:27;12582:18;;;12575:55;12647:18;;31632:55:0;12496:175:1;31632:55:0;-1:-1:-1;;;;;31694:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;31694:46:0;;;;;;;;;;31752:41;;8498::1;;;31752::0;;8471:18:1;31752:41:0;;;;;;;31512:287;;;:::o;26881:308::-;27016:28;27026:4;27032:2;27036:7;27016:9;:28::i;:::-;27067:48;27090:4;27096:2;27100:7;27109:5;27067:22;:48::i;:::-;27051:132;;;;-1:-1:-1;;;27051:132:0;;;;;;;:::i;23108:394::-;23206:13;23247:16;23255:7;23247;:16::i;:::-;23231:97;;;;-1:-1:-1;;;23231:97:0;;16888:2:1;23231:97:0;;;16870:21:1;16927:2;16907:18;;;16900:30;16966:34;16946:18;;;16939:62;-1:-1:-1;;;17017:18:1;;;17010:45;17072:19;;23231:97:0;16860:237:1;23231:97:0;23337:21;23361:10;:8;:10::i;:::-;23337:34;;23416:1;23398:7;23392:21;:25;:104;;;;;;;;;;;;;;;;;23453:7;23462:18;:7;:16;:18::i;:::-;23436:45;;;;;;;;;:::i;64082:330::-;64254:132;;;64279:47;64254:132;;;9246:25:1;9287:18;;;9280:34;;;-1:-1:-1;;;;;9350:32:1;;9330:18;;;9323:60;64172:7:0;;64205:201;;9219:18:1;;64254:132:0;;;;;;;;;;;;64232:165;;;;;;64205:16;:201::i;40221:235::-;40314:7;40334:17;40353:18;40375:27;40386:4;40392:9;40375:10;:27::i;:::-;40333:69;;;;40409:18;40421:5;40409:11;:18::i;:::-;-1:-1:-1;40441:9:0;40221:235;-1:-1:-1;;;40221:235:0:o;28447:104::-;28519:26;28529:2;28533:7;28519:26;;;;;;;;;;;;:9;:26::i;32342:685::-;32479:4;-1:-1:-1;;;;;32496:13:0;;9919:20;9959:8;32492:530;;32535:72;;-1:-1:-1;;;32535:72:0;;-1:-1:-1;;;;;32535:36:0;;;;;:72;;17394:10;;32586:4;;32592:7;;32601:5;;32535:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32535:72:0;;;;;;;;-1:-1:-1;;32535:72:0;;;;;;;;;;;;:::i;:::-;;;32522:459;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32762:13:0;;32758:214;;32795:60;;-1:-1:-1;;;32795:60:0;;;;;;;:::i;32758:214::-;32940:6;32934:13;32925:6;32921:2;32917:15;32910:38;32522:459;-1:-1:-1;;;;;;32657:51:0;-1:-1:-1;;;32657:51:0;;-1:-1:-1;32650:58:0;;32492:530;-1:-1:-1;33010:4:0;32342:685;;;;;;:::o;55566:99::-;55618:13;55647:12;55640:19;;;;;:::i;17877:637::-;17933:13;18142:10;18138:43;;-1:-1:-1;;18163:10:0;;;;;;;;;;;;-1:-1:-1;;;18163:10:0;;;;;17877:637::o;18138:43::-;18202:5;18187:12;18235:62;18242:9;;18235:62;;18262:8;;;;:::i;:::-;;-1:-1:-1;18279:10:0;;-1:-1:-1;18287:2:0;18279:10;;:::i;:::-;;;18235:62;;;18303:19;18335:6;18325:17;;;;;;-1:-1:-1;;;18325:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18325:17:0;;18303:39;;18349:132;18356:10;;18349:132;;18377:11;18387:1;18377:11;;:::i;:::-;;-1:-1:-1;18440:10:0;18448:2;18440:5;:10;:::i;:::-;18427:24;;:2;:24;:::i;:::-;18414:39;;18397:6;18404;18397:14;;;;;;-1:-1:-1;;;18397:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;18397:56:0;;;;;;;;-1:-1:-1;18462:11:0;18471:2;18462:11;;:::i;:::-;;;18349:132;;49611:184;49708:7;49734:55;49756:20;:18;:20::i;:::-;49778:10;45144:57;;-1:-1:-1;;;45144:57:0;;;7308:27:1;7351:11;;;7344:27;;;7387:12;;;7380:28;;;45108:7:0;;7424:12:1;;45144:57:0;;;;;;;;;;;;45134:68;;;;;;45127:75;;45000:208;;;;;38289:1160;38385:7;38394:12;38606:9;:16;38626:2;38606:22;38602:842;;;38858:4;38843:20;;38837:27;38900:4;38885:20;;38879:27;38950:4;38935:20;;38929:27;38639:9;38921:36;38981:25;38992:4;38921:36;38837:27;38879;38981:10;:25::i;:::-;38974:32;;;;;;;;;38602:842;39024:9;:16;39044:2;39024:22;39020:424;;;39261:4;39246:20;;39240:27;39304:4;39289:20;;39283:27;39334:23;39345:4;39240:27;39283;39334:10;:23::i;:::-;39327:30;;;;;;;;39020:424;-1:-1:-1;39396:1:0;;-1:-1:-1;39400:35:0;39020:424;38289:1160;;;;;:::o;36658:587::-;36732:20;36723:5;:29;;;;;;-1:-1:-1;;;36723:29:0;;;;;;;;;;36719:521;;;36658:587;:::o;36719:521::-;36820:29;36811:5;:38;;;;;;-1:-1:-1;;;36811:38:0;;;;;;;;;;36807:433;;;36860:34;;-1:-1:-1;;;36860:34:0;;10223:2:1;36860:34:0;;;10205:21:1;10262:2;10242:18;;;10235:30;10301:26;10281:18;;;10274:54;10345:18;;36860:34:0;10195:174:1;36807:433:0;36921:35;36912:5;:44;;;;;;-1:-1:-1;;;36912:44:0;;;;;;;;;;36908:332;;;36967:41;;-1:-1:-1;;;36967:41:0;;10576:2:1;36967:41:0;;;10558:21:1;10615:2;10595:18;;;10588:30;10654:33;10634:18;;;10627:61;10705:18;;36967:41:0;10548:181:1;36908:332:0;37035:30;37026:5;:39;;;;;;-1:-1:-1;;;37026:39:0;;;;;;;;;;37022:218;;;37076:44;;-1:-1:-1;;;37076:44:0;;12878:2:1;37076:44:0;;;12860:21:1;12917:2;12897:18;;;12890:30;12956:34;12936:18;;;12929:62;-1:-1:-1;;;13007:18:1;;;13000:32;13049:19;;37076:44:0;12850:224:1;37022:218:0;37147:30;37138:5;:39;;;;;;-1:-1:-1;;;37138:39:0;;;;;;;;;;37134:106;;;37188:44;;-1:-1:-1;;;37188:44:0;;14940:2:1;37188:44:0;;;14922:21:1;14979:2;14959:18;;;14952:30;15018:34;14998:18;;;14991:62;-1:-1:-1;;;15069:18:1;;;15062:32;15111:19;;37188:44:0;14912:224:1;28768:281:0;28880:18;28886:2;28890:7;28880:5;:18::i;:::-;28921:54;28952:1;28956:2;28960:7;28969:5;28921:22;:54::i;:::-;28905:138;;;;-1:-1:-1;;;28905:138:0;;;;;;;:::i;48373:288::-;48426:7;48454:4;-1:-1:-1;;;;;48463:12:0;48446:29;;:66;;;;;48496:16;48479:13;:33;48446:66;48442:214;;;-1:-1:-1;48530:24:0;;48373:288::o;48442:214::-;-1:-1:-1;48847:139:0;;;48606:10;48847:139;;;;8809:25:1;;;;48618:12:0;8850:18:1;;;8843:34;48632:15:0;8893:18:1;;;8886:34;48936:13:0;8936:18:1;;;8929:34;48970:4:0;8979:19:1;;;;8972:61;;;;48847:139:0;;;;;;;;;;8781:19:1;;;;48847:139:0;;;48827:168;;;;;;61328:118::o;41633:1543::-;41746:7;;42655:66;42635:86;;42623:174;;;-1:-1:-1;42754:1:0;;-1:-1:-1;42758:30:0;42738:51;;42623:174;42807:1;:7;;42812:2;42807:7;;:18;;;;;42818:1;:7;;42823:2;42818:7;;42807:18;42803:92;;;-1:-1:-1;42852:1:0;;-1:-1:-1;42856:30:0;42836:51;;42803:92;43001:24;;;42984:14;43001:24;;;;;;;;;9621:25:1;;;9694:4;9682:17;;9662:18;;;9655:45;;;;9716:18;;;9709:34;;;9759:18;;;9752:34;;;43001:24:0;;9593:19:1;;43001:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43001:24:0;;-1:-1:-1;;43001:24:0;;;-1:-1:-1;;;;;;;43036:20:0;;43032:93;;43083:1;43087:29;43067:50;;;;;;;43032:93;43141:6;-1:-1:-1;43149:20:0;;-1:-1:-1;41633:1543:0;;;;;;;;:::o;40703:370::-;40803:7;;-1:-1:-1;;;;;40886:102:0;;41009:3;41005:12;;;41019:2;41001:21;41042:25;41053:4;41001:21;41062:1;40886:102;41042:10;:25::i;:::-;41035:32;;;;;;40703:370;;;;;;:::o;29359:356::-;-1:-1:-1;;;;;29435:16:0;;29427:61;;;;-1:-1:-1;;;29427:61:0;;15343:2:1;29427:61:0;;;15325:21:1;;;15362:18;;;15355:30;15421:34;15401:18;;;15394:62;15473:18;;29427:61:0;15315:182:1;29427:61:0;29504:16;29512:7;29504;:16::i;:::-;29503:17;29495:58;;;;-1:-1:-1;;;29495:58:0;;11762:2:1;29495:58:0;;;11744:21:1;11801:2;11781:18;;;11774:30;11840;11820:18;;;11813:58;11888:18;;29495:58:0;11734:178:1;29495:58:0;-1:-1:-1;;;;;29616:13:0;;;;;;:9;:13;;;;;:18;;29633:1;;29616:13;:18;;29633:1;;29616:18;:::i;:::-;;;;-1:-1:-1;;29641:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29641:21:0;-1:-1:-1;;;;;29641:21:0;;;;;;;;29676:33;;29641:16;;;29676:33;;29641:16;;29676:33;29359:356;;:::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:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:228::-;870:5;923:3;916:4;908:6;904:17;900:27;890:2;;945:5;938;931:20;890:2;971:79;1046:3;1037:6;1024:20;1017:4;1009:6;1005:17;971:79;:::i;1061:196::-;1120:6;1173:2;1161:9;1152:7;1148:23;1144:32;1141:2;;;1194:6;1186;1179:22;1141:2;1222:29;1241:9;1222:29;:::i;1262:270::-;1330:6;1338;1391:2;1379:9;1370:7;1366:23;1362:32;1359:2;;;1412:6;1404;1397:22;1359:2;1440:29;1459:9;1440:29;:::i;:::-;1430:39;;1488:38;1522:2;1511:9;1507:18;1488:38;:::i;:::-;1478:48;;1349:183;;;;;:::o;1537:338::-;1614:6;1622;1630;1683:2;1671:9;1662:7;1658:23;1654:32;1651:2;;;1704:6;1696;1689:22;1651:2;1732:29;1751:9;1732:29;:::i;:::-;1722:39;;1780:38;1814:2;1803:9;1799:18;1780:38;:::i;:::-;1770:48;;1865:2;1854:9;1850:18;1837:32;1827:42;;1641:234;;;;;:::o;1880:557::-;1975:6;1983;1991;1999;2052:3;2040:9;2031:7;2027:23;2023:33;2020:2;;;2074:6;2066;2059:22;2020:2;2102:29;2121:9;2102:29;:::i;:::-;2092:39;;2150:38;2184:2;2173:9;2169:18;2150:38;:::i;:::-;2140:48;;2235:2;2224:9;2220:18;2207:32;2197:42;;2290:2;2279:9;2275:18;2262:32;2317:18;2309:6;2306:30;2303:2;;;2354:6;2346;2339:22;2303:2;2382:49;2423:7;2414:6;2403:9;2399:22;2382:49;:::i;:::-;2372:59;;;2010:427;;;;;;;:::o;2442:367::-;2507:6;2515;2568:2;2556:9;2547:7;2543:23;2539:32;2536:2;;;2589:6;2581;2574:22;2536:2;2617:29;2636:9;2617:29;:::i;:::-;2607:39;;2696:2;2685:9;2681:18;2668:32;2743:5;2736:13;2729:21;2722:5;2719:32;2709:2;;2770:6;2762;2755:22;2709:2;2798:5;2788:15;;;2526:283;;;;;:::o;2814:264::-;2882:6;2890;2943:2;2931:9;2922:7;2918:23;2914:32;2911:2;;;2964:6;2956;2949:22;2911:2;2992:29;3011:9;2992:29;:::i;:::-;2982:39;3068:2;3053:18;;;;3040:32;;-1:-1:-1;;;2901:177:1:o;3083:255::-;3141:6;3194:2;3182:9;3173:7;3169:23;3165:32;3162:2;;;3215:6;3207;3200:22;3162:2;3259:9;3246:23;3278:30;3302:5;3278:30;:::i;3343:259::-;3412:6;3465:2;3453:9;3444:7;3440:23;3436:32;3433:2;;;3486:6;3478;3471:22;3433:2;3523:9;3517:16;3542:30;3566:5;3542:30;:::i;3607:408::-;3684:6;3692;3745:2;3733:9;3724:7;3720:23;3716:32;3713:2;;;3766:6;3758;3751:22;3713:2;3811:9;3798:23;3844:18;3836:6;3833:30;3830:2;;;3881:6;3873;3866:22;3830:2;3909:49;3950:7;3941:6;3930:9;3926:22;3909:49;:::i;:::-;3899:59;4005:2;3990:18;;;;3977:32;;-1:-1:-1;;;;3703:312:1:o;4020:480::-;4089:6;4142:2;4130:9;4121:7;4117:23;4113:32;4110:2;;;4163:6;4155;4148:22;4110:2;4208:9;4195:23;4241:18;4233:6;4230:30;4227:2;;;4278:6;4270;4263:22;4227:2;4306:22;;4359:4;4351:13;;4347:27;-1:-1:-1;4337:2:1;;4393:6;4385;4378:22;4337:2;4421:73;4486:7;4481:2;4468:16;4463:2;4459;4455:11;4421:73;:::i;4505:190::-;4564:6;4617:2;4605:9;4596:7;4592:23;4588:32;4585:2;;;4638:6;4630;4623:22;4585:2;-1:-1:-1;4666:23:1;;4575:120;-1:-1:-1;4575:120:1:o;4700:264::-;4768:6;4776;4829:2;4817:9;4808:7;4804:23;4800:32;4797:2;;;4850:6;4842;4835:22;4797:2;4891:9;4878:23;4868:33;;4920:38;4954:2;4943:9;4939:18;4920:38;:::i;4969:257::-;5010:3;5048:5;5042:12;5075:6;5070:3;5063:19;5091:63;5147:6;5140:4;5135:3;5131:14;5124:4;5117:5;5113:16;5091:63;:::i;:::-;5208:2;5187:15;-1:-1:-1;;5183:29:1;5174:39;;;;5215:4;5170:50;;5018:208;-1:-1:-1;;5018:208:1:o;5231:470::-;5410:3;5448:6;5442:13;5464:53;5510:6;5505:3;5498:4;5490:6;5486:17;5464:53;:::i;:::-;5580:13;;5539:16;;;;5602:57;5580:13;5539:16;5636:4;5624:17;;5602:57;:::i;:::-;5675:20;;5418:283;-1:-1:-1;;;;5418:283:1:o;5706:1339::-;5882:3;5920:6;5914:13;5946:4;5959:51;6003:6;5998:3;5993:2;5985:6;5981:15;5959:51;:::i;:::-;6097:13;;6032:16;;;;6068:3;;6157:1;6179:18;;;;6232;;;;6259:2;;6337:4;6327:8;6323:19;6311:31;;6259:2;6400;6390:8;6387:16;6367:18;6364:40;6361:2;;;-1:-1:-1;;;6427:33:1;;6483:4;6480:1;6473:15;6513:4;6434:3;6501:17;6361:2;6544:18;6571:110;;;;6695:1;6690:330;;;;6537:483;;6571:110;-1:-1:-1;;6606:24:1;;6592:39;;6651:20;;;;-1:-1:-1;6571:110:1;;6690:330;18151:4;18170:17;;;18220:4;18204:21;;6785:3;6801:169;6815:8;6812:1;6809:15;6801:169;;;6897:14;;6882:13;;;6875:37;6940:16;;;;6832:10;;6801:169;;;6805:3;;7001:8;6994:5;6990:20;6983:27;;6537:483;-1:-1:-1;7036:3:1;;5890:1155;-1:-1:-1;;;;;;;;;;5890:1155:1:o;7865:488::-;-1:-1:-1;;;;;8134:15:1;;;8116:34;;8186:15;;8181:2;8166:18;;8159:43;8233:2;8218:18;;8211:34;;;8281:3;8276:2;8261:18;;8254:31;;;8059:4;;8302:45;;8327:19;;8319:6;8302:45;:::i;:::-;8294:53;8068:285;-1:-1:-1;;;;;;8068:285:1:o;9797:219::-;9946:2;9935:9;9928:21;9909:4;9966:44;10006:2;9995:9;9991:18;9983:6;9966:44;:::i;10734:414::-;10936:2;10918:21;;;10975:2;10955:18;;;10948:30;11014:34;11009:2;10994:18;;10987:62;-1:-1:-1;;;11080:2:1;11065:18;;11058:48;11138:3;11123:19;;10908:240::o;15915:356::-;16117:2;16099:21;;;16136:18;;;16129:30;16195:34;16190:2;16175:18;;16168:62;16262:2;16247:18;;16089:182::o;17504:413::-;17706:2;17688:21;;;17745:2;17725:18;;;17718:30;17784:34;17779:2;17764:18;;17757:62;-1:-1:-1;;;17850:2:1;17835:18;;17828:47;17907:3;17892:19;;17678:239::o;18236:128::-;18276:3;18307:1;18303:6;18300:1;18297:13;18294:2;;;18313:18;;:::i;:::-;-1:-1:-1;18349:9:1;;18284:80::o;18369:120::-;18409:1;18435;18425:2;;18440:18;;:::i;:::-;-1:-1:-1;18474:9:1;;18415:74::o;18494:125::-;18534:4;18562:1;18559;18556:8;18553:2;;;18567:18;;:::i;:::-;-1:-1:-1;18604:9:1;;18543:76::o;18624:258::-;18696:1;18706:113;18720:6;18717:1;18714:13;18706:113;;;18796:11;;;18790:18;18777:11;;;18770:39;18742:2;18735:10;18706:113;;;18837:6;18834:1;18831:13;18828:2;;;-1:-1:-1;;18872:1:1;18854:16;;18847:27;18677:205::o;18887:380::-;18966:1;18962:12;;;;19009;;;19030:2;;19084:4;19076:6;19072:17;19062:27;;19030:2;19137;19129:6;19126:14;19106:18;19103:38;19100:2;;;19183:10;19178:3;19174:20;19171:1;19164:31;19218:4;19215:1;19208:15;19246:4;19243:1;19236:15;19100:2;;18942:325;;;:::o;19272:135::-;19311:3;-1:-1:-1;;19332:17:1;;19329:2;;;19352:18;;:::i;:::-;-1:-1:-1;19399:1:1;19388:13;;19319:88::o;19412:112::-;19444:1;19470;19460:2;;19475:18;;:::i;:::-;-1:-1:-1;19509:9:1;;19450:74::o;19529:127::-;19590:10;19585:3;19581:20;19578:1;19571:31;19621:4;19618:1;19611:15;19645:4;19642:1;19635:15;19661:127;19722:10;19717:3;19713:20;19710:1;19703:31;19753:4;19750:1;19743:15;19777:4;19774:1;19767:15;19793:127;19854:10;19849:3;19845:20;19842:1;19835:31;19885:4;19882:1;19875:15;19909:4;19906:1;19899:15;19925:131;-1:-1:-1;;;;;;19999:32:1;;19989:43;;19979:2;;20046:1;20043;20036:12

Swarm Source

ipfs://800119f736278e36e67325cdfc629e6a4d2071dea7eb8fc0466406af58b12d75
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.