ETH Price: $3,607.18 (+4.67%)
 

Overview

Max Total Supply

96 OAE

Holders

33

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
10 OAE
0xE5EA7D50dDB730481e81ae78b07b300779704DBC
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:
OpenAEye

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 10 runs

Other Settings:
default evmVersion, MIT license
File 1 of 13 : OpenAEye.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721EfficientEnumerable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/Address.sol";

/*
 * @title OpenAEye
 * OpenAEye - Smart Contract for https://www.open-a-eye.com/.
 *
 *                                                            
                                                                                
                                   @@@@@@@@@@@                        
                         /@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,                        
       @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@      
     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@    
      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@     
       @@@@@@@@@@@@@@@@@@@@@@@@@       @@@@@@@@@@@@@@@@@@@@@@@@@      
         @@@@@@@@@@@@@@@@@@@@                       @@@@@@@@@@@@@@@@@@@@        
          @@@@@@@@@@@@@@@@@@         @@@@@@/         @@@@@@@@@@@@@@@@@*         
           @@@@@@@@@@@@@@@        @@@@@@@@@@@@@        @@@@@@@@@@@@@@@          
            @@@@@@@@@@@@@@       @@@@@@@@@@@@@@@       @@@@@@@@@@@@@@           
             @@@@@@@@@@@@@      @@@@@@@@@@@@@@@@%      @@@@@@@@@@@@@            
              @@@@@@@@@@@@       @@@@@@@@@@@@@@@       @@@@@@@@@@@@             
                 @@@@@@@@@        @@@@@@@@@@@@@       .@@@@@@@@@                
                    @@@@@@@@          @@@@@          @@@@@@@@                   
                     @@@@@@@@                       @@@@@@@*                    
       #@@@@@@@@@@                 @@@@@@@@@@                     
                      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                     
                       @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                      
                         @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                        
                           @@@@@@@@@@@@@@@@@@@@@@@@@@@                          
                              *@@@@@@@@@@@@@@@@@@@,                             
                       @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                      
                 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                
                @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@               
               @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@              
              @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   
 *
 *
 */
contract OpenAEye is ERC721EfficientEnumerable {
    using Counters for Counters.Counter;

    enum MintingPhase {
        INITIAL_MINT, // Initial Mint Phase
        PUBLIC_MINT,  // Primary Minting Phase
        CLOSED        // Minting Closed
    }
    enum TokenState {
        EyeAmOpen,
        EyeAmOk,
        EyeAmMeh,
        EyeAmBored
    }
    struct MetadataBatch {
        uint256 endIndex;
        string metadataURI;
    }
    event EyeMinted(uint256 tokenId);

    MintingPhase private currentMintingPhase;
    uint private constant MAX_EYES_MINTED_PER_TRANSACTION = 10;
    uint256 private constant MINT_PRICE_PER_TOKEN = 0.065 ether;
    MetadataBatch[] private metadataURIs;
    bytes private constant provenance = "57a5cd83d310a7fdbf5a7c12ebbbefdf42ea73336e737be664323d80697164b4";

    mapping(uint256 => Counters.Counter) private _sales;
    mapping(uint256 => uint256) private _lastTransferBlock;

    constructor()
        ERC721EfficientEnumerable("OpenAEye", "OAE") {
    }

    function setMintingPhase(MintingPhase mintingPhase) external onlyOwner {
        currentMintingPhase = mintingPhase;
    }

    function revealBatchMetadata(uint256 endIndex, string memory newURI) external onlyOwner {
        uint256 size = metadataURIs.length;
        uint256 lastIdRevealed = size == 0 ? 0 : metadataURIs[size - 1].endIndex;
        require(endIndex >= lastIdRevealed, "402"); // Invalid batch endIndex

        if (endIndex == lastIdRevealed) {
            metadataURIs[size - 1].metadataURI = newURI;
        } else {
            metadataURIs.push(MetadataBatch(endIndex, newURI));
        }
    }

    function reserveEyesForGiveaways(uint256 numberOfTokens) external onlyOwner ensureAvailability(numberOfTokens) {
        require(currentMintingPhase != MintingPhase.CLOSED, "403"); // Minting is closed.
        for (uint i = 0; i < numberOfTokens; i++) {
            _mintTo(owner());
        }
    }
    
    function withdraw() external onlyOwner {
        require(address(this).balance > 0, "401"); // Insufficient funds
        Address.sendValue(payable(owner()), address(this).balance);
    }

    function withdraw(uint256 amount, address payable to) external onlyOwner {
        require(address(this).balance >= amount, "401"); // Insufficient funds
        Address.sendValue(to, amount);
    }

    function mintEyes(uint256 numberOfTokens) external payable ensureAvailability(numberOfTokens) {
        require(currentMintingPhase != MintingPhase.INITIAL_MINT, "405"); // Initial Mint Only
        require(currentMintingPhase != MintingPhase.CLOSED, "403"); // Minting is closed
        require(numberOfTokens <= MAX_EYES_MINTED_PER_TRANSACTION, "410"); // Only allowed to mint 10 tokens per transaction
        require((numberOfTokens * MINT_PRICE_PER_TOKEN) <= msg.value, "465"); // Wrong ETH value sent

        for (uint i = 0; i < numberOfTokens; i++) {
            _mintTo(_msgSender());
        }
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override ensureExistance(tokenId) {
        super.transferFrom(from, to, tokenId);
        updateSalesHistory(tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override ensureExistance(tokenId) {
        super.safeTransferFrom(from, to, tokenId, _data);
        updateSalesHistory(tokenId);
    }

    function min(uint256 a, uint256 b) private pure returns (uint256) {
        return a < b ? a : b;
    }

    /*
    *   @dev visible for testing, to allow mocking time
    */
    function _blockNumber() internal virtual view returns (uint256) {
        return block.number;
    }

    function getTokenTimeInWallet(uint256 _tokenId) public view ensureExistance(_tokenId) returns (uint256) {
        return (_blockNumber() - _lastTransferBlock[_tokenId]) / 800;
    }

    function getTokenDecayTime(uint256 _tokenId) public view ensureExistance(_tokenId) returns (uint256) {
        uint256 tokenSales = _sales[_tokenId].current();
        uint256 offset = 0;
        for (uint i = 0; i <= 3; i++) {
            uint256 batch = tokenSales;
            if (i < 3) {
                batch = min(15, tokenSales);
            }
            offset += (1 days / (2**i)) * batch;
            tokenSales -= batch;
        }
        return min(30 days + offset, 60 days);
    }

    function getPlaceholderURI() internal virtual pure returns (string memory) {
        return "ipfs://bafkreidku2fnslorzrwjjrpwqnofcajp5dpcdd34etczpibt2datwq7ppe";
    }

    function tokenURI(uint256 _tokenId) public view override ensureExistance(_tokenId) returns (string memory) {
        for (uint i = 0; i < metadataURIs.length; i++) {
            if( _tokenId <= metadataURIs[i].endIndex ) {
                return string(
                    abi.encodePacked(
                        metadataURIs[i].metadataURI,
                        Strings.toString(_tokenId),
                        "_",
                        Strings.toString(uint256(getTokenState(_tokenId))),
                        ".json"
                    )
                );
            }
        }
        
        return getPlaceholderURI();
    }

    function getTokenState(uint256 _tokenId) private view returns (TokenState) {
        uint256 tokenAge = getTokenTimeInWallet(_tokenId) * 3 hours;
        uint256 timeToDecay = getTokenDecayTime(_tokenId);
        return TokenState(min(tokenAge / timeToDecay, 3));
    }

    function updateSalesHistory(uint256 _tokenId) private {
        _sales[_tokenId].increment();
        _lastTransferBlock[_tokenId] = _blockNumber();
    }

    function _mintTo(address _to) internal override {
        super._mintTo(_to);
        uint256 tokenId = totalSupply();
        _lastTransferBlock[tokenId] = _blockNumber();
        emit EyeMinted(tokenId);
    }
}

File 2 of 13 : ERC721EfficientEnumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

/**
 * @title ERC721EfficientEnumerable
 * ERC721EfficientEnumerable - ERC721 contract that uses counters for more gas-efficient tokenID enumeration.
 * For more details: https://shiny.mirror.xyz/OUampBbIz9ebEicfGnQf5At_ReMHlZy0tB4glb9xQ0E
 */
abstract contract ERC721EfficientEnumerable is ERC721, Ownable {
    using Counters for Counters.Counter;

    /**
     * We rely on the OZ Counter util to keep track of the next available ID.
     * We track the nextTokenId instead of the currentTokenId to save users on gas costs. 
     */ 
    Counters.Counter private _nextTokenId;

    /*
    * @dev The maximum ammount of tokens offered by this contract
    */
    uint256 private constant _maxTokenSupply = 10000;

    constructor(
        string memory _name,
        string memory _symbol
    ) ERC721(_name, _symbol) {
        // nextTokenId is initialized to 1, since starting at 0 leads to higher gas cost for the first minter
        _nextTokenId.increment();
    }

    /**
     * @dev Mints a token to an address with a tokenURI.
     * @param _to address of the future owner of the token
     */
    function _mintTo(address _to) internal virtual {
        uint256 currentTokenId = _nextTokenId.current();
        _nextTokenId.increment();
        _safeMint(_to, currentTokenId);
    }

    /**
        @dev Returns the total tokens minted so far.
        1 is always subtracted from the Counter since it tracks the next available tokenId.
     */
    function totalSupply() public view returns (uint256) {
        return _nextTokenId.current() - 1;
    }

    function maxSupply() public pure returns (uint256) {
        return _maxTokenSupply;
    }

    function availableTokens() public view returns (uint256) {
        return maxSupply() - totalSupply();
    }

    /// @dev Check whether another token is still available
    modifier ensureAvailability(uint256 amount) {
        require(availableTokens() >= amount, "409"); // Insufficient tokens available
        _;
    }

    /// @dev Check whether tokenId exists
    modifier ensureExistance(uint256 tokenId) {
        require(_exists(tokenId), "404"); // Token not found
        _;
    }
}

File 3 of 13 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 4 of 13 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 5 of 13 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 6 of 13 : Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 7 of 13 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 8 of 13 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 9 of 13 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @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 10 of 13 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 11 of 13 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @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 12 of 13 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @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 13 of 13 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 10
  },
  "evmVersion": "london",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"EyeMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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":"getTokenDecayTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getTokenTimeInWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintEyes","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reserveEyesForGiveaways","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"endIndex","type":"uint256"},{"internalType":"string","name":"newURI","type":"string"}],"name":"revealBatchMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum OpenAEye.MintingPhase","name":"mintingPhase","type":"uint8"}],"name":"setMintingPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060408051808201825260088152674f70656e4145796560c01b6020808301918252835180850190945260038452624f414560e81b90840152815191929183918391620000619160009162000112565b5080516200007790600190602084019062000112565b505050620000946200008e620000b360201b60201c565b620000b7565b620000ab60076200010960201b620010c31760201c565b5050620001f5565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80546001019055565b8280546200012090620001b8565b90600052602060002090601f0160209004810192826200014457600085556200018f565b82601f106200015f57805160ff19168380011785556200018f565b828001600101855582156200018f579182015b828111156200018f57825182559160200191906001019062000172565b506200019d929150620001a1565b5090565b5b808211156200019d5760008155600101620001a2565b600181811c90821680620001cd57607f821691505b60208210811415620001ef57634e487b7160e01b600052602260045260246000fd5b50919050565b61244480620002056000396000f3fe60806040526004361061013b5760003560e01c8062f714ce1461014057806301ffc9a71461016257806306fdde0314610197578063081812fc146101b9578063095ea7b3146101f157806318160ddd1461021157806323b872dd146102345780633ccfd60b1461025457806342842e0e146102695780636352211e1461028957806369bb4dc2146102a957806370a08231146102be578063715018a6146102de5780638da5cb5b146102f357806395d89b4114610308578063a22cb4651461031d578063b02c0de41461033d578063b1fa1b641461035d578063b88d4fde14610370578063bf39532b14610390578063c87b56dd146103b0578063d4c21019146103d0578063d5abeb01146103f0578063e985e9c514610405578063ea21675c14610425578063ec58203b14610445578063f2fde38b14610465575b600080fd5b34801561014c57600080fd5b5061016061015b366004611bba565b610485565b005b34801561016e57600080fd5b5061018261017d366004611c00565b6104eb565b60405190151581526020015b60405180910390f35b3480156101a357600080fd5b506101ac61053d565b60405161018e9190611c75565b3480156101c557600080fd5b506101d96101d4366004611c88565b6105cf565b6040516001600160a01b03909116815260200161018e565b3480156101fd57600080fd5b5061016061020c366004611ca1565b610657565b34801561021d57600080fd5b50610226610768565b60405190815260200161018e565b34801561024057600080fd5b5061016061024f366004611ccd565b610784565b34801561026057600080fd5b506101606107c4565b34801561027557600080fd5b50610160610284366004611ccd565b610826565b34801561029557600080fd5b506101d96102a4366004611c88565b610841565b3480156102b557600080fd5b506102266108b8565b3480156102ca57600080fd5b506102266102d9366004611d0e565b6108ca565b3480156102ea57600080fd5b50610160610951565b3480156102ff57600080fd5b506101d961098a565b34801561031457600080fd5b506101ac610999565b34801561032957600080fd5b50610160610338366004611d2b565b6109a8565b34801561034957600080fd5b50610160610358366004611de9565b6109b3565b61016061036b366004611c88565b610b3c565b34801561037c57600080fd5b5061016061038b366004611e43565b610c90565b34801561039c57600080fd5b506102266103ab366004611c88565b610cd2565b3480156103bc57600080fd5b506101ac6103cb366004611c88565b610d2a565b3480156103dc57600080fd5b506102266103eb366004611c88565b610e1d565b3480156103fc57600080fd5b50612710610226565b34801561041157600080fd5b50610182610420366004611ec2565b610ee9565b34801561043157600080fd5b50610160610440366004611ef0565b610f17565b34801561045157600080fd5b50610160610460366004611c88565b610f6d565b34801561047157600080fd5b50610160610480366004611d0e565b611023565b3361048e61098a565b6001600160a01b0316146104bd5760405162461bcd60e51b81526004016104b490611f11565b60405180910390fd5b814710156104dd5760405162461bcd60e51b81526004016104b490611f46565b6104e781836110cc565b5050565b60006001600160e01b031982166380ac58cd60e01b148061051c57506001600160e01b03198216635b5e139f60e01b145b8061053757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461054c90611f63565b80601f016020809104026020016040519081016040528092919081815260200182805461057890611f63565b80156105c55780601f1061059a576101008083540402835291602001916105c5565b820191906000526020600020905b8154815290600101906020018083116105a857829003601f168201915b5050505050905090565b60006105da826111e2565b61063b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016104b4565b506000908152600460205260409020546001600160a01b031690565b600061066282610841565b9050806001600160a01b0316836001600160a01b031614156106d05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016104b4565b336001600160a01b03821614806106ec57506106ec8133610ee9565b6107595760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016104b4565b61076383836111ff565b505050565b6000600161077560075490565b61077f9190611fae565b905090565b8061078e816111e2565b6107aa5760405162461bcd60e51b81526004016104b490611fc5565b6107b584848461126d565b6107be8261129e565b50505050565b336107cd61098a565b6001600160a01b0316146107f35760405162461bcd60e51b81526004016104b490611f11565b600047116108135760405162461bcd60e51b81526004016104b490611f46565b61082461081e61098a565b476110cc565b565b61076383838360405180602001604052806000815250610c90565b6000818152600260205260408120546001600160a01b0316806105375760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016104b4565b60006108c2610768565b612710610775565b60006001600160a01b0382166109355760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016104b4565b506001600160a01b031660009081526003602052604090205490565b3361095a61098a565b6001600160a01b0316146109805760405162461bcd60e51b81526004016104b490611f11565b61082460006112c2565b6006546001600160a01b031690565b60606001805461054c90611f63565b6104e7338383611314565b336109bc61098a565b6001600160a01b0316146109e25760405162461bcd60e51b81526004016104b490611f11565b60095460008115610a215760096109fa600184611fae565b81548110610a0a57610a0a611fe2565b906000526020600020906002020160000154610a24565b60005b905080841015610a5c5760405162461bcd60e51b81526020600482015260036024820152621a181960e91b60448201526064016104b4565b80841415610aac57826009610a72600185611fae565b81548110610a8257610a82611fe2565b90600052602060002090600202016001019080519060200190610aa6929190611b0c565b506107be565b60408051808201909152848152602080820185815260098054600181018255600091909152835160029091027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af8101918255915180519193610b33937f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b00192910190611b0c565b50505050505050565b8080610b466108b8565b1015610b645760405162461bcd60e51b81526004016104b490611ff8565b600060085460ff166002811115610b7d57610b7d612015565b1415610bb15760405162461bcd60e51b815260206004820152600360248201526234303560e81b60448201526064016104b4565b600260085460ff166002811115610bca57610bca612015565b1415610be85760405162461bcd60e51b81526004016104b49061202b565b600a821115610c1f5760405162461bcd60e51b815260206004820152600360248201526203431360ec1b60448201526064016104b4565b34610c3166e6ed27d666800084612048565b1115610c655760405162461bcd60e51b815260206004820152600360248201526234363560e81b60448201526064016104b4565b60005b8281101561076357610c7e336113df565b6113df565b80610c8881612067565b915050610c68565b81610c9a816111e2565b610cb65760405162461bcd60e51b81526004016104b490611fc5565b610cc28585858561143e565b610ccb8361129e565b5050505050565b600081610cde816111e2565b610cfa5760405162461bcd60e51b81526004016104b490611fc5565b6000838152600b602052604090205461032090610d179043611fae565b610d219190612098565b91505b50919050565b606081610d36816111e2565b610d525760405162461bcd60e51b81526004016104b490611fc5565b60005b600954811015610e145760098181548110610d7257610d72611fe2565b9060005260206000209060020201600001548411610e025760098181548110610d9d57610d9d611fe2565b9060005260206000209060020201600101610db785611470565b610dd9610dc387611575565b6003811115610dd457610dd4612015565b611470565b604051602001610deb939291906120c8565b604051602081830303815290604052925050610d24565b80610e0c81612067565b915050610d55565b50610d216115c1565b600081610e29816111e2565b610e455760405162461bcd60e51b81526004016104b490611fc5565b6000838152600a602052604081205490805b60038111610ec657826003821015610e7757610e74600f856115e1565b90505b80610e83836002612281565b610e909062015180612098565b610e9a9190612048565b610ea4908461228d565b9250610eb08185611fae565b9350508080610ebe90612067565b915050610e57565b50610ee0610ed78262278d0061228d565b624f1a006115e1565b95945050505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b33610f2061098a565b6001600160a01b031614610f465760405162461bcd60e51b81526004016104b490611f11565b6008805482919060ff19166001836002811115610f6557610f65612015565b021790555050565b33610f7661098a565b6001600160a01b031614610f9c5760405162461bcd60e51b81526004016104b490611f11565b8080610fa66108b8565b1015610fc45760405162461bcd60e51b81526004016104b490611ff8565b600260085460ff166002811115610fdd57610fdd612015565b1415610ffb5760405162461bcd60e51b81526004016104b49061202b565b60005b8281101561076357611011610c7961098a565b8061101b81612067565b915050610ffe565b3361102c61098a565b6001600160a01b0316146110525760405162461bcd60e51b81526004016104b490611f11565b6001600160a01b0381166110b75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104b4565b6110c0816112c2565b50565b80546001019055565b8047101561111c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016104b4565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611169576040519150601f19603f3d011682016040523d82523d6000602084013e61116e565b606091505b50509050806107635760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c20726044820152791958da5c1a595b9d081b585e481a185d99481c995d995c9d195960321b60648201526084016104b4565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061123482610841565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61127733826115f9565b6112935760405162461bcd60e51b81526004016104b4906122a5565b6107638383836116bb565b6000908152600a6020908152604080832080546001019055600b9091529020439055565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156113725760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016104b4565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6113e881611849565b60006113f2610768565b9050436000828152600b602090815260409182902092909255518281527f8d43fd66bdca8b702c1431933f95654bd567ce2014903def8a143946a0b71c2b910160405180910390a15050565b61144833836115f9565b6114645760405162461bcd60e51b81526004016104b4906122a5565b6107be8484848461186e565b6060816114945750506040805180820190915260018152600360fc1b602082015290565b8160005b81156114be57806114a881612067565b91506114b79050600a83612098565b9150611498565b6000816001600160401b038111156114d8576114d8611d5e565b6040519080825280601f01601f191660200182016040528015611502576020820181803683370190505b5090505b841561156d57611517600183611fae565b9150611524600a866122f6565b61152f90603061228d565b60f81b81838151811061154457611544611fe2565b60200101906001600160f81b031916908160001a905350611566600a86612098565b9450611506565b949350505050565b60008061158183610cd2565b61158d90612a30612048565b9050600061159a84610e1d565b90506115b06115a98284612098565b60036115e1565b600381111561156d5761156d612015565b60606040518060800160405280604281526020016123ad60429139905090565b60008183106115f057816115f2565b825b9392505050565b6000611604826111e2565b6116655760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016104b4565b600061167083610841565b9050806001600160a01b0316846001600160a01b031614806116ab5750836001600160a01b03166116a0846105cf565b6001600160a01b0316145b8061156d575061156d8185610ee9565b826001600160a01b03166116ce82610841565b6001600160a01b0316146117365760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016104b4565b6001600160a01b0382166117985760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104b4565b6117a36000826111ff565b6001600160a01b03831660009081526003602052604081208054600192906117cc908490611fae565b90915550506001600160a01b03821660009081526003602052604081208054600192906117fa90849061228d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716916000805160206123ef83398151915291a4505050565b600061185460075490565b9050611864600780546001019055565b6104e782826118a1565b6118798484846116bb565b611885848484846118bb565b6107be5760405162461bcd60e51b81526004016104b49061230a565b6104e78282604051806020016040528060008152506119b9565b60006001600160a01b0384163b156119ae57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118ff90339089908890889060040161235c565b6020604051808303816000875af192505050801561193a575060408051601f3d908101601f191682019092526119379181019061238f565b60015b611994573d808015611968576040519150601f19603f3d011682016040523d82523d6000602084013e61196d565b606091505b50805161198c5760405162461bcd60e51b81526004016104b49061230a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061156d565b506001949350505050565b6119c383836119ec565b6119d060008484846118bb565b6107635760405162461bcd60e51b81526004016104b49061230a565b6001600160a01b038216611a425760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104b4565b611a4b816111e2565b15611a975760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016104b4565b6001600160a01b0382166000908152600360205260408120805460019290611ac090849061228d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392906000805160206123ef833981519152908290a45050565b828054611b1890611f63565b90600052602060002090601f016020900481019282611b3a5760008555611b80565b82601f10611b5357805160ff1916838001178555611b80565b82800160010185558215611b80579182015b82811115611b80578251825591602001919060010190611b65565b50611b8c929150611b90565b5090565b5b80821115611b8c5760008155600101611b91565b6001600160a01b03811681146110c057600080fd5b60008060408385031215611bcd57600080fd5b823591506020830135611bdf81611ba5565b809150509250929050565b6001600160e01b0319811681146110c057600080fd5b600060208284031215611c1257600080fd5b81356115f281611bea565b60005b83811015611c38578181015183820152602001611c20565b838111156107be5750506000910152565b60008151808452611c61816020860160208601611c1d565b601f01601f19169290920160200192915050565b6020815260006115f26020830184611c49565b600060208284031215611c9a57600080fd5b5035919050565b60008060408385031215611cb457600080fd5b8235611cbf81611ba5565b946020939093013593505050565b600080600060608486031215611ce257600080fd5b8335611ced81611ba5565b92506020840135611cfd81611ba5565b929592945050506040919091013590565b600060208284031215611d2057600080fd5b81356115f281611ba5565b60008060408385031215611d3e57600080fd5b8235611d4981611ba5565b915060208301358015158114611bdf57600080fd5b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115611d8e57611d8e611d5e565b604051601f8501601f19908116603f01168101908282118183101715611db657611db6611d5e565b81604052809350858152868686011115611dcf57600080fd5b858560208301376000602087830101525050509392505050565b60008060408385031215611dfc57600080fd5b8235915060208301356001600160401b03811115611e1957600080fd5b8301601f81018513611e2a57600080fd5b611e3985823560208401611d74565b9150509250929050565b60008060008060808587031215611e5957600080fd5b8435611e6481611ba5565b93506020850135611e7481611ba5565b92506040850135915060608501356001600160401b03811115611e9657600080fd5b8501601f81018713611ea757600080fd5b611eb687823560208401611d74565b91505092959194509250565b60008060408385031215611ed557600080fd5b8235611ee081611ba5565b91506020830135611bdf81611ba5565b600060208284031215611f0257600080fd5b8135600381106115f257600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526003908201526234303160e81b604082015260600190565b600181811c90821680611f7757607f821691505b60208210811415610d2457634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015611fc057611fc0611f98565b500390565b6020808252600390820152620d0c0d60ea1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526003908201526234303960e81b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b60208082526003908201526234303360e81b604082015260600190565b600081600019048311821515161561206257612062611f98565b500290565b600060001982141561207b5761207b611f98565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826120a7576120a7612082565b500490565b600081516120be818560208601611c1d565b9290920192915050565b600080855481600182811c9150808316806120e457607f831692505b602080841082141561210457634e487b7160e01b86526022600452602486fd5b818015612118576001811461212957612156565b60ff19861689528489019650612156565b60008c81526020902060005b8681101561214e5781548b820152908501908301612135565b505084890196505b50505050505061219361218261217c61216f84896120ac565b605f60f81b815260010190565b866120ac565b64173539b7b760d91b815260050190565b9695505050505050565b600181815b808511156121d85781600019048211156121be576121be611f98565b808516156121cb57918102915b93841c93908002906121a2565b509250929050565b6000826121ef57506001610537565b816121fc57506000610537565b8160018114612212576002811461221c57612238565b6001915050610537565b60ff84111561222d5761222d611f98565b50506001821b610537565b5060208310610133831016604e8410600b841016171561225b575081810a610537565b612265838361219d565b806000190482111561227957612279611f98565b029392505050565b60006115f283836121e0565b600082198211156122a0576122a0611f98565b500190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008261230557612305612082565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061219390830184611c49565b6000602082840312156123a157600080fd5b81516115f281611bea56fe697066733a2f2f6261666b726569646b7532666e736c6f727a72776a6a727077716e6f6663616a7035647063646433346574637a7069627432646174777137707065ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212201d432f165b32cf5c64433b0608e29f4692c6a8f669c01ebc34b197340e23b1ce64736f6c634300080b0033

Deployed Bytecode

0x60806040526004361061013b5760003560e01c8062f714ce1461014057806301ffc9a71461016257806306fdde0314610197578063081812fc146101b9578063095ea7b3146101f157806318160ddd1461021157806323b872dd146102345780633ccfd60b1461025457806342842e0e146102695780636352211e1461028957806369bb4dc2146102a957806370a08231146102be578063715018a6146102de5780638da5cb5b146102f357806395d89b4114610308578063a22cb4651461031d578063b02c0de41461033d578063b1fa1b641461035d578063b88d4fde14610370578063bf39532b14610390578063c87b56dd146103b0578063d4c21019146103d0578063d5abeb01146103f0578063e985e9c514610405578063ea21675c14610425578063ec58203b14610445578063f2fde38b14610465575b600080fd5b34801561014c57600080fd5b5061016061015b366004611bba565b610485565b005b34801561016e57600080fd5b5061018261017d366004611c00565b6104eb565b60405190151581526020015b60405180910390f35b3480156101a357600080fd5b506101ac61053d565b60405161018e9190611c75565b3480156101c557600080fd5b506101d96101d4366004611c88565b6105cf565b6040516001600160a01b03909116815260200161018e565b3480156101fd57600080fd5b5061016061020c366004611ca1565b610657565b34801561021d57600080fd5b50610226610768565b60405190815260200161018e565b34801561024057600080fd5b5061016061024f366004611ccd565b610784565b34801561026057600080fd5b506101606107c4565b34801561027557600080fd5b50610160610284366004611ccd565b610826565b34801561029557600080fd5b506101d96102a4366004611c88565b610841565b3480156102b557600080fd5b506102266108b8565b3480156102ca57600080fd5b506102266102d9366004611d0e565b6108ca565b3480156102ea57600080fd5b50610160610951565b3480156102ff57600080fd5b506101d961098a565b34801561031457600080fd5b506101ac610999565b34801561032957600080fd5b50610160610338366004611d2b565b6109a8565b34801561034957600080fd5b50610160610358366004611de9565b6109b3565b61016061036b366004611c88565b610b3c565b34801561037c57600080fd5b5061016061038b366004611e43565b610c90565b34801561039c57600080fd5b506102266103ab366004611c88565b610cd2565b3480156103bc57600080fd5b506101ac6103cb366004611c88565b610d2a565b3480156103dc57600080fd5b506102266103eb366004611c88565b610e1d565b3480156103fc57600080fd5b50612710610226565b34801561041157600080fd5b50610182610420366004611ec2565b610ee9565b34801561043157600080fd5b50610160610440366004611ef0565b610f17565b34801561045157600080fd5b50610160610460366004611c88565b610f6d565b34801561047157600080fd5b50610160610480366004611d0e565b611023565b3361048e61098a565b6001600160a01b0316146104bd5760405162461bcd60e51b81526004016104b490611f11565b60405180910390fd5b814710156104dd5760405162461bcd60e51b81526004016104b490611f46565b6104e781836110cc565b5050565b60006001600160e01b031982166380ac58cd60e01b148061051c57506001600160e01b03198216635b5e139f60e01b145b8061053757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461054c90611f63565b80601f016020809104026020016040519081016040528092919081815260200182805461057890611f63565b80156105c55780601f1061059a576101008083540402835291602001916105c5565b820191906000526020600020905b8154815290600101906020018083116105a857829003601f168201915b5050505050905090565b60006105da826111e2565b61063b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016104b4565b506000908152600460205260409020546001600160a01b031690565b600061066282610841565b9050806001600160a01b0316836001600160a01b031614156106d05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016104b4565b336001600160a01b03821614806106ec57506106ec8133610ee9565b6107595760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016104b4565b61076383836111ff565b505050565b6000600161077560075490565b61077f9190611fae565b905090565b8061078e816111e2565b6107aa5760405162461bcd60e51b81526004016104b490611fc5565b6107b584848461126d565b6107be8261129e565b50505050565b336107cd61098a565b6001600160a01b0316146107f35760405162461bcd60e51b81526004016104b490611f11565b600047116108135760405162461bcd60e51b81526004016104b490611f46565b61082461081e61098a565b476110cc565b565b61076383838360405180602001604052806000815250610c90565b6000818152600260205260408120546001600160a01b0316806105375760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016104b4565b60006108c2610768565b612710610775565b60006001600160a01b0382166109355760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016104b4565b506001600160a01b031660009081526003602052604090205490565b3361095a61098a565b6001600160a01b0316146109805760405162461bcd60e51b81526004016104b490611f11565b61082460006112c2565b6006546001600160a01b031690565b60606001805461054c90611f63565b6104e7338383611314565b336109bc61098a565b6001600160a01b0316146109e25760405162461bcd60e51b81526004016104b490611f11565b60095460008115610a215760096109fa600184611fae565b81548110610a0a57610a0a611fe2565b906000526020600020906002020160000154610a24565b60005b905080841015610a5c5760405162461bcd60e51b81526020600482015260036024820152621a181960e91b60448201526064016104b4565b80841415610aac57826009610a72600185611fae565b81548110610a8257610a82611fe2565b90600052602060002090600202016001019080519060200190610aa6929190611b0c565b506107be565b60408051808201909152848152602080820185815260098054600181018255600091909152835160029091027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af8101918255915180519193610b33937f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b00192910190611b0c565b50505050505050565b8080610b466108b8565b1015610b645760405162461bcd60e51b81526004016104b490611ff8565b600060085460ff166002811115610b7d57610b7d612015565b1415610bb15760405162461bcd60e51b815260206004820152600360248201526234303560e81b60448201526064016104b4565b600260085460ff166002811115610bca57610bca612015565b1415610be85760405162461bcd60e51b81526004016104b49061202b565b600a821115610c1f5760405162461bcd60e51b815260206004820152600360248201526203431360ec1b60448201526064016104b4565b34610c3166e6ed27d666800084612048565b1115610c655760405162461bcd60e51b815260206004820152600360248201526234363560e81b60448201526064016104b4565b60005b8281101561076357610c7e336113df565b6113df565b80610c8881612067565b915050610c68565b81610c9a816111e2565b610cb65760405162461bcd60e51b81526004016104b490611fc5565b610cc28585858561143e565b610ccb8361129e565b5050505050565b600081610cde816111e2565b610cfa5760405162461bcd60e51b81526004016104b490611fc5565b6000838152600b602052604090205461032090610d179043611fae565b610d219190612098565b91505b50919050565b606081610d36816111e2565b610d525760405162461bcd60e51b81526004016104b490611fc5565b60005b600954811015610e145760098181548110610d7257610d72611fe2565b9060005260206000209060020201600001548411610e025760098181548110610d9d57610d9d611fe2565b9060005260206000209060020201600101610db785611470565b610dd9610dc387611575565b6003811115610dd457610dd4612015565b611470565b604051602001610deb939291906120c8565b604051602081830303815290604052925050610d24565b80610e0c81612067565b915050610d55565b50610d216115c1565b600081610e29816111e2565b610e455760405162461bcd60e51b81526004016104b490611fc5565b6000838152600a602052604081205490805b60038111610ec657826003821015610e7757610e74600f856115e1565b90505b80610e83836002612281565b610e909062015180612098565b610e9a9190612048565b610ea4908461228d565b9250610eb08185611fae565b9350508080610ebe90612067565b915050610e57565b50610ee0610ed78262278d0061228d565b624f1a006115e1565b95945050505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b33610f2061098a565b6001600160a01b031614610f465760405162461bcd60e51b81526004016104b490611f11565b6008805482919060ff19166001836002811115610f6557610f65612015565b021790555050565b33610f7661098a565b6001600160a01b031614610f9c5760405162461bcd60e51b81526004016104b490611f11565b8080610fa66108b8565b1015610fc45760405162461bcd60e51b81526004016104b490611ff8565b600260085460ff166002811115610fdd57610fdd612015565b1415610ffb5760405162461bcd60e51b81526004016104b49061202b565b60005b8281101561076357611011610c7961098a565b8061101b81612067565b915050610ffe565b3361102c61098a565b6001600160a01b0316146110525760405162461bcd60e51b81526004016104b490611f11565b6001600160a01b0381166110b75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104b4565b6110c0816112c2565b50565b80546001019055565b8047101561111c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016104b4565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611169576040519150601f19603f3d011682016040523d82523d6000602084013e61116e565b606091505b50509050806107635760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c20726044820152791958da5c1a595b9d081b585e481a185d99481c995d995c9d195960321b60648201526084016104b4565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061123482610841565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61127733826115f9565b6112935760405162461bcd60e51b81526004016104b4906122a5565b6107638383836116bb565b6000908152600a6020908152604080832080546001019055600b9091529020439055565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156113725760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016104b4565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6113e881611849565b60006113f2610768565b9050436000828152600b602090815260409182902092909255518281527f8d43fd66bdca8b702c1431933f95654bd567ce2014903def8a143946a0b71c2b910160405180910390a15050565b61144833836115f9565b6114645760405162461bcd60e51b81526004016104b4906122a5565b6107be8484848461186e565b6060816114945750506040805180820190915260018152600360fc1b602082015290565b8160005b81156114be57806114a881612067565b91506114b79050600a83612098565b9150611498565b6000816001600160401b038111156114d8576114d8611d5e565b6040519080825280601f01601f191660200182016040528015611502576020820181803683370190505b5090505b841561156d57611517600183611fae565b9150611524600a866122f6565b61152f90603061228d565b60f81b81838151811061154457611544611fe2565b60200101906001600160f81b031916908160001a905350611566600a86612098565b9450611506565b949350505050565b60008061158183610cd2565b61158d90612a30612048565b9050600061159a84610e1d565b90506115b06115a98284612098565b60036115e1565b600381111561156d5761156d612015565b60606040518060800160405280604281526020016123ad60429139905090565b60008183106115f057816115f2565b825b9392505050565b6000611604826111e2565b6116655760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016104b4565b600061167083610841565b9050806001600160a01b0316846001600160a01b031614806116ab5750836001600160a01b03166116a0846105cf565b6001600160a01b0316145b8061156d575061156d8185610ee9565b826001600160a01b03166116ce82610841565b6001600160a01b0316146117365760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016104b4565b6001600160a01b0382166117985760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104b4565b6117a36000826111ff565b6001600160a01b03831660009081526003602052604081208054600192906117cc908490611fae565b90915550506001600160a01b03821660009081526003602052604081208054600192906117fa90849061228d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716916000805160206123ef83398151915291a4505050565b600061185460075490565b9050611864600780546001019055565b6104e782826118a1565b6118798484846116bb565b611885848484846118bb565b6107be5760405162461bcd60e51b81526004016104b49061230a565b6104e78282604051806020016040528060008152506119b9565b60006001600160a01b0384163b156119ae57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118ff90339089908890889060040161235c565b6020604051808303816000875af192505050801561193a575060408051601f3d908101601f191682019092526119379181019061238f565b60015b611994573d808015611968576040519150601f19603f3d011682016040523d82523d6000602084013e61196d565b606091505b50805161198c5760405162461bcd60e51b81526004016104b49061230a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061156d565b506001949350505050565b6119c383836119ec565b6119d060008484846118bb565b6107635760405162461bcd60e51b81526004016104b49061230a565b6001600160a01b038216611a425760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104b4565b611a4b816111e2565b15611a975760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016104b4565b6001600160a01b0382166000908152600360205260408120805460019290611ac090849061228d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392906000805160206123ef833981519152908290a45050565b828054611b1890611f63565b90600052602060002090601f016020900481019282611b3a5760008555611b80565b82601f10611b5357805160ff1916838001178555611b80565b82800160010185558215611b80579182015b82811115611b80578251825591602001919060010190611b65565b50611b8c929150611b90565b5090565b5b80821115611b8c5760008155600101611b91565b6001600160a01b03811681146110c057600080fd5b60008060408385031215611bcd57600080fd5b823591506020830135611bdf81611ba5565b809150509250929050565b6001600160e01b0319811681146110c057600080fd5b600060208284031215611c1257600080fd5b81356115f281611bea565b60005b83811015611c38578181015183820152602001611c20565b838111156107be5750506000910152565b60008151808452611c61816020860160208601611c1d565b601f01601f19169290920160200192915050565b6020815260006115f26020830184611c49565b600060208284031215611c9a57600080fd5b5035919050565b60008060408385031215611cb457600080fd5b8235611cbf81611ba5565b946020939093013593505050565b600080600060608486031215611ce257600080fd5b8335611ced81611ba5565b92506020840135611cfd81611ba5565b929592945050506040919091013590565b600060208284031215611d2057600080fd5b81356115f281611ba5565b60008060408385031215611d3e57600080fd5b8235611d4981611ba5565b915060208301358015158114611bdf57600080fd5b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115611d8e57611d8e611d5e565b604051601f8501601f19908116603f01168101908282118183101715611db657611db6611d5e565b81604052809350858152868686011115611dcf57600080fd5b858560208301376000602087830101525050509392505050565b60008060408385031215611dfc57600080fd5b8235915060208301356001600160401b03811115611e1957600080fd5b8301601f81018513611e2a57600080fd5b611e3985823560208401611d74565b9150509250929050565b60008060008060808587031215611e5957600080fd5b8435611e6481611ba5565b93506020850135611e7481611ba5565b92506040850135915060608501356001600160401b03811115611e9657600080fd5b8501601f81018713611ea757600080fd5b611eb687823560208401611d74565b91505092959194509250565b60008060408385031215611ed557600080fd5b8235611ee081611ba5565b91506020830135611bdf81611ba5565b600060208284031215611f0257600080fd5b8135600381106115f257600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526003908201526234303160e81b604082015260600190565b600181811c90821680611f7757607f821691505b60208210811415610d2457634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015611fc057611fc0611f98565b500390565b6020808252600390820152620d0c0d60ea1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526003908201526234303960e81b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b60208082526003908201526234303360e81b604082015260600190565b600081600019048311821515161561206257612062611f98565b500290565b600060001982141561207b5761207b611f98565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826120a7576120a7612082565b500490565b600081516120be818560208601611c1d565b9290920192915050565b600080855481600182811c9150808316806120e457607f831692505b602080841082141561210457634e487b7160e01b86526022600452602486fd5b818015612118576001811461212957612156565b60ff19861689528489019650612156565b60008c81526020902060005b8681101561214e5781548b820152908501908301612135565b505084890196505b50505050505061219361218261217c61216f84896120ac565b605f60f81b815260010190565b866120ac565b64173539b7b760d91b815260050190565b9695505050505050565b600181815b808511156121d85781600019048211156121be576121be611f98565b808516156121cb57918102915b93841c93908002906121a2565b509250929050565b6000826121ef57506001610537565b816121fc57506000610537565b8160018114612212576002811461221c57612238565b6001915050610537565b60ff84111561222d5761222d611f98565b50506001821b610537565b5060208310610133831016604e8410600b841016171561225b575081810a610537565b612265838361219d565b806000190482111561227957612279611f98565b029392505050565b60006115f283836121e0565b600082198211156122a0576122a0611f98565b500190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008261230557612305612082565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061219390830184611c49565b6000602082840312156123a157600080fd5b81516115f281611bea56fe697066733a2f2f6261666b726569646b7532666e736c6f727a72776a6a727077716e6f6663616a7035647063646433346574637a7069627432646174777137707065ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212201d432f165b32cf5c64433b0608e29f4692c6a8f669c01ebc34b197340e23b1ce64736f6c634300080b0033

Deployed Bytecode Sourcemap

2605:6077:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4800:201;;;;;;;;;;-1:-1:-1;4800:201:1;;;;;:::i;:::-;;:::i;:::-;;1555:300:3;;;;;;;;;;-1:-1:-1;1555:300:3;;;;;:::i;:::-;;:::i;:::-;;;1045:14:13;;1038:22;1020:41;;1008:2;993:18;1555:300:3;;;;;;;;2473:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3984:217::-;;;;;;;;;;-1:-1:-1;3984:217:3;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2194:32:13;;;2176:51;;2164:2;2149:18;3984:217:3;2030:203:13;3522:401:3;;;;;;;;;;-1:-1:-1;3522:401:3;;;;;:::i;:::-;;:::i;1734:105:0:-;;;;;;;;;;;;;:::i;:::-;;;2712:25:13;;;2700:2;2685:18;1734:105:0;2566:177:13;5636:234:1;;;;;;;;;;-1:-1:-1;5636:234:1;;;;;:::i;:::-;;:::i;4602:190::-;;;;;;;;;;;;;:::i;5107:179:3:-;;;;;;;;;;-1:-1:-1;5107:179:3;;;;;:::i;:::-;;:::i;2176:235::-;;;;;;;;;;-1:-1:-1;2176:235:3;;;;;:::i;:::-;;:::i;1947:110:0:-;;;;;;;;;;;;;:::i;1914:205:3:-;;;;;;;;;;-1:-1:-1;1914:205:3;;;;;:::i;:::-;;:::i;1668:101:2:-;;;;;;;;;;;;;:::i;1036:85::-;;;;;;;;;;;;;:::i;2635:102:3:-;;;;;;;;;;;;;:::i;4268:153::-;;;;;;;;;;-1:-1:-1;4268:153:3;;;;;:::i;:::-;;:::i;3777:500:1:-;;;;;;;;;;-1:-1:-1;3777:500:1;;;;;:::i;:::-;;:::i;5009:619::-;;;;;;:::i;:::-;;:::i;5878:278::-;;;;;;;;;;-1:-1:-1;5878:278:1;;;;;:::i;:::-;;:::i;6460:183::-;;;;;;;;;;-1:-1:-1;6460:183:1;;;;;:::i;:::-;;:::i;7344:665::-;;;;;;;;;;-1:-1:-1;7344:665:1;;;;;:::i;:::-;;:::i;6651:508::-;;;;;;;;;;-1:-1:-1;6651:508:1;;;;;:::i;:::-;;:::i;1847:92:0:-;;;;;;;;;;-1:-1:-1;956:5:0;1847:92;;4487:162:3;;;;;;;;;;-1:-1:-1;4487:162:3;;;;;:::i;:::-;;:::i;3645:124:1:-;;;;;;;;;;-1:-1:-1;3645:124:1;;;;;:::i;:::-;;:::i;4285:305::-;;;;;;;;;;-1:-1:-1;4285:305:1;;;;;:::i;:::-;;:::i;1918:198:2:-;;;;;;;;;;-1:-1:-1;1918:198:2;;;;;:::i;:::-;;:::i;4800:201:1:-;719:10:8;1248:7:2;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:2;;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;;;;;;;;;4917:6:1::1;4892:21;:31;;4884:47;;;;-1:-1:-1::0;;;4884:47:1::1;;;;;;;:::i;:::-;4964:29;4982:2;4986:6;4964:17;:29::i;:::-;4800:201:::0;;:::o;1555:300:3:-;1657:4;-1:-1:-1;;;;;;1692:40:3;;-1:-1:-1;;;1692:40:3;;:104;;-1:-1:-1;;;;;;;1748:48:3;;-1:-1:-1;;;1748:48:3;1692:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:11;;;1812:36:3;1673:175;1555:300;-1:-1:-1;;1555:300:3:o;2473:98::-;2527:13;2559:5;2552:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2473:98;:::o;3984:217::-;4060:7;4087:16;4095:7;4087;:16::i;:::-;4079:73;;;;-1:-1:-1;;;4079:73:3;;7988:2:13;4079:73:3;;;7970:21:13;8027:2;8007:18;;;8000:30;8066:34;8046:18;;;8039:62;-1:-1:-1;;;8117:18:13;;;8110:42;8169:19;;4079:73:3;7786:408:13;4079:73:3;-1:-1:-1;4170:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;4170:24:3;;3984:217::o;3522:401::-;3602:13;3618:23;3633:7;3618:14;:23::i;:::-;3602:39;;3665:5;-1:-1:-1;;;;;3659:11:3;:2;-1:-1:-1;;;;;3659:11:3;;;3651:57;;;;-1:-1:-1;;;3651:57:3;;8401:2:13;3651:57:3;;;8383:21:13;8440:2;8420:18;;;8413:30;8479:34;8459:18;;;8452:62;-1:-1:-1;;;8530:18:13;;;8523:31;8571:19;;3651:57:3;8199:397:13;3651:57:3;719:10:8;-1:-1:-1;;;;;3740:21:3;;;;:62;;-1:-1:-1;3765:37:3;3782:5;719:10:8;4487:162:3;:::i;3765:37::-;3719:165;;;;-1:-1:-1;;;3719:165:3;;8803:2:13;3719:165:3;;;8785:21:13;8842:2;8822:18;;;8815:30;8881:34;8861:18;;;8854:62;-1:-1:-1;;;8932:18:13;;;8925:54;8996:19;;3719:165:3;8601:420:13;3719:165:3;3895:21;3904:2;3908:7;3895:8;:21::i;:::-;3592:331;3522:401;;:::o;1734:105:0:-;1778:7;1830:1;1805:22;:12;918:14:9;;827:112;1805:22:0;:26;;;;:::i;:::-;1798:33;;1734:105;:::o;5636:234:1:-;5767:7;2389:16:0;2397:7;2389;:16::i;:::-;2381:32;;;;-1:-1:-1;;;2381:32:0;;;;;;;:::i;:::-;5787:37:1::1;5806:4;5812:2;5816:7;5787:18;:37::i;:::-;5835:27;5854:7;5835:18;:27::i;:::-;5636:234:::0;;;;:::o;4602:190::-;719:10:8;1248:7:2;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:2;;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;4684:1:1::1;4660:21;:25;4652:41;;;;-1:-1:-1::0;;;4652:41:1::1;;;;;;;:::i;:::-;4726:58;4752:7;:5;:7::i;:::-;4762:21;4726:17;:58::i;:::-;4602:190::o:0;5107:179:3:-;5240:39;5257:4;5263:2;5267:7;5240:39;;;;;;;;;;;;:16;:39::i;2176:235::-;2248:7;2283:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2283:16:3;2317:19;2309:73;;;;-1:-1:-1;;;2309:73:3;;9821:2:13;2309:73:3;;;9803:21:13;9860:2;9840:18;;;9833:30;9899:34;9879:18;;;9872:62;-1:-1:-1;;;9950:18:13;;;9943:39;9999:19;;2309:73:3;9619:405:13;1947:110:0;1995:7;2036:13;:11;:13::i;:::-;956:5;2022:11;1847:92;1914:205:3;1986:7;-1:-1:-1;;;;;2013:19:3;;2005:74;;;;-1:-1:-1;;;2005:74:3;;10231:2:13;2005:74:3;;;10213:21:13;10270:2;10250:18;;;10243:30;10309:34;10289:18;;;10282:62;-1:-1:-1;;;10360:18:13;;;10353:40;10410:19;;2005:74:3;10029:406:13;2005:74:3;-1:-1:-1;;;;;;2096:16:3;;;;;:9;:16;;;;;;;1914:205::o;1668:101:2:-;719:10:8;1248:7:2;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:2;;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;1732:30:::1;1759:1;1732:18;:30::i;1036:85::-:0;1108:6;;-1:-1:-1;;;;;1108:6:2;;1036:85::o;2635:102:3:-;2691:13;2723:7;2716:14;;;;;:::i;4268:153::-;4362:52;719:10:8;4395:8:3;4405;4362:18;:52::i;3777:500:1:-;719:10:8;1248:7:2;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:2;;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;3891:12:1::1;:19:::0;3876:12:::1;3946:9:::0;;:47:::1;;3962:12;3975:8;3982:1;3975:4:::0;:8:::1;:::i;:::-;3962:22;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;;3946:47;;;3958:1;3946:47;3921:72;;4024:14;4012:8;:26;;4004:42;;;::::0;-1:-1:-1;;;4004:42:1;;10774:2:13;4004:42:1::1;::::0;::::1;10756:21:13::0;10813:1;10793:18;;;10786:29;-1:-1:-1;;;10831:18:13;;;10824:33;10874:18;;4004:42:1::1;10572:326:13::0;4004:42:1::1;4101:14;4089:8;:26;4085:185;;;4169:6:::0;4132:12:::1;4145:8;4152:1;4145:4:::0;:8:::1;:::i;:::-;4132:22;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;:43;;;;;;;;;;;;:::i;:::-;;4085:185;;;4226:31;::::0;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;4208:12:::1;:50:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;4208:50:1;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;::::1;::::0;;;;;::::1;::::0;::::1;:::i;:::-;;;;3865:412;;3777:500:::0;;:::o;5009:619::-;5087:14;2210:6:0;2189:17;:15;:17::i;:::-;:27;;2181:43;;;;-1:-1:-1;;;2181:43:0;;;;;;;:::i;:::-;5145:25:1::1;5122:19;::::0;::::1;;:48;::::0;::::1;;;;;;:::i;:::-;;;5114:64;;;::::0;-1:-1:-1;;;5114:64:1;;11568:2:13;5114:64:1::1;::::0;::::1;11550:21:13::0;11607:1;11587:18;;;11580:29;-1:-1:-1;;;11625:18:13;;;11618:33;11668:18;;5114:64:1::1;11366:326:13::0;5114:64:1::1;5241:19;5218;::::0;::::1;;:42;::::0;::::1;;;;;;:::i;:::-;;;5210:58;;;;-1:-1:-1::0;;;5210:58:1::1;;;;;;;:::i;:::-;3211:2;5308:14;:49;;5300:65;;;::::0;-1:-1:-1;;;5300:65:1;;12230:2:13;5300:65:1::1;::::0;::::1;12212:21:13::0;12269:1;12249:18;;;12242:29;-1:-1:-1;;;12287:18:13;;;12280:33;12330:18;;5300:65:1::1;12028:326:13::0;5300:65:1::1;5477:9;5435:37;3268:11;5435:14:::0;:37:::1;:::i;:::-;5434:52;;5426:68;;;::::0;-1:-1:-1;;;5426:68:1;;12734:2:13;5426:68:1::1;::::0;::::1;12716:21:13::0;12773:1;12753:18;;;12746:29;-1:-1:-1;;;12791:18:13;;;12784:33;12834:18;;5426:68:1::1;12532:326:13::0;5426:68:1::1;5536:6;5531:90;5552:14;5548:1;:18;5531:90;;;5588:21;719:10:8::0;5588:7:1::1;:21::i;5596:12::-;5588:7;:21::i;:::-;5568:3:::0;::::1;::::0;::::1;:::i;:::-;;;;5531:90;;5878:278:::0;6042:7;2389:16:0;2397:7;2389;:16::i;:::-;2381:32;;;;-1:-1:-1;;;2381:32:0;;;;;;;:::i;:::-;6062:48:1::1;6085:4;6091:2;6095:7;6104:5;6062:22;:48::i;:::-;6121:27;6140:7;6121:18;:27::i;:::-;5878:278:::0;;;;;:::o;6460:183::-;6555:7;6536:8;2389:16:0;2397:7;2389;:16::i;:::-;2381:32;;;;-1:-1:-1;;;2381:32:0;;;;;;;:::i;:::-;6600:28:1::1;::::0;;;:18:::1;:28;::::0;;;;;6632:3:::1;::::0;6583:45:::1;::::0;6432:12;6583:45:::1;:::i;:::-;6582:53;;;;:::i;:::-;6575:60;;2443:1:0;6460:183:1::0;;;;:::o;7344:665::-;7436:13;7417:8;2389:16:0;2397:7;2389;:16::i;:::-;2381:32;;;;-1:-1:-1;;;2381:32:0;;;;;;;:::i;:::-;7467:6:1::1;7462:493;7483:12;:19:::0;7479:23;::::1;7462:493;;;7540:12;7553:1;7540:15;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;7528:8;:36;7524:420;;7665:12;7678:1;7665:15;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;7719:26;7736:8;7719:16;:26::i;:::-;7802:50;7827:23;7841:8;7827:13;:23::i;:::-;7819:32;;;;;;;;:::i;:::-;7802:16;:50::i;:::-;7622:287;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7586:342;;;;;7524:420;7504:3:::0;::::1;::::0;::::1;:::i;:::-;;;;7462:493;;;;7982:19;:17;:19::i;6651:508::-:0;6743:7;6724:8;2389:16:0;2397:7;2389;:16::i;:::-;2381:32;;;;-1:-1:-1;;;2381:32:0;;;;;;;:::i;:::-;6763:18:1::1;6784:16:::0;;;:6:::1;:16;::::0;;;;918:14:9;;6763:18:1;6850:254:::1;6872:1;6867;:6;6850:254;;6911:10:::0;6944:1:::1;6940:5:::0;::::1;6936:73;;;6974:19;6978:2;6982:10;6974:3;:19::i;:::-;6966:27;;6936:73;7053:5:::0;7044:4:::1;7047:1:::0;7044::::1;:4;:::i;:::-;7034:15;::::0;:6:::1;:15;:::i;:::-;7033:25;;;;:::i;:::-;7023:35;::::0;;::::1;:::i;:::-;::::0;-1:-1:-1;7073:19:1::1;7087:5:::0;7073:19;::::1;:::i;:::-;;;6880:224;6875:3;;;;;:::i;:::-;;;;6850:254;;;-1:-1:-1::0;7121:30:1::1;7125:16;7135:6:::0;7125:7:::1;:16;:::i;:::-;7143:7;7121:3;:30::i;:::-;7114:37:::0;6651:508;-1:-1:-1;;;;;6651:508:1:o;4487:162:3:-;-1:-1:-1;;;;;4607:25:3;;;4584:4;4607:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4487:162::o;3645:124:1:-;719:10:8;1248:7:2;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:2;;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;3727:19:1::1;:34:::0;;3749:12;;3727:19;-1:-1:-1;;3727:34:1::1;::::0;3749:12;3727:34:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;3645:124:::0;:::o;4285:305::-;719:10:8;1248:7:2;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:2;;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;4380:14:1::1;2210:6:0;2189:17;:15;:17::i;:::-;:27;;2181:43;;;;-1:-1:-1::0;;;2181:43:0::1;;;;;;;:::i;:::-;4438:19:1::2;4415;::::0;::::2;;:42;::::0;::::2;;;;;;:::i;:::-;;;4407:58;;;;-1:-1:-1::0;;;4407:58:1::2;;;;;;;:::i;:::-;4503:6;4498:85;4519:14;4515:1;:18;4498:85;;;4555:16;4563:7;:5;:7::i;4555:16::-;4535:3:::0;::::2;::::0;::::2;:::i;:::-;;;;4498:85;;1918:198:2::0;719:10:8;1248:7:2;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:2;;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;2006:22:2;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:2;;17035:2:13;1998:73:2::1;::::0;::::1;17017:21:13::0;17074:2;17054:18;;;17047:30;17113:34;17093:18;;;17086:62;-1:-1:-1;;;17164:18:13;;;17157:36;17210:19;;1998:73:2::1;16833:402:13::0;1998:73:2::1;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;945:123:9:-;1032:19;;1050:1;1032:19;;;945:123::o;2065:312:7:-;2179:6;2154:21;:31;;2146:73;;;;-1:-1:-1;;;2146:73:7;;17442:2:13;2146:73:7;;;17424:21:13;17481:2;17461:18;;;17454:30;17520:31;17500:18;;;17493:59;17569:18;;2146:73:7;17240:353:13;2146:73:7;2231:12;2249:9;-1:-1:-1;;;;;2249:14:7;2271:6;2249:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2230:52;;;2300:7;2292:78;;;;-1:-1:-1;;;2292:78:7;;18010:2:13;2292:78:7;;;17992:21:13;18049:2;18029:18;;;18022:30;18088:34;18068:18;;;18061:62;-1:-1:-1;;;18139:18:13;;;18132:56;18205:19;;2292:78:7;17808:422:13;7144:125:3;7209:4;7232:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7232:16:3;:30;;;7144:125::o;10995:171::-;11069:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11069:29:3;-1:-1:-1;;;;;11069:29:3;;;;;;;;:24;;11122:23;11069:24;11122:14;:23::i;:::-;-1:-1:-1;;;;;11113:46:3;;;;;;;;;;;10995:171;;:::o;4711:330::-;4900:41;719:10:8;4933:7:3;4900:18;:41::i;:::-;4892:103;;;;-1:-1:-1;;;4892:103:3;;;;;;;:::i;:::-;5006:28;5016:4;5022:2;5026:7;5006:9;:28::i;8298:157:1:-;8363:16;;;;:6;:16;;;;;;;;1032:19:9;;1050:1;1032:19;;;8402:18:1;:28;;;;;6432:12;8402:45;;8298:157::o;2270:187:2:-;2362:6;;;-1:-1:-1;;;;;2378:17:2;;;-1:-1:-1;;;;;;2378:17:2;;;;;;;2410:40;;2362:6;;;2378:17;2362:6;;2410:40;;2343:16;;2410:40;2333:124;2270:187;:::o;11301:307:3:-;11451:8;-1:-1:-1;;;;;11442:17:3;:5;-1:-1:-1;;;;;11442:17:3;;;11434:55;;;;-1:-1:-1;;;11434:55:3;;18855:2:13;11434:55:3;;;18837:21:13;18894:2;18874:18;;;18867:30;-1:-1:-1;;;18913:18:13;;;18906:55;18978:18;;11434:55:3;18653:349:13;11434:55:3;-1:-1:-1;;;;;11499:25:3;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11499:46:3;;;;;;;;;;11560:41;;1020::13;;;11560::3;;993:18:13;11560:41:3;;;;;;;11301:307;;;:::o;8463:216:1:-;8522:18;8536:3;8522:13;:18::i;:::-;8551:15;8569:13;:11;:13::i;:::-;8551:31;-1:-1:-1;6432:12:1;8593:27;;;;:18;:27;;;;;;;;;:44;;;;8653:18;2712:25:13;;;8653:18:1;;2685::13;8653::1;;;;;;;8511:168;8463:216;:::o;5352:320:3:-;5521:41;719:10:8;5554:7:3;5521:18;:41::i;:::-;5513:103;;;;-1:-1:-1;;;5513:103:3;;;;;;;:::i;:::-;5626:39;5640:4;5646:2;5650:7;5659:5;5626:13;:39::i;328:703:10:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:10;;;;;;;;;;;;-1:-1:-1;;;627:10:10;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:10;;-1:-1:-1;773:2:10;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;-1:-1:-1;;;;;817:17:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:10;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:10;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:10;;;;;;;;-1:-1:-1;972:11:10;981:2;972:11;;:::i;:::-;;;844:150;;;1017:6;328:703;-1:-1:-1;;;;328:703:10:o;8017:273:1:-;8080:10;8103:16;8122:30;8143:8;8122:20;:30::i;:::-;:40;;8155:7;8122:40;:::i;:::-;8103:59;;8173:19;8195:27;8213:8;8195:17;:27::i;:::-;8173:49;-1:-1:-1;8251:30:1;8255:22;8173:49;8255:8;:22;:::i;:::-;8279:1;8251:3;:30::i;:::-;8240:42;;;;;;;;:::i;7167:169::-;7227:13;7253:75;;;;;;;;;;;;;;;;;;;7167:169;:::o;6164:105::-;6221:7;6252:1;6248;:5;:13;;6260:1;6248:13;;;6256:1;6248:13;6241:20;6164:105;-1:-1:-1;;;6164:105:1:o;7427:344:3:-;7520:4;7544:16;7552:7;7544;:16::i;:::-;7536:73;;;;-1:-1:-1;;;7536:73:3;;19326:2:13;7536:73:3;;;19308:21:13;19365:2;19345:18;;;19338:30;19404:34;19384:18;;;19377:62;-1:-1:-1;;;19455:18:13;;;19448:42;19507:19;;7536:73:3;19124:408:13;7536:73:3;7619:13;7635:23;7650:7;7635:14;:23::i;:::-;7619:39;;7687:5;-1:-1:-1;;;;;7676:16:3;:7;-1:-1:-1;;;;;7676:16:3;;:51;;;;7720:7;-1:-1:-1;;;;;7696:31:3;:20;7708:7;7696:11;:20::i;:::-;-1:-1:-1;;;;;7696:31:3;;7676:51;:87;;;;7731:32;7748:5;7755:7;7731:16;:32::i;10324:560::-;10478:4;-1:-1:-1;;;;;10451:31:3;:23;10466:7;10451:14;:23::i;:::-;-1:-1:-1;;;;;10451:31:3;;10443:85;;;;-1:-1:-1;;;10443:85:3;;19739:2:13;10443:85:3;;;19721:21:13;19778:2;19758:18;;;19751:30;19817:34;19797:18;;;19790:62;-1:-1:-1;;;19868:18:13;;;19861:39;19917:19;;10443:85:3;19537:405:13;10443:85:3;-1:-1:-1;;;;;10546:16:3;;10538:65;;;;-1:-1:-1;;;10538:65:3;;20149:2:13;10538:65:3;;;20131:21:13;20188:2;20168:18;;;20161:30;20227:34;20207:18;;;20200:62;-1:-1:-1;;;20278:18:13;;;20271:34;20322:19;;10538:65:3;19947:400:13;10538:65:3;10715:29;10732:1;10736:7;10715:8;:29::i;:::-;-1:-1:-1;;;;;10755:15:3;;;;;;:9;:15;;;;;:20;;10774:1;;10755:15;:20;;10774:1;;10755:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10785:13:3;;;;;;:9;:13;;;;;:18;;10802:1;;10785:13;:18;;10802:1;;10785:18;:::i;:::-;;;;-1:-1:-1;;10813:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10813:21:3;-1:-1:-1;;;;;10813:21:3;;;;;;;;;10850:27;;10813:16;;10850:27;;;;-1:-1:-1;;;;;;;;;;;10850:27:3;;10324:560;;;:::o;1372:189:0:-;1430:22;1455;:12;918:14:9;;827:112;1455:22:0;1430:47;;1488:24;:12;1032:19:9;;1050:1;1032:19;;;945:123;1488:24:0;1523:30;1533:3;1538:14;1523:9;:30::i;6534:307:3:-;6685:28;6695:4;6701:2;6705:7;6685:9;:28::i;:::-;6731:48;6754:4;6760:2;6764:7;6773:5;6731:22;:48::i;:::-;6723:111;;;;-1:-1:-1;;;6723:111:3;;;;;;;:::i;8101:108::-;8176:26;8186:2;8190:7;8176:26;;;;;;;;;;;;:9;:26::i;12161:778::-;12311:4;-1:-1:-1;;;;;12331:13:3;;1087:20:7;1133:8;12327:606:3;;12366:72;;-1:-1:-1;;;12366:72:3;;-1:-1:-1;;;;;12366:36:3;;;;;:72;;719:10:8;;12417:4:3;;12423:7;;12432:5;;12366:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12366:72:3;;;;;;;;-1:-1:-1;;12366:72:3;;;;;;;;;;;;:::i;:::-;;;12362:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12605:13:3;;12601:266;;12647:60;;-1:-1:-1;;;12647:60:3;;;;;;;:::i;12601:266::-;12819:6;12813:13;12804:6;12800:2;12796:15;12789:38;12362:519;-1:-1:-1;;;;;;12488:51:3;-1:-1:-1;;;12488:51:3;;-1:-1:-1;12481:58:3;;12327:606;-1:-1:-1;12918:4:3;12161:778;;;;;;:::o;8430:311::-;8555:18;8561:2;8565:7;8555:5;:18::i;:::-;8604:54;8635:1;8639:2;8643:7;8652:5;8604:22;:54::i;:::-;8583:151;;;;-1:-1:-1;;;8583:151:3;;;;;;;:::i;9063:372::-;-1:-1:-1;;;;;9142:16:3;;9134:61;;;;-1:-1:-1;;;9134:61:3;;21732:2:13;9134:61:3;;;21714:21:13;;;21751:18;;;21744:30;21810:34;21790:18;;;21783:62;21862:18;;9134:61:3;21530:356:13;9134:61:3;9214:16;9222:7;9214;:16::i;:::-;9213:17;9205:58;;;;-1:-1:-1;;;9205:58:3;;22093:2:13;9205:58:3;;;22075:21:13;22132:2;22112:18;;;22105:30;-1:-1:-1;;;22151:18:13;;;22144:58;22219:18;;9205:58:3;21891:352:13;9205:58:3;-1:-1:-1;;;;;9330:13:3;;;;;;:9;:13;;;;;:18;;9347:1;;9330:13;:18;;9347:1;;9330:18;:::i;:::-;;;;-1:-1:-1;;9358:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9358:21:3;-1:-1:-1;;;;;9358:21:3;;;;;;;;9395:33;;9358:16;;;-1:-1:-1;;;;;;;;;;;9395:33:3;9358:16;;9395:33;9063:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:139:13;-1:-1:-1;;;;;97:31:13;;87:42;;77:70;;143:1;140;133:12;158:331;234:6;242;295:2;283:9;274:7;270:23;266:32;263:52;;;311:1;308;301:12;263:52;347:9;334:23;324:33;;407:2;396:9;392:18;379:32;420:39;453:5;420:39;:::i;:::-;478:5;468:15;;;158:331;;;;;:::o;494:131::-;-1:-1:-1;;;;;;568:32:13;;558:43;;548:71;;615:1;612;605:12;630:245;688:6;741:2;729:9;720:7;716:23;712:32;709:52;;;757:1;754;747:12;709:52;796:9;783:23;815:30;839:5;815:30;:::i;1072:258::-;1144:1;1154:113;1168:6;1165:1;1162:13;1154:113;;;1244:11;;;1238:18;1225:11;;;1218:39;1190:2;1183:10;1154:113;;;1285:6;1282:1;1279:13;1276:48;;;-1:-1:-1;;1320:1:13;1302:16;;1295:27;1072:258::o;1335:269::-;1388:3;1426:5;1420:12;1453:6;1448:3;1441:19;1469:63;1525:6;1518:4;1513:3;1509:14;1502:4;1495:5;1491:16;1469:63;:::i;:::-;1586:2;1565:15;-1:-1:-1;;1561:29:13;1552:39;;;;1593:4;1548:50;;1335:269;-1:-1:-1;;1335:269:13:o;1609:231::-;1758:2;1747:9;1740:21;1721:4;1778:56;1830:2;1819:9;1815:18;1807:6;1778:56;:::i;1845:180::-;1904:6;1957:2;1945:9;1936:7;1932:23;1928:32;1925:52;;;1973:1;1970;1963:12;1925:52;-1:-1:-1;1996:23:13;;1845:180;-1:-1:-1;1845:180:13:o;2238:323::-;2306:6;2314;2367:2;2355:9;2346:7;2342:23;2338:32;2335:52;;;2383:1;2380;2373:12;2335:52;2422:9;2409:23;2441:39;2474:5;2441:39;:::i;:::-;2499:5;2551:2;2536:18;;;;2523:32;;-1:-1:-1;;;2238:323:13:o;2748:472::-;2825:6;2833;2841;2894:2;2882:9;2873:7;2869:23;2865:32;2862:52;;;2910:1;2907;2900:12;2862:52;2949:9;2936:23;2968:39;3001:5;2968:39;:::i;:::-;3026:5;-1:-1:-1;3083:2:13;3068:18;;3055:32;3096:41;3055:32;3096:41;:::i;:::-;2748:472;;3156:7;;-1:-1:-1;;;3210:2:13;3195:18;;;;3182:32;;2748:472::o;3225:255::-;3284:6;3337:2;3325:9;3316:7;3312:23;3308:32;3305:52;;;3353:1;3350;3343:12;3305:52;3392:9;3379:23;3411:39;3444:5;3411:39;:::i;3485:424::-;3550:6;3558;3611:2;3599:9;3590:7;3586:23;3582:32;3579:52;;;3627:1;3624;3617:12;3579:52;3666:9;3653:23;3685:39;3718:5;3685:39;:::i;:::-;3743:5;-1:-1:-1;3800:2:13;3785:18;;3772:32;3842:15;;3835:23;3823:36;;3813:64;;3873:1;3870;3863:12;3914:127;3975:10;3970:3;3966:20;3963:1;3956:31;4006:4;4003:1;3996:15;4030:4;4027:1;4020:15;4046:632;4111:5;-1:-1:-1;;;;;4171:14:13;;;4168:40;;;4188:18;;:::i;:::-;4263:2;4257:9;4231:2;4317:15;;-1:-1:-1;;4313:24:13;;;4339:2;4309:33;4305:42;4293:55;;;4363:18;;;4383:22;;;4360:46;4357:72;;;4409:18;;:::i;:::-;4449:10;4445:2;4438:22;4478:6;4469:15;;4508:6;4500;4493:22;4548:3;4539:6;4534:3;4530:16;4527:25;4524:45;;;4565:1;4562;4555:12;4524:45;4615:6;4610:3;4603:4;4595:6;4591:17;4578:44;4670:1;4663:4;4654:6;4646;4642:19;4638:30;4631:41;;;;4046:632;;;;;:::o;4683:519::-;4761:6;4769;4822:2;4810:9;4801:7;4797:23;4793:32;4790:52;;;4838:1;4835;4828:12;4790:52;4861:23;;;-1:-1:-1;4935:2:13;4920:18;;4907:32;-1:-1:-1;;;;;4951:30:13;;4948:50;;;4994:1;4991;4984:12;4948:50;5017:22;;5070:4;5062:13;;5058:27;-1:-1:-1;5048:55:13;;5099:1;5096;5089:12;5048:55;5122:74;5188:7;5183:2;5170:16;5165:2;5161;5157:11;5122:74;:::i;:::-;5112:84;;;4683:519;;;;;:::o;5207:811::-;5302:6;5310;5318;5326;5379:3;5367:9;5358:7;5354:23;5350:33;5347:53;;;5396:1;5393;5386:12;5347:53;5435:9;5422:23;5454:39;5487:5;5454:39;:::i;:::-;5512:5;-1:-1:-1;5569:2:13;5554:18;;5541:32;5582:41;5541:32;5582:41;:::i;:::-;5642:7;-1:-1:-1;5696:2:13;5681:18;;5668:32;;-1:-1:-1;5751:2:13;5736:18;;5723:32;-1:-1:-1;;;;;5767:30:13;;5764:50;;;5810:1;5807;5800:12;5764:50;5833:22;;5886:4;5878:13;;5874:27;-1:-1:-1;5864:55:13;;5915:1;5912;5905:12;5864:55;5938:74;6004:7;5999:2;5986:16;5981:2;5977;5973:11;5938:74;:::i;:::-;5928:84;;;5207:811;;;;;;;:::o;6023:404::-;6091:6;6099;6152:2;6140:9;6131:7;6127:23;6123:32;6120:52;;;6168:1;6165;6158:12;6120:52;6207:9;6194:23;6226:39;6259:5;6226:39;:::i;:::-;6284:5;-1:-1:-1;6341:2:13;6326:18;;6313:32;6354:41;6313:32;6354:41;:::i;6432:272::-;6507:6;6560:2;6548:9;6539:7;6535:23;6531:32;6528:52;;;6576:1;6573;6566:12;6528:52;6615:9;6602:23;6654:1;6647:5;6644:12;6634:40;;6670:1;6667;6660:12;6709:356;6911:2;6893:21;;;6930:18;;;6923:30;6989:34;6984:2;6969:18;;6962:62;7056:2;7041:18;;6709:356::o;7070:326::-;7272:2;7254:21;;;7311:1;7291:18;;;7284:29;-1:-1:-1;;;7344:2:13;7329:18;;7322:33;7387:2;7372:18;;7070:326::o;7401:380::-;7480:1;7476:12;;;;7523;;;7544:61;;7598:4;7590:6;7586:17;7576:27;;7544:61;7651:2;7643:6;7640:14;7620:18;7617:38;7614:161;;;7697:10;7692:3;7688:20;7685:1;7678:31;7732:4;7729:1;7722:15;7760:4;7757:1;7750:15;9026:127;9087:10;9082:3;9078:20;9075:1;9068:31;9118:4;9115:1;9108:15;9142:4;9139:1;9132:15;9158:125;9198:4;9226:1;9223;9220:8;9217:34;;;9231:18;;:::i;:::-;-1:-1:-1;9268:9:13;;9158:125::o;9288:326::-;9490:2;9472:21;;;9529:1;9509:18;;;9502:29;-1:-1:-1;;;9562:2:13;9547:18;;9540:33;9605:2;9590:18;;9288:326::o;10440:127::-;10501:10;10496:3;10492:20;10489:1;10482:31;10532:4;10529:1;10522:15;10556:4;10553:1;10546:15;10903:326;11105:2;11087:21;;;11144:1;11124:18;;;11117:29;-1:-1:-1;;;11177:2:13;11162:18;;11155:33;11220:2;11205:18;;10903:326::o;11234:127::-;11295:10;11290:3;11286:20;11283:1;11276:31;11326:4;11323:1;11316:15;11350:4;11347:1;11340:15;11697:326;11899:2;11881:21;;;11938:1;11918:18;;;11911:29;-1:-1:-1;;;11971:2:13;11956:18;;11949:33;12014:2;11999:18;;11697:326::o;12359:168::-;12399:7;12465:1;12461;12457:6;12453:14;12450:1;12447:21;12442:1;12435:9;12428:17;12424:45;12421:71;;;12472:18;;:::i;:::-;-1:-1:-1;12512:9:13;;12359:168::o;12863:135::-;12902:3;-1:-1:-1;;12923:17:13;;12920:43;;;12943:18;;:::i;:::-;-1:-1:-1;12990:1:13;12979:13;;12863:135::o;13003:127::-;13064:10;13059:3;13055:20;13052:1;13045:31;13095:4;13092:1;13085:15;13119:4;13116:1;13109:15;13135:120;13175:1;13201;13191:35;;13206:18;;:::i;:::-;-1:-1:-1;13240:9:13;;13135:120::o;13386:185::-;13428:3;13466:5;13460:12;13481:52;13526:6;13521:3;13514:4;13507:5;13503:16;13481:52;:::i;:::-;13549:16;;;;;13386:185;-1:-1:-1;;13386:185:13:o;13813:1508::-;14239:3;14268:1;14301:6;14295:13;14331:3;14353:1;14381:9;14377:2;14373:18;14363:28;;14441:2;14430:9;14426:18;14463;14453:61;;14507:4;14499:6;14495:17;14485:27;;14453:61;14533:2;14581;14573:6;14570:14;14550:18;14547:38;14544:165;;;-1:-1:-1;;;14608:33:13;;14664:4;14661:1;14654:15;14694:4;14615:3;14682:17;14544:165;14725:18;14752:104;;;;14870:1;14865:320;;;;14718:467;;14752:104;-1:-1:-1;;14785:24:13;;14773:37;;14830:16;;;;-1:-1:-1;14752:104:13;;14865:320;13333:1;13326:14;;;13370:4;13357:18;;14960:1;14974:165;14988:6;14985:1;14982:13;14974:165;;;15066:14;;15053:11;;;15046:35;15109:16;;;;15003:10;;14974:165;;;14978:3;;15168:6;15163:3;15159:16;15152:23;;14718:467;;;;;;;15201:114;15226:88;15252:61;15282:30;15308:3;15300:6;15282:30;:::i;:::-;-1:-1:-1;;;13641:16:13;;13682:1;13673:11;;13576:114;15252:61;15244:6;15226:88;:::i;:::-;-1:-1:-1;;;13755:20:13;;13800:1;13791:11;;13695:113;15201:114;15194:121;13813:1508;-1:-1:-1;;;;;;13813:1508:13:o;15326:422::-;15415:1;15458:5;15415:1;15472:270;15493:7;15483:8;15480:21;15472:270;;;15552:4;15548:1;15544:6;15540:17;15534:4;15531:27;15528:53;;;15561:18;;:::i;:::-;15611:7;15601:8;15597:22;15594:55;;;15631:16;;;;15594:55;15710:22;;;;15670:15;;;;15472:270;;;15476:3;15326:422;;;;;:::o;15753:806::-;15802:5;15832:8;15822:80;;-1:-1:-1;15873:1:13;15887:5;;15822:80;15921:4;15911:76;;-1:-1:-1;15958:1:13;15972:5;;15911:76;16003:4;16021:1;16016:59;;;;16089:1;16084:130;;;;15996:218;;16016:59;16046:1;16037:10;;16060:5;;;16084:130;16121:3;16111:8;16108:17;16105:43;;;16128:18;;:::i;:::-;-1:-1:-1;;16184:1:13;16170:16;;16199:5;;15996:218;;16298:2;16288:8;16285:16;16279:3;16273:4;16270:13;16266:36;16260:2;16250:8;16247:16;16242:2;16236:4;16233:12;16229:35;16226:77;16223:159;;;-1:-1:-1;16335:19:13;;;16367:5;;16223:159;16414:34;16439:8;16433:4;16414:34;:::i;:::-;16484:6;16480:1;16476:6;16472:19;16463:7;16460:32;16457:58;;;16495:18;;:::i;:::-;16533:20;;15753:806;-1:-1:-1;;;15753:806:13:o;16564:131::-;16624:5;16653:36;16680:8;16674:4;16653:36;:::i;16700:128::-;16740:3;16771:1;16767:6;16764:1;16761:13;16758:39;;;16777:18;;:::i;:::-;-1:-1:-1;16813:9:13;;16700:128::o;18235:413::-;18437:2;18419:21;;;18476:2;18456:18;;;18449:30;18515:34;18510:2;18495:18;;18488:62;-1:-1:-1;;;18581:2:13;18566:18;;18559:47;18638:3;18623:19;;18235:413::o;19007:112::-;19039:1;19065;19055:35;;19070:18;;:::i;:::-;-1:-1:-1;19104:9:13;;19007:112::o;20352:414::-;20554:2;20536:21;;;20593:2;20573:18;;;20566:30;20632:34;20627:2;20612:18;;20605:62;-1:-1:-1;;;20698:2:13;20683:18;;20676:48;20756:3;20741:19;;20352:414::o;20771:500::-;-1:-1:-1;;;;;21040:15:13;;;21022:34;;21092:15;;21087:2;21072:18;;21065:43;21139:2;21124:18;;21117:34;;;21187:3;21182:2;21167:18;;21160:31;;;20965:4;;21208:57;;21245:19;;21237:6;21208:57;:::i;21276:249::-;21345:6;21398:2;21386:9;21377:7;21373:23;21369:32;21366:52;;;21414:1;21411;21404:12;21366:52;21446:9;21440:16;21465:30;21489:5;21465:30;:::i

Swarm Source

ipfs://1d432f165b32cf5c64433b0608e29f4692c6a8f669c01ebc34b197340e23b1ce
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.