ETH Price: $2,973.80 (-0.68%)
Gas: 6 Gwei

Token

PAYC Degen Hours (PAYC Degen Hours)
 

Overview

Max Total Supply

1,371 PAYC Degen Hours

Holders

151

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 PAYC Degen Hours
0xcce70dcb47cd76ebdefbe179810602b3cd288ee1
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:
PAYCDegenHours

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-11
*/

// SPDX-License-Identifier: MIT
// Pepe Ape Yacht Club Portal Contract

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);
    }

}

// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: ERC2000000.sol



pragma solidity ^0.8.7;










library Address {
    function isContract(address account) internal view returns (bool) {
        uint size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;
    
    string private _name;
    string private _symbol;

    // Mapping from token ID to owner address
    address[] internal _owners;

    mapping(uint256 => address) private _tokenApprovals;
    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 (uint) 
    {
        require(owner != address(0), "ERC721: balance query for the zero address");

        uint count;
        uint length= _owners.length;
        for( uint i; i < length; ++i ){
          if( owner == _owners[i] )
            ++count;
        }
        delete length;
        return count;
    }

    /**
     * @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 {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        revert("Transfer not allowed");
      
    }
     
       function pepetransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) internal {
        //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 {
     delete from;
     delete to;
      delete tokenId;
      delete _data;

        revert("Transfer not allowed");
        
      
    }

    /**
     * @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 {
       
        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 tokenId < _owners.length && _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");

      
        _owners.push(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);
        _owners[tokenId] = address(0);

        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);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

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

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


pragma solidity ^0.8.7;


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account but rips out the core of the gas-wasting processing that comes from OpenZeppelin.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

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

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

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

        uint count;
        for(uint i; i < _owners.length; i++){
            if(owner == _owners[i]){
                if(count == index) return i;
                else count++;
            }
        }

        revert("ERC721Enumerable: owner index out of bounds");
    }
}
    pragma solidity ^0.8.7;

    interface IMain {
   
function transferFrom( address from,   address to, uint256 tokenId) external;
function ownerOf( uint _tokenid) external view returns (address);
}

    contract PAYCDegenHours  is ERC721Enumerable,  Ownable {
    using Strings for uint256;


  string private uriPrefix = "ipfs://Qmae138hdMAu2DKmwxmkkVnw66oHQC9W6Cc7dAUer8C5yE/";
  string private uriSuffix = ".json";

  uint16 public constant maxSupply = 7777;
  

  
  mapping (uint => uint) public mappingOldtoNewTokens;
  mapping (uint => uint) public mappingNewtoOldTokens;
 

  address public mainAddress = 0x2D0D57D004F82e9f4471CaA8b9f8B1965a814154; 
  IMain Main = IMain(mainAddress);

  constructor() ERC721("PAYC Degen Hours", "PAYC Degen Hours") {
    
  }
  
	function setMainAddress(address contractAddr) external onlyOwner {
		mainAddress = contractAddr;
        Main= IMain(mainAddress);
	}  
 

  function mint( uint tokenNumber) external  {

 
   uint16 totalSupply = uint16(_owners.length);
    require(totalSupply + 1 <= maxSupply, "Exceeds max supply.");
     Main.transferFrom( msg.sender, address(this),tokenNumber);
    _mint(msg.sender, totalSupply);
  
    mappingNewtoOldTokens[totalSupply] = tokenNumber;
    mappingOldtoNewTokens[tokenNumber] = totalSupply; 
 
  }

  function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override  {
        uint token =mappingNewtoOldTokens[tokenId];
        address _address = Main.ownerOf(token);
        require (from == address(this) || to ==  address(this) , "Transfer not Allowed");
        require (from == _address || to ==  _address , "Transfer not Allowed ");
        delete token;
    }

  function ExchangeOldForNew( uint tokenNumber ) external  {

 
 
  uint _token = mappingOldtoNewTokens[tokenNumber] ;

  pepetransferFrom( address(this), msg.sender,_token);
  Main.transferFrom(msg.sender, address(this),tokenNumber);
  
  }

   function ExchangeNewForOld( uint tokenNumber) external  {

 

  uint _token = mappingNewtoOldTokens[tokenNumber] ;

  Main.transferFrom( address(this), msg.sender,_token);
  pepetransferFrom( msg.sender, address(this),tokenNumber);
 

    
  }
  

  function checkIfNFTExist(uint256 _tokenId)
    public
    view
   returns (bool)
   {
    bool exist =   _exists(_tokenId);
    return exist;
   }


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

    _tokenId = mappingNewtoOldTokens[_tokenId];

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


  function setUriPrefix(string memory _uriPrefix) external onlyOwner {
    uriPrefix = _uriPrefix;
  }


 
 

  
   function _mint(address to, uint256 tokenId) internal virtual override {
        _owners.push(to);
        emit Transfer(address(0), to, tokenId);
    }

  function _baseURI() internal view  returns (string memory) {
    return uriPrefix;
  }
}

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":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":"uint256","name":"tokenNumber","type":"uint256"}],"name":"ExchangeNewForOld","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenNumber","type":"uint256"}],"name":"ExchangeOldForNew","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"checkIfNFTExist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"mainAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mappingNewtoOldTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mappingOldtoNewTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenNumber","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"address","name":"contractAddr","type":"address"}],"name":"setMainAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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"}]

60e0604052603660808181529062001d8560a0398051620000299160069160209091019062000177565b5060408051808201909152600580825264173539b7b760d91b6020909201918252620000589160079162000177565b50600a8054732d0d57d004f82e9f4471caa8b9f8b1965a8141546001600160a01b03199182168117909255600b805490911690911790553480156200009c57600080fd5b5060408051808201825260108082526f5041594320446567656e20486f75727360801b602080840182815285518087019096529285528401528151919291620000e89160009162000177565b508051620000fe90600190602084019062000177565b5050506200011b620001156200012160201b60201c565b62000125565b6200025a565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000185906200021d565b90600052602060002090601f016020900481019282620001a95760008555620001f4565b82601f10620001c457805160ff1916838001178555620001f4565b82800160010185558215620001f4579182015b82811115620001f4578251825591602001919060010190620001d7565b506200020292915062000206565b5090565b5b8082111562000202576000815560010162000207565b600181811c908216806200023257607f821691505b602082108114156200025457634e487b7160e01b600052602260045260246000fd5b50919050565b611b1b806200026a6000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80637ec4a65911610104578063c87b56dd116100a2578063d600ddef11610071578063d600ddef146103ea578063db9771f5146103fd578063e985e9c514610410578063f2fde38b1461044c57600080fd5b8063c87b56dd14610388578063cf9bed2f1461039b578063d44624b2146103bb578063d5abeb01146103ce57600080fd5b8063a0712d68116100de578063a0712d681461033c578063a22cb4651461034f578063b88d4fde14610362578063baf9e3dc1461037557600080fd5b80637ec4a659146103105780638da5cb5b1461032357806395d89b411461033457600080fd5b80632f745c59116101715780636352211e1161014b5780636352211e146102c257806370a08231146102d5578063715018a6146102e857806376c63873146102f057600080fd5b80632f745c591461028957806342842e0e1461029c5780634f6ccce7146102af57600080fd5b8063095ea7b3116101ad578063095ea7b31461023c5780630cdd42341461025157806318160ddd1461026457806323b872dd1461027657600080fd5b806301ffc9a7146101d457806306fdde03146101fc578063081812fc14610211575b600080fd5b6101e76101e2366004611772565b61045f565b60405190151581526020015b60405180910390f35b61020461048a565b6040516101f391906118c2565b61022461021f3660046117e5565b61051c565b6040516001600160a01b0390911681526020016101f3565b61024f61024a366004611746565b6105a9565b005b600a54610224906001600160a01b031681565b6002545b6040519081526020016101f3565b61024f610284366004611652565b6106bf565b610268610297366004611746565b610708565b61024f6102aa366004611652565b6107bb565b6102686102bd3660046117e5565b6107d6565b6102246102d03660046117e5565b610843565b6102686102e33660046115df565b6108cf565b61024f6109a1565b6102686102fe3660046117e5565b60086020526000908152604090205481565b61024f61031e36600461179c565b6109d7565b6005546001600160a01b0316610224565b610204610a18565b61024f61034a3660046117e5565b610a27565b61024f61035d366004611713565b610b1e565b61024f610370366004611693565b610be3565b61024f6103833660046117e5565b610c30565b6102046103963660046117e5565b610cb5565b6102686103a93660046117e5565b60096020526000908152604090205481565b61024f6103c93660046117e5565b610d91565b6103d7611e6181565b60405161ffff90911681526020016101f3565b6101e76103f83660046117e5565b610e19565b61024f61040b3660046115df565b610e25565b6101e761041e366004611619565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b61024f61045a3660046115df565b610e7b565b60006001600160e01b0319821663780e9d6360e01b1480610484575061048482610f16565b92915050565b60606000805461049990611a0e565b80601f01602080910402602001604051908101604052809291908181526020018280546104c590611a0e565b80156105125780601f106104e757610100808354040283529160200191610512565b820191906000526020600020905b8154815290600101906020018083116104f557829003601f168201915b5050505050905090565b600061052782610f66565b61058d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b60006105b482610843565b9050806001600160a01b0316836001600160a01b031614156106225760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610584565b336001600160a01b038216148061063e575061063e813361041e565b6106b05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610584565b6106ba8383610fb0565b505050565b505060405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c881b9bdd08185b1b1bddd95960621b60448201526000915081908190606401610584565b6000610713836108cf565b82106107315760405162461bcd60e51b8152600401610584906118f5565b6000805b6002548110156107a2576002818154811061075257610752611aa4565b6000918252602090912001546001600160a01b038681169116141561079057838214156107825791506104849050565b8161078c81611a49565b9250505b8061079a81611a49565b915050610735565b5060405162461bcd60e51b8152600401610584906118f5565b6106ba83838360405180602001604052806000815250610be3565b600254600090821061083f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610584565b5090565b6000806002838154811061085957610859611aa4565b6000918252602090912001546001600160a01b03169050806104845760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610584565b60006001600160a01b03821661093a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610584565b600254600090815b81811015610998576002818154811061095d5761095d611aa4565b6000918252602090912001546001600160a01b03868116911614156109885761098583611a49565b92505b61099181611a49565b9050610942565b50909392505050565b6005546001600160a01b031633146109cb5760405162461bcd60e51b815260040161058490611940565b6109d5600061101e565b565b6005546001600160a01b03163314610a015760405162461bcd60e51b815260040161058490611940565b8051610a149060069060208401906114d9565b5050565b60606001805461049990611a0e565b600254611e61610a38826001611975565b61ffff161115610a805760405162461bcd60e51b815260206004820152601360248201527222bc31b2b2b2399036b0bc1039bab838363c9760691b6044820152606401610584565b600b546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd90606401600060405180830381600087803b158015610ad257600080fd5b505af1158015610ae6573d6000803e3d6000fd5b50505050610af8338261ffff16611070565b61ffff166000818152600960209081526040808320859055938252600890529190912055565b6001600160a01b038216331415610b775760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610584565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b505060405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c881b9bdd08185b1b1bddd95960621b6044820152600092508291508190606090606401610584565b6000818152600960205260409081902054600b5491516323b872dd60e01b81523060048201523360248201526044810182905290916001600160a01b0316906323b872dd90606401600060405180830381600087803b158015610c9257600080fd5b505af1158015610ca6573d6000803e3d6000fd5b50505050610a143330846110ec565b6060610cc082610f66565b610d245760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610584565b60009182526009602052604082205491610d3c6110f7565b90506000815111610d5c5760405180602001604052806000815250610d8a565b80610d6684611106565b6007604051602001610d7a939291906117fe565b6040516020818303038152906040525b9392505050565b600081815260086020526040902054610dab3033836110ec565b600b546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd90606401600060405180830381600087803b158015610dfd57600080fd5b505af1158015610e11573d6000803e3d6000fd5b505050505050565b600080610d8a83610f66565b6005546001600160a01b03163314610e4f5760405162461bcd60e51b815260040161058490611940565b600a80546001600160a01b039092166001600160a01b03199283168117909155600b8054909216179055565b6005546001600160a01b03163314610ea55760405162461bcd60e51b815260040161058490611940565b6001600160a01b038116610f0a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610584565b610f138161101e565b50565b60006001600160e01b031982166380ac58cd60e01b1480610f4757506001600160e01b03198216635b5e139f60e01b145b8061048457506301ffc9a760e01b6001600160e01b0319831614610484565b60025460009082108015610484575060006001600160a01b031660028381548110610f9357610f93611aa4565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610fe582610843565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6106ba83838361120c565b60606006805461049990611a0e565b60608161112a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611154578061113e81611a49565b915061114d9050600a836119b3565b915061112e565b60008167ffffffffffffffff81111561116f5761116f611aba565b6040519080825280601f01601f191660200182016040528015611199576020820181803683370190505b5090505b8415611204576111ae6001836119c7565b91506111bb600a86611a64565b6111c690603061199b565b60f81b8183815181106111db576111db611aa4565b60200101906001600160f81b031916908160001a9053506111fd600a866119b3565b945061119d565b949350505050565b826001600160a01b031661121f82610843565b6001600160a01b0316146112875760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610584565b6001600160a01b0382166112e95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610584565b6112f483838361136d565b6112ff600082610fb0565b816002828154811061131357611313611aa4565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60008181526009602052604080822054600b5491516331a9108f60e11b8152600481018290529092916001600160a01b031690636352211e9060240160206040518083038186803b1580156113c157600080fd5b505afa1580156113d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f991906115fc565b90506001600160a01b03851630148061141a57506001600160a01b03841630145b61145d5760405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c881b9bdd08105b1b1bddd95960621b6044820152606401610584565b806001600160a01b0316856001600160a01b0316148061148e5750806001600160a01b0316846001600160a01b0316145b6114d25760405162461bcd60e51b815260206004820152601560248201527402a3930b739b332b9103737ba1020b63637bbb2b21605d1b6044820152606401610584565b5050505050565b8280546114e590611a0e565b90600052602060002090601f016020900481019282611507576000855561154d565b82601f1061152057805160ff191683800117855561154d565b8280016001018555821561154d579182015b8281111561154d578251825591602001919060010190611532565b5061083f9291505b8082111561083f5760008155600101611555565b600067ffffffffffffffff8084111561158457611584611aba565b604051601f8501601f19908116603f011681019082821181831017156115ac576115ac611aba565b816040528093508581528686860111156115c557600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156115f157600080fd5b8135610d8a81611ad0565b60006020828403121561160e57600080fd5b8151610d8a81611ad0565b6000806040838503121561162c57600080fd5b823561163781611ad0565b9150602083013561164781611ad0565b809150509250929050565b60008060006060848603121561166757600080fd5b833561167281611ad0565b9250602084013561168281611ad0565b929592945050506040919091013590565b600080600080608085870312156116a957600080fd5b84356116b481611ad0565b935060208501356116c481611ad0565b925060408501359150606085013567ffffffffffffffff8111156116e757600080fd5b8501601f810187136116f857600080fd5b61170787823560208401611569565b91505092959194509250565b6000806040838503121561172657600080fd5b823561173181611ad0565b91506020830135801515811461164757600080fd5b6000806040838503121561175957600080fd5b823561176481611ad0565b946020939093013593505050565b60006020828403121561178457600080fd5b81356001600160e01b031981168114610d8a57600080fd5b6000602082840312156117ae57600080fd5b813567ffffffffffffffff8111156117c557600080fd5b8201601f810184136117d657600080fd5b61120484823560208401611569565b6000602082840312156117f757600080fd5b5035919050565b6000845160206118118285838a016119de565b8551918401916118248184848a016119de565b8554920191600090600181811c908083168061184157607f831692505b85831081141561185f57634e487b7160e01b85526022600452602485fd5b8080156118735760018114611884576118b1565b60ff198516885283880195506118b1565b60008b81526020902060005b858110156118a95781548a820152908401908801611890565b505083880195505b50939b9a5050505050505050505050565b60208152600082518060208401526118e18160408501602087016119de565b601f01601f19169190910160400192915050565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600061ffff80831681851680830382111561199257611992611a78565b01949350505050565b600082198211156119ae576119ae611a78565b500190565b6000826119c2576119c2611a8e565b500490565b6000828210156119d9576119d9611a78565b500390565b60005b838110156119f95781810151838201526020016119e1565b83811115611a08576000848401525b50505050565b600181811c90821680611a2257607f821691505b60208210811415611a4357634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611a5d57611a5d611a78565b5060010190565b600082611a7357611a73611a8e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f1357600080fdfea26469706673582212201ce1d3632dc1b5dcd32a35c9608e56b8e97ba4f5a678c31fde9e4eda299c0af664736f6c63430008070033697066733a2f2f516d616531333868644d417532444b6d77786d6b6b566e7736366f485143395736436337644155657238433579452f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80637ec4a65911610104578063c87b56dd116100a2578063d600ddef11610071578063d600ddef146103ea578063db9771f5146103fd578063e985e9c514610410578063f2fde38b1461044c57600080fd5b8063c87b56dd14610388578063cf9bed2f1461039b578063d44624b2146103bb578063d5abeb01146103ce57600080fd5b8063a0712d68116100de578063a0712d681461033c578063a22cb4651461034f578063b88d4fde14610362578063baf9e3dc1461037557600080fd5b80637ec4a659146103105780638da5cb5b1461032357806395d89b411461033457600080fd5b80632f745c59116101715780636352211e1161014b5780636352211e146102c257806370a08231146102d5578063715018a6146102e857806376c63873146102f057600080fd5b80632f745c591461028957806342842e0e1461029c5780634f6ccce7146102af57600080fd5b8063095ea7b3116101ad578063095ea7b31461023c5780630cdd42341461025157806318160ddd1461026457806323b872dd1461027657600080fd5b806301ffc9a7146101d457806306fdde03146101fc578063081812fc14610211575b600080fd5b6101e76101e2366004611772565b61045f565b60405190151581526020015b60405180910390f35b61020461048a565b6040516101f391906118c2565b61022461021f3660046117e5565b61051c565b6040516001600160a01b0390911681526020016101f3565b61024f61024a366004611746565b6105a9565b005b600a54610224906001600160a01b031681565b6002545b6040519081526020016101f3565b61024f610284366004611652565b6106bf565b610268610297366004611746565b610708565b61024f6102aa366004611652565b6107bb565b6102686102bd3660046117e5565b6107d6565b6102246102d03660046117e5565b610843565b6102686102e33660046115df565b6108cf565b61024f6109a1565b6102686102fe3660046117e5565b60086020526000908152604090205481565b61024f61031e36600461179c565b6109d7565b6005546001600160a01b0316610224565b610204610a18565b61024f61034a3660046117e5565b610a27565b61024f61035d366004611713565b610b1e565b61024f610370366004611693565b610be3565b61024f6103833660046117e5565b610c30565b6102046103963660046117e5565b610cb5565b6102686103a93660046117e5565b60096020526000908152604090205481565b61024f6103c93660046117e5565b610d91565b6103d7611e6181565b60405161ffff90911681526020016101f3565b6101e76103f83660046117e5565b610e19565b61024f61040b3660046115df565b610e25565b6101e761041e366004611619565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b61024f61045a3660046115df565b610e7b565b60006001600160e01b0319821663780e9d6360e01b1480610484575061048482610f16565b92915050565b60606000805461049990611a0e565b80601f01602080910402602001604051908101604052809291908181526020018280546104c590611a0e565b80156105125780601f106104e757610100808354040283529160200191610512565b820191906000526020600020905b8154815290600101906020018083116104f557829003601f168201915b5050505050905090565b600061052782610f66565b61058d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b60006105b482610843565b9050806001600160a01b0316836001600160a01b031614156106225760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610584565b336001600160a01b038216148061063e575061063e813361041e565b6106b05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610584565b6106ba8383610fb0565b505050565b505060405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c881b9bdd08185b1b1bddd95960621b60448201526000915081908190606401610584565b6000610713836108cf565b82106107315760405162461bcd60e51b8152600401610584906118f5565b6000805b6002548110156107a2576002818154811061075257610752611aa4565b6000918252602090912001546001600160a01b038681169116141561079057838214156107825791506104849050565b8161078c81611a49565b9250505b8061079a81611a49565b915050610735565b5060405162461bcd60e51b8152600401610584906118f5565b6106ba83838360405180602001604052806000815250610be3565b600254600090821061083f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610584565b5090565b6000806002838154811061085957610859611aa4565b6000918252602090912001546001600160a01b03169050806104845760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610584565b60006001600160a01b03821661093a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610584565b600254600090815b81811015610998576002818154811061095d5761095d611aa4565b6000918252602090912001546001600160a01b03868116911614156109885761098583611a49565b92505b61099181611a49565b9050610942565b50909392505050565b6005546001600160a01b031633146109cb5760405162461bcd60e51b815260040161058490611940565b6109d5600061101e565b565b6005546001600160a01b03163314610a015760405162461bcd60e51b815260040161058490611940565b8051610a149060069060208401906114d9565b5050565b60606001805461049990611a0e565b600254611e61610a38826001611975565b61ffff161115610a805760405162461bcd60e51b815260206004820152601360248201527222bc31b2b2b2399036b0bc1039bab838363c9760691b6044820152606401610584565b600b546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd90606401600060405180830381600087803b158015610ad257600080fd5b505af1158015610ae6573d6000803e3d6000fd5b50505050610af8338261ffff16611070565b61ffff166000818152600960209081526040808320859055938252600890529190912055565b6001600160a01b038216331415610b775760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610584565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b505060405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c881b9bdd08185b1b1bddd95960621b6044820152600092508291508190606090606401610584565b6000818152600960205260409081902054600b5491516323b872dd60e01b81523060048201523360248201526044810182905290916001600160a01b0316906323b872dd90606401600060405180830381600087803b158015610c9257600080fd5b505af1158015610ca6573d6000803e3d6000fd5b50505050610a143330846110ec565b6060610cc082610f66565b610d245760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610584565b60009182526009602052604082205491610d3c6110f7565b90506000815111610d5c5760405180602001604052806000815250610d8a565b80610d6684611106565b6007604051602001610d7a939291906117fe565b6040516020818303038152906040525b9392505050565b600081815260086020526040902054610dab3033836110ec565b600b546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd90606401600060405180830381600087803b158015610dfd57600080fd5b505af1158015610e11573d6000803e3d6000fd5b505050505050565b600080610d8a83610f66565b6005546001600160a01b03163314610e4f5760405162461bcd60e51b815260040161058490611940565b600a80546001600160a01b039092166001600160a01b03199283168117909155600b8054909216179055565b6005546001600160a01b03163314610ea55760405162461bcd60e51b815260040161058490611940565b6001600160a01b038116610f0a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610584565b610f138161101e565b50565b60006001600160e01b031982166380ac58cd60e01b1480610f4757506001600160e01b03198216635b5e139f60e01b145b8061048457506301ffc9a760e01b6001600160e01b0319831614610484565b60025460009082108015610484575060006001600160a01b031660028381548110610f9357610f93611aa4565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610fe582610843565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6106ba83838361120c565b60606006805461049990611a0e565b60608161112a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611154578061113e81611a49565b915061114d9050600a836119b3565b915061112e565b60008167ffffffffffffffff81111561116f5761116f611aba565b6040519080825280601f01601f191660200182016040528015611199576020820181803683370190505b5090505b8415611204576111ae6001836119c7565b91506111bb600a86611a64565b6111c690603061199b565b60f81b8183815181106111db576111db611aa4565b60200101906001600160f81b031916908160001a9053506111fd600a866119b3565b945061119d565b949350505050565b826001600160a01b031661121f82610843565b6001600160a01b0316146112875760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610584565b6001600160a01b0382166112e95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610584565b6112f483838361136d565b6112ff600082610fb0565b816002828154811061131357611313611aa4565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60008181526009602052604080822054600b5491516331a9108f60e11b8152600481018290529092916001600160a01b031690636352211e9060240160206040518083038186803b1580156113c157600080fd5b505afa1580156113d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f991906115fc565b90506001600160a01b03851630148061141a57506001600160a01b03841630145b61145d5760405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c881b9bdd08105b1b1bddd95960621b6044820152606401610584565b806001600160a01b0316856001600160a01b0316148061148e5750806001600160a01b0316846001600160a01b0316145b6114d25760405162461bcd60e51b815260206004820152601560248201527402a3930b739b332b9103737ba1020b63637bbb2b21605d1b6044820152606401610584565b5050505050565b8280546114e590611a0e565b90600052602060002090601f016020900481019282611507576000855561154d565b82601f1061152057805160ff191683800117855561154d565b8280016001018555821561154d579182015b8281111561154d578251825591602001919060010190611532565b5061083f9291505b8082111561083f5760008155600101611555565b600067ffffffffffffffff8084111561158457611584611aba565b604051601f8501601f19908116603f011681019082821181831017156115ac576115ac611aba565b816040528093508581528686860111156115c557600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156115f157600080fd5b8135610d8a81611ad0565b60006020828403121561160e57600080fd5b8151610d8a81611ad0565b6000806040838503121561162c57600080fd5b823561163781611ad0565b9150602083013561164781611ad0565b809150509250929050565b60008060006060848603121561166757600080fd5b833561167281611ad0565b9250602084013561168281611ad0565b929592945050506040919091013590565b600080600080608085870312156116a957600080fd5b84356116b481611ad0565b935060208501356116c481611ad0565b925060408501359150606085013567ffffffffffffffff8111156116e757600080fd5b8501601f810187136116f857600080fd5b61170787823560208401611569565b91505092959194509250565b6000806040838503121561172657600080fd5b823561173181611ad0565b91506020830135801515811461164757600080fd5b6000806040838503121561175957600080fd5b823561176481611ad0565b946020939093013593505050565b60006020828403121561178457600080fd5b81356001600160e01b031981168114610d8a57600080fd5b6000602082840312156117ae57600080fd5b813567ffffffffffffffff8111156117c557600080fd5b8201601f810184136117d657600080fd5b61120484823560208401611569565b6000602082840312156117f757600080fd5b5035919050565b6000845160206118118285838a016119de565b8551918401916118248184848a016119de565b8554920191600090600181811c908083168061184157607f831692505b85831081141561185f57634e487b7160e01b85526022600452602485fd5b8080156118735760018114611884576118b1565b60ff198516885283880195506118b1565b60008b81526020902060005b858110156118a95781548a820152908401908801611890565b505083880195505b50939b9a5050505050505050505050565b60208152600082518060208401526118e18160408501602087016119de565b601f01601f19169190910160400192915050565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600061ffff80831681851680830382111561199257611992611a78565b01949350505050565b600082198211156119ae576119ae611a78565b500190565b6000826119c2576119c2611a8e565b500490565b6000828210156119d9576119d9611a78565b500390565b60005b838110156119f95781810151838201526020016119e1565b83811115611a08576000848401525b50505050565b600181811c90821680611a2257607f821691505b60208210811415611a4357634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611a5d57611a5d611a78565b5060010190565b600082611a7357611a73611a8e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f1357600080fdfea26469706673582212201ce1d3632dc1b5dcd32a35c9608e56b8e97ba4f5a678c31fde9e4eda299c0af664736f6c63430008070033

Deployed Bytecode Sourcemap

29558:3124:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28073:224;;;;;;:::i;:::-;;:::i;:::-;;;6768:14:1;;6761:22;6743:41;;6731:2;6716:18;28073:224:0;;;;;;;;16554:100;;;:::i;:::-;;;;;;;:::i;17366:308::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6179:32:1;;;6161:51;;6149:2;6134:18;17366:308:0;6015:203:1;16889:411:0;;;;;;:::i;:::-;;:::i;:::-;;29954:71;;;;;-1:-1:-1;;;;;29954:71:0;;;28373:110;28461:7;:14;28373:110;;;14157:25:1;;;14145:2;14130:18;28373:110:0;14011:177:1;18425:259:0;;;;;;:::i;:::-;;:::i;28849:490::-;;;;;;:::i;:::-;;:::i;19142:185::-;;;;;;:::i;:::-;;:::i;28560:205::-;;;;;;:::i;:::-;;:::i;16161:326::-;;;;;;:::i;:::-;;:::i;15653:446::-;;;;;;:::i;:::-;;:::i;3664:103::-;;;:::i;29837:51::-;;;;;;:::i;:::-;;;;;;;;;;;;;;32308:102;;;;;;:::i;:::-;;:::i;3013:87::-;3086:6;;-1:-1:-1;;;;;3086:6:0;3013:87;;16723:104;;;:::i;30296:390::-;;;;;;:::i;:::-;;:::i;17746:327::-;;;;;;:::i;:::-;;:::i;19398:305::-;;;;;;:::i;:::-;;:::i;31393:254::-;;;;;;:::i;:::-;;:::i;31823:477::-;;;;;;:::i;:::-;;:::i;29893:51::-;;;;;;:::i;:::-;;;;;;;;;;;;;;31138:248;;;;;;:::i;:::-;;:::i;29783:39::-;;29818:4;29783:39;;;;;13992:6:1;13980:19;;;13962:38;;13950:2;13935:18;29783:39:0;13818:188:1;31657:153:0;;;;;;:::i;:::-;;:::i;30149:136::-;;;;;;:::i;:::-;;:::i;18144:214::-;;;;;;:::i;:::-;-1:-1:-1;;;;;18315:25:0;;;18286:4;18315:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;18144:214;3922:201;;;;;;:::i;:::-;;:::i;28073:224::-;28175:4;-1:-1:-1;;;;;;28199:50:0;;-1:-1:-1;;;28199:50:0;;:90;;;28253:36;28277:11;28253:23;:36::i;:::-;28192:97;28073:224;-1:-1:-1;;28073:224:0:o;16554:100::-;16608:13;16641:5;16634:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16554:100;:::o;17366:308::-;17487:7;17534:16;17542:7;17534;:16::i;:::-;17512:110;;;;-1:-1:-1;;;17512:110:0;;10907:2:1;17512:110:0;;;10889:21:1;10946:2;10926:18;;;10919:30;10985:34;10965:18;;;10958:62;-1:-1:-1;;;11036:18:1;;;11029:42;11088:19;;17512:110:0;;;;;;;;;-1:-1:-1;17642:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;17642:24:0;;17366:308::o;16889:411::-;16970:13;16986:23;17001:7;16986:14;:23::i;:::-;16970:39;;17034:5;-1:-1:-1;;;;;17028:11:0;:2;-1:-1:-1;;;;;17028:11:0;;;17020:57;;;;-1:-1:-1;;;17020:57:0;;12855:2:1;17020:57:0;;;12837:21:1;12894:2;12874:18;;;12867:30;12933:34;12913:18;;;12906:62;-1:-1:-1;;;12984:18:1;;;12977:31;13025:19;;17020:57:0;12653:397:1;17020:57:0;1817:10;-1:-1:-1;;;;;17112:21:0;;;;:62;;-1:-1:-1;17137:37:0;17154:5;1817:10;18144:214;:::i;17137:37::-;17090:168;;;;-1:-1:-1;;;17090:168:0;;9312:2:1;17090:168:0;;;9294:21:1;9351:2;9331:18;;;9324:30;9390:34;9370:18;;;9363:62;9461:26;9441:18;;;9434:54;9505:19;;17090:168:0;9110:420:1;17090:168:0;17271:21;17280:2;17284:7;17271:8;:21::i;:::-;16959:341;16889:411;;:::o;18425:259::-;-1:-1:-1;;18638:30:0;;-1:-1:-1;;;18638:30:0;;10558:2:1;18638:30:0;;;10540:21:1;10597:2;10577:18;;;10570:30;-1:-1:-1;;;10616:18:1;;;10609:50;18562:11:0;;-1:-1:-1;18562:11:0;;;;10676:18:1;;18638:30:0;10356:344:1;28849:490:0;28946:15;28990:16;29000:5;28990:9;:16::i;:::-;28982:5;:24;28974:80;;;;-1:-1:-1;;;28974:80:0;;;;;;;:::i;:::-;29067:10;29092:6;29088:178;29104:7;:14;29100:18;;29088:178;;;29151:7;29159:1;29151:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;29142:19:0;;;29151:10;;29142:19;29139:116;;;29193:5;29184;:14;29181:58;;;29207:1;-1:-1:-1;29200:8:0;;-1:-1:-1;29200:8:0;29181:58;29232:7;;;;:::i;:::-;;;;29181:58;29120:3;;;;:::i;:::-;;;;29088:178;;;;29278:53;;-1:-1:-1;;;29278:53:0;;;;;;;:::i;19142:185::-;19280:39;19297:4;19303:2;19307:7;19280:39;;;;;;;;;;;;:16;:39::i;28560:205::-;28671:7;:14;28635:7;;28663:22;;28655:79;;;;-1:-1:-1;;;28655:79:0;;13607:2:1;28655:79:0;;;13589:21:1;13646:2;13626:18;;;13619:30;13685:34;13665:18;;;13658:62;-1:-1:-1;;;13736:18:1;;;13729:42;13788:19;;28655:79:0;13405:408:1;28655:79:0;-1:-1:-1;28752:5:0;28560:205::o;16161:326::-;16278:7;16303:13;16319:7;16327;16319:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;16319:16:0;;-1:-1:-1;16368:19:0;16346:110;;;;-1:-1:-1;;;16346:110:0;;10148:2:1;16346:110:0;;;10130:21:1;10187:2;10167:18;;;10160:30;10226:34;10206:18;;;10199:62;-1:-1:-1;;;10277:18:1;;;10270:39;10326:19;;16346:110:0;9946:405:1;15653:446:0;15775:4;-1:-1:-1;;;;;15806:19:0;;15798:74;;;;-1:-1:-1;;;15798:74:0;;9737:2:1;15798:74:0;;;9719:21:1;9776:2;9756:18;;;9749:30;9815:34;9795:18;;;9788:62;-1:-1:-1;;;9866:18:1;;;9859:40;9916:19;;15798:74:0;9535:406:1;15798:74:0;15919:7;:14;15885:10;;;15944:101;15961:6;15957:1;:10;15944:101;;;16000:7;16008:1;16000:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;15991:19:0;;;16000:10;;15991:19;15987:46;;;16026:7;;;:::i;:::-;;;15987:46;15969:3;;;:::i;:::-;;;15944:101;;;-1:-1:-1;16086:5:0;;15653:446;-1:-1:-1;;;15653:446:0:o;3664:103::-;3086:6;;-1:-1:-1;;;;;3086:6:0;1817:10;3233:23;3225:68;;;;-1:-1:-1;;;3225:68:0;;;;;;;:::i;:::-;3729:30:::1;3756:1;3729:18;:30::i;:::-;3664:103::o:0;32308:102::-;3086:6;;-1:-1:-1;;;;;3086:6:0;1817:10;3233:23;3225:68;;;;-1:-1:-1;;;3225:68:0;;;;;;;:::i;:::-;32382:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;32308:102:::0;:::o;16723:104::-;16779:13;16812:7;16805:14;;;;;:::i;30296:390::-;30378:7;:14;29818:4;30408:15;30378:14;30422:1;30408:15;:::i;:::-;:28;;;;30400:60;;;;-1:-1:-1;;;30400:60:0;;12507:2:1;30400:60:0;;;12489:21:1;12546:2;12526:18;;;12519:30;-1:-1:-1;;;12565:18:1;;;12558:49;12624:18;;30400:60:0;12305:343:1;30400:60:0;30468:4;;:57;;-1:-1:-1;;;30468:57:0;;30487:10;30468:57;;;6463:34:1;30507:4:0;6513:18:1;;;6506:43;6565:18;;;6558:34;;;-1:-1:-1;;;;;30468:4:0;;;;:17;;6398:18:1;;30468:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30532:30;30538:10;30550:11;30532:30;;:5;:30::i;:::-;30573:34;;;;;;:21;:34;;;;;;;;:48;;;30628:34;;;:21;:34;;;;;;:48;30296:390::o;17746:327::-;-1:-1:-1;;;;;17881:24:0;;1817:10;17881:24;;17873:62;;;;-1:-1:-1;;;17873:62:0;;8609:2:1;17873:62:0;;;8591:21:1;8648:2;8628:18;;;8621:30;8687:27;8667:18;;;8660:55;8732:18;;17873:62:0;8407:349:1;17873:62:0;1817:10;17948:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;17948:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;17948:53:0;;;;;;;;;;18017:48;;6743:41:1;;;17948:42:0;;1817:10;18017:48;;6716:18:1;18017:48:0;;;;;;;17746:327;;:::o;19398:305::-;-1:-1:-1;;19647:30:0;;-1:-1:-1;;;19647:30:0;;10558:2:1;19647:30:0;;;10540:21:1;10597:2;10577:18;;;10570:30;-1:-1:-1;;;10616:18:1;;;10609:50;19562:11:0;;-1:-1:-1;19562:11:0;;-1:-1:-1;19562:11:0;;19622:12;;10676:18:1;;19647:30:0;10356:344:1;31393:254:0;31461:11;31475:34;;;:21;:34;;;;;;;;31517:4;;:52;;-1:-1:-1;;;31517:52:0;;31544:4;31517:52;;;6463:34:1;31551:10:0;6513:18:1;;;6506:43;6565:18;;;6558:34;;;31475::0;;-1:-1:-1;;;;;31517:4:0;;:17;;6398:18:1;;31517:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31574:56;31592:10;31612:4;31618:11;31574:16;:56::i;31823:477::-;31922:13;31963:17;31971:8;31963:7;:17::i;:::-;31947:98;;;;-1:-1:-1;;;31947:98:0;;12091:2:1;31947:98:0;;;12073:21:1;12130:2;12110:18;;;12103:30;12169:34;12149:18;;;12142:62;-1:-1:-1;;;12220:18:1;;;12213:45;12275:19;;31947:98:0;11889:411:1;31947:98:0;32069:31;;;;:21;:31;;;;;;;32140:10;:8;:10::i;:::-;32109:41;;32195:1;32170:14;32164:28;:32;:130;;;;;;;;;;;;;;;;;32232:14;32248:19;:8;:17;:19::i;:::-;32269:9;32215:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32164:130;32157:137;31823:477;-1:-1:-1;;;31823:477:0:o;31138:248::-;31208:11;31222:34;;;:21;:34;;;;;;31264:51;31290:4;31297:10;31222:34;31264:16;:51::i;:::-;31320:4;;:56;;-1:-1:-1;;;31320:56:0;;31338:10;31320:56;;;6463:34:1;31358:4:0;6513:18:1;;;6506:43;6565:18;;;6558:34;;;-1:-1:-1;;;;;31320:4:0;;;;:17;;6398:18:1;;31320:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31195:191;31138:248;:::o;31657:153::-;31735:4;31752:10;31767:17;31775:8;31767:7;:17::i;30149:136::-;3086:6;;-1:-1:-1;;;;;3086:6:0;1817:10;3233:23;3225:68;;;;-1:-1:-1;;;3225:68:0;;;;;;;:::i;:::-;30219:11:::1;:26:::0;;-1:-1:-1;;;;;30219:26:0;;::::1;-1:-1:-1::0;;;;;;30219:26:0;;::::1;::::0;::::1;::::0;;;30256:4:::1;:24:::0;;;;::::1;;::::0;;30149:136::o;3922:201::-;3086:6;;-1:-1:-1;;;;;3086:6:0;1817:10;3233:23;3225:68;;;;-1:-1:-1;;;3225:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4011:22:0;::::1;4003:73;;;::::0;-1:-1:-1;;;4003:73:0;;7797:2:1;4003:73:0::1;::::0;::::1;7779:21:1::0;7836:2;7816:18;;;7809:30;7875:34;7855:18;;;7848:62;-1:-1:-1;;;7926:18:1;;;7919:36;7972:19;;4003:73:0::1;7595:402:1::0;4003:73:0::1;4087:28;4106:8;4087:18;:28::i;:::-;3922:201:::0;:::o;15234:355::-;15381:4;-1:-1:-1;;;;;;15423:40:0;;-1:-1:-1;;;15423:40:0;;:105;;-1:-1:-1;;;;;;;15480:48:0;;-1:-1:-1;;;15480:48:0;15423:105;:158;;;-1:-1:-1;;;;;;;;;;7403:40:0;;;15545:36;7294:157;21220:155;21319:7;:14;21285:4;;21309:24;;:58;;;;;21365:1;-1:-1:-1;;;;;21337:30:0;:7;21345;21337:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;21337:16:0;:30;;21302:65;21220:155;-1:-1:-1;;21220:155:0:o;25197:174::-;25272:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;25272:29:0;-1:-1:-1;;;;;25272:29:0;;;;;;;;:24;;25326:23;25272:24;25326:14;:23::i;:::-;-1:-1:-1;;;;;25317:46:0;;;;;;;;;;;25197:174;;:::o;4283:191::-;4376:6;;;-1:-1:-1;;;;;4393:17:0;;;-1:-1:-1;;;;;;4393:17:0;;;;;;;4426:40;;4376:6;;;4393:17;4376:6;;4426:40;;4357:16;;4426:40;4346:128;4283:191;:::o;32431:154::-;32512:7;:16;;;;;;;-1:-1:-1;32512:16:0;;;;;;;-1:-1:-1;;;;;;32512:16:0;-1:-1:-1;;;;;32512:16:0;;;;;;;;32544:33;;32569:7;;-1:-1:-1;32544:33:0;;-1:-1:-1;;32544:33:0;32431:154;;:::o;18700:373::-;19037:28;19047:4;19053:2;19057:7;19037:9;:28::i;32591:88::-;32635:13;32664:9;32657:16;;;;;:::i;326:723::-;382:13;603:10;599:53;;-1:-1:-1;;630:10:0;;;;;;;;;;;;-1:-1:-1;;;630:10:0;;;;;326:723::o;599:53::-;677:5;662:12;718:78;725:9;;718:78;;751:8;;;;:::i;:::-;;-1:-1:-1;774:10:0;;-1:-1:-1;782:2:0;774:10;;:::i;:::-;;;718:78;;;806:19;838:6;828:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;828:17:0;;806:39;;856:154;863:10;;856:154;;890:11;900:1;890:11;;:::i;:::-;;-1:-1:-1;959:10:0;967:2;959:5;:10;:::i;:::-;946:24;;:2;:24;:::i;:::-;933:39;;916:6;923;916:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;916:56:0;;;;;;;;-1:-1:-1;987:11:0;996:2;987:11;;:::i;:::-;;;856:154;;;1034:6;326:723;-1:-1:-1;;;;326:723:0:o;24526:553::-;24699:4;-1:-1:-1;;;;;24672:31:0;:23;24687:7;24672:14;:23::i;:::-;-1:-1:-1;;;;;24672:31:0;;24650:122;;;;-1:-1:-1;;;24650:122:0;;11681:2:1;24650:122:0;;;11663:21:1;11720:2;11700:18;;;11693:30;11759:34;11739:18;;;11732:62;-1:-1:-1;;;11810:18:1;;;11803:39;11859:19;;24650:122:0;11479:405:1;24650:122:0;-1:-1:-1;;;;;24791:16:0;;24783:65;;;;-1:-1:-1;;;24783:65:0;;8204:2:1;24783:65:0;;;8186:21:1;8243:2;8223:18;;;8216:30;8282:34;8262:18;;;8255:62;-1:-1:-1;;;8333:18:1;;;8326:34;8377:19;;24783:65:0;8002:400:1;24783:65:0;24861:39;24882:4;24888:2;24892:7;24861:20;:39::i;:::-;24965:29;24982:1;24986:7;24965:8;:29::i;:::-;25024:2;25005:7;25013;25005:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;25005:21:0;-1:-1:-1;;;;;25005:21:0;;;;;;25044:27;;25063:7;;25044:27;;;;;;;;;;25005:16;25044:27;24526:553;;;:::o;30692:440::-;30837:10;30849:30;;;:21;:30;;;;;;;30909:4;;:19;;-1:-1:-1;;;30909:19:0;;;;;14157:25:1;;;30849:30:0;;30837:10;-1:-1:-1;;;;;30909:4:0;;:12;;14130:18:1;;30909:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30890:38;-1:-1:-1;;;;;;30948:21:0;;30964:4;30948:21;;:45;;-1:-1:-1;;;;;;30973:20:0;;30988:4;30973:20;30948:45;30939:80;;;;-1:-1:-1;;;30939:80:0;;8963:2:1;30939:80:0;;;8945:21:1;9002:2;8982:18;;;8975:30;-1:-1:-1;;;9021:18:1;;;9014:50;9081:18;;30939:80:0;8761:344:1;30939:80:0;31047:8;-1:-1:-1;;;;;31039:16:0;:4;-1:-1:-1;;;;;31039:16:0;;:35;;;;31066:8;-1:-1:-1;;;;;31059:15:0;:2;-1:-1:-1;;;;;31059:15:0;;31039:35;31030:71;;;;-1:-1:-1;;;31030:71:0;;13257:2:1;31030:71:0;;;13239:21:1;13296:2;13276:18;;;13269:30;-1:-1:-1;;;13315:18:1;;;13308:51;13376:18;;31030:71:0;13055:345:1;31030:71:0;-1:-1:-1;;;;;30692:440:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:247::-;709:6;762:2;750:9;741:7;737:23;733:32;730:52;;;778:1;775;768:12;730:52;817:9;804:23;836:31;861:5;836:31;:::i;902:251::-;972:6;1025:2;1013:9;1004:7;1000:23;996:32;993:52;;;1041:1;1038;1031:12;993:52;1073:9;1067:16;1092:31;1117:5;1092:31;:::i;1158:388::-;1226:6;1234;1287:2;1275:9;1266:7;1262:23;1258:32;1255:52;;;1303:1;1300;1293:12;1255:52;1342:9;1329:23;1361:31;1386:5;1361:31;:::i;:::-;1411:5;-1:-1:-1;1468:2:1;1453:18;;1440:32;1481:33;1440:32;1481:33;:::i;:::-;1533:7;1523:17;;;1158:388;;;;;:::o;1551:456::-;1628:6;1636;1644;1697:2;1685:9;1676:7;1672:23;1668:32;1665:52;;;1713:1;1710;1703:12;1665:52;1752:9;1739:23;1771:31;1796:5;1771:31;:::i;:::-;1821:5;-1:-1:-1;1878:2:1;1863:18;;1850:32;1891:33;1850:32;1891:33;:::i;:::-;1551:456;;1943:7;;-1:-1:-1;;;1997:2:1;1982:18;;;;1969:32;;1551:456::o;2012:794::-;2107:6;2115;2123;2131;2184:3;2172:9;2163:7;2159:23;2155:33;2152:53;;;2201:1;2198;2191:12;2152:53;2240:9;2227:23;2259:31;2284:5;2259:31;:::i;:::-;2309:5;-1:-1:-1;2366:2:1;2351:18;;2338:32;2379:33;2338:32;2379:33;:::i;:::-;2431:7;-1:-1:-1;2485:2:1;2470:18;;2457:32;;-1:-1:-1;2540:2:1;2525:18;;2512:32;2567:18;2556:30;;2553:50;;;2599:1;2596;2589:12;2553:50;2622:22;;2675:4;2667:13;;2663:27;-1:-1:-1;2653:55:1;;2704:1;2701;2694:12;2653:55;2727:73;2792:7;2787:2;2774:16;2769:2;2765;2761:11;2727:73;:::i;:::-;2717:83;;;2012:794;;;;;;;:::o;2811:416::-;2876:6;2884;2937:2;2925:9;2916:7;2912:23;2908:32;2905:52;;;2953:1;2950;2943:12;2905:52;2992:9;2979:23;3011:31;3036:5;3011:31;:::i;:::-;3061:5;-1:-1:-1;3118:2:1;3103:18;;3090:32;3160:15;;3153:23;3141:36;;3131:64;;3191:1;3188;3181:12;3232:315;3300:6;3308;3361:2;3349:9;3340:7;3336:23;3332:32;3329:52;;;3377:1;3374;3367:12;3329:52;3416:9;3403:23;3435:31;3460:5;3435:31;:::i;:::-;3485:5;3537:2;3522:18;;;;3509:32;;-1:-1:-1;;;3232:315:1:o;3552:286::-;3610:6;3663:2;3651:9;3642:7;3638:23;3634:32;3631:52;;;3679:1;3676;3669:12;3631:52;3705:23;;-1:-1:-1;;;;;;3757:32:1;;3747:43;;3737:71;;3804:1;3801;3794:12;3843:450;3912:6;3965:2;3953:9;3944:7;3940:23;3936:32;3933:52;;;3981:1;3978;3971:12;3933:52;4021:9;4008:23;4054:18;4046:6;4043:30;4040:50;;;4086:1;4083;4076:12;4040:50;4109:22;;4162:4;4154:13;;4150:27;-1:-1:-1;4140:55:1;;4191:1;4188;4181:12;4140:55;4214:73;4279:7;4274:2;4261:16;4256:2;4252;4248:11;4214:73;:::i;4298:180::-;4357:6;4410:2;4398:9;4389:7;4385:23;4381:32;4378:52;;;4426:1;4423;4416:12;4378:52;-1:-1:-1;4449:23:1;;4298:180;-1:-1:-1;4298:180:1:o;4483:1527::-;4707:3;4745:6;4739:13;4771:4;4784:51;4828:6;4823:3;4818:2;4810:6;4806:15;4784:51;:::i;:::-;4898:13;;4857:16;;;;4920:55;4898:13;4857:16;4942:15;;;4920:55;:::i;:::-;5064:13;;4997:20;;;5037:1;;5124;5146:18;;;;5199;;;;5226:93;;5304:4;5294:8;5290:19;5278:31;;5226:93;5367:2;5357:8;5354:16;5334:18;5331:40;5328:167;;;-1:-1:-1;;;5394:33:1;;5450:4;5447:1;5440:15;5480:4;5401:3;5468:17;5328:167;5511:18;5538:110;;;;5662:1;5657:328;;;;5504:481;;5538:110;-1:-1:-1;;5573:24:1;;5559:39;;5618:20;;;;-1:-1:-1;5538:110:1;;5657:328;14266:1;14259:14;;;14303:4;14290:18;;5752:1;5766:169;5780:8;5777:1;5774:15;5766:169;;;5862:14;;5847:13;;;5840:37;5905:16;;;;5797:10;;5766:169;;;5770:3;;5966:8;5959:5;5955:20;5948:27;;5504:481;-1:-1:-1;6001:3:1;;4483:1527;-1:-1:-1;;;;;;;;;;;4483:1527:1:o;6795:383::-;6944:2;6933:9;6926:21;6907:4;6976:6;6970:13;7019:6;7014:2;7003:9;6999:18;6992:34;7035:66;7094:6;7089:2;7078:9;7074:18;7069:2;7061:6;7057:15;7035:66;:::i;:::-;7162:2;7141:15;-1:-1:-1;;7137:29:1;7122:45;;;;7169:2;7118:54;;6795:383;-1:-1:-1;;6795:383:1:o;7183:407::-;7385:2;7367:21;;;7424:2;7404:18;;;7397:30;7463:34;7458:2;7443:18;;7436:62;-1:-1:-1;;;7529:2:1;7514:18;;7507:41;7580:3;7565:19;;7183:407::o;11118:356::-;11320:2;11302:21;;;11339:18;;;11332:30;11398:34;11393:2;11378:18;;11371:62;11465:2;11450:18;;11118:356::o;14319:224::-;14358:3;14386:6;14419:2;14416:1;14412:10;14449:2;14446:1;14442:10;14480:3;14476:2;14472:12;14467:3;14464:21;14461:47;;;14488:18;;:::i;:::-;14524:13;;14319:224;-1:-1:-1;;;;14319:224:1:o;14548:128::-;14588:3;14619:1;14615:6;14612:1;14609:13;14606:39;;;14625:18;;:::i;:::-;-1:-1:-1;14661:9:1;;14548:128::o;14681:120::-;14721:1;14747;14737:35;;14752:18;;:::i;:::-;-1:-1:-1;14786:9:1;;14681:120::o;14806:125::-;14846:4;14874:1;14871;14868:8;14865:34;;;14879:18;;:::i;:::-;-1:-1:-1;14916:9:1;;14806:125::o;14936:258::-;15008:1;15018:113;15032:6;15029:1;15026:13;15018:113;;;15108:11;;;15102:18;15089:11;;;15082:39;15054:2;15047:10;15018:113;;;15149:6;15146:1;15143:13;15140:48;;;15184:1;15175:6;15170:3;15166:16;15159:27;15140:48;;14936:258;;;:::o;15199:380::-;15278:1;15274:12;;;;15321;;;15342:61;;15396:4;15388:6;15384:17;15374:27;;15342:61;15449:2;15441:6;15438:14;15418:18;15415:38;15412:161;;;15495:10;15490:3;15486:20;15483:1;15476:31;15530:4;15527:1;15520:15;15558:4;15555:1;15548:15;15412:161;;15199:380;;;:::o;15584:135::-;15623:3;-1:-1:-1;;15644:17:1;;15641:43;;;15664:18;;:::i;:::-;-1:-1:-1;15711:1:1;15700:13;;15584:135::o;15724:112::-;15756:1;15782;15772:35;;15787:18;;:::i;:::-;-1:-1:-1;15821:9:1;;15724:112::o;15841:127::-;15902:10;15897:3;15893:20;15890:1;15883:31;15933:4;15930:1;15923:15;15957:4;15954:1;15947:15;15973:127;16034:10;16029:3;16025:20;16022:1;16015:31;16065:4;16062:1;16055:15;16089:4;16086:1;16079:15;16105:127;16166:10;16161:3;16157:20;16154:1;16147:31;16197:4;16194:1;16187:15;16221:4;16218:1;16211:15;16237:127;16298:10;16293:3;16289:20;16286:1;16279:31;16329:4;16326:1;16319:15;16353:4;16350:1;16343:15;16369:131;-1:-1:-1;;;;;16444:31:1;;16434:42;;16424:70;;16490:1;16487;16480:12

Swarm Source

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