ETH Price: $3,066.60 (+2.52%)
Gas: 4 Gwei

Token

Fluffy Fucks (FFXv2)
 

Overview

Max Total Supply

6,060 FFXv2

Holders

1,601

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 FFXv2
0x1b1aa9a5d1f56f4cb705754e54f4eae47912f25a
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:
FluffyFucksReborn

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
petersburg EvmVersion, None license

Contract Source Code (Solidity)

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

// 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/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            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);

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @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`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

    // ==============================
    //        IERC721Metadata
    // ==============================

    /**
     * @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: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * @dev Returns the starting token ID. 
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count. 
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), 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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }
            
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

// File: erc721a/contracts/extensions/IERC721AQueryable.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev Interface of an ERC721AQueryable compliant contract.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

// File: erc721a/contracts/extensions/ERC721AQueryable.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;



/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

// File: contracts/FluffyFucksReborn.sol



pragma solidity >=0.7.0 <0.9.0;




contract FluffyFucksReborn is ERC721AQueryable, Ownable {
  using Strings for uint256;

  string public uriPrefix = ""; //http://www.site.com/data/
  string public uriSuffix = ".json";

  string public _contractURI = "";

  uint256 public maxSupply = 6061;

  bool public paused = false;

  constructor() ERC721A("Fluffy Fucks", "FFXv2") {
  }

  function _startTokenId()
        internal
        pure
        override
        returns(uint256)
    {
        return 1;
    }

  function mintForAddress(uint256 _mintAmount, address _receiver) public onlyOwner {
    require(!paused, "The contract is paused!");
    require(totalSupply() + _mintAmount < maxSupply, "Max supply exceeded!");
    _safeMint(_receiver, _mintAmount);
  }

  function mintForAddressMultiple(address[] calldata addresses, uint256[] calldata amount) public onlyOwner
  {
    require(!paused, "The contract is paused!");
    require(addresses.length == amount.length, "Address and amount length mismatch");

    for (uint256 i; i < addresses.length; ++i)
    {
      _safeMint(addresses[i], amount[i]);
    }

    require(totalSupply() < maxSupply, "Max supply exceeded!");
  }

  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override (ERC721A, IERC721A)
    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, _tokenId.toString(), uriSuffix))
        : "";
  }

  function contractURI()
  public
  view
  returns (string memory)
  {
        return bytes(_contractURI).length > 0
          ? string(abi.encodePacked(_contractURI))
          : "";
  }

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

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setContractURI(string memory newContractURI) public onlyOwner {
    _contractURI = newContractURI;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function withdraw() public onlyOwner {
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
  }

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

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":[],"name":"_contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"mintForAddressMultiple","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040819052600060808190526200001b916009916200019d565b506040805180820190915260058082527f2e6a736f6e00000000000000000000000000000000000000000000000000000060209092019182526200006291600a916200019d565b506040805160208101918290526000908190526200008391600b916200019d565b506117ad600c55600d805460ff19169055348015620000a157600080fd5b50604080518082018252600c81527f466c75666679204675636b73000000000000000000000000000000000000000060208083019182528351808501909452600584527f46465876320000000000000000000000000000000000000000000000000000009084015281519192916200011c916002916200019d565b508051620001329060039060208401906200019d565b505060016000555062000145336200014b565b62000298565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001ab9062000243565b90600052602060002090601f016020900481019282620001cf57600085556200021a565b82601f10620001ea57805160ff19168380011785556200021a565b828001600101855582156200021a579182015b828111156200021a578251825591602001919060010190620001fd565b50620002289291506200022c565b5090565b5b808211156200022857600081556001016200022d565b600181811c908216806200025857607f821691505b60208210810362000292577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b61224580620002a86000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80637ec4a6591161011a578063c0e72740116100ad578063de6c6d361161007c578063de6c6d361461043d578063e8a3d48514610450578063e985e9c514610458578063efbd73f41461046b578063f2fde38b1461047e57600080fd5b8063c0e72740146103f9578063c23dc68f14610401578063c87b56dd14610421578063d5abeb011461043457600080fd5b806395d89b41116100e957806395d89b41146103b857806399a2557a146103c0578063a22cb465146103d3578063b88d4fde146103e657600080fd5b80637ec4a659146103615780638462151c146103745780638da5cb5b14610394578063938e3d7b146103a557600080fd5b80633ccfd60b1161019d5780635c975abb1161016c5780635c975abb1461031e57806362b99ad41461032b5780636352211e1461033357806370a0823114610346578063715018a61461035957600080fd5b80633ccfd60b146102db57806342842e0e146102e35780635503a0e8146102f65780635bbb2177146102fe57600080fd5b806316ba10e0116101d957806316ba10e01461028857806316c38b3c1461029b57806318160ddd146102ae57806323b872dd146102c857600080fd5b806301ffc9a71461020b57806306fdde0314610233578063081812fc14610248578063095ea7b314610273575b600080fd5b61021e610219366004611a04565b610491565b60405190151581526020015b60405180910390f35b61023b6104e3565b60405161022a9190611a79565b61025b610256366004611a8c565b610575565b6040516001600160a01b03909116815260200161022a565b610286610281366004611ac1565b6105b9565b005b610286610296366004611b88565b61068b565b6102866102a9366004611be0565b6106d5565b60015460005403600019015b60405190815260200161022a565b6102866102d6366004611bfb565b610712565b610286610722565b6102866102f1366004611bfb565b6107ca565b61023b6107e5565b61031161030c366004611c37565b610873565b60405161022a9190611cdc565b600d5461021e9060ff1681565b61023b610939565b61025b610341366004611a8c565b610946565b6102ba610354366004611d46565b610951565b61028661099f565b61028661036f366004611b88565b6109d5565b610387610382366004611d46565b610a12565b60405161022a9190611d61565b6008546001600160a01b031661025b565b6102866103b3366004611b88565b610b13565b61023b610b50565b6103876103ce366004611d99565b610b5f565b6102866103e1366004611dcc565b610ce6565b6102866103f4366004611dff565b610d7b565b61023b610dc5565b61041461040f366004611a8c565b610dd2565b60405161022a9190611e7a565b61023b61042f366004611a8c565b610e47565b6102ba600c5481565b61028661044b366004611efa565b610f14565b61023b61109b565b61021e610466366004611f65565b6110ec565b610286610479366004611f8f565b61111a565b61028661048c366004611d46565b6111fa565b60006301ffc9a760e01b6001600160e01b0319831614806104c257506380ac58cd60e01b6001600160e01b03198316145b806104dd5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546104f290611fb2565b80601f016020809104026020016040519081016040528092919081815260200182805461051e90611fb2565b801561056b5780601f106105405761010080835404028352916020019161056b565b820191906000526020600020905b81548152906001019060200180831161054e57829003601f168201915b5050505050905090565b600061058082611292565b61059d576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006105c4826112c7565b9050806001600160a01b0316836001600160a01b0316036105f85760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161461062f5761061281336110ec565b61062f576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b031633146106be5760405162461bcd60e51b81526004016106b590611fec565b60405180910390fd5b80516106d190600a906020840190611955565b5050565b6008546001600160a01b031633146106ff5760405162461bcd60e51b81526004016106b590611fec565b600d805460ff1916911515919091179055565b61071d838383611336565b505050565b6008546001600160a01b0316331461074c5760405162461bcd60e51b81526004016106b590611fec565b60006107606008546001600160a01b031690565b6001600160a01b0316306001600160a01b03163160405160006040518083038185875af1925050503d80600081146107b4576040519150601f19603f3d011682016040523d82523d6000602084013e6107b9565b606091505b50509050806107c757600080fd5b50565b61071d83838360405180602001604052806000815250610d7b565b600a80546107f290611fb2565b80601f016020809104026020016040519081016040528092919081815260200182805461081e90611fb2565b801561086b5780601f106108405761010080835404028352916020019161086b565b820191906000526020600020905b81548152906001019060200180831161084e57829003601f168201915b505050505081565b80516060906000816001600160401b0381111561089257610892611aeb565b6040519080825280602002602001820160405280156108dd57816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816108b05790505b50905060005b8281146109315761090c8582815181106108ff576108ff612021565b6020026020010151610dd2565b82828151811061091e5761091e612021565b60209081029190910101526001016108e3565b509392505050565b600980546107f290611fb2565b60006104dd826112c7565b60006001600160a01b03821661097a576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146109c95760405162461bcd60e51b81526004016106b590611fec565b6109d360006114dd565b565b6008546001600160a01b031633146109ff5760405162461bcd60e51b81526004016106b590611fec565b80516106d1906009906020840190611955565b60606000806000610a2285610951565b90506000816001600160401b03811115610a3e57610a3e611aeb565b604051908082528060200260200182016040528015610a67578160200160208202803683370190505b509050610a8d604080516060810182526000808252602082018190529181019190915290565b60015b838614610b0757610aa08161152f565b91508160400151610aff5781516001600160a01b031615610ac057815194505b876001600160a01b0316856001600160a01b031603610aff5780838780600101985081518110610af257610af2612021565b6020026020010181815250505b600101610a90565b50909695505050505050565b6008546001600160a01b03163314610b3d5760405162461bcd60e51b81526004016106b590611fec565b80516106d190600b906020840190611955565b6060600380546104f290611fb2565b6060818310610b8157604051631960ccad60e11b815260040160405180910390fd5b600080610b8d60005490565b90506001851015610b9d57600194505b80841115610ba9578093505b6000610bb487610951565b905084861015610bd35785850381811015610bcd578091505b50610bd7565b5060005b6000816001600160401b03811115610bf157610bf1611aeb565b604051908082528060200260200182016040528015610c1a578160200160208202803683370190505b50905081600003610c30579350610cdf92505050565b6000610c3b88610dd2565b905060008160400151610c4c575080515b885b888114158015610c5e5750848714155b15610cd357610c6c8161152f565b92508260400151610ccb5782516001600160a01b031615610c8c57825191505b8a6001600160a01b0316826001600160a01b031603610ccb5780848880600101995081518110610cbe57610cbe612021565b6020026020010181815250505b600101610c4e565b50505092835250909150505b9392505050565b336001600160a01b03831603610d0f5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d86848484611336565b6001600160a01b0383163b15610dbf57610da284848484611564565b610dbf576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600b80546107f290611fb2565b60408051606080820183526000808352602080840182905283850182905284519283018552818352820181905292810192909252906001831080610e1857506000548310155b15610e235792915050565b610e2c8361152f565b9050806040015115610e3e5792915050565b610cdf83611650565b6060610e5282611292565b610eb65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106b5565b6000610ec061167e565b90506000815111610ee05760405180602001604052806000815250610cdf565b80610eea8461168d565b600a604051602001610efe939291906120d0565b6040516020818303038152906040529392505050565b6008546001600160a01b03163314610f3e5760405162461bcd60e51b81526004016106b590611fec565b600d5460ff1615610f8b5760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b60448201526064016106b5565b828114610fe55760405162461bcd60e51b815260206004820152602260248201527f4164647265737320616e6420616d6f756e74206c656e677468206d69736d61746044820152610c6d60f31b60648201526084016106b5565b60005b838110156110485761103885858381811061100557611005612021565b905060200201602081019061101a9190611d46565b84848481811061102c5761102c612021565b9050602002013561178d565b61104181612123565b9050610fe8565b50600c54600154600054036000190110610dbf5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016106b5565b60606000600b80546110ac90611fb2565b9050116110c6575060408051602081019091526000815290565b600b6040516020016110d8919061213c565b604051602081830303815290604052905090565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146111445760405162461bcd60e51b81526004016106b590611fec565b600d5460ff16156111915760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b60448201526064016106b5565b600c5460015460005484919003600019016111ac9190612148565b106111f05760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016106b5565b6106d1818361178d565b6008546001600160a01b031633146112245760405162461bcd60e51b81526004016106b590611fec565b6001600160a01b0381166112895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b5565b6107c7816114dd565b6000816001111580156112a6575060005482105b80156104dd575050600090815260046020526040902054600160e01b161590565b6000818060011161131d5760005481101561131d5760008181526004602052604081205490600160e01b8216900361131b575b80600003610cdf5750600019016000818152600460205260409020546112fa565b505b604051636f96cda160e11b815260040160405180910390fd5b6000611341826112c7565b9050836001600160a01b0316816001600160a01b0316146113745760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611392575061139285336110ec565b806113ad5750336113a284610575565b6001600160a01b0316145b9050806113cd57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166113f457604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091528120600160e11b4260a01b8717811790915583169003611495576001830160008181526004602052604081205490036114935760005481146114935760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60408051606081018252600080825260208201819052918101919091526000828152600460205260409020546104dd906117a7565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611599903390899088908890600401612160565b6020604051808303816000875af19250505080156115d4575060408051601f3d908101601f191682019092526115d19181019061219d565b60015b611632573d808015611602576040519150601f19603f3d011682016040523d82523d6000602084013e611607565b606091505b50805160000361162a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60408051606081018252600080825260208201819052918101919091526104dd611679836112c7565b6117a7565b6060600980546104f290611fb2565b6060816000036116b45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156116de57806116c881612123565b91506116d79050600a836121d0565b91506116b8565b6000816001600160401b038111156116f8576116f8611aeb565b6040519080825280601f01601f191660200182016040528015611722576020820181803683370190505b5090505b8415611648576117376001836121e4565b9150611744600a866121fb565b61174f906030612148565b60f81b81838151811061176457611764612021565b60200101906001600160f81b031916908160001a905350611786600a866121d0565b9450611726565b6106d18282604051806020016040528060008152506117e1565b604080516060810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b90921615159082015290565b6000546001600160a01b03841661180a57604051622e076360e81b815260040160405180910390fd5b8260000361182b5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15611900575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46118c96000878480600101955087611564565b6118e6576040516368d2bf6b60e11b815260040160405180910390fd5b80821061187e5782600054146118fb57600080fd5b611945565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611901575b506000908155610dbf9085838684565b82805461196190611fb2565b90600052602060002090601f01602090048101928261198357600085556119c9565b82601f1061199c57805160ff19168380011785556119c9565b828001600101855582156119c9579182015b828111156119c95782518255916020019190600101906119ae565b506119d59291506119d9565b5090565b5b808211156119d557600081556001016119da565b6001600160e01b0319811681146107c757600080fd5b600060208284031215611a1657600080fd5b8135610cdf816119ee565b60005b83811015611a3c578181015183820152602001611a24565b83811115610dbf5750506000910152565b60008151808452611a65816020860160208601611a21565b601f01601f19169290920160200192915050565b602081526000610cdf6020830184611a4d565b600060208284031215611a9e57600080fd5b5035919050565b80356001600160a01b0381168114611abc57600080fd5b919050565b60008060408385031215611ad457600080fd5b611add83611aa5565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611b2957611b29611aeb565b604052919050565b60006001600160401b03831115611b4a57611b4a611aeb565b611b5d601f8401601f1916602001611b01565b9050828152838383011115611b7157600080fd5b828260208301376000602084830101529392505050565b600060208284031215611b9a57600080fd5b81356001600160401b03811115611bb057600080fd5b8201601f81018413611bc157600080fd5b61164884823560208401611b31565b80358015158114611abc57600080fd5b600060208284031215611bf257600080fd5b610cdf82611bd0565b600080600060608486031215611c1057600080fd5b611c1984611aa5565b9250611c2760208501611aa5565b9150604084013590509250925092565b60006020808385031215611c4a57600080fd5b82356001600160401b0380821115611c6157600080fd5b818501915085601f830112611c7557600080fd5b813581811115611c8757611c87611aeb565b8060051b9150611c98848301611b01565b8181529183018401918481019088841115611cb257600080fd5b938501935b83851015611cd057843582529385019390850190611cb7565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610b0757611d3383855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b9284019260609290920191600101611cf8565b600060208284031215611d5857600080fd5b610cdf82611aa5565b6020808252825182820181905260009190848201906040850190845b81811015610b0757835183529284019291840191600101611d7d565b600080600060608486031215611dae57600080fd5b611db784611aa5565b95602085013595506040909401359392505050565b60008060408385031215611ddf57600080fd5b611de883611aa5565b9150611df660208401611bd0565b90509250929050565b60008060008060808587031215611e1557600080fd5b611e1e85611aa5565b9350611e2c60208601611aa5565b92506040850135915060608501356001600160401b03811115611e4e57600080fd5b8501601f81018713611e5f57600080fd5b611e6e87823560208401611b31565b91505092959194509250565b81516001600160a01b031681526020808301516001600160401b031690820152604080830151151590820152606081016104dd565b60008083601f840112611ec157600080fd5b5081356001600160401b03811115611ed857600080fd5b6020830191508360208260051b8501011115611ef357600080fd5b9250929050565b60008060008060408587031215611f1057600080fd5b84356001600160401b0380821115611f2757600080fd5b611f3388838901611eaf565b90965094506020870135915080821115611f4c57600080fd5b50611f5987828801611eaf565b95989497509550505050565b60008060408385031215611f7857600080fd5b611f8183611aa5565b9150611df660208401611aa5565b60008060408385031215611fa257600080fd5b82359150611df660208401611aa5565b600181811c90821680611fc657607f821691505b602082108103611fe657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b8054600090600181811c908083168061205157607f831692505b6020808410820361207257634e487b7160e01b600052602260045260246000fd5b8180156120865760018114612097576120c4565b60ff198616895284890196506120c4565b60008881526020902060005b868110156120bc5781548b8201529085019083016120a3565b505084890196505b50505050505092915050565b600084516120e2818460208901611a21565b8451908301906120f6818360208901611a21565b61210281830186612037565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016121355761213561210d565b5060010190565b6000610cdf8284612037565b6000821982111561215b5761215b61210d565b500190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061219390830184611a4d565b9695505050505050565b6000602082840312156121af57600080fd5b8151610cdf816119ee565b634e487b7160e01b600052601260045260246000fd5b6000826121df576121df6121ba565b500490565b6000828210156121f6576121f661210d565b500390565b60008261220a5761220a6121ba565b50069056fea2646970667358221220417f4ac239f99b4d95d6d9764886dc14240c00beec4d2131d04ae1b2335fc3f864736f6c634300080d0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c80637ec4a6591161011a578063c0e72740116100ad578063de6c6d361161007c578063de6c6d361461043d578063e8a3d48514610450578063e985e9c514610458578063efbd73f41461046b578063f2fde38b1461047e57600080fd5b8063c0e72740146103f9578063c23dc68f14610401578063c87b56dd14610421578063d5abeb011461043457600080fd5b806395d89b41116100e957806395d89b41146103b857806399a2557a146103c0578063a22cb465146103d3578063b88d4fde146103e657600080fd5b80637ec4a659146103615780638462151c146103745780638da5cb5b14610394578063938e3d7b146103a557600080fd5b80633ccfd60b1161019d5780635c975abb1161016c5780635c975abb1461031e57806362b99ad41461032b5780636352211e1461033357806370a0823114610346578063715018a61461035957600080fd5b80633ccfd60b146102db57806342842e0e146102e35780635503a0e8146102f65780635bbb2177146102fe57600080fd5b806316ba10e0116101d957806316ba10e01461028857806316c38b3c1461029b57806318160ddd146102ae57806323b872dd146102c857600080fd5b806301ffc9a71461020b57806306fdde0314610233578063081812fc14610248578063095ea7b314610273575b600080fd5b61021e610219366004611a04565b610491565b60405190151581526020015b60405180910390f35b61023b6104e3565b60405161022a9190611a79565b61025b610256366004611a8c565b610575565b6040516001600160a01b03909116815260200161022a565b610286610281366004611ac1565b6105b9565b005b610286610296366004611b88565b61068b565b6102866102a9366004611be0565b6106d5565b60015460005403600019015b60405190815260200161022a565b6102866102d6366004611bfb565b610712565b610286610722565b6102866102f1366004611bfb565b6107ca565b61023b6107e5565b61031161030c366004611c37565b610873565b60405161022a9190611cdc565b600d5461021e9060ff1681565b61023b610939565b61025b610341366004611a8c565b610946565b6102ba610354366004611d46565b610951565b61028661099f565b61028661036f366004611b88565b6109d5565b610387610382366004611d46565b610a12565b60405161022a9190611d61565b6008546001600160a01b031661025b565b6102866103b3366004611b88565b610b13565b61023b610b50565b6103876103ce366004611d99565b610b5f565b6102866103e1366004611dcc565b610ce6565b6102866103f4366004611dff565b610d7b565b61023b610dc5565b61041461040f366004611a8c565b610dd2565b60405161022a9190611e7a565b61023b61042f366004611a8c565b610e47565b6102ba600c5481565b61028661044b366004611efa565b610f14565b61023b61109b565b61021e610466366004611f65565b6110ec565b610286610479366004611f8f565b61111a565b61028661048c366004611d46565b6111fa565b60006301ffc9a760e01b6001600160e01b0319831614806104c257506380ac58cd60e01b6001600160e01b03198316145b806104dd5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546104f290611fb2565b80601f016020809104026020016040519081016040528092919081815260200182805461051e90611fb2565b801561056b5780601f106105405761010080835404028352916020019161056b565b820191906000526020600020905b81548152906001019060200180831161054e57829003601f168201915b5050505050905090565b600061058082611292565b61059d576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006105c4826112c7565b9050806001600160a01b0316836001600160a01b0316036105f85760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161461062f5761061281336110ec565b61062f576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b031633146106be5760405162461bcd60e51b81526004016106b590611fec565b60405180910390fd5b80516106d190600a906020840190611955565b5050565b6008546001600160a01b031633146106ff5760405162461bcd60e51b81526004016106b590611fec565b600d805460ff1916911515919091179055565b61071d838383611336565b505050565b6008546001600160a01b0316331461074c5760405162461bcd60e51b81526004016106b590611fec565b60006107606008546001600160a01b031690565b6001600160a01b0316306001600160a01b03163160405160006040518083038185875af1925050503d80600081146107b4576040519150601f19603f3d011682016040523d82523d6000602084013e6107b9565b606091505b50509050806107c757600080fd5b50565b61071d83838360405180602001604052806000815250610d7b565b600a80546107f290611fb2565b80601f016020809104026020016040519081016040528092919081815260200182805461081e90611fb2565b801561086b5780601f106108405761010080835404028352916020019161086b565b820191906000526020600020905b81548152906001019060200180831161084e57829003601f168201915b505050505081565b80516060906000816001600160401b0381111561089257610892611aeb565b6040519080825280602002602001820160405280156108dd57816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816108b05790505b50905060005b8281146109315761090c8582815181106108ff576108ff612021565b6020026020010151610dd2565b82828151811061091e5761091e612021565b60209081029190910101526001016108e3565b509392505050565b600980546107f290611fb2565b60006104dd826112c7565b60006001600160a01b03821661097a576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146109c95760405162461bcd60e51b81526004016106b590611fec565b6109d360006114dd565b565b6008546001600160a01b031633146109ff5760405162461bcd60e51b81526004016106b590611fec565b80516106d1906009906020840190611955565b60606000806000610a2285610951565b90506000816001600160401b03811115610a3e57610a3e611aeb565b604051908082528060200260200182016040528015610a67578160200160208202803683370190505b509050610a8d604080516060810182526000808252602082018190529181019190915290565b60015b838614610b0757610aa08161152f565b91508160400151610aff5781516001600160a01b031615610ac057815194505b876001600160a01b0316856001600160a01b031603610aff5780838780600101985081518110610af257610af2612021565b6020026020010181815250505b600101610a90565b50909695505050505050565b6008546001600160a01b03163314610b3d5760405162461bcd60e51b81526004016106b590611fec565b80516106d190600b906020840190611955565b6060600380546104f290611fb2565b6060818310610b8157604051631960ccad60e11b815260040160405180910390fd5b600080610b8d60005490565b90506001851015610b9d57600194505b80841115610ba9578093505b6000610bb487610951565b905084861015610bd35785850381811015610bcd578091505b50610bd7565b5060005b6000816001600160401b03811115610bf157610bf1611aeb565b604051908082528060200260200182016040528015610c1a578160200160208202803683370190505b50905081600003610c30579350610cdf92505050565b6000610c3b88610dd2565b905060008160400151610c4c575080515b885b888114158015610c5e5750848714155b15610cd357610c6c8161152f565b92508260400151610ccb5782516001600160a01b031615610c8c57825191505b8a6001600160a01b0316826001600160a01b031603610ccb5780848880600101995081518110610cbe57610cbe612021565b6020026020010181815250505b600101610c4e565b50505092835250909150505b9392505050565b336001600160a01b03831603610d0f5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d86848484611336565b6001600160a01b0383163b15610dbf57610da284848484611564565b610dbf576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600b80546107f290611fb2565b60408051606080820183526000808352602080840182905283850182905284519283018552818352820181905292810192909252906001831080610e1857506000548310155b15610e235792915050565b610e2c8361152f565b9050806040015115610e3e5792915050565b610cdf83611650565b6060610e5282611292565b610eb65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106b5565b6000610ec061167e565b90506000815111610ee05760405180602001604052806000815250610cdf565b80610eea8461168d565b600a604051602001610efe939291906120d0565b6040516020818303038152906040529392505050565b6008546001600160a01b03163314610f3e5760405162461bcd60e51b81526004016106b590611fec565b600d5460ff1615610f8b5760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b60448201526064016106b5565b828114610fe55760405162461bcd60e51b815260206004820152602260248201527f4164647265737320616e6420616d6f756e74206c656e677468206d69736d61746044820152610c6d60f31b60648201526084016106b5565b60005b838110156110485761103885858381811061100557611005612021565b905060200201602081019061101a9190611d46565b84848481811061102c5761102c612021565b9050602002013561178d565b61104181612123565b9050610fe8565b50600c54600154600054036000190110610dbf5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016106b5565b60606000600b80546110ac90611fb2565b9050116110c6575060408051602081019091526000815290565b600b6040516020016110d8919061213c565b604051602081830303815290604052905090565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146111445760405162461bcd60e51b81526004016106b590611fec565b600d5460ff16156111915760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b60448201526064016106b5565b600c5460015460005484919003600019016111ac9190612148565b106111f05760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016106b5565b6106d1818361178d565b6008546001600160a01b031633146112245760405162461bcd60e51b81526004016106b590611fec565b6001600160a01b0381166112895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b5565b6107c7816114dd565b6000816001111580156112a6575060005482105b80156104dd575050600090815260046020526040902054600160e01b161590565b6000818060011161131d5760005481101561131d5760008181526004602052604081205490600160e01b8216900361131b575b80600003610cdf5750600019016000818152600460205260409020546112fa565b505b604051636f96cda160e11b815260040160405180910390fd5b6000611341826112c7565b9050836001600160a01b0316816001600160a01b0316146113745760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611392575061139285336110ec565b806113ad5750336113a284610575565b6001600160a01b0316145b9050806113cd57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166113f457604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091528120600160e11b4260a01b8717811790915583169003611495576001830160008181526004602052604081205490036114935760005481146114935760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60408051606081018252600080825260208201819052918101919091526000828152600460205260409020546104dd906117a7565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611599903390899088908890600401612160565b6020604051808303816000875af19250505080156115d4575060408051601f3d908101601f191682019092526115d19181019061219d565b60015b611632573d808015611602576040519150601f19603f3d011682016040523d82523d6000602084013e611607565b606091505b50805160000361162a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60408051606081018252600080825260208201819052918101919091526104dd611679836112c7565b6117a7565b6060600980546104f290611fb2565b6060816000036116b45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156116de57806116c881612123565b91506116d79050600a836121d0565b91506116b8565b6000816001600160401b038111156116f8576116f8611aeb565b6040519080825280601f01601f191660200182016040528015611722576020820181803683370190505b5090505b8415611648576117376001836121e4565b9150611744600a866121fb565b61174f906030612148565b60f81b81838151811061176457611764612021565b60200101906001600160f81b031916908160001a905350611786600a866121d0565b9450611726565b6106d18282604051806020016040528060008152506117e1565b604080516060810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b90921615159082015290565b6000546001600160a01b03841661180a57604051622e076360e81b815260040160405180910390fd5b8260000361182b5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15611900575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46118c96000878480600101955087611564565b6118e6576040516368d2bf6b60e11b815260040160405180910390fd5b80821061187e5782600054146118fb57600080fd5b611945565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611901575b506000908155610dbf9085838684565b82805461196190611fb2565b90600052602060002090601f01602090048101928261198357600085556119c9565b82601f1061199c57805160ff19168380011785556119c9565b828001600101855582156119c9579182015b828111156119c95782518255916020019190600101906119ae565b506119d59291506119d9565b5090565b5b808211156119d557600081556001016119da565b6001600160e01b0319811681146107c757600080fd5b600060208284031215611a1657600080fd5b8135610cdf816119ee565b60005b83811015611a3c578181015183820152602001611a24565b83811115610dbf5750506000910152565b60008151808452611a65816020860160208601611a21565b601f01601f19169290920160200192915050565b602081526000610cdf6020830184611a4d565b600060208284031215611a9e57600080fd5b5035919050565b80356001600160a01b0381168114611abc57600080fd5b919050565b60008060408385031215611ad457600080fd5b611add83611aa5565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611b2957611b29611aeb565b604052919050565b60006001600160401b03831115611b4a57611b4a611aeb565b611b5d601f8401601f1916602001611b01565b9050828152838383011115611b7157600080fd5b828260208301376000602084830101529392505050565b600060208284031215611b9a57600080fd5b81356001600160401b03811115611bb057600080fd5b8201601f81018413611bc157600080fd5b61164884823560208401611b31565b80358015158114611abc57600080fd5b600060208284031215611bf257600080fd5b610cdf82611bd0565b600080600060608486031215611c1057600080fd5b611c1984611aa5565b9250611c2760208501611aa5565b9150604084013590509250925092565b60006020808385031215611c4a57600080fd5b82356001600160401b0380821115611c6157600080fd5b818501915085601f830112611c7557600080fd5b813581811115611c8757611c87611aeb565b8060051b9150611c98848301611b01565b8181529183018401918481019088841115611cb257600080fd5b938501935b83851015611cd057843582529385019390850190611cb7565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610b0757611d3383855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b9284019260609290920191600101611cf8565b600060208284031215611d5857600080fd5b610cdf82611aa5565b6020808252825182820181905260009190848201906040850190845b81811015610b0757835183529284019291840191600101611d7d565b600080600060608486031215611dae57600080fd5b611db784611aa5565b95602085013595506040909401359392505050565b60008060408385031215611ddf57600080fd5b611de883611aa5565b9150611df660208401611bd0565b90509250929050565b60008060008060808587031215611e1557600080fd5b611e1e85611aa5565b9350611e2c60208601611aa5565b92506040850135915060608501356001600160401b03811115611e4e57600080fd5b8501601f81018713611e5f57600080fd5b611e6e87823560208401611b31565b91505092959194509250565b81516001600160a01b031681526020808301516001600160401b031690820152604080830151151590820152606081016104dd565b60008083601f840112611ec157600080fd5b5081356001600160401b03811115611ed857600080fd5b6020830191508360208260051b8501011115611ef357600080fd5b9250929050565b60008060008060408587031215611f1057600080fd5b84356001600160401b0380821115611f2757600080fd5b611f3388838901611eaf565b90965094506020870135915080821115611f4c57600080fd5b50611f5987828801611eaf565b95989497509550505050565b60008060408385031215611f7857600080fd5b611f8183611aa5565b9150611df660208401611aa5565b60008060408385031215611fa257600080fd5b82359150611df660208401611aa5565b600181811c90821680611fc657607f821691505b602082108103611fe657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b8054600090600181811c908083168061205157607f831692505b6020808410820361207257634e487b7160e01b600052602260045260246000fd5b8180156120865760018114612097576120c4565b60ff198616895284890196506120c4565b60008881526020902060005b868110156120bc5781548b8201529085019083016120a3565b505084890196505b50505050505092915050565b600084516120e2818460208901611a21565b8451908301906120f6818360208901611a21565b61210281830186612037565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016121355761213561210d565b5060010190565b6000610cdf8284612037565b6000821982111561215b5761215b61210d565b500190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061219390830184611a4d565b9695505050505050565b6000602082840312156121af57600080fd5b8151610cdf816119ee565b634e487b7160e01b600052601260045260246000fd5b6000826121df576121df6121ba565b500490565b6000828210156121f6576121f661210d565b500390565b60008261220a5761220a6121ba565b50069056fea2646970667358221220417f4ac239f99b4d95d6d9764886dc14240c00beec4d2131d04ae1b2335fc3f864736f6c634300080d0033

Deployed Bytecode Sourcemap

52632:2508:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18620:615;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;18620:615:0;;;;;;;;23633:100;;;:::i;:::-;;;;;;;:::i;25701:204::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;25701:204:0;1528:203:1;25161:474:0;;;;;;:::i;:::-;;:::i;:::-;;54580:100;;;;;;:::i;:::-;;:::i;54805:77::-;;;;;;:::i;:::-;;:::i;17674:315::-;53118:1;17940:12;17727:7;17924:13;:28;-1:-1:-1;;17924:46:0;17674:315;;;3949:25:1;;;3937:2;3922:18;17674:315:0;3803:177:1;26587:170:0;;;;;;:::i;:::-;;:::i;54888:137::-;;;:::i;26828:185::-;;;;;;:::i;:::-;;:::i;52786:33::-;;;:::i;47832:468::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;52902:26::-;;;;;;;;;52725:28;;;:::i;23422:144::-;;;;;;:::i;:::-;;:::i;19299:224::-;;;;;;:::i;:::-;;:::i;2606:103::-;;;:::i;54474:100::-;;;;;;:::i;:::-;;:::i;51644:892::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1955:87::-;2028:6;;-1:-1:-1;;;;;2028:6:0;1955:87;;54686:113;;;;;;:::i;:::-;;:::i;23802:104::-;;;:::i;48690:2505::-;;;;;;:::i;:::-;;:::i;25977:308::-;;;;;;:::i;:::-;;:::i;27084:396::-;;;;;;:::i;:::-;;:::i;52826:31::-;;;:::i;47253:420::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;53827:442::-;;;;;;:::i;:::-;;:::i;52864:31::-;;;;;;53395:426;;;;;;:::i;:::-;;:::i;54275:193::-;;;:::i;26356:164::-;;;;;;:::i;:::-;;:::i;53133:256::-;;;;;;:::i;:::-;;:::i;2864:201::-;;;;;;:::i;:::-;;:::i;18620:615::-;18705:4;-1:-1:-1;;;;;;;;;19005:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;19082:25:0;;;19005:102;:179;;;-1:-1:-1;;;;;;;;;;19159:25:0;;;19005:179;18985:199;18620:615;-1:-1:-1;;18620:615:0:o;23633:100::-;23687:13;23720:5;23713:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23633:100;:::o;25701:204::-;25769:7;25794:16;25802:7;25794;:16::i;:::-;25789:64;;25819:34;;-1:-1:-1;;;25819:34:0;;;;;;;;;;;25789:64;-1:-1:-1;25873:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25873:24:0;;25701:204::o;25161:474::-;25234:13;25266:27;25285:7;25266:18;:27::i;:::-;25234:61;;25316:5;-1:-1:-1;;;;;25310:11:0;:2;-1:-1:-1;;;;;25310:11:0;;25306:48;;25330:24;;-1:-1:-1;;;25330:24:0;;;;;;;;;;;25306:48;41804:10;-1:-1:-1;;;;;25371:28:0;;;25367:175;;25419:44;25436:5;41804:10;26356:164;:::i;25419:44::-;25414:128;;25491:35;;-1:-1:-1;;;25491:35:0;;;;;;;;;;;25414:128;25554:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;25554:29:0;-1:-1:-1;;;;;25554:29:0;;;;;;;;;25599:28;;25554:24;;25599:28;;;;;;;25223:412;25161:474;;:::o;54580:100::-;2028:6;;-1:-1:-1;;;;;2028:6:0;41804:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;;;;;;;;;54652:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;54580:100:::0;:::o;54805:77::-;2028:6;;-1:-1:-1;;;;;2028:6:0;41804:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;54861:6:::1;:15:::0;;-1:-1:-1;;54861:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54805:77::o;26587:170::-;26721:28;26731:4;26737:2;26741:7;26721:9;:28::i;:::-;26587:170;;;:::o;54888:137::-;2028:6;;-1:-1:-1;;;;;2028:6:0;41804:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;54933:7:::1;54954;2028:6:::0;;-1:-1:-1;;;;;2028:6:0;;1955:87;54954:7:::1;-1:-1:-1::0;;;;;54946:21:0::1;54983:4;-1:-1:-1::0;;;;;54975:21:0::1;;54946:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54932:69;;;55016:2;55008:11;;;::::0;::::1;;54925:100;54888:137::o:0;26828:185::-;26966:39;26983:4;26989:2;26993:7;26966:39;;;;;;;;;;;;:16;:39::i;52786:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47832:468::-;48007:15;;47921:23;;47982:22;48007:15;-1:-1:-1;;;;;48074:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;48074:36:0;;-1:-1:-1;;48074:36:0;;;;;;;;;;;;48037:73;;48130:9;48125:125;48146:14;48141:1;:19;48125:125;;48202:32;48222:8;48231:1;48222:11;;;;;;;;:::i;:::-;;;;;;;48202:19;:32::i;:::-;48186:10;48197:1;48186:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;48162:3;;48125:125;;;-1:-1:-1;48271:10:0;47832:468;-1:-1:-1;;;47832:468:0:o;52725:28::-;;;;;;;:::i;23422:144::-;23486:7;23529:27;23548:7;23529:18;:27::i;19299:224::-;19363:7;-1:-1:-1;;;;;19387:19:0;;19383:60;;19415:28;;-1:-1:-1;;;19415:28:0;;;;;;;;;;;19383:60;-1:-1:-1;;;;;;19461:25:0;;;;;:18;:25;;;;;;-1:-1:-1;;;;;19461:54:0;;19299:224::o;2606:103::-;2028:6;;-1:-1:-1;;;;;2028:6:0;41804:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;2671:30:::1;2698:1;2671:18;:30::i;:::-;2606:103::o:0;54474:100::-;2028:6;;-1:-1:-1;;;;;2028:6:0;41804:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;54546:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;51644:892::-:0;51714:16;51768:19;51802:25;51842:22;51867:16;51877:5;51867:9;:16::i;:::-;51842:41;;51898:25;51940:14;-1:-1:-1;;;;;51926:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51926:29:0;;51898:57;;51970:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;51970:31:0;53118:1;52016:472;52065:14;52050:11;:29;52016:472;;52117:15;52130:1;52117:12;:15::i;:::-;52105:27;;52155:9;:16;;;52196:8;52151:73;52246:14;;-1:-1:-1;;;;;52246:28:0;;52242:111;;52319:14;;;-1:-1:-1;52242:111:0;52396:5;-1:-1:-1;;;;;52375:26:0;:17;-1:-1:-1;;;;;52375:26:0;;52371:102;;52452:1;52426:8;52435:13;;;;;;52426:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;52371:102;52081:3;;52016:472;;;-1:-1:-1;52509:8:0;;51644:892;-1:-1:-1;;;;;;51644:892:0:o;54686:113::-;2028:6;;-1:-1:-1;;;;;2028:6:0;41804:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;54764:29;;::::1;::::0;:12:::1;::::0;:29:::1;::::0;::::1;::::0;::::1;:::i;23802:104::-:0;23858:13;23891:7;23884:14;;;;;:::i;48690:2505::-;48825:16;48892:4;48883:5;:13;48879:45;;48905:19;;-1:-1:-1;;;48905:19:0;;;;;;;;;;;48879:45;48939:19;48973:17;48993:14;17415:7;17442:13;;17368:95;48993:14;48973:34;-1:-1:-1;53118:1:0;49085:5;:23;49081:87;;;53118:1;49129:23;;49081:87;49244:9;49237:4;:16;49233:73;;;49281:9;49274:16;;49233:73;49320:25;49348:16;49358:5;49348:9;:16::i;:::-;49320:44;;49542:4;49534:5;:12;49530:278;;;49589:12;;;49624:31;;;49620:111;;;49700:11;49680:31;;49620:111;49548:198;49530:278;;;-1:-1:-1;49791:1:0;49530:278;49822:25;49864:17;-1:-1:-1;;;;;49850:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49850:32:0;;49822:60;;49901:17;49922:1;49901:22;49897:78;;49951:8;-1:-1:-1;49944:15:0;;-1:-1:-1;;;49944:15:0;49897:78;50119:31;50153:26;50173:5;50153:19;:26::i;:::-;50119:60;;50194:25;50439:9;:16;;;50434:92;;-1:-1:-1;50496:14:0;;50434:92;50557:5;50540:478;50569:4;50564:1;:9;;:45;;;;;50592:17;50577:11;:32;;50564:45;50540:478;;;50647:15;50660:1;50647:12;:15::i;:::-;50635:27;;50685:9;:16;;;50726:8;50681:73;50776:14;;-1:-1:-1;;;;;50776:28:0;;50772:111;;50849:14;;;-1:-1:-1;50772:111:0;50926:5;-1:-1:-1;;;;;50905:26:0;:17;-1:-1:-1;;;;;50905:26:0;;50901:102;;50982:1;50956:8;50965:13;;;;;;50956:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;50901:102;50611:3;;50540:478;;;-1:-1:-1;;;51103:29:0;;;-1:-1:-1;51110:8:0;;-1:-1:-1;;48690:2505:0;;;;;;:::o;25977:308::-;41804:10;-1:-1:-1;;;;;26076:31:0;;;26072:61;;26116:17;;-1:-1:-1;;;26116:17:0;;;;;;;;;;;26072:61;41804:10;26146:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;26146:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;26146:60:0;;;;;;;;;;26222:55;;540:41:1;;;26146:49:0;;41804:10;26222:55;;513:18:1;26222:55:0;;;;;;;25977:308;;:::o;27084:396::-;27251:28;27261:4;27267:2;27271:7;27251:9;:28::i;:::-;-1:-1:-1;;;;;27294:14:0;;;:19;27290:183;;27333:56;27364:4;27370:2;27374:7;27383:5;27333:30;:56::i;:::-;27328:145;;27417:40;;-1:-1:-1;;;27417:40:0;;;;;;;;;;;27328:145;27084:396;;;;:::o;52826:31::-;;;;;;;:::i;47253:420::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53118:1:0;47409:25;;;:54;;-1:-1:-1;17415:7:0;17442:13;47438:7;:25;;47409:54;47405:103;;;47487:9;47253:420;-1:-1:-1;;47253:420:0:o;47405:103::-;47530:21;47543:7;47530:12;:21::i;:::-;47518:33;;47566:9;:16;;;47562:65;;;47606:9;47253:420;-1:-1:-1;;47253:420:0:o;47562:65::-;47644:21;47657:7;47644:12;:21::i;53827:442::-;53946:13;53987:17;53995:8;53987:7;:17::i;:::-;53971:98;;;;-1:-1:-1;;;53971:98:0;;11599:2:1;53971:98:0;;;11581:21:1;11638:2;11618:18;;;11611:30;11677:34;11657:18;;;11650:62;-1:-1:-1;;;11728:18:1;;;11721:45;11783:19;;53971:98:0;11397:411:1;53971:98:0;54078:28;54109:10;:8;:10::i;:::-;54078:41;;54164:1;54139:14;54133:28;:32;:130;;;;;;;;;;;;;;;;;54201:14;54217:19;:8;:17;:19::i;:::-;54238:9;54184:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54126:137;53827:442;-1:-1:-1;;;53827:442:0:o;53395:426::-;2028:6;;-1:-1:-1;;;;;2028:6:0;41804:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;53520:6:::1;::::0;::::1;;53519:7;53511:43;;;::::0;-1:-1:-1;;;53511:43:0;;13674:2:1;53511:43:0::1;::::0;::::1;13656:21:1::0;13713:2;13693:18;;;13686:30;-1:-1:-1;;;13732:18:1;;;13725:53;13795:18;;53511:43:0::1;13472:347:1::0;53511:43:0::1;53569:33:::0;;::::1;53561:80;;;::::0;-1:-1:-1;;;53561:80:0;;14026:2:1;53561:80:0::1;::::0;::::1;14008:21:1::0;14065:2;14045:18;;;14038:30;14104:34;14084:18;;;14077:62;-1:-1:-1;;;14155:18:1;;;14148:32;14197:19;;53561:80:0::1;13824:398:1::0;53561:80:0::1;53655:9;53650:99;53666:20:::0;;::::1;53650:99;;;53707:34;53717:9;;53727:1;53717:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;53731:6;;53738:1;53731:9;;;;;;;:::i;:::-;;;;;;;53707;:34::i;:::-;53688:3;::::0;::::1;:::i;:::-;;;53650:99;;;-1:-1:-1::0;53781:9:0::1;::::0;53118:1;17940:12;17727:7;17924:13;:28;-1:-1:-1;;17924:46:0;53765:25:::1;53757:58;;;::::0;-1:-1:-1;;;53757:58:0;;14701:2:1;53757:58:0::1;::::0;::::1;14683:21:1::0;14740:2;14720:18;;;14713:30;-1:-1:-1;;;14759:18:1;;;14752:50;14819:18;;53757:58:0::1;14499:344:1::0;54275:193:0;54328:13;54393:1;54370:12;54364:26;;;;;:::i;:::-;;;:30;:98;;-1:-1:-1;54364:98:0;;;;;;;;;-1:-1:-1;54364:98:0;;;54275:193::o;54364:98::-;54432:12;54415:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;54357:105;;54275:193;:::o;26356:164::-;-1:-1:-1;;;;;26477:25:0;;;26453:4;26477:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26356:164::o;53133:256::-;2028:6;;-1:-1:-1;;;;;2028:6:0;41804:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;53230:6:::1;::::0;::::1;;53229:7;53221:43;;;::::0;-1:-1:-1;;;53221:43:0;;13674:2:1;53221:43:0::1;::::0;::::1;13656:21:1::0;13713:2;13693:18;;;13686:30;-1:-1:-1;;;13732:18:1;;;13725:53;13795:18;;53221:43:0::1;13472:347:1::0;53221:43:0::1;53309:9;::::0;53118:1;17940:12;17727:7;17924:13;53295:11;;17924:28;;-1:-1:-1;;17924:46:0;53279:27:::1;;;;:::i;:::-;:39;53271:72;;;::::0;-1:-1:-1;;;53271:72:0;;14701:2:1;53271:72:0::1;::::0;::::1;14683:21:1::0;14740:2;14720:18;;;14713:30;-1:-1:-1;;;14759:18:1;;;14752:50;14819:18;;53271:72:0::1;14499:344:1::0;53271:72:0::1;53350:33;53360:9;53371:11;53350:9;:33::i;2864:201::-:0;2028:6;;-1:-1:-1;;;;;2028:6:0;41804:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2953:22:0;::::1;2945:73;;;::::0;-1:-1:-1;;;2945:73:0;;15385:2:1;2945:73:0::1;::::0;::::1;15367:21:1::0;15424:2;15404:18;;;15397:30;15463:34;15443:18;;;15436:62;-1:-1:-1;;;15514:18:1;;;15507:36;15560:19;;2945:73:0::1;15183:402:1::0;2945:73:0::1;3029:28;3048:8;3029:18;:28::i;27735:273::-:0;27792:4;27848:7;53118:1;27829:26;;:66;;;;;27882:13;;27872:7;:23;27829:66;:152;;;;-1:-1:-1;;27933:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;27933:43:0;:48;;27735:273::o;20937:1129::-;21004:7;21039;;53118:1;21088:23;21084:915;;21141:13;;21134:4;:20;21130:869;;;21179:14;21196:23;;;:17;:23;;;;;;;-1:-1:-1;;;21285:23:0;;:28;;21281:699;;21804:113;21811:6;21821:1;21811:11;21804:113;;-1:-1:-1;;;21882:6:0;21864:25;;;;:17;:25;;;;;;21804:113;;21281:699;21156:843;21130:869;22027:31;;-1:-1:-1;;;22027:31:0;;;;;;;;;;;32974:2515;33089:27;33119;33138:7;33119:18;:27::i;:::-;33089:57;;33204:4;-1:-1:-1;;;;;33163:45:0;33179:19;-1:-1:-1;;;;;33163:45:0;;33159:86;;33217:28;;-1:-1:-1;;;33217:28:0;;;;;;;;;;;33159:86;33258:22;41804:10;-1:-1:-1;;;;;33284:27:0;;;;:87;;-1:-1:-1;33328:43:0;33345:4;41804:10;26356:164;:::i;33328:43::-;33284:147;;;-1:-1:-1;41804:10:0;33388:20;33400:7;33388:11;:20::i;:::-;-1:-1:-1;;;;;33388:43:0;;33284:147;33258:174;;33450:17;33445:66;;33476:35;;-1:-1:-1;;;33476:35:0;;;;;;;;;;;33445:66;-1:-1:-1;;;;;33526:16:0;;33522:52;;33551:23;;-1:-1:-1;;;33551:23:0;;;;;;;;;;;33522:52;33703:24;;;;:15;:24;;;;;;;;33696:31;;-1:-1:-1;;;;;;33696:31:0;;;-1:-1:-1;;;;;34095:24:0;;;;;:18;:24;;;;;34093:26;;-1:-1:-1;;34093:26:0;;;34164:22;;;;;;;34162:24;;-1:-1:-1;34162:24:0;;;34457:26;;;:17;:26;;;;;-1:-1:-1;;;34545:15:0;15292:3;34545:41;34503:84;;:128;;34457:174;;;34751:46;;:51;;34747:626;;34855:1;34845:11;;34823:19;34978:30;;;:17;:30;;;;;;:35;;34974:384;;35116:13;;35101:11;:28;35097:242;;35263:30;;;;:17;:30;;;;;:52;;;35097:242;34804:569;34747:626;35420:7;35416:2;-1:-1:-1;;;;;35401:27:0;35410:4;-1:-1:-1;;;;;35401:27:0;;;;;;;;;;;33078:2411;;32974:2515;;;:::o;3225:191::-;3318:6;;;-1:-1:-1;;;;;3335:17:0;;;-1:-1:-1;;;;;;3335:17:0;;;;;;;3368:40;;3318:6;;;3335:17;3318:6;;3368:40;;3299:16;;3368:40;3288:128;3225:191;:::o;22546:153::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;22666:24:0;;;;:17;:24;;;;;;22647:44;;:18;:44::i;39186:716::-;39370:88;;-1:-1:-1;;;39370:88:0;;39349:4;;-1:-1:-1;;;;;39370:45:0;;;;;:88;;41804:10;;39437:4;;39443:7;;39452:5;;39370:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39370:88:0;;;;;;;;-1:-1:-1;;39370:88:0;;;;;;;;;;;;:::i;:::-;;;39366:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39653:6;:13;39670:1;39653:18;39649:235;;39699:40;;-1:-1:-1;;;39699:40:0;;;;;;;;;;;39649:235;39842:6;39836:13;39827:6;39823:2;39819:15;39812:38;39366:529;-1:-1:-1;;;;;;39529:64:0;-1:-1:-1;;;39529:64:0;;-1:-1:-1;39366:529:0;39186:716;;;;;;:::o;23202:158::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;23305:47:0;23324:27;23343:7;23324:18;:27::i;:::-;23305:18;:47::i;55031:104::-;55091:13;55120:9;55113:16;;;;;:::i;3788:723::-;3844:13;4065:5;4074:1;4065:10;4061:53;;-1:-1:-1;;4092:10:0;;;;;;;;;;;;-1:-1:-1;;;4092:10:0;;;;;3788:723::o;4061:53::-;4139:5;4124:12;4180:78;4187:9;;4180:78;;4213:8;;;;:::i;:::-;;-1:-1:-1;4236:10:0;;-1:-1:-1;4244:2:0;4236:10;;:::i;:::-;;;4180:78;;;4268:19;4300:6;-1:-1:-1;;;;;4290:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4290:17:0;;4268:39;;4318:154;4325:10;;4318:154;;4352:11;4362:1;4352:11;;:::i;:::-;;-1:-1:-1;4421:10:0;4429:2;4421:5;:10;:::i;:::-;4408:24;;:2;:24;:::i;:::-;4395:39;;4378:6;4385;4378:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;4378:56:0;;;;;;;;-1:-1:-1;4449:11:0;4458:2;4449:11;;:::i;:::-;;;4318:154;;28092:104;28161:27;28171:2;28175:8;28161:27;;;;;;;;;;;;:9;:27::i;22160:295::-;-1:-1:-1;;;;;;;;;;;;;22270:41:0;;;;15292:3;22356:32;;;-1:-1:-1;;;;;22322:67:0;-1:-1:-1;;;22322:67:0;-1:-1:-1;;;22419:23:0;;;:28;;-1:-1:-1;;;22400:47:0;-1:-1:-1;22160:295:0:o;28569:2236::-;28692:20;28715:13;-1:-1:-1;;;;;28743:16:0;;28739:48;;28768:19;;-1:-1:-1;;;28768:19:0;;;;;;;;;;;28739:48;28802:8;28814:1;28802:13;28798:44;;28824:18;;-1:-1:-1;;;28824:18:0;;;;;;;;;;;28798:44;-1:-1:-1;;;;;29391:22:0;;;;;;:18;:22;;;;14775:2;29391:22;;;:70;;29429:31;29417:44;;29391:70;;;29704:31;;;:17;:31;;;;;29797:15;15292:3;29797:41;29755:84;;-1:-1:-1;29875:13:0;;15555:3;29860:56;29755:162;29704:213;;:31;;29998:23;;;;30042:14;:19;30038:635;;30082:313;30113:38;;30138:12;;-1:-1:-1;;;;;30113:38:0;;;30130:1;;30113:38;;30130:1;;30113:38;30179:69;30218:1;30222:2;30226:14;;;;;;30242:5;30179:30;:69::i;:::-;30174:174;;30284:40;;-1:-1:-1;;;30284:40:0;;;;;;;;;;;30174:174;30390:3;30375:12;:18;30082:313;;30476:12;30459:13;;:29;30455:43;;30490:8;;;30455:43;30038:635;;;30539:119;30570:40;;30595:14;;;;;-1:-1:-1;;;;;30570:40:0;;;30587:1;;30570:40;;30587:1;;30570:40;30653:3;30638:12;:18;30539:119;;30038:635;-1:-1:-1;30687:13:0;:28;;;30737:60;;30770:2;30774:12;30788:8;30737:60;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2173:127::-;2234:10;2229:3;2225:20;2222:1;2215:31;2265:4;2262:1;2255:15;2289:4;2286:1;2279:15;2305:275;2376:2;2370:9;2441:2;2422:13;;-1:-1:-1;;2418:27:1;2406:40;;-1:-1:-1;;;;;2461:34:1;;2497:22;;;2458:62;2455:88;;;2523:18;;:::i;:::-;2559:2;2552:22;2305:275;;-1:-1:-1;2305:275:1:o;2585:407::-;2650:5;-1:-1:-1;;;;;2676:6:1;2673:30;2670:56;;;2706:18;;:::i;:::-;2744:57;2789:2;2768:15;;-1:-1:-1;;2764:29:1;2795:4;2760:40;2744:57;:::i;:::-;2735:66;;2824:6;2817:5;2810:21;2864:3;2855:6;2850:3;2846:16;2843:25;2840:45;;;2881:1;2878;2871:12;2840:45;2930:6;2925:3;2918:4;2911:5;2907:16;2894:43;2984:1;2977:4;2968:6;2961:5;2957:18;2953:29;2946:40;2585:407;;;;;:::o;2997:451::-;3066:6;3119:2;3107:9;3098:7;3094:23;3090:32;3087:52;;;3135:1;3132;3125:12;3087:52;3175:9;3162:23;-1:-1:-1;;;;;3200:6:1;3197:30;3194:50;;;3240:1;3237;3230:12;3194:50;3263:22;;3316:4;3308:13;;3304:27;-1:-1:-1;3294:55:1;;3345:1;3342;3335:12;3294:55;3368:74;3434:7;3429:2;3416:16;3411:2;3407;3403:11;3368:74;:::i;3453:160::-;3518:20;;3574:13;;3567:21;3557:32;;3547:60;;3603:1;3600;3593:12;3618:180;3674:6;3727:2;3715:9;3706:7;3702:23;3698:32;3695:52;;;3743:1;3740;3733:12;3695:52;3766:26;3782:9;3766:26;:::i;3985:328::-;4062:6;4070;4078;4131:2;4119:9;4110:7;4106:23;4102:32;4099:52;;;4147:1;4144;4137:12;4099:52;4170:29;4189:9;4170:29;:::i;:::-;4160:39;;4218:38;4252:2;4241:9;4237:18;4218:38;:::i;:::-;4208:48;;4303:2;4292:9;4288:18;4275:32;4265:42;;3985:328;;;;;:::o;4318:946::-;4402:6;4433:2;4476;4464:9;4455:7;4451:23;4447:32;4444:52;;;4492:1;4489;4482:12;4444:52;4532:9;4519:23;-1:-1:-1;;;;;4602:2:1;4594:6;4591:14;4588:34;;;4618:1;4615;4608:12;4588:34;4656:6;4645:9;4641:22;4631:32;;4701:7;4694:4;4690:2;4686:13;4682:27;4672:55;;4723:1;4720;4713:12;4672:55;4759:2;4746:16;4781:2;4777;4774:10;4771:36;;;4787:18;;:::i;:::-;4833:2;4830:1;4826:10;4816:20;;4856:28;4880:2;4876;4872:11;4856:28;:::i;:::-;4918:15;;;4988:11;;;4984:20;;;4949:12;;;;5016:19;;;5013:39;;;5048:1;5045;5038:12;5013:39;5072:11;;;;5092:142;5108:6;5103:3;5100:15;5092:142;;;5174:17;;5162:30;;5125:12;;;;5212;;;;5092:142;;;5253:5;4318:946;-1:-1:-1;;;;;;;;4318:946:1:o;5552:722::-;5785:2;5837:21;;;5907:13;;5810:18;;;5929:22;;;5756:4;;5785:2;6008:15;;;;5982:2;5967:18;;;5756:4;6051:197;6065:6;6062:1;6059:13;6051:197;;;6114:52;6162:3;6153:6;6147:13;5353:12;;-1:-1:-1;;;;;5349:38:1;5337:51;;5441:4;5430:16;;;5424:23;-1:-1:-1;;;;;5420:48:1;5404:14;;;5397:72;5532:4;5521:16;;;5515:23;5508:31;5501:39;5485:14;;5478:63;5269:278;6114:52;6223:15;;;;6195:4;6186:14;;;;;6087:1;6080:9;6051:197;;6279:186;6338:6;6391:2;6379:9;6370:7;6366:23;6362:32;6359:52;;;6407:1;6404;6397:12;6359:52;6430:29;6449:9;6430:29;:::i;6470:632::-;6641:2;6693:21;;;6763:13;;6666:18;;;6785:22;;;6612:4;;6641:2;6864:15;;;;6838:2;6823:18;;;6612:4;6907:169;6921:6;6918:1;6915:13;6907:169;;;6982:13;;6970:26;;7051:15;;;;7016:12;;;;6943:1;6936:9;6907:169;;7107:322;7184:6;7192;7200;7253:2;7241:9;7232:7;7228:23;7224:32;7221:52;;;7269:1;7266;7259:12;7221:52;7292:29;7311:9;7292:29;:::i;:::-;7282:39;7368:2;7353:18;;7340:32;;-1:-1:-1;7419:2:1;7404:18;;;7391:32;;7107:322;-1:-1:-1;;;7107:322:1:o;7434:254::-;7499:6;7507;7560:2;7548:9;7539:7;7535:23;7531:32;7528:52;;;7576:1;7573;7566:12;7528:52;7599:29;7618:9;7599:29;:::i;:::-;7589:39;;7647:35;7678:2;7667:9;7663:18;7647:35;:::i;:::-;7637:45;;7434:254;;;;;:::o;7693:667::-;7788:6;7796;7804;7812;7865:3;7853:9;7844:7;7840:23;7836:33;7833:53;;;7882:1;7879;7872:12;7833:53;7905:29;7924:9;7905:29;:::i;:::-;7895:39;;7953:38;7987:2;7976:9;7972:18;7953:38;:::i;:::-;7943:48;;8038:2;8027:9;8023:18;8010:32;8000:42;;8093:2;8082:9;8078:18;8065:32;-1:-1:-1;;;;;8112:6:1;8109:30;8106:50;;;8152:1;8149;8142:12;8106:50;8175:22;;8228:4;8220:13;;8216:27;-1:-1:-1;8206:55:1;;8257:1;8254;8247:12;8206:55;8280:74;8346:7;8341:2;8328:16;8323:2;8319;8315:11;8280:74;:::i;:::-;8270:84;;;7693:667;;;;;;;:::o;8365:265::-;5353:12;;-1:-1:-1;;;;;5349:38:1;5337:51;;5441:4;5430:16;;;5424:23;-1:-1:-1;;;;;5420:48:1;5404:14;;;5397:72;5532:4;5521:16;;;5515:23;5508:31;5501:39;5485:14;;;5478:63;8561:2;8546:18;;8573:51;5269:278;8635:367;8698:8;8708:6;8762:3;8755:4;8747:6;8743:17;8739:27;8729:55;;8780:1;8777;8770:12;8729:55;-1:-1:-1;8803:20:1;;-1:-1:-1;;;;;8835:30:1;;8832:50;;;8878:1;8875;8868:12;8832:50;8915:4;8907:6;8903:17;8891:29;;8975:3;8968:4;8958:6;8955:1;8951:14;8943:6;8939:27;8935:38;8932:47;8929:67;;;8992:1;8989;8982:12;8929:67;8635:367;;;;;:::o;9007:773::-;9129:6;9137;9145;9153;9206:2;9194:9;9185:7;9181:23;9177:32;9174:52;;;9222:1;9219;9212:12;9174:52;9262:9;9249:23;-1:-1:-1;;;;;9332:2:1;9324:6;9321:14;9318:34;;;9348:1;9345;9338:12;9318:34;9387:70;9449:7;9440:6;9429:9;9425:22;9387:70;:::i;:::-;9476:8;;-1:-1:-1;9361:96:1;-1:-1:-1;9564:2:1;9549:18;;9536:32;;-1:-1:-1;9580:16:1;;;9577:36;;;9609:1;9606;9599:12;9577:36;;9648:72;9712:7;9701:8;9690:9;9686:24;9648:72;:::i;:::-;9007:773;;;;-1:-1:-1;9739:8:1;-1:-1:-1;;;;9007:773:1:o;9785:260::-;9853:6;9861;9914:2;9902:9;9893:7;9889:23;9885:32;9882:52;;;9930:1;9927;9920:12;9882:52;9953:29;9972:9;9953:29;:::i;:::-;9943:39;;10001:38;10035:2;10024:9;10020:18;10001:38;:::i;10050:254::-;10118:6;10126;10179:2;10167:9;10158:7;10154:23;10150:32;10147:52;;;10195:1;10192;10185:12;10147:52;10231:9;10218:23;10208:33;;10260:38;10294:2;10283:9;10279:18;10260:38;:::i;10309:380::-;10388:1;10384:12;;;;10431;;;10452:61;;10506:4;10498:6;10494:17;10484:27;;10452:61;10559:2;10551:6;10548:14;10528:18;10525:38;10522:161;;10605:10;10600:3;10596:20;10593:1;10586:31;10640:4;10637:1;10630:15;10668:4;10665:1;10658:15;10522:161;;10309:380;;;:::o;10694:356::-;10896:2;10878:21;;;10915:18;;;10908:30;10974:34;10969:2;10954:18;;10947:62;11041:2;11026:18;;10694:356::o;11265:127::-;11326:10;11321:3;11317:20;11314:1;11307:31;11357:4;11354:1;11347:15;11381:4;11378:1;11371:15;11939:973;12024:12;;11989:3;;12079:1;12099:18;;;;12152;;;;12179:61;;12233:4;12225:6;12221:17;12211:27;;12179:61;12259:2;12307;12299:6;12296:14;12276:18;12273:38;12270:161;;12353:10;12348:3;12344:20;12341:1;12334:31;12388:4;12385:1;12378:15;12416:4;12413:1;12406:15;12270:161;12447:18;12474:104;;;;12592:1;12587:319;;;;12440:466;;12474:104;-1:-1:-1;;12507:24:1;;12495:37;;12552:16;;;;-1:-1:-1;12474:104:1;;12587:319;11886:1;11879:14;;;11923:4;11910:18;;12681:1;12695:165;12709:6;12706:1;12703:13;12695:165;;;12787:14;;12774:11;;;12767:35;12830:16;;;;12724:10;;12695:165;;;12699:3;;12889:6;12884:3;12880:16;12873:23;;12440:466;;;;;;;11939:973;;;;:::o;12917:550::-;13141:3;13179:6;13173:13;13195:53;13241:6;13236:3;13229:4;13221:6;13217:17;13195:53;:::i;:::-;13311:13;;13270:16;;;;13333:57;13311:13;13270:16;13367:4;13355:17;;13333:57;:::i;:::-;13406:55;13451:8;13444:5;13440:20;13432:6;13406:55;:::i;:::-;13399:62;12917:550;-1:-1:-1;;;;;;;12917:550:1:o;14227:127::-;14288:10;14283:3;14279:20;14276:1;14269:31;14319:4;14316:1;14309:15;14343:4;14340:1;14333:15;14359:135;14398:3;14419:17;;;14416:43;;14439:18;;:::i;:::-;-1:-1:-1;14486:1:1;14475:13;;14359:135::o;14848:197::-;14976:3;15001:38;15035:3;15027:6;15001:38;:::i;15050:128::-;15090:3;15121:1;15117:6;15114:1;15111:13;15108:39;;;15127:18;;:::i;:::-;-1:-1:-1;15163:9:1;;15050:128::o;15590:489::-;-1:-1:-1;;;;;15859:15:1;;;15841:34;;15911:15;;15906:2;15891:18;;15884:43;15958:2;15943:18;;15936:34;;;16006:3;16001:2;15986:18;;15979:31;;;15784:4;;16027:46;;16053:19;;16045:6;16027:46;:::i;:::-;16019:54;15590:489;-1:-1:-1;;;;;;15590:489:1:o;16084:249::-;16153:6;16206:2;16194:9;16185:7;16181:23;16177:32;16174:52;;;16222:1;16219;16212:12;16174:52;16254:9;16248:16;16273:30;16297:5;16273:30;:::i;16338:127::-;16399:10;16394:3;16390:20;16387:1;16380:31;16430:4;16427:1;16420:15;16454:4;16451:1;16444:15;16470:120;16510:1;16536;16526:35;;16541:18;;:::i;:::-;-1:-1:-1;16575:9:1;;16470:120::o;16595:125::-;16635:4;16663:1;16660;16657:8;16654:34;;;16668:18;;:::i;:::-;-1:-1:-1;16705:9:1;;16595:125::o;16725:112::-;16757:1;16783;16773:35;;16788:18;;:::i;:::-;-1:-1:-1;16822:9:1;;16725:112::o

Swarm Source

ipfs://417f4ac239f99b4d95d6d9764886dc14240c00beec4d2131d04ae1b2335fc3f8
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.