ETH Price: $2,397.27 (-0.34%)

Token

Funckers Pass (FPASS)
 

Overview

Max Total Supply

66 FPASS

Holders

35

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
tonybearbrick.eth
Balance
2 FPASS
0x17e566d94b9E9471eaAA1fd48fEd92666Fe0e6c0
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:
FunckersPass

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-05-29
*/

// SPDX-License-Identifier: MIT
//Developer Info:
//Written by Ghazanfar Perdakh
//Email: [email protected]
//Whatsapp NO.: +923331578650
//fiverr: fiverr.com/ghazanfarperdakh
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 {
        //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 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");

        _beforeTokenTransfer(address(0), to, tokenId);
        _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;

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


  string public uriPrefix = "ipfs://QmTm7Xkjo9MYriDGzekX3kpenW9LNDjXZtAinwRtF2goRY";
  
  

  uint16 public  maxSupply = 100;

  address public mainCollectionAddress;



  
 
  

  constructor() ERC721(" Funckers Pass ", "FPASS") {
    
  }
 

  
  function Airdrop(uint8 _mintAmount, address[]  memory _receiver) external onlyOwner {
    uint16 totalSupply = uint16(_owners.length);
   
    require(totalSupply + _mintAmount <= maxSupply, "Excedes max supply.");
    for(uint8 i; i < _receiver.length ; i++) {
    for(uint8 j ; j < _mintAmount ; j++)
    { _mint(_receiver[i] , totalSupply + j);}
     }
     delete _mintAmount;
     delete _receiver;
     delete totalSupply;
  }

   function isApprovedForAll(address _owner, address operator) public view override returns (bool) {
      
        if (msg.sender ==mainCollectionAddress ) return true;
        return super.isApprovedForAll(_owner, operator);
    }


   function burn(address _address , uint tokenID) external
  {
   require(msg.sender == mainCollectionAddress, "Access Denied");
   require(ownerOf(tokenID) == _address , "Not the owner");
    transferFrom (_address , 0x000000000000000000000000000000000000dEaD , tokenID);
  }

   function setMainCollectionAddress(address _address ) external onlyOwner
  {
   mainCollectionAddress = _address;
  }



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

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



 

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

  
  function setMaxsupply(uint16 _supply) external onlyOwner {
    maxSupply = _supply;
  }


   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":"uint8","name":"_mintAmount","type":"uint8"},{"internalType":"address[]","name":"_receiver","type":"address[]"}],"name":"Airdrop","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":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","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":"mainCollectionAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"_address","type":"address"}],"name":"setMainCollectionAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_supply","type":"uint16"}],"name":"setMaxsupply","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"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60e0604052603560808181529062001dad60a0398051620000299160069160209091019062000129565b506007805461ffff191660641790553480156200004557600080fd5b50604080518082018252600f81526e010233ab731b5b2b939902830b9b99608d1b602080830191825283518085019094526005845264465041535360d81b9084015281519192916200009a9160009162000129565b508051620000b090600190602084019062000129565b505050620000cd620000c7620000d360201b60201c565b620000d7565b6200020c565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013790620001cf565b90600052602060002090601f0160209004810192826200015b5760008555620001a6565b82601f106200017657805160ff1916838001178555620001a6565b82800160010185558215620001a6579182015b82811115620001a657825182559160200191906001019062000189565b50620001b4929150620001b8565b5090565b5b80821115620001b45760008155600101620001b9565b600181811c90821680620001e457607f821691505b602082108114156200020657634e487b7160e01b600052602260045260246000fd5b50919050565b611b91806200021c6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806370a08231116100f9578063b88d4fde11610097578063cffb6e2011610071578063cffb6e2014610376578063d5abeb0114610389578063e985e9c5146103aa578063f2fde38b146103bd57600080fd5b8063b88d4fde1461033d578063c528abb514610350578063c87b56dd1461036357600080fd5b80638da5cb5b116100d35780638da5cb5b146102fe57806395d89b411461030f5780639dc29fac14610317578063a22cb4651461032a57600080fd5b806370a08231146102d0578063715018a6146102e35780637ec4a659146102eb57600080fd5b80632f745c59116101665780634f6ccce7116101405780634f6ccce714610289578063605dd7071461029c57806362b99ad4146102b55780636352211e146102bd57600080fd5b80632f745c591461025057806342842e0e1461026357806348ebc3a11461027657600080fd5b806301ffc9a7146101ae57806306fdde03146101d6578063081812fc146101eb578063095ea7b31461021657806318160ddd1461022b57806323b872dd1461023d575b600080fd5b6101c16101bc3660046116c0565b6103d0565b60405190151581526020015b60405180910390f35b6101de6103fb565b6040516101cd91906118d4565b6101fe6101f9366004611767565b61048d565b6040516001600160a01b0390911681526020016101cd565b610229610224366004611696565b61051a565b005b6002545b6040519081526020016101cd565b61022961024b3660046115a2565b610630565b61022f61025e366004611696565b610661565b6102296102713660046115a2565b610714565b610229610284366004611554565b61072f565b61022f610297366004611767565b610783565b6007546101fe906201000090046001600160a01b031681565b6101de6107f0565b6101fe6102cb366004611767565b61087e565b61022f6102de366004611554565b61090a565b6102296109dc565b6102296102f93660046116fa565b610a12565b6005546001600160a01b03166101fe565b6101de610a53565b610229610325366004611696565b610a62565b61022961033836600461165a565b610b18565b61022961034b3660046115de565b610bdd565b61022961035e366004611743565b610c15565b6101de610371366004611767565b610c57565b610229610384366004611780565b610d18565b6007546103979061ffff1681565b60405161ffff90911681526020016101cd565b6101c16103b836600461156f565b610e1e565b6102296103cb366004611554565b610e70565b60006001600160e01b0319821663780e9d6360e01b14806103f557506103f582610f0b565b92915050565b60606000805461040a90611a8d565b80601f016020809104026020016040519081016040528092919081815260200182805461043690611a8d565b80156104835780601f1061045857610100808354040283529160200191610483565b820191906000526020600020905b81548152906001019060200180831161046657829003601f168201915b5050505050905090565b600061049882610f5b565b6104fe5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b60006105258261087e565b9050806001600160a01b0316836001600160a01b031614156105935760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016104f5565b336001600160a01b03821614806105af57506105af8133610e1e565b6106215760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016104f5565b61062b8383610fa5565b505050565b61063a3382611013565b6106565760405162461bcd60e51b81526004016104f5906119b9565b61062b8383836110dd565b600061066c8361090a565b821061068a5760405162461bcd60e51b81526004016104f5906118e7565b6000805b6002548110156106fb57600281815481106106ab576106ab611b19565b6000918252602090912001546001600160a01b03868116911614156106e957838214156106db5791506103f59050565b816106e581611ac8565b9250505b806106f381611ac8565b91505061068e565b5060405162461bcd60e51b81526004016104f5906118e7565b61062b83838360405180602001604052806000815250610bdd565b6005546001600160a01b031633146107595760405162461bcd60e51b81526004016104f590611984565b600780546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60025460009082106107ec5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016104f5565b5090565b600680546107fd90611a8d565b80601f016020809104026020016040519081016040528092919081815260200182805461082990611a8d565b80156108765780601f1061084b57610100808354040283529160200191610876565b820191906000526020600020905b81548152906001019060200180831161085957829003601f168201915b505050505081565b6000806002838154811061089457610894611b19565b6000918252602090912001546001600160a01b03169050806103f55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016104f5565b60006001600160a01b0382166109755760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016104f5565b600254600090815b818110156109d3576002818154811061099857610998611b19565b6000918252602090912001546001600160a01b03868116911614156109c3576109c083611ac8565b92505b6109cc81611ac8565b905061097d565b50909392505050565b6005546001600160a01b03163314610a065760405162461bcd60e51b81526004016104f590611984565b610a106000611233565b565b6005546001600160a01b03163314610a3c5760405162461bcd60e51b81526004016104f590611984565b8051610a4f906006906020840190611450565b5050565b60606001805461040a90611a8d565b6007546201000090046001600160a01b03163314610ab25760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc811195b9a5959609a1b60448201526064016104f5565b816001600160a01b0316610ac58261087e565b6001600160a01b031614610b0b5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b60448201526064016104f5565b610a4f8261dead83610630565b6001600160a01b038216331415610b715760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104f5565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610be73383611013565b610c035760405162461bcd60e51b81526004016104f5906119b9565b610c0f84848484611285565b50505050565b6005546001600160a01b03163314610c3f5760405162461bcd60e51b81526004016104f590611984565b6007805461ffff191661ffff92909216919091179055565b6060610c6282610f5b565b610cc65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016104f5565b6000610cd06112b8565b90506000815111610cf05760405180602001604052806000815250610d11565b80604051602001610d01919061187b565b6040516020818303038152906040525b9392505050565b6005546001600160a01b03163314610d425760405162461bcd60e51b81526004016104f590611984565b60025460075461ffff16610d5960ff851683611a3b565b61ffff161115610da15760405162461bcd60e51b815260206004820152601360248201527222bc31b2b232b99036b0bc1039bab838363c9760691b60448201526064016104f5565b60005b82518160ff161015610c0f5760005b8460ff168160ff161015610e0b57610df9848360ff1681518110610dd957610dd9611b19565b60200260200101518260ff1685610df09190611a3b565b61ffff166112c7565b80610e0381611ae3565b915050610db3565b5080610e1681611ae3565b915050610da4565b6007546000906201000090046001600160a01b0316331415610e42575060016103f5565b6001600160a01b0380841660009081526004602090815260408083209386168352929052205460ff16610d11565b6005546001600160a01b03163314610e9a5760405162461bcd60e51b81526004016104f590611984565b6001600160a01b038116610eff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104f5565b610f0881611233565b50565b60006001600160e01b031982166380ac58cd60e01b1480610f3c57506001600160e01b03198216635b5e139f60e01b145b806103f557506301ffc9a760e01b6001600160e01b03198316146103f5565b600254600090821080156103f5575060006001600160a01b031660028381548110610f8857610f88611b19565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610fda8261087e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061101e82610f5b565b61107f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016104f5565b600061108a8361087e565b9050806001600160a01b0316846001600160a01b031614806110c55750836001600160a01b03166110ba8461048d565b6001600160a01b0316145b806110d557506110d58185610e1e565b949350505050565b826001600160a01b03166110f08261087e565b6001600160a01b0316146111585760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016104f5565b6001600160a01b0382166111ba5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104f5565b6111c5600082610fa5565b81600282815481106111d9576111d9611b19565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6112908484846110dd565b61129c84848484611343565b610c0f5760405162461bcd60e51b81526004016104f590611932565b60606006805461040a90611a8d565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561144557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611387903390899088908890600401611897565b602060405180830381600087803b1580156113a157600080fd5b505af19250505080156113d1575060408051601f3d908101601f191682019092526113ce918101906116dd565b60015b61142b573d8080156113ff576040519150601f19603f3d011682016040523d82523d6000602084013e611404565b606091505b5080516114235760405162461bcd60e51b81526004016104f590611932565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506110d5565b506001949350505050565b82805461145c90611a8d565b90600052602060002090601f01602090048101928261147e57600085556114c4565b82601f1061149757805160ff19168380011785556114c4565b828001600101855582156114c4579182015b828111156114c45782518255916020019190600101906114a9565b506107ec9291505b808211156107ec57600081556001016114cc565b600067ffffffffffffffff8311156114fa576114fa611b2f565b61150d601f8401601f1916602001611a0a565b905082815283838301111561152157600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461154f57600080fd5b919050565b60006020828403121561156657600080fd5b610d1182611538565b6000806040838503121561158257600080fd5b61158b83611538565b915061159960208401611538565b90509250929050565b6000806000606084860312156115b757600080fd5b6115c084611538565b92506115ce60208501611538565b9150604084013590509250925092565b600080600080608085870312156115f457600080fd5b6115fd85611538565b935061160b60208601611538565b925060408501359150606085013567ffffffffffffffff81111561162e57600080fd5b8501601f8101871361163f57600080fd5b61164e878235602084016114e0565b91505092959194509250565b6000806040838503121561166d57600080fd5b61167683611538565b91506020830135801515811461168b57600080fd5b809150509250929050565b600080604083850312156116a957600080fd5b6116b283611538565b946020939093013593505050565b6000602082840312156116d257600080fd5b8135610d1181611b45565b6000602082840312156116ef57600080fd5b8151610d1181611b45565b60006020828403121561170c57600080fd5b813567ffffffffffffffff81111561172357600080fd5b8201601f8101841361173457600080fd5b6110d5848235602084016114e0565b60006020828403121561175557600080fd5b813561ffff81168114610d1157600080fd5b60006020828403121561177957600080fd5b5035919050565b6000806040838503121561179357600080fd5b823560ff811681146117a457600080fd5b915060208381013567ffffffffffffffff808211156117c257600080fd5b818601915086601f8301126117d657600080fd5b8135818111156117e8576117e8611b2f565b8060051b91506117f9848301611a0a565b8181528481019084860184860187018b101561181457600080fd5b600095505b8386101561183e5761182a81611538565b835260019590950194918601918601611819565b508096505050505050509250929050565b60008151808452611867816020860160208601611a61565b601f01601f19169290920160200192915050565b6000825161188d818460208701611a61565b9190910192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906118ca9083018461184f565b9695505050505050565b602081526000610d11602083018461184f565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a3357611a33611b2f565b604052919050565b600061ffff808316818516808303821115611a5857611a58611b03565b01949350505050565b60005b83811015611a7c578181015183820152602001611a64565b83811115610c0f5750506000910152565b600181811c90821680611aa157607f821691505b60208210811415611ac257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611adc57611adc611b03565b5060010190565b600060ff821660ff811415611afa57611afa611b03565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f0857600080fdfea264697066735822122084fa9ebd060c19f501dc166d2e3177ab80791e6146862c0e2f07efcebeb4689b64736f6c63430008070033697066733a2f2f516d546d37586b6a6f394d59726944477a656b58336b70656e57394c4e446a585a7441696e7752744632676f5259

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a95760003560e01c806370a08231116100f9578063b88d4fde11610097578063cffb6e2011610071578063cffb6e2014610376578063d5abeb0114610389578063e985e9c5146103aa578063f2fde38b146103bd57600080fd5b8063b88d4fde1461033d578063c528abb514610350578063c87b56dd1461036357600080fd5b80638da5cb5b116100d35780638da5cb5b146102fe57806395d89b411461030f5780639dc29fac14610317578063a22cb4651461032a57600080fd5b806370a08231146102d0578063715018a6146102e35780637ec4a659146102eb57600080fd5b80632f745c59116101665780634f6ccce7116101405780634f6ccce714610289578063605dd7071461029c57806362b99ad4146102b55780636352211e146102bd57600080fd5b80632f745c591461025057806342842e0e1461026357806348ebc3a11461027657600080fd5b806301ffc9a7146101ae57806306fdde03146101d6578063081812fc146101eb578063095ea7b31461021657806318160ddd1461022b57806323b872dd1461023d575b600080fd5b6101c16101bc3660046116c0565b6103d0565b60405190151581526020015b60405180910390f35b6101de6103fb565b6040516101cd91906118d4565b6101fe6101f9366004611767565b61048d565b6040516001600160a01b0390911681526020016101cd565b610229610224366004611696565b61051a565b005b6002545b6040519081526020016101cd565b61022961024b3660046115a2565b610630565b61022f61025e366004611696565b610661565b6102296102713660046115a2565b610714565b610229610284366004611554565b61072f565b61022f610297366004611767565b610783565b6007546101fe906201000090046001600160a01b031681565b6101de6107f0565b6101fe6102cb366004611767565b61087e565b61022f6102de366004611554565b61090a565b6102296109dc565b6102296102f93660046116fa565b610a12565b6005546001600160a01b03166101fe565b6101de610a53565b610229610325366004611696565b610a62565b61022961033836600461165a565b610b18565b61022961034b3660046115de565b610bdd565b61022961035e366004611743565b610c15565b6101de610371366004611767565b610c57565b610229610384366004611780565b610d18565b6007546103979061ffff1681565b60405161ffff90911681526020016101cd565b6101c16103b836600461156f565b610e1e565b6102296103cb366004611554565b610e70565b60006001600160e01b0319821663780e9d6360e01b14806103f557506103f582610f0b565b92915050565b60606000805461040a90611a8d565b80601f016020809104026020016040519081016040528092919081815260200182805461043690611a8d565b80156104835780601f1061045857610100808354040283529160200191610483565b820191906000526020600020905b81548152906001019060200180831161046657829003601f168201915b5050505050905090565b600061049882610f5b565b6104fe5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b60006105258261087e565b9050806001600160a01b0316836001600160a01b031614156105935760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016104f5565b336001600160a01b03821614806105af57506105af8133610e1e565b6106215760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016104f5565b61062b8383610fa5565b505050565b61063a3382611013565b6106565760405162461bcd60e51b81526004016104f5906119b9565b61062b8383836110dd565b600061066c8361090a565b821061068a5760405162461bcd60e51b81526004016104f5906118e7565b6000805b6002548110156106fb57600281815481106106ab576106ab611b19565b6000918252602090912001546001600160a01b03868116911614156106e957838214156106db5791506103f59050565b816106e581611ac8565b9250505b806106f381611ac8565b91505061068e565b5060405162461bcd60e51b81526004016104f5906118e7565b61062b83838360405180602001604052806000815250610bdd565b6005546001600160a01b031633146107595760405162461bcd60e51b81526004016104f590611984565b600780546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60025460009082106107ec5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016104f5565b5090565b600680546107fd90611a8d565b80601f016020809104026020016040519081016040528092919081815260200182805461082990611a8d565b80156108765780601f1061084b57610100808354040283529160200191610876565b820191906000526020600020905b81548152906001019060200180831161085957829003601f168201915b505050505081565b6000806002838154811061089457610894611b19565b6000918252602090912001546001600160a01b03169050806103f55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016104f5565b60006001600160a01b0382166109755760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016104f5565b600254600090815b818110156109d3576002818154811061099857610998611b19565b6000918252602090912001546001600160a01b03868116911614156109c3576109c083611ac8565b92505b6109cc81611ac8565b905061097d565b50909392505050565b6005546001600160a01b03163314610a065760405162461bcd60e51b81526004016104f590611984565b610a106000611233565b565b6005546001600160a01b03163314610a3c5760405162461bcd60e51b81526004016104f590611984565b8051610a4f906006906020840190611450565b5050565b60606001805461040a90611a8d565b6007546201000090046001600160a01b03163314610ab25760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc811195b9a5959609a1b60448201526064016104f5565b816001600160a01b0316610ac58261087e565b6001600160a01b031614610b0b5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b60448201526064016104f5565b610a4f8261dead83610630565b6001600160a01b038216331415610b715760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104f5565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610be73383611013565b610c035760405162461bcd60e51b81526004016104f5906119b9565b610c0f84848484611285565b50505050565b6005546001600160a01b03163314610c3f5760405162461bcd60e51b81526004016104f590611984565b6007805461ffff191661ffff92909216919091179055565b6060610c6282610f5b565b610cc65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016104f5565b6000610cd06112b8565b90506000815111610cf05760405180602001604052806000815250610d11565b80604051602001610d01919061187b565b6040516020818303038152906040525b9392505050565b6005546001600160a01b03163314610d425760405162461bcd60e51b81526004016104f590611984565b60025460075461ffff16610d5960ff851683611a3b565b61ffff161115610da15760405162461bcd60e51b815260206004820152601360248201527222bc31b2b232b99036b0bc1039bab838363c9760691b60448201526064016104f5565b60005b82518160ff161015610c0f5760005b8460ff168160ff161015610e0b57610df9848360ff1681518110610dd957610dd9611b19565b60200260200101518260ff1685610df09190611a3b565b61ffff166112c7565b80610e0381611ae3565b915050610db3565b5080610e1681611ae3565b915050610da4565b6007546000906201000090046001600160a01b0316331415610e42575060016103f5565b6001600160a01b0380841660009081526004602090815260408083209386168352929052205460ff16610d11565b6005546001600160a01b03163314610e9a5760405162461bcd60e51b81526004016104f590611984565b6001600160a01b038116610eff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104f5565b610f0881611233565b50565b60006001600160e01b031982166380ac58cd60e01b1480610f3c57506001600160e01b03198216635b5e139f60e01b145b806103f557506301ffc9a760e01b6001600160e01b03198316146103f5565b600254600090821080156103f5575060006001600160a01b031660028381548110610f8857610f88611b19565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610fda8261087e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061101e82610f5b565b61107f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016104f5565b600061108a8361087e565b9050806001600160a01b0316846001600160a01b031614806110c55750836001600160a01b03166110ba8461048d565b6001600160a01b0316145b806110d557506110d58185610e1e565b949350505050565b826001600160a01b03166110f08261087e565b6001600160a01b0316146111585760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016104f5565b6001600160a01b0382166111ba5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104f5565b6111c5600082610fa5565b81600282815481106111d9576111d9611b19565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6112908484846110dd565b61129c84848484611343565b610c0f5760405162461bcd60e51b81526004016104f590611932565b60606006805461040a90611a8d565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561144557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611387903390899088908890600401611897565b602060405180830381600087803b1580156113a157600080fd5b505af19250505080156113d1575060408051601f3d908101601f191682019092526113ce918101906116dd565b60015b61142b573d8080156113ff576040519150601f19603f3d011682016040523d82523d6000602084013e611404565b606091505b5080516114235760405162461bcd60e51b81526004016104f590611932565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506110d5565b506001949350505050565b82805461145c90611a8d565b90600052602060002090601f01602090048101928261147e57600085556114c4565b82601f1061149757805160ff19168380011785556114c4565b828001600101855582156114c4579182015b828111156114c45782518255916020019190600101906114a9565b506107ec9291505b808211156107ec57600081556001016114cc565b600067ffffffffffffffff8311156114fa576114fa611b2f565b61150d601f8401601f1916602001611a0a565b905082815283838301111561152157600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461154f57600080fd5b919050565b60006020828403121561156657600080fd5b610d1182611538565b6000806040838503121561158257600080fd5b61158b83611538565b915061159960208401611538565b90509250929050565b6000806000606084860312156115b757600080fd5b6115c084611538565b92506115ce60208501611538565b9150604084013590509250925092565b600080600080608085870312156115f457600080fd5b6115fd85611538565b935061160b60208601611538565b925060408501359150606085013567ffffffffffffffff81111561162e57600080fd5b8501601f8101871361163f57600080fd5b61164e878235602084016114e0565b91505092959194509250565b6000806040838503121561166d57600080fd5b61167683611538565b91506020830135801515811461168b57600080fd5b809150509250929050565b600080604083850312156116a957600080fd5b6116b283611538565b946020939093013593505050565b6000602082840312156116d257600080fd5b8135610d1181611b45565b6000602082840312156116ef57600080fd5b8151610d1181611b45565b60006020828403121561170c57600080fd5b813567ffffffffffffffff81111561172357600080fd5b8201601f8101841361173457600080fd5b6110d5848235602084016114e0565b60006020828403121561175557600080fd5b813561ffff81168114610d1157600080fd5b60006020828403121561177957600080fd5b5035919050565b6000806040838503121561179357600080fd5b823560ff811681146117a457600080fd5b915060208381013567ffffffffffffffff808211156117c257600080fd5b818601915086601f8301126117d657600080fd5b8135818111156117e8576117e8611b2f565b8060051b91506117f9848301611a0a565b8181528481019084860184860187018b101561181457600080fd5b600095505b8386101561183e5761182a81611538565b835260019590950194918601918601611819565b508096505050505050509250929050565b60008151808452611867816020860160208601611a61565b601f01601f19169290920160200192915050565b6000825161188d818460208701611a61565b9190910192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906118ca9083018461184f565b9695505050505050565b602081526000610d11602083018461184f565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a3357611a33611b2f565b604052919050565b600061ffff808316818516808303821115611a5857611a58611b03565b01949350505050565b60005b83811015611a7c578181015183820152602001611a64565b83811115610c0f5750506000910152565b600181811c90821680611aa157607f821691505b60208210811415611ac257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611adc57611adc611b03565b5060010190565b600060ff821660ff811415611afa57611afa611b03565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f0857600080fdfea264697066735822122084fa9ebd060c19f501dc166d2e3177ab80791e6146862c0e2f07efcebeb4689b64736f6c63430008070033

Deployed Bytecode Sourcemap

29362:2354:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28056:224;;;;;;:::i;:::-;;:::i;:::-;;;6629:14:1;;6622:22;6604:41;;6592:2;6577:18;28056:224:0;;;;;;;;16669:100;;;:::i;:::-;;;;;;;:::i;17481:308::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5927:32:1;;;5909:51;;5897:2;5882:18;17481:308:0;5763:203:1;17004:411:0;;;;;;:::i;:::-;;:::i;:::-;;28356:110;28444:7;:14;28356:110;;;14740:25:1;;;14728:2;14713:18;28356:110:0;14594:177:1;18540:376:0;;;;;;:::i;:::-;;:::i;28832:490::-;;;;;;:::i;:::-;;:::i;18987:185::-;;;;;;:::i;:::-;;:::i;30701:119::-;;;;;;:::i;:::-;;:::i;28543:205::-;;;;;;:::i;:::-;;:::i;29590:36::-;;;;;;;;-1:-1:-1;;;;;29590:36:0;;;29457:81;;;:::i;16276:326::-;;;;;;:::i;:::-;;:::i;15768:446::-;;;;;;:::i;:::-;;:::i;3779:103::-;;;:::i;31255:102::-;;;;;;:::i;:::-;;:::i;3128:87::-;3201:6;;-1:-1:-1;;;;;3201:6:0;3128:87;;16838:104;;;:::i;30416:278::-;;;;;;:::i;:::-;;:::i;17861:327::-;;;;;;:::i;:::-;;:::i;19243:365::-;;;;;;:::i;:::-;;:::i;31367:89::-;;;;;;:::i;:::-;;:::i;30835:405::-;;;;;;:::i;:::-;;:::i;29724:443::-;;;;;;:::i;:::-;;:::i;29553:30::-;;;;;;;;;;;;14575:6:1;14563:19;;;14545:38;;14533:2;14518:18;29553:30:0;14401:188:1;30174:233:0;;;;;;:::i;:::-;;:::i;4037:201::-;;;;;;:::i;:::-;;:::i;28056:224::-;28158:4;-1:-1:-1;;;;;;28182:50:0;;-1:-1:-1;;;28182:50:0;;:90;;;28236:36;28260:11;28236:23;:36::i;:::-;28175:97;28056:224;-1:-1:-1;;28056:224:0:o;16669:100::-;16723:13;16756:5;16749:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16669:100;:::o;17481:308::-;17602:7;17649:16;17657:7;17649;:16::i;:::-;17627:110;;;;-1:-1:-1;;;17627:110:0;;11770:2:1;17627:110:0;;;11752:21:1;11809:2;11789:18;;;11782:30;11848:34;11828:18;;;11821:62;-1:-1:-1;;;11899:18:1;;;11892:42;11951:19;;17627:110:0;;;;;;;;;-1:-1:-1;17757:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;17757:24:0;;17481:308::o;17004:411::-;17085:13;17101:23;17116:7;17101:14;:23::i;:::-;17085:39;;17149:5;-1:-1:-1;;;;;17143:11:0;:2;-1:-1:-1;;;;;17143:11:0;;;17135:57;;;;-1:-1:-1;;;17135:57:0;;13370:2:1;17135:57:0;;;13352:21:1;13409:2;13389:18;;;13382:30;13448:34;13428:18;;;13421:62;-1:-1:-1;;;13499:18:1;;;13492:31;13540:19;;17135:57:0;13168:397:1;17135:57:0;1932:10;-1:-1:-1;;;;;17227:21:0;;;;:62;;-1:-1:-1;17252:37:0;17269:5;1932:10;30174:233;:::i;17252:37::-;17205:168;;;;-1:-1:-1;;;17205:168:0;;10182:2:1;17205:168:0;;;10164:21:1;10221:2;10201:18;;;10194:30;10260:34;10240:18;;;10233:62;10331:26;10311:18;;;10304:54;10375:19;;17205:168:0;9980:420:1;17205:168:0;17386:21;17395:2;17399:7;17386:8;:21::i;:::-;17074:341;17004:411;;:::o;18540:376::-;18749:41;1932:10;18782:7;18749:18;:41::i;:::-;18727:140;;;;-1:-1:-1;;;18727:140:0;;;;;;;:::i;:::-;18880:28;18890:4;18896:2;18900:7;18880:9;:28::i;28832:490::-;28929:15;28973:16;28983:5;28973:9;:16::i;:::-;28965:5;:24;28957:80;;;;-1:-1:-1;;;28957:80:0;;;;;;;:::i;:::-;29050:10;29075:6;29071:178;29087:7;:14;29083:18;;29071:178;;;29134:7;29142:1;29134:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;29125:19:0;;;29134:10;;29125:19;29122:116;;;29176:5;29167;:14;29164:58;;;29190:1;-1:-1:-1;29183:8:0;;-1:-1:-1;29183:8:0;29164:58;29215:7;;;;:::i;:::-;;;;29164:58;29103:3;;;;:::i;:::-;;;;29071:178;;;;29261:53;;-1:-1:-1;;;29261:53:0;;;;;;;:::i;18987:185::-;19125:39;19142:4;19148:2;19152:7;19125:39;;;;;;;;;;;;:16;:39::i;30701:119::-;3201:6;;-1:-1:-1;;;;;3201:6:0;1932:10;3348:23;3340:68;;;;-1:-1:-1;;;3340:68:0;;;;;;;:::i;:::-;30782:21:::1;:32:::0;;-1:-1:-1;;;;;30782:32:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;30782:32:0;;::::1;::::0;;;::::1;::::0;;30701:119::o;28543:205::-;28654:7;:14;28618:7;;28646:22;;28638:79;;;;-1:-1:-1;;;28638:79:0;;14190:2:1;28638:79:0;;;14172:21:1;14229:2;14209:18;;;14202:30;14268:34;14248:18;;;14241:62;-1:-1:-1;;;14319:18:1;;;14312:42;14371:19;;28638:79:0;13988:408:1;28638:79:0;-1:-1:-1;28735:5:0;28543:205::o;29457:81::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16276:326::-;16393:7;16418:13;16434:7;16442;16434:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;16434:16:0;;-1:-1:-1;16483:19:0;16461:110;;;;-1:-1:-1;;;16461:110:0;;11360:2:1;16461:110:0;;;11342:21:1;11399:2;11379:18;;;11372:30;11438:34;11418:18;;;11411:62;-1:-1:-1;;;11489:18:1;;;11482:39;11538:19;;16461:110:0;11158:405:1;15768:446:0;15890:4;-1:-1:-1;;;;;15921:19:0;;15913:74;;;;-1:-1:-1;;;15913:74:0;;10949:2:1;15913:74:0;;;10931:21:1;10988:2;10968:18;;;10961:30;11027:34;11007:18;;;11000:62;-1:-1:-1;;;11078:18:1;;;11071:40;11128:19;;15913:74:0;10747:406:1;15913:74:0;16034:7;:14;16000:10;;;16059:101;16076:6;16072:1;:10;16059:101;;;16115:7;16123:1;16115:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;16106:19:0;;;16115:10;;16106:19;16102:46;;;16141:7;;;:::i;:::-;;;16102:46;16084:3;;;:::i;:::-;;;16059:101;;;-1:-1:-1;16201:5:0;;15768:446;-1:-1:-1;;;15768:446:0:o;3779:103::-;3201:6;;-1:-1:-1;;;;;3201:6:0;1932:10;3348:23;3340:68;;;;-1:-1:-1;;;3340:68:0;;;;;;;:::i;:::-;3844:30:::1;3871:1;3844:18;:30::i;:::-;3779:103::o:0;31255:102::-;3201:6;;-1:-1:-1;;;;;3201:6:0;1932:10;3348:23;3340:68;;;;-1:-1:-1;;;3340:68:0;;;;;;;:::i;:::-;31329:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;31255:102:::0;:::o;16838:104::-;16894:13;16927:7;16920:14;;;;;:::i;30416:278::-;30503:21;;;;;-1:-1:-1;;;;;30503:21:0;30489:10;:35;30481:61;;;;-1:-1:-1;;;30481:61:0;;9427:2:1;30481:61:0;;;9409:21:1;9466:2;9446:18;;;9439:30;-1:-1:-1;;;9485:18:1;;;9478:43;9538:18;;30481:61:0;9225:337:1;30481:61:0;30576:8;-1:-1:-1;;;;;30556:28:0;:16;30564:7;30556;:16::i;:::-;-1:-1:-1;;;;;30556:28:0;;30548:55;;;;-1:-1:-1;;;30548:55:0;;10607:2:1;30548:55:0;;;10589:21:1;10646:2;10626:18;;;10619:30;-1:-1:-1;;;10665:18:1;;;10658:43;10718:18;;30548:55:0;10405:337:1;30548:55:0;30610:78;30624:8;30635:42;30680:7;30610:12;:78::i;17861:327::-;-1:-1:-1;;;;;17996:24:0;;1932:10;17996:24;;17988:62;;;;-1:-1:-1;;;17988:62:0;;9073:2:1;17988:62:0;;;9055:21:1;9112:2;9092:18;;;9085:30;9151:27;9131:18;;;9124:55;9196:18;;17988:62:0;8871:349:1;17988:62:0;1932:10;18063:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;18063:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;18063:53:0;;;;;;;;;;18132:48;;6604:41:1;;;18063:42:0;;1932:10;18132:48;;6577:18:1;18132:48:0;;;;;;;17861:327;;:::o;19243:365::-;19432:41;1932:10;19465:7;19432:18;:41::i;:::-;19410:140;;;;-1:-1:-1;;;19410:140:0;;;;;;;:::i;:::-;19561:39;19575:4;19581:2;19585:7;19594:5;19561:13;:39::i;:::-;19243:365;;;;:::o;31367:89::-;3201:6;;-1:-1:-1;;;;;3201:6:0;1932:10;3348:23;3340:68;;;;-1:-1:-1;;;3340:68:0;;;;;;;:::i;:::-;31431:9:::1;:19:::0;;-1:-1:-1;;31431:19:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;31367:89::o;30835:405::-;30934:13;30975:17;30983:8;30975:7;:17::i;:::-;30959:98;;;;-1:-1:-1;;;30959:98:0;;12954:2:1;30959:98:0;;;12936:21:1;12993:2;12973:18;;;12966:30;13032:34;13012:18;;;13005:62;-1:-1:-1;;;13083:18:1;;;13076:45;13138:19;;30959:98:0;12752:411:1;30959:98:0;31081:28;31112:10;:8;:10::i;:::-;31081:41;;31167:1;31142:14;31136:28;:32;:98;;;;;;;;;;;;;;;;;31204:14;31187:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;31136:98;31129:105;30835:405;-1:-1:-1;;;30835:405:0:o;29724:443::-;3201:6;;-1:-1:-1;;;;;3201:6:0;1932:10;3348:23;3340:68;;;;-1:-1:-1;;;3340:68:0;;;;;;;:::i;:::-;29843:7:::1;:14:::0;29907:9:::1;::::0;::::1;;29878:25;;::::0;::::1;29843:14:::0;29878:25:::1;:::i;:::-;:38;;;;29870:70;;;::::0;-1:-1:-1;;;29870:70:0;;7082:2:1;29870:70:0::1;::::0;::::1;7064:21:1::0;7121:2;7101:18;;;7094:30;-1:-1:-1;;;7140:18:1;;;7133:49;7199:18;;29870:70:0::1;6880:343:1::0;29870:70:0::1;29951:7;29947:139;29964:9;:16;29960:1;:20;;;29947:139;;;29999:7;29995:83;30013:11;30009:15;;:1;:15;;;29995:83;;;30039:37;30045:9;30055:1;30045:12;;;;;;;;;;:::i;:::-;;;;;;;30074:1;30060:15;;:11;:15;;;;:::i;:::-;30039:37;;:5;:37::i;:::-;30027:3:::0;::::1;::::0;::::1;:::i;:::-;;;;29995:83;;;-1:-1:-1::0;29983:3:0;::::1;::::0;::::1;:::i;:::-;;;;29947:139;;30174:233:::0;30306:21;;30264:4;;30306:21;;;-1:-1:-1;;;;;30306:21:0;30293:10;:34;30289:52;;;-1:-1:-1;30337:4:0;30330:11;;30289:52;-1:-1:-1;;;;;18430:25:0;;;18401:4;18430:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;30359:40;18259:214;4037:201;3201:6;;-1:-1:-1;;;;;3201:6:0;1932:10;3348:23;3340:68;;;;-1:-1:-1;;;3340:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4126:22:0;::::1;4118:73;;;::::0;-1:-1:-1;;;4118:73:0;;8261:2:1;4118:73:0::1;::::0;::::1;8243:21:1::0;8300:2;8280:18;;;8273:30;8339:34;8319:18;;;8312:62;-1:-1:-1;;;8390:18:1;;;8383:36;8436:19;;4118:73:0::1;8059:402:1::0;4118:73:0::1;4202:28;4221:8;4202:18;:28::i;:::-;4037:201:::0;:::o;15349:355::-;15496:4;-1:-1:-1;;;;;;15538:40:0;;-1:-1:-1;;;15538:40:0;;:105;;-1:-1:-1;;;;;;;15595:48:0;;-1:-1:-1;;;15595:48:0;15538:105;:158;;;-1:-1:-1;;;;;;;;;;7518:40:0;;;15660:36;7409:157;21155:155;21254:7;:14;21220:4;;21244:24;;:58;;;;;21300:1;-1:-1:-1;;;;;21272:30:0;:7;21280;21272:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;21272:16:0;:30;;21237:65;21155:155;-1:-1:-1;;21155:155:0:o;25180:174::-;25255:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;25255:29:0;-1:-1:-1;;;;;25255:29:0;;;;;;;;:24;;25309:23;25255:24;25309:14;:23::i;:::-;-1:-1:-1;;;;;25300:46:0;;;;;;;;;;;25180:174;;:::o;21477:452::-;21606:4;21650:16;21658:7;21650;:16::i;:::-;21628:110;;;;-1:-1:-1;;;21628:110:0;;9769:2:1;21628:110:0;;;9751:21:1;9808:2;9788:18;;;9781:30;9847:34;9827:18;;;9820:62;-1:-1:-1;;;9898:18:1;;;9891:42;9950:19;;21628:110:0;9567:408:1;21628:110:0;21749:13;21765:23;21780:7;21765:14;:23::i;:::-;21749:39;;21818:5;-1:-1:-1;;;;;21807:16:0;:7;-1:-1:-1;;;;;21807:16:0;;:64;;;;21864:7;-1:-1:-1;;;;;21840:31:0;:20;21852:7;21840:11;:20::i;:::-;-1:-1:-1;;;;;21840:31:0;;21807:64;:113;;;;21888:32;21905:5;21912:7;21888:16;:32::i;:::-;21799:122;21477:452;-1:-1:-1;;;;21477:452:0:o;24509:553::-;24682:4;-1:-1:-1;;;;;24655:31:0;:23;24670:7;24655:14;:23::i;:::-;-1:-1:-1;;;;;24655:31:0;;24633:122;;;;-1:-1:-1;;;24633:122:0;;12544:2:1;24633:122:0;;;12526:21:1;12583:2;12563:18;;;12556:30;12622:34;12602:18;;;12595:62;-1:-1:-1;;;12673:18:1;;;12666:39;12722:19;;24633:122:0;12342:405:1;24633:122:0;-1:-1:-1;;;;;24774:16:0;;24766:65;;;;-1:-1:-1;;;24766:65:0;;8668:2:1;24766:65:0;;;8650:21:1;8707:2;8687:18;;;8680:30;8746:34;8726:18;;;8719:62;-1:-1:-1;;;8797:18:1;;;8790:34;8841:19;;24766:65:0;8466:400:1;24766:65:0;24948:29;24965:1;24969:7;24948:8;:29::i;:::-;25007:2;24988:7;24996;24988:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;24988:21:0;-1:-1:-1;;;;;24988:21:0;;;;;;25027:27;;25046:7;;25027:27;;;;;;;;;;24988:16;25027:27;24509:553;;;:::o;4398:191::-;4491:6;;;-1:-1:-1;;;;;4508:17:0;;;-1:-1:-1;;;;;;4508:17:0;;;;;;;4541:40;;4491:6;;;4508:17;4491:6;;4541:40;;4472:16;;4541:40;4461:128;4398:191;:::o;20490:352::-;20647:28;20657:4;20663:2;20667:7;20647:9;:28::i;:::-;20708:48;20731:4;20737:2;20741:7;20750:5;20708:22;:48::i;:::-;20686:148;;;;-1:-1:-1;;;20686:148:0;;;;;;;:::i;31625:88::-;31669:13;31698:9;31691:16;;;;;:::i;31465:154::-;31546:7;:16;;;;;;;-1:-1:-1;31546:16:0;;;;;;;-1:-1:-1;;;;;;31546:16:0;-1:-1:-1;;;;;31546:16:0;;;;;;;;31578:33;;31603:7;;-1:-1:-1;31578:33:0;;-1:-1:-1;;31578:33:0;31465:154;;:::o;25919:980::-;26074:4;-1:-1:-1;;;;;26095:13:0;;14549:20;14597:8;26091:801;;26148:175;;-1:-1:-1;;;26148:175:0;;-1:-1:-1;;;;;26148:36:0;;;;;:175;;1932:10;;26242:4;;26269:7;;26299:5;;26148:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26148:175:0;;;;;;;;-1:-1:-1;;26148:175:0;;;;;;;;;;;;:::i;:::-;;;26127:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26506:13:0;;26502:320;;26549:108;;-1:-1:-1;;;26549:108:0;;;;;;;:::i;26502:320::-;26772:6;26766:13;26757:6;26753:2;26749:15;26742:38;26127:710;-1:-1:-1;;;;;;26387:51:0;-1:-1:-1;;;26387:51:0;;-1:-1:-1;26380:58:0;;26091:801;-1:-1:-1;26876:4:0;25919:980;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:186::-;662:6;715:2;703:9;694:7;690:23;686:32;683:52;;;731:1;728;721:12;683:52;754:29;773:9;754:29;:::i;794:260::-;862:6;870;923:2;911:9;902:7;898:23;894:32;891:52;;;939:1;936;929:12;891:52;962:29;981:9;962:29;:::i;:::-;952:39;;1010:38;1044:2;1033:9;1029:18;1010:38;:::i;:::-;1000:48;;794:260;;;;;:::o;1059:328::-;1136:6;1144;1152;1205:2;1193:9;1184:7;1180:23;1176:32;1173:52;;;1221:1;1218;1211:12;1173:52;1244:29;1263:9;1244:29;:::i;:::-;1234:39;;1292:38;1326:2;1315:9;1311:18;1292:38;:::i;:::-;1282:48;;1377:2;1366:9;1362:18;1349:32;1339:42;;1059:328;;;;;:::o;1392:666::-;1487:6;1495;1503;1511;1564:3;1552:9;1543:7;1539:23;1535:33;1532:53;;;1581:1;1578;1571:12;1532:53;1604:29;1623:9;1604:29;:::i;:::-;1594:39;;1652:38;1686:2;1675:9;1671:18;1652:38;:::i;:::-;1642:48;;1737:2;1726:9;1722:18;1709:32;1699:42;;1792:2;1781:9;1777:18;1764:32;1819:18;1811:6;1808:30;1805:50;;;1851:1;1848;1841:12;1805:50;1874:22;;1927:4;1919:13;;1915:27;-1:-1:-1;1905:55:1;;1956:1;1953;1946:12;1905:55;1979:73;2044:7;2039:2;2026:16;2021:2;2017;2013:11;1979:73;:::i;:::-;1969:83;;;1392:666;;;;;;;:::o;2063:347::-;2128:6;2136;2189:2;2177:9;2168:7;2164:23;2160:32;2157:52;;;2205:1;2202;2195:12;2157:52;2228:29;2247:9;2228:29;:::i;:::-;2218:39;;2307:2;2296:9;2292:18;2279:32;2354:5;2347:13;2340:21;2333:5;2330:32;2320:60;;2376:1;2373;2366:12;2320:60;2399:5;2389:15;;;2063:347;;;;;:::o;2415:254::-;2483:6;2491;2544:2;2532:9;2523:7;2519:23;2515:32;2512:52;;;2560:1;2557;2550:12;2512:52;2583:29;2602:9;2583:29;:::i;:::-;2573:39;2659:2;2644:18;;;;2631:32;;-1:-1:-1;;;2415:254:1:o;2674:245::-;2732:6;2785:2;2773:9;2764:7;2760:23;2756:32;2753:52;;;2801:1;2798;2791:12;2753:52;2840:9;2827:23;2859:30;2883:5;2859:30;:::i;2924:249::-;2993:6;3046:2;3034:9;3025:7;3021:23;3017:32;3014:52;;;3062:1;3059;3052:12;3014:52;3094:9;3088:16;3113:30;3137:5;3113:30;:::i;3178:450::-;3247:6;3300:2;3288:9;3279:7;3275:23;3271:32;3268:52;;;3316:1;3313;3306:12;3268:52;3356:9;3343:23;3389:18;3381:6;3378:30;3375:50;;;3421:1;3418;3411:12;3375:50;3444:22;;3497:4;3489:13;;3485:27;-1:-1:-1;3475:55:1;;3526:1;3523;3516:12;3475:55;3549:73;3614:7;3609:2;3596:16;3591:2;3587;3583:11;3549:73;:::i;3633:272::-;3691:6;3744:2;3732:9;3723:7;3719:23;3715:32;3712:52;;;3760:1;3757;3750:12;3712:52;3799:9;3786:23;3849:6;3842:5;3838:18;3831:5;3828:29;3818:57;;3871:1;3868;3861:12;3910:180;3969:6;4022:2;4010:9;4001:7;3997:23;3993:32;3990:52;;;4038:1;4035;4028:12;3990:52;-1:-1:-1;4061:23:1;;3910:180;-1:-1:-1;3910:180:1:o;4095:1120::-;4186:6;4194;4247:2;4235:9;4226:7;4222:23;4218:32;4215:52;;;4263:1;4260;4253:12;4215:52;4302:9;4289:23;4352:4;4345:5;4341:16;4334:5;4331:27;4321:55;;4372:1;4369;4362:12;4321:55;4395:5;-1:-1:-1;4419:2:1;4457:18;;;4444:32;4495:18;4525:14;;;4522:34;;;4552:1;4549;4542:12;4522:34;4590:6;4579:9;4575:22;4565:32;;4635:7;4628:4;4624:2;4620:13;4616:27;4606:55;;4657:1;4654;4647:12;4606:55;4693:2;4680:16;4715:2;4711;4708:10;4705:36;;;4721:18;;:::i;:::-;4767:2;4764:1;4760:10;4750:20;;4790:28;4814:2;4810;4806:11;4790:28;:::i;:::-;4852:15;;;4883:12;;;;4915:11;;;4945;;;4941:20;;4938:33;-1:-1:-1;4935:53:1;;;4984:1;4981;4974:12;4935:53;5006:1;4997:10;;5016:169;5030:2;5027:1;5024:9;5016:169;;;5087:23;5106:3;5087:23;:::i;:::-;5075:36;;5048:1;5041:9;;;;;5131:12;;;;5163;;5016:169;;;5020:3;5204:5;5194:15;;;;;;;;4095:1120;;;;;:::o;5220:257::-;5261:3;5299:5;5293:12;5326:6;5321:3;5314:19;5342:63;5398:6;5391:4;5386:3;5382:14;5375:4;5368:5;5364:16;5342:63;:::i;:::-;5459:2;5438:15;-1:-1:-1;;5434:29:1;5425:39;;;;5466:4;5421:50;;5220:257;-1:-1:-1;;5220:257:1:o;5482:276::-;5613:3;5651:6;5645:13;5667:53;5713:6;5708:3;5701:4;5693:6;5689:17;5667:53;:::i;:::-;5736:16;;;;;5482:276;-1:-1:-1;;5482:276:1:o;5971:488::-;-1:-1:-1;;;;;6240:15:1;;;6222:34;;6292:15;;6287:2;6272:18;;6265:43;6339:2;6324:18;;6317:34;;;6387:3;6382:2;6367:18;;6360:31;;;6165:4;;6408:45;;6433:19;;6425:6;6408:45;:::i;:::-;6400:53;5971:488;-1:-1:-1;;;;;;5971:488:1:o;6656:219::-;6805:2;6794:9;6787:21;6768:4;6825:44;6865:2;6854:9;6850:18;6842:6;6825:44;:::i;7228:407::-;7430:2;7412:21;;;7469:2;7449:18;;;7442:30;7508:34;7503:2;7488:18;;7481:62;-1:-1:-1;;;7574:2:1;7559:18;;7552:41;7625:3;7610:19;;7228:407::o;7640:414::-;7842:2;7824:21;;;7881:2;7861:18;;;7854:30;7920:34;7915:2;7900:18;;7893:62;-1:-1:-1;;;7986:2:1;7971:18;;7964:48;8044:3;8029:19;;7640:414::o;11981:356::-;12183:2;12165:21;;;12202:18;;;12195:30;12261:34;12256:2;12241:18;;12234:62;12328:2;12313:18;;11981:356::o;13570:413::-;13772:2;13754:21;;;13811:2;13791:18;;;13784:30;13850:34;13845:2;13830:18;;13823:62;-1:-1:-1;;;13916:2:1;13901:18;;13894:47;13973:3;13958:19;;13570:413::o;14776:275::-;14847:2;14841:9;14912:2;14893:13;;-1:-1:-1;;14889:27:1;14877:40;;14947:18;14932:34;;14968:22;;;14929:62;14926:88;;;14994:18;;:::i;:::-;15030:2;15023:22;14776:275;;-1:-1:-1;14776:275:1:o;15056:224::-;15095:3;15123:6;15156:2;15153:1;15149:10;15186:2;15183:1;15179:10;15217:3;15213:2;15209:12;15204:3;15201:21;15198:47;;;15225:18;;:::i;:::-;15261:13;;15056:224;-1:-1:-1;;;;15056:224:1:o;15285:258::-;15357:1;15367:113;15381:6;15378:1;15375:13;15367:113;;;15457:11;;;15451:18;15438:11;;;15431:39;15403:2;15396:10;15367:113;;;15498:6;15495:1;15492:13;15489:48;;;-1:-1:-1;;15533:1:1;15515:16;;15508:27;15285:258::o;15548:380::-;15627:1;15623:12;;;;15670;;;15691:61;;15745:4;15737:6;15733:17;15723:27;;15691:61;15798:2;15790:6;15787:14;15767:18;15764:38;15761:161;;;15844:10;15839:3;15835:20;15832:1;15825:31;15879:4;15876:1;15869:15;15907:4;15904:1;15897:15;15761:161;;15548:380;;;:::o;15933:135::-;15972:3;-1:-1:-1;;15993:17:1;;15990:43;;;16013:18;;:::i;:::-;-1:-1:-1;16060:1:1;16049:13;;15933:135::o;16073:175::-;16110:3;16154:4;16147:5;16143:16;16183:4;16174:7;16171:17;16168:43;;;16191:18;;:::i;:::-;16240:1;16227:15;;16073:175;-1:-1:-1;;16073:175:1:o;16253:127::-;16314:10;16309:3;16305:20;16302:1;16295:31;16345:4;16342:1;16335:15;16369:4;16366:1;16359:15;16385:127;16446:10;16441:3;16437:20;16434:1;16427:31;16477:4;16474:1;16467:15;16501:4;16498:1;16491:15;16517:127;16578:10;16573:3;16569:20;16566:1;16559:31;16609:4;16606:1;16599:15;16633:4;16630:1;16623:15;16649:131;-1:-1:-1;;;;;;16723:32:1;;16713:43;;16703:71;;16770:1;16767;16760:12

Swarm Source

ipfs://84fa9ebd060c19f501dc166d2e3177ab80791e6146862c0e2f07efcebeb4689b
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.