ETH Price: $3,369.84 (-8.38%)

Token

CaveDinos (CAVEDINOS)
 

Overview

Max Total Supply

5,000 CAVEDINOS

Holders

591

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
Fake_Phishing76541
Balance
336 CAVEDINOS
0xae5e3351885c29619f5d1e45d5d237ab07415f05
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:
CaveDinos

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-04
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// 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: @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/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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);
}

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


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

pragma solidity ^0.8.0;


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

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

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

// File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/IERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;



/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * 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();

    // Compiler will pack this into a single 256bit word.
    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;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

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

// File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;







/**
 * @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 Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

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

    // The number of tokens burned.
    uint256 internal _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 _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    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();
        }
    }

    /**
     * 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 See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

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

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].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 {
        _addressData[owner].aux = aux;
    }

    /**
     * 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) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // 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.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

    /**
     * @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, tokenId.toString())) : '';
    }

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

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

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

        _approve(to, tokenId, owner);
    }

    /**
     * @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 == _msgSender()) revert ApproveToCaller();

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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.isContract() && !_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 && !_ownerships[tokenId].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 {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

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

            if (to.isContract()) {
                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 {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // 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 {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // 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 {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        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 Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @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 IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == 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 {}
}

// File: contracts/CaveDinos.sol


pragma solidity ^0.8.7;






contract CaveDinos is ERC721A, Ownable {
    
    using Strings for uint256;

    address breedingContract;
   
    string public baseURI;
    bytes32 private whitelistRoot;
    

    //Inventory
    uint16 public maxMintAmountPerTransaction = 10;
    uint16 public maxMintAmountPerWallet = 10;
    uint16 public maxMintAmountPerWhitelist = 3;
    uint256 public maxSupply = 10000;
    uint256 public payableMints = 2223;
    
    //Prices
    uint256 public cost = 0.18 ether;
    uint256 public whitelistCost = 0.15 ether;


    //counters
    uint256 public mintableCounter = 0;

    //Utility
    bool public paused = false;
    bool public claimable = false;
    bool public whiteListingSale = true;

    //mapping
    mapping(address => uint256) private whitelistedMints;
    //bad baby dino Claims 
    mapping(uint256 => bool) public bbdClaimed;

    IERC721 bbd721;

    constructor(string memory _baseUrl, address _bbdContractAddress) ERC721A("CaveDinos", "CAVEDINOS") {
        baseURI = _baseUrl;
        bbd721 = IERC721(_bbdContractAddress);
    }

    function getClaimableData(uint256[] memory bbdTokens) public view  returns(bool[] memory) {
        bool[] memory rd = new bool[](bbdTokens.length);
          for (uint256 i = 0; i < bbdTokens.length; i++) {
            uint256 BBDID = bbdTokens[i];
            rd[i] = bbdClaimed[BBDID];
        }
        return rd;
   }

   function claimFreeCaveDino(uint256[] memory bbdTokens) public {
       require(claimable, "Sorry you Cave Dinos not Claimable");
        uint256 len =  bbdTokens.length;
        unchecked {
            for (uint256 i = 0; i < len; i++) {
            uint256 BBDID = bbdTokens[i];
            //check if already claimed 
            require(!bbdClaimed[BBDID], "This Id is already used to claim");
            //check ownership 
            require(bbd721.ownerOf(BBDID) == msg.sender, "Sorry you dont own this token");
            bbdClaimed[BBDID] = true;          
            }
        }

         _safeMint(msg.sender, len);
       
   }

    function setBreedingContractAddress(address _bAddress) public onlyOwner {
        breedingContract = _bAddress;
    }

    
    function mintExternal(address _address, uint256 _amount) external {
        require(
            msg.sender == breedingContract,
            "Sorry you dont have permission to mint"
        );
        _safeMint(_address, _amount);
    }

    function setWhitelistingRoot(bytes32 _root) public onlyOwner {
        whitelistRoot = _root;
    }

   

    // Verify that a given leaf is in the tree.
    function _verify(
        bytes32 _leafNode,
        bytes32[] memory proof
    ) internal view returns (bool) {
        
            return MerkleProof.verify(proof, whitelistRoot, _leafNode);
        
    }

    // Generate the leaf node (just the hash of tokenID concatenated with the account address)
    function _leaf(address account) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(account));
    }

    //whitelist mint
    function mintWhitelist(
        uint256 _mintAmount,
        bytes32[] calldata proof
    ) public payable {
        if (msg.sender != owner()) {
            require(!paused);
            require(whiteListingSale, "Whitelisting not enabled");
            require(
                    msg.value >= (whitelistCost * _mintAmount),
                    "Insuffient funds"
                );

        }

        require(
                    _verify(_leaf(msg.sender), proof),
                    "Invalid proof"
                );
                require(
                    (whitelistedMints[msg.sender] + _mintAmount) <=
                        maxMintAmountPerWhitelist,
                    "Exceeds Max Mint amount"
                );

                require(
                mintableCounter + _mintAmount <= payableMints,
                "Exceeds Max Supply on Purchases"
            );

            require(
                totalSupply() + _mintAmount <= maxSupply,
                "Exceeds Max Supply"
            );



       
        whitelistedMints[msg.sender] =
            whitelistedMints[msg.sender] +
            _mintAmount;

        mintableCounter += _mintAmount;

             _safeMint(msg.sender, _mintAmount);
    }

    // public
    function mint(uint256 _mintAmount) public payable {
        
        if (msg.sender != owner()) {
            uint256 ownerTokenCount = balanceOf(msg.sender);
            require(!paused);
            require(!whiteListingSale, "You cant mint on Presale");
            require(_mintAmount > 0, "Mint amount should be greater than 0");
            require(
                    msg.value >= (cost * _mintAmount),
                    "Insuffient funds"
                );
            require(
                _mintAmount <= maxMintAmountPerTransaction,
                "Sorry you cant mint this amount at once"
            );
            require(
                (ownerTokenCount + _mintAmount) <= maxMintAmountPerWallet,
                "Sorry you cant mint more"
            );
        }

          
            require(
                mintableCounter + _mintAmount <= payableMints,
                "Exceeds Max Supply on Purchases"
            );

            require(
                totalSupply() + _mintAmount <= maxSupply,
                "Exceeds Max Supply"
            );
            

         mintableCounter += _mintAmount;
        _safeMint(msg.sender, _mintAmount);
    }

    function gift(address _to, uint256 _mintAmount, bool isMintableStock) public onlyOwner {
        require(
                totalSupply() + _mintAmount <= maxSupply,
                "Exceeds Max Supply"
            );
        if(isMintableStock){
             require(
                mintableCounter + _mintAmount <= payableMints,
                "Exceeds Max Supply on Purchases"
            );
             mintableCounter += _mintAmount;
        }
      _safeMint(_to, _mintAmount);
    }

    function airdrop(address[] memory _airdropAddresses, bool isMintableStock) public onlyOwner {
        uint256 len = _airdropAddresses.length;
         if(isMintableStock){
             require(
                mintableCounter + len <= payableMints,
                "Exceeds Max Supply on Purchases"
            );
             mintableCounter += len;
        }
        unchecked {
            for (uint256 i = 0; i < len; i++) {
            address to = _airdropAddresses[i];
             _safeMint(to, 1);
        }
        }
    }

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

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(abi.encodePacked(currentBaseURI, tokenId.toString()))
                : "";
    }

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    function setWhitelistingCost(uint256 _newCost) public onlyOwner {
        whitelistCost = _newCost;
    }

    function setmaxMintAmountPerTransaction(uint16 _amount) public onlyOwner {
        maxMintAmountPerTransaction = _amount;
    }

    function setMaxMintAmountPerWallet(uint16 _amount) public onlyOwner {
        maxMintAmountPerWallet = _amount;
    }

    function setMaxMintAmountPerWhitelist(uint16 _amount) public onlyOwner {
        maxMintAmountPerWhitelist = _amount;
    }

    function setMaxSupply(uint256 _supply) public onlyOwner {
        maxSupply = _supply;
    }

    function setPayableMints(uint256 _val) public  onlyOwner{
        payableMints = _val;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function togglePause() public onlyOwner {
        paused = !paused;
    }

     function toggleClaimable() public onlyOwner {
        claimable = !claimable;
    }

    function toggleWhiteSale() public onlyOwner {
        whiteListingSale = !whiteListingSale;
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseUrl","type":"string"},{"internalType":"address","name":"_bbdContractAddress","type":"address"}],"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":"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":[{"internalType":"address[]","name":"_airdropAddresses","type":"address[]"},{"internalType":"bool","name":"isMintableStock","type":"bool"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bbdClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"bbdTokens","type":"uint256[]"}],"name":"claimFreeCaveDino","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"bbdTokens","type":"uint256[]"}],"name":"getClaimableData","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bool","name":"isMintableStock","type":"bool"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","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":"maxMintAmountPerTransaction","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerWallet","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerWhitelist","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintExternal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintableCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payableMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bAddress","type":"address"}],"name":"setBreedingContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"setMaxMintAmountPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"setMaxMintAmountPerWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"setPayableMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setWhitelistingCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setWhitelistingRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"setmaxMintAmountPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhiteSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListingSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052600c80546403000a000a65ffffffffffff19909116179055612710600d556108af600e5567027f7d0bdb920000600f55670214e8348c4f000060105560006011556012805462ffffff1916620100001790553480156200006357600080fd5b50604051620031203803806200312083398101604081905262000086916200025c565b604051806040016040528060098152602001684361766544696e6f7360b81b815250604051806040016040528060098152602001684341564544494e4f5360b81b8152508160029080519060200190620000e292919062000199565b508051620000f890600390602084019062000199565b505060008055506200010a3362000147565b81516200011f90600a90602085019062000199565b50601580546001600160a01b0319166001600160a01b039290921691909117905550620003a0565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001a7906200034d565b90600052602060002090601f016020900481019282620001cb576000855562000216565b82601f10620001e657805160ff191683800117855562000216565b8280016001018555821562000216579182015b8281111562000216578251825591602001919060010190620001f9565b506200022492915062000228565b5090565b5b8082111562000224576000815560010162000229565b80516001600160a01b03811681146200025757600080fd5b919050565b600080604083850312156200027057600080fd5b82516001600160401b03808211156200028857600080fd5b818501915085601f8301126200029d57600080fd5b815181811115620002b257620002b26200038a565b604051601f8201601f19908116603f01168101908382118183101715620002dd57620002dd6200038a565b81604052828152602093508884848701011115620002fa57600080fd5b600091505b828210156200031e5784820184015181830185015290830190620002ff565b82821115620003305760008484830101525b9550620003429150508582016200023f565b925050509250929050565b600181811c908216806200036257607f821691505b602082108114156200038457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612d7080620003b06000396000f3fe6080604052600436106102e45760003560e01c8063715018a611610190578063cef11729116100dc578063e985e9c511610095578063edb81ffc1161006f578063edb81ffc1461089a578063ee891212146108ca578063f2fde38b146108ea578063f4da18461461090a57600080fd5b8063e985e9c51461081c578063ea44462214610865578063ed8161791461088557600080fd5b8063cef1172914610770578063d5abeb0114610790578063dfc33dd1146107a6578063e5a88cdb146107c6578063e7b99ec7146107e6578063e97800cb146107fc57600080fd5b8063af38d75711610149578063bc951b9111610123578063bc951b91146106fa578063c4ae31681461071b578063c87b56dd14610730578063ca0641fa1461075057600080fd5b8063af38d757146106a0578063b88d4fde146106bf578063bbb89744146106df57600080fd5b8063715018a6146105f857806383089b0a1461060d5780638da5cb5b1461063a57806395d89b4114610658578063a0712d681461066d578063a22cb4651461068057600080fd5b806342842e0e1161024f5780635c975abb116102085780636c0360eb116101e25780636c0360eb1461058d5780636d6de9c1146105a25780636f8b44b0146105b857806370a08231146105d857600080fd5b80635c975abb146105335780636352211e1461054d57806368570bd61461056d57600080fd5b806342842e0e1461047d57806344a0d68a1461049d57806344b0db4f146104bd57806346eeae79146104dd578063559f43b8146104f357806355f804b31461051357600080fd5b806313faede6116102a157806313faede6146103cd57806318160ddd146103f157806323b872dd1461040a5780632cefffa71461042a5780633ccfd60b1461046057806340897bbe1461046857600080fd5b806301ffc9a7146102e957806304ba73cd1461031e578063061431a81461034057806306fdde0314610353578063081812fc14610375578063095ea7b3146103ad575b600080fd5b3480156102f557600080fd5b506103096103043660046128bf565b61092a565b60405190151581526020015b60405180910390f35b34801561032a57600080fd5b5061033e6103393660046128a6565b61097c565b005b61033e61034e366004612965565b6109b4565b34801561035f57600080fd5b50610368610c65565b6040516103159190612ac1565b34801561038157600080fd5b506103956103903660046128a6565b610cf7565b6040516001600160a01b039091168152602001610315565b3480156103b957600080fd5b5061033e6103c83660046126ee565b610d3b565b3480156103d957600080fd5b506103e3600f5481565b604051908152602001610315565b3480156103fd57600080fd5b50600154600054036103e3565b34801561041657600080fd5b5061033e6104253660046125f9565b610dc4565b34801561043657600080fd5b50600c5461044d90640100000000900461ffff1681565b60405161ffff9091168152602001610315565b61033e610dcf565b34801561047457600080fd5b5061033e610e6d565b34801561048957600080fd5b5061033e6104983660046125f9565b610eb4565b3480156104a957600080fd5b5061033e6104b83660046128a6565b610ecf565b3480156104c957600080fd5b5061033e6104d836600461280f565b610efe565b3480156104e957600080fd5b506103e360115481565b3480156104ff57600080fd5b5061033e61050e36600461271a565b6110f3565b34801561051f57600080fd5b5061033e61052e3660046128f9565b6111ad565b34801561053f57600080fd5b506012546103099060ff1681565b34801561055957600080fd5b506103956105683660046128a6565b6111ea565b34801561057957600080fd5b5061033e610588366004612586565b6111fc565b34801561059957600080fd5b50610368611248565b3480156105ae57600080fd5b506103e3600e5481565b3480156105c457600080fd5b5061033e6105d33660046128a6565b6112d6565b3480156105e457600080fd5b506103e36105f3366004612586565b611305565b34801561060457600080fd5b5061033e611353565b34801561061957600080fd5b5061062d61062836600461280f565b611389565b6040516103159190612a7b565b34801561064657600080fd5b506008546001600160a01b0316610395565b34801561066457600080fd5b50610368611459565b61033e61067b3660046128a6565b611468565b34801561068c57600080fd5b5061033e61069b3660046126b9565b6116f4565b3480156106ac57600080fd5b5060125461030990610100900460ff1681565b3480156106cb57600080fd5b5061033e6106da36600461263a565b61178a565b3480156106eb57600080fd5b50600c5461044d9061ffff1681565b34801561070657600080fd5b50600c5461044d9062010000900461ffff1681565b34801561072757600080fd5b5061033e6117db565b34801561073c57600080fd5b5061036861074b3660046128a6565b611819565b34801561075c57600080fd5b5061033e61076b366004612758565b6118e4565b34801561077c57600080fd5b5061033e61078b366004612941565b61199a565b34801561079c57600080fd5b506103e3600d5481565b3480156107b257600080fd5b5061033e6107c13660046128a6565b6119e4565b3480156107d257600080fd5b506012546103099062010000900460ff1681565b3480156107f257600080fd5b506103e360105481565b34801561080857600080fd5b5061033e610817366004612941565b611a13565b34801561082857600080fd5b506103096108373660046125c0565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561087157600080fd5b5061033e610880366004612941565b611a55565b34801561089157600080fd5b5061033e611aa3565b3480156108a657600080fd5b506103096108b53660046128a6565b60146020526000908152604090205460ff1681565b3480156108d657600080fd5b5061033e6108e53660046128a6565b611aec565b3480156108f657600080fd5b5061033e610905366004612586565b611b1b565b34801561091657600080fd5b5061033e6109253660046126ee565b611bb3565b60006001600160e01b031982166380ac58cd60e01b148061095b57506001600160e01b03198216635b5e139f60e01b145b8061097657506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146109af5760405162461bcd60e51b81526004016109a690612b37565b60405180910390fd5b600e55565b6008546001600160a01b03163314610a7e5760125460ff16156109d657600080fd5b60125462010000900460ff16610a2e5760405162461bcd60e51b815260206004820152601860248201527f57686974656c697374696e67206e6f7420656e61626c6564000000000000000060448201526064016109a6565b82601054610a3c9190612beb565b341015610a7e5760405162461bcd60e51b815260206004820152601060248201526f496e7375666669656e742066756e647360801b60448201526064016109a6565b604080513360601b6bffffffffffffffffffffffff19166020808301919091528251601481840301815260349092019092528051910120610af290838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c2692505050565b610b2e5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b60448201526064016109a6565b600c543360009081526013602052604090205464010000000090910461ffff1690610b5a908590612bbf565b1115610ba85760405162461bcd60e51b815260206004820152601760248201527f45786365656473204d6178204d696e7420616d6f756e7400000000000000000060448201526064016109a6565b600e5483601154610bb99190612bbf565b1115610bd75760405162461bcd60e51b81526004016109a690612b00565b600d5483610be86001546000540390565b610bf29190612bbf565b1115610c105760405162461bcd60e51b81526004016109a690612ad4565b33600090815260136020526040902054610c2b908490612bbf565b3360009081526013602052604081209190915560118054859290610c50908490612bbf565b90915550610c6090503384611c35565b505050565b606060028054610c7490612c4d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca090612c4d565b8015610ced5780601f10610cc257610100808354040283529160200191610ced565b820191906000526020600020905b815481529060010190602001808311610cd057829003601f168201915b5050505050905090565b6000610d0282611c4f565b610d1f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d46826111ea565b9050806001600160a01b0316836001600160a01b03161415610d7b5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610d9b5750610d998133610837565b155b15610db9576040516367d9dca160e11b815260040160405180910390fd5b610c60838383611c7a565b610c60838383611cd6565b6008546001600160a01b03163314610df95760405162461bcd60e51b81526004016109a690612b37565b6000610e0d6008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610e57576040519150601f19603f3d011682016040523d82523d6000602084013e610e5c565b606091505b5050905080610e6a57600080fd5b50565b6008546001600160a01b03163314610e975760405162461bcd60e51b81526004016109a690612b37565b6012805461ff001981166101009182900460ff1615909102179055565b610c608383836040518060200160405280600081525061178a565b6008546001600160a01b03163314610ef95760405162461bcd60e51b81526004016109a690612b37565b600f55565b601254610100900460ff16610f605760405162461bcd60e51b815260206004820152602260248201527f536f72727920796f7520436176652044696e6f73206e6f7420436c61696d61626044820152616c6560f01b60648201526084016109a6565b805160005b818110156110e4576000838281518110610f8157610f81612ce3565b6020908102919091018101516000818152601490925260409091205490915060ff1615610ff05760405162461bcd60e51b815260206004820181905260248201527f5468697320496420697320616c7265616479207573656420746f20636c61696d60448201526064016109a6565b6015546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561103457600080fd5b505afa158015611048573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106c91906125a3565b6001600160a01b0316146110c25760405162461bcd60e51b815260206004820152601d60248201527f536f72727920796f7520646f6e74206f776e207468697320746f6b656e00000060448201526064016109a6565b6000908152601460205260409020805460ff1916600190811790915501610f65565b506110ef3382611c35565b5050565b6008546001600160a01b0316331461111d5760405162461bcd60e51b81526004016109a690612b37565b600d548261112e6001546000540390565b6111389190612bbf565b11156111565760405162461bcd60e51b81526004016109a690612ad4565b80156111a357600e548260115461116d9190612bbf565b111561118b5760405162461bcd60e51b81526004016109a690612b00565b816011600082825461119d9190612bbf565b90915550505b610c608383611c35565b6008546001600160a01b031633146111d75760405162461bcd60e51b81526004016109a690612b37565b80516110ef90600a906020840190612481565b60006111f582611ec3565b5192915050565b6008546001600160a01b031633146112265760405162461bcd60e51b81526004016109a690612b37565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600a805461125590612c4d565b80601f016020809104026020016040519081016040528092919081815260200182805461128190612c4d565b80156112ce5780601f106112a3576101008083540402835291602001916112ce565b820191906000526020600020905b8154815290600101906020018083116112b157829003601f168201915b505050505081565b6008546001600160a01b031633146113005760405162461bcd60e51b81526004016109a690612b37565b600d55565b60006001600160a01b03821661132e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b0316331461137d5760405162461bcd60e51b81526004016109a690612b37565b6113876000611fdd565b565b6060600082516001600160401b038111156113a6576113a6612cf9565b6040519080825280602002602001820160405280156113cf578160200160208202803683370190505b50905060005b83518110156114525760008482815181106113f2576113f2612ce3565b602002602001015190506014600082815260200190815260200160002060009054906101000a900460ff1683838151811061142f5761142f612ce3565b91151560209283029190910190910152508061144a81612c88565b9150506113d5565b5092915050565b606060038054610c7490612c4d565b6008546001600160a01b0316331461166a57600061148533611305565b60125490915060ff161561149857600080fd5b60125462010000900460ff16156114f15760405162461bcd60e51b815260206004820152601860248201527f596f752063616e74206d696e74206f6e2050726573616c65000000000000000060448201526064016109a6565b6000821161154d5760405162461bcd60e51b8152602060048201526024808201527f4d696e7420616d6f756e742073686f756c6420626520677265617465722074686044820152630616e20360e41b60648201526084016109a6565b81600f5461155b9190612beb565b34101561159d5760405162461bcd60e51b815260206004820152601060248201526f496e7375666669656e742066756e647360801b60448201526064016109a6565b600c5461ffff168211156116035760405162461bcd60e51b815260206004820152602760248201527f536f72727920796f752063616e74206d696e74207468697320616d6f756e74206044820152666174206f6e636560c81b60648201526084016109a6565b600c5462010000900461ffff1661161a8383612bbf565b11156116685760405162461bcd60e51b815260206004820152601860248201527f536f72727920796f752063616e74206d696e74206d6f7265000000000000000060448201526064016109a6565b505b600e548160115461167b9190612bbf565b11156116995760405162461bcd60e51b81526004016109a690612b00565b600d54816116aa6001546000540390565b6116b49190612bbf565b11156116d25760405162461bcd60e51b81526004016109a690612ad4565b80601160008282546116e49190612bbf565b90915550610e6a90503382611c35565b6001600160a01b03821633141561171e5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611795848484611cd6565b6001600160a01b0383163b151580156117b757506117b58484848461202f565b155b156117d5576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146118055760405162461bcd60e51b81526004016109a690612b37565b6012805460ff19811660ff90911615179055565b606061182482611c4f565b6118885760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109a6565b6000611892612127565b905060008151116118b257604051806020016040528060008152506118dd565b806118bc84612136565b6040516020016118cd929190612a0f565b6040516020818303038152906040525b9392505050565b6008546001600160a01b0316331461190e5760405162461bcd60e51b81526004016109a690612b37565b8151811561195d57600e54816011546119279190612bbf565b11156119455760405162461bcd60e51b81526004016109a690612b00565b80601160008282546119579190612bbf565b90915550505b60005b818110156117d557600084828151811061197c5761197c612ce3565b60200260200101519050611991816001611c35565b50600101611960565b6008546001600160a01b031633146119c45760405162461bcd60e51b81526004016109a690612b37565b600c805461ffff909216620100000263ffff000019909216919091179055565b6008546001600160a01b03163314611a0e5760405162461bcd60e51b81526004016109a690612b37565b601055565b6008546001600160a01b03163314611a3d5760405162461bcd60e51b81526004016109a690612b37565b600c805461ffff191661ffff92909216919091179055565b6008546001600160a01b03163314611a7f5760405162461bcd60e51b81526004016109a690612b37565b600c805461ffff9092166401000000000265ffff0000000019909216919091179055565b6008546001600160a01b03163314611acd5760405162461bcd60e51b81526004016109a690612b37565b6012805462ff0000198116620100009182900460ff1615909102179055565b6008546001600160a01b03163314611b165760405162461bcd60e51b81526004016109a690612b37565b600b55565b6008546001600160a01b03163314611b455760405162461bcd60e51b81526004016109a690612b37565b6001600160a01b038116611baa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a6565b610e6a81611fdd565b6009546001600160a01b03163314611c1c5760405162461bcd60e51b815260206004820152602660248201527f536f72727920796f7520646f6e742068617665207065726d697373696f6e20746044820152651bc81b5a5b9d60d21b60648201526084016109a6565b6110ef8282611c35565b60006118dd82600b5485612233565b6110ef828260405180602001604052806000815250612249565b6000805482108015610976575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611ce182611ec3565b9050836001600160a01b031681600001516001600160a01b031614611d185760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611d365750611d368533610837565b80611d51575033611d4684610cf7565b6001600160a01b0316145b905080611d7157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611d9857604051633a954ecd60e21b815260040160405180910390fd5b611da460008487611c7a565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611e78576000548214611e7857805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b604080516060810182526000808252602082018190529181019190915281600054811015611fc457600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290611fc25780516001600160a01b031615611f59579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611fbd579392505050565b611f59565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612064903390899088908890600401612a3e565b602060405180830381600087803b15801561207e57600080fd5b505af19250505080156120ae575060408051601f3d908101601f191682019092526120ab918101906128dc565b60015b612109573d8080156120dc576040519150601f19603f3d011682016040523d82523d6000602084013e6120e1565b606091505b508051612101576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600a8054610c7490612c4d565b60608161215a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612184578061216e81612c88565b915061217d9050600a83612bd7565b915061215e565b6000816001600160401b0381111561219e5761219e612cf9565b6040519080825280601f01601f1916602001820160405280156121c8576020820181803683370190505b5090505b841561211f576121dd600183612c0a565b91506121ea600a86612ca3565b6121f5906030612bbf565b60f81b81838151811061220a5761220a612ce3565b60200101906001600160f81b031916908160001a90535061222c600a86612bd7565b94506121cc565b600082612240858461240d565b14949350505050565b6000546001600160a01b03841661227257604051622e076360e81b815260040160405180910390fd5b826122905760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b156123b8575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612381600087848060010195508761202f565b61239e576040516368d2bf6b60e11b815260040160405180910390fd5b8082106123365782600054146123b357600080fd5b6123fd565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106123b9575b5060009081556117d59085838684565b600081815b845181101561247957600085828151811061242f5761242f612ce3565b602002602001015190508083116124555760008381526020829052604090209250612466565b600081815260208490526040902092505b508061247181612c88565b915050612412565b509392505050565b82805461248d90612c4d565b90600052602060002090601f0160209004810192826124af57600085556124f5565b82601f106124c857805160ff19168380011785556124f5565b828001600101855582156124f5579182015b828111156124f55782518255916020019190600101906124da565b50612501929150612505565b5090565b5b808211156125015760008155600101612506565b60006001600160401b0383111561253357612533612cf9565b612546601f8401601f1916602001612b6c565b905082815283838301111561255a57600080fd5b828260208301376000602084830101529392505050565b8035801515811461258157600080fd5b919050565b60006020828403121561259857600080fd5b81356118dd81612d0f565b6000602082840312156125b557600080fd5b81516118dd81612d0f565b600080604083850312156125d357600080fd5b82356125de81612d0f565b915060208301356125ee81612d0f565b809150509250929050565b60008060006060848603121561260e57600080fd5b833561261981612d0f565b9250602084013561262981612d0f565b929592945050506040919091013590565b6000806000806080858703121561265057600080fd5b843561265b81612d0f565b9350602085013561266b81612d0f565b92506040850135915060608501356001600160401b0381111561268d57600080fd5b8501601f8101871361269e57600080fd5b6126ad8782356020840161251a565b91505092959194509250565b600080604083850312156126cc57600080fd5b82356126d781612d0f565b91506126e560208401612571565b90509250929050565b6000806040838503121561270157600080fd5b823561270c81612d0f565b946020939093013593505050565b60008060006060848603121561272f57600080fd5b833561273a81612d0f565b92506020840135915061274f60408501612571565b90509250925092565b6000806040838503121561276b57600080fd5b82356001600160401b0381111561278157600080fd5b8301601f8101851361279257600080fd5b803560206127a76127a283612b9c565b612b6c565b80838252828201915082850189848660051b88010111156127c757600080fd5b600095505b848610156127f35780356127df81612d0f565b8352600195909501949183019183016127cc565b5095506128039050868201612571565b93505050509250929050565b6000602080838503121561282257600080fd5b82356001600160401b0381111561283857600080fd5b8301601f8101851361284957600080fd5b80356128576127a282612b9c565b80828252848201915084840188868560051b870101111561287757600080fd5b600094505b8385101561289a57803583526001949094019391850191850161287c565b50979650505050505050565b6000602082840312156128b857600080fd5b5035919050565b6000602082840312156128d157600080fd5b81356118dd81612d24565b6000602082840312156128ee57600080fd5b81516118dd81612d24565b60006020828403121561290b57600080fd5b81356001600160401b0381111561292157600080fd5b8201601f8101841361293257600080fd5b61211f8482356020840161251a565b60006020828403121561295357600080fd5b813561ffff811681146118dd57600080fd5b60008060006040848603121561297a57600080fd5b8335925060208401356001600160401b038082111561299857600080fd5b818601915086601f8301126129ac57600080fd5b8135818111156129bb57600080fd5b8760208260051b85010111156129d057600080fd5b6020830194508093505050509250925092565b600081518084526129fb816020860160208601612c21565b601f01601f19169290920160200192915050565b60008351612a21818460208801612c21565b835190830190612a35818360208801612c21565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a71908301846129e3565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612ab5578351151583529284019291840191600101612a97565b50909695505050505050565b6020815260006118dd60208301846129e3565b60208082526012908201527145786365656473204d617820537570706c7960701b604082015260600190565b6020808252601f908201527f45786365656473204d617820537570706c79206f6e2050757263686173657300604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f191681016001600160401b0381118282101715612b9457612b94612cf9565b604052919050565b60006001600160401b03821115612bb557612bb5612cf9565b5060051b60200190565b60008219821115612bd257612bd2612cb7565b500190565b600082612be657612be6612ccd565b500490565b6000816000190483118215151615612c0557612c05612cb7565b500290565b600082821015612c1c57612c1c612cb7565b500390565b60005b83811015612c3c578181015183820152602001612c24565b838111156117d55750506000910152565b600181811c90821680612c6157607f821691505b60208210811415612c8257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612c9c57612c9c612cb7565b5060010190565b600082612cb257612cb2612ccd565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e6a57600080fd5b6001600160e01b031981168114610e6a57600080fdfea26469706673582212203241a878f5832cccd0137774c1ddf80b3259a88351844dab89b9d54ae94afc7c64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000df93e81f3231afaea101861ea3f6ca109fb075aa000000000000000000000000000000000000000000000000000000000000004668747470733a2f2f75732d63656e7472616c312d6d6f666f732d36396136322e636c6f756466756e6374696f6e732e6e65742f6170702f6361766564696e6f2f746f6b656e2f0000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102e45760003560e01c8063715018a611610190578063cef11729116100dc578063e985e9c511610095578063edb81ffc1161006f578063edb81ffc1461089a578063ee891212146108ca578063f2fde38b146108ea578063f4da18461461090a57600080fd5b8063e985e9c51461081c578063ea44462214610865578063ed8161791461088557600080fd5b8063cef1172914610770578063d5abeb0114610790578063dfc33dd1146107a6578063e5a88cdb146107c6578063e7b99ec7146107e6578063e97800cb146107fc57600080fd5b8063af38d75711610149578063bc951b9111610123578063bc951b91146106fa578063c4ae31681461071b578063c87b56dd14610730578063ca0641fa1461075057600080fd5b8063af38d757146106a0578063b88d4fde146106bf578063bbb89744146106df57600080fd5b8063715018a6146105f857806383089b0a1461060d5780638da5cb5b1461063a57806395d89b4114610658578063a0712d681461066d578063a22cb4651461068057600080fd5b806342842e0e1161024f5780635c975abb116102085780636c0360eb116101e25780636c0360eb1461058d5780636d6de9c1146105a25780636f8b44b0146105b857806370a08231146105d857600080fd5b80635c975abb146105335780636352211e1461054d57806368570bd61461056d57600080fd5b806342842e0e1461047d57806344a0d68a1461049d57806344b0db4f146104bd57806346eeae79146104dd578063559f43b8146104f357806355f804b31461051357600080fd5b806313faede6116102a157806313faede6146103cd57806318160ddd146103f157806323b872dd1461040a5780632cefffa71461042a5780633ccfd60b1461046057806340897bbe1461046857600080fd5b806301ffc9a7146102e957806304ba73cd1461031e578063061431a81461034057806306fdde0314610353578063081812fc14610375578063095ea7b3146103ad575b600080fd5b3480156102f557600080fd5b506103096103043660046128bf565b61092a565b60405190151581526020015b60405180910390f35b34801561032a57600080fd5b5061033e6103393660046128a6565b61097c565b005b61033e61034e366004612965565b6109b4565b34801561035f57600080fd5b50610368610c65565b6040516103159190612ac1565b34801561038157600080fd5b506103956103903660046128a6565b610cf7565b6040516001600160a01b039091168152602001610315565b3480156103b957600080fd5b5061033e6103c83660046126ee565b610d3b565b3480156103d957600080fd5b506103e3600f5481565b604051908152602001610315565b3480156103fd57600080fd5b50600154600054036103e3565b34801561041657600080fd5b5061033e6104253660046125f9565b610dc4565b34801561043657600080fd5b50600c5461044d90640100000000900461ffff1681565b60405161ffff9091168152602001610315565b61033e610dcf565b34801561047457600080fd5b5061033e610e6d565b34801561048957600080fd5b5061033e6104983660046125f9565b610eb4565b3480156104a957600080fd5b5061033e6104b83660046128a6565b610ecf565b3480156104c957600080fd5b5061033e6104d836600461280f565b610efe565b3480156104e957600080fd5b506103e360115481565b3480156104ff57600080fd5b5061033e61050e36600461271a565b6110f3565b34801561051f57600080fd5b5061033e61052e3660046128f9565b6111ad565b34801561053f57600080fd5b506012546103099060ff1681565b34801561055957600080fd5b506103956105683660046128a6565b6111ea565b34801561057957600080fd5b5061033e610588366004612586565b6111fc565b34801561059957600080fd5b50610368611248565b3480156105ae57600080fd5b506103e3600e5481565b3480156105c457600080fd5b5061033e6105d33660046128a6565b6112d6565b3480156105e457600080fd5b506103e36105f3366004612586565b611305565b34801561060457600080fd5b5061033e611353565b34801561061957600080fd5b5061062d61062836600461280f565b611389565b6040516103159190612a7b565b34801561064657600080fd5b506008546001600160a01b0316610395565b34801561066457600080fd5b50610368611459565b61033e61067b3660046128a6565b611468565b34801561068c57600080fd5b5061033e61069b3660046126b9565b6116f4565b3480156106ac57600080fd5b5060125461030990610100900460ff1681565b3480156106cb57600080fd5b5061033e6106da36600461263a565b61178a565b3480156106eb57600080fd5b50600c5461044d9061ffff1681565b34801561070657600080fd5b50600c5461044d9062010000900461ffff1681565b34801561072757600080fd5b5061033e6117db565b34801561073c57600080fd5b5061036861074b3660046128a6565b611819565b34801561075c57600080fd5b5061033e61076b366004612758565b6118e4565b34801561077c57600080fd5b5061033e61078b366004612941565b61199a565b34801561079c57600080fd5b506103e3600d5481565b3480156107b257600080fd5b5061033e6107c13660046128a6565b6119e4565b3480156107d257600080fd5b506012546103099062010000900460ff1681565b3480156107f257600080fd5b506103e360105481565b34801561080857600080fd5b5061033e610817366004612941565b611a13565b34801561082857600080fd5b506103096108373660046125c0565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561087157600080fd5b5061033e610880366004612941565b611a55565b34801561089157600080fd5b5061033e611aa3565b3480156108a657600080fd5b506103096108b53660046128a6565b60146020526000908152604090205460ff1681565b3480156108d657600080fd5b5061033e6108e53660046128a6565b611aec565b3480156108f657600080fd5b5061033e610905366004612586565b611b1b565b34801561091657600080fd5b5061033e6109253660046126ee565b611bb3565b60006001600160e01b031982166380ac58cd60e01b148061095b57506001600160e01b03198216635b5e139f60e01b145b8061097657506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146109af5760405162461bcd60e51b81526004016109a690612b37565b60405180910390fd5b600e55565b6008546001600160a01b03163314610a7e5760125460ff16156109d657600080fd5b60125462010000900460ff16610a2e5760405162461bcd60e51b815260206004820152601860248201527f57686974656c697374696e67206e6f7420656e61626c6564000000000000000060448201526064016109a6565b82601054610a3c9190612beb565b341015610a7e5760405162461bcd60e51b815260206004820152601060248201526f496e7375666669656e742066756e647360801b60448201526064016109a6565b604080513360601b6bffffffffffffffffffffffff19166020808301919091528251601481840301815260349092019092528051910120610af290838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c2692505050565b610b2e5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b60448201526064016109a6565b600c543360009081526013602052604090205464010000000090910461ffff1690610b5a908590612bbf565b1115610ba85760405162461bcd60e51b815260206004820152601760248201527f45786365656473204d6178204d696e7420616d6f756e7400000000000000000060448201526064016109a6565b600e5483601154610bb99190612bbf565b1115610bd75760405162461bcd60e51b81526004016109a690612b00565b600d5483610be86001546000540390565b610bf29190612bbf565b1115610c105760405162461bcd60e51b81526004016109a690612ad4565b33600090815260136020526040902054610c2b908490612bbf565b3360009081526013602052604081209190915560118054859290610c50908490612bbf565b90915550610c6090503384611c35565b505050565b606060028054610c7490612c4d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca090612c4d565b8015610ced5780601f10610cc257610100808354040283529160200191610ced565b820191906000526020600020905b815481529060010190602001808311610cd057829003601f168201915b5050505050905090565b6000610d0282611c4f565b610d1f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d46826111ea565b9050806001600160a01b0316836001600160a01b03161415610d7b5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610d9b5750610d998133610837565b155b15610db9576040516367d9dca160e11b815260040160405180910390fd5b610c60838383611c7a565b610c60838383611cd6565b6008546001600160a01b03163314610df95760405162461bcd60e51b81526004016109a690612b37565b6000610e0d6008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610e57576040519150601f19603f3d011682016040523d82523d6000602084013e610e5c565b606091505b5050905080610e6a57600080fd5b50565b6008546001600160a01b03163314610e975760405162461bcd60e51b81526004016109a690612b37565b6012805461ff001981166101009182900460ff1615909102179055565b610c608383836040518060200160405280600081525061178a565b6008546001600160a01b03163314610ef95760405162461bcd60e51b81526004016109a690612b37565b600f55565b601254610100900460ff16610f605760405162461bcd60e51b815260206004820152602260248201527f536f72727920796f7520436176652044696e6f73206e6f7420436c61696d61626044820152616c6560f01b60648201526084016109a6565b805160005b818110156110e4576000838281518110610f8157610f81612ce3565b6020908102919091018101516000818152601490925260409091205490915060ff1615610ff05760405162461bcd60e51b815260206004820181905260248201527f5468697320496420697320616c7265616479207573656420746f20636c61696d60448201526064016109a6565b6015546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561103457600080fd5b505afa158015611048573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106c91906125a3565b6001600160a01b0316146110c25760405162461bcd60e51b815260206004820152601d60248201527f536f72727920796f7520646f6e74206f776e207468697320746f6b656e00000060448201526064016109a6565b6000908152601460205260409020805460ff1916600190811790915501610f65565b506110ef3382611c35565b5050565b6008546001600160a01b0316331461111d5760405162461bcd60e51b81526004016109a690612b37565b600d548261112e6001546000540390565b6111389190612bbf565b11156111565760405162461bcd60e51b81526004016109a690612ad4565b80156111a357600e548260115461116d9190612bbf565b111561118b5760405162461bcd60e51b81526004016109a690612b00565b816011600082825461119d9190612bbf565b90915550505b610c608383611c35565b6008546001600160a01b031633146111d75760405162461bcd60e51b81526004016109a690612b37565b80516110ef90600a906020840190612481565b60006111f582611ec3565b5192915050565b6008546001600160a01b031633146112265760405162461bcd60e51b81526004016109a690612b37565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600a805461125590612c4d565b80601f016020809104026020016040519081016040528092919081815260200182805461128190612c4d565b80156112ce5780601f106112a3576101008083540402835291602001916112ce565b820191906000526020600020905b8154815290600101906020018083116112b157829003601f168201915b505050505081565b6008546001600160a01b031633146113005760405162461bcd60e51b81526004016109a690612b37565b600d55565b60006001600160a01b03821661132e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b0316331461137d5760405162461bcd60e51b81526004016109a690612b37565b6113876000611fdd565b565b6060600082516001600160401b038111156113a6576113a6612cf9565b6040519080825280602002602001820160405280156113cf578160200160208202803683370190505b50905060005b83518110156114525760008482815181106113f2576113f2612ce3565b602002602001015190506014600082815260200190815260200160002060009054906101000a900460ff1683838151811061142f5761142f612ce3565b91151560209283029190910190910152508061144a81612c88565b9150506113d5565b5092915050565b606060038054610c7490612c4d565b6008546001600160a01b0316331461166a57600061148533611305565b60125490915060ff161561149857600080fd5b60125462010000900460ff16156114f15760405162461bcd60e51b815260206004820152601860248201527f596f752063616e74206d696e74206f6e2050726573616c65000000000000000060448201526064016109a6565b6000821161154d5760405162461bcd60e51b8152602060048201526024808201527f4d696e7420616d6f756e742073686f756c6420626520677265617465722074686044820152630616e20360e41b60648201526084016109a6565b81600f5461155b9190612beb565b34101561159d5760405162461bcd60e51b815260206004820152601060248201526f496e7375666669656e742066756e647360801b60448201526064016109a6565b600c5461ffff168211156116035760405162461bcd60e51b815260206004820152602760248201527f536f72727920796f752063616e74206d696e74207468697320616d6f756e74206044820152666174206f6e636560c81b60648201526084016109a6565b600c5462010000900461ffff1661161a8383612bbf565b11156116685760405162461bcd60e51b815260206004820152601860248201527f536f72727920796f752063616e74206d696e74206d6f7265000000000000000060448201526064016109a6565b505b600e548160115461167b9190612bbf565b11156116995760405162461bcd60e51b81526004016109a690612b00565b600d54816116aa6001546000540390565b6116b49190612bbf565b11156116d25760405162461bcd60e51b81526004016109a690612ad4565b80601160008282546116e49190612bbf565b90915550610e6a90503382611c35565b6001600160a01b03821633141561171e5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611795848484611cd6565b6001600160a01b0383163b151580156117b757506117b58484848461202f565b155b156117d5576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146118055760405162461bcd60e51b81526004016109a690612b37565b6012805460ff19811660ff90911615179055565b606061182482611c4f565b6118885760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109a6565b6000611892612127565b905060008151116118b257604051806020016040528060008152506118dd565b806118bc84612136565b6040516020016118cd929190612a0f565b6040516020818303038152906040525b9392505050565b6008546001600160a01b0316331461190e5760405162461bcd60e51b81526004016109a690612b37565b8151811561195d57600e54816011546119279190612bbf565b11156119455760405162461bcd60e51b81526004016109a690612b00565b80601160008282546119579190612bbf565b90915550505b60005b818110156117d557600084828151811061197c5761197c612ce3565b60200260200101519050611991816001611c35565b50600101611960565b6008546001600160a01b031633146119c45760405162461bcd60e51b81526004016109a690612b37565b600c805461ffff909216620100000263ffff000019909216919091179055565b6008546001600160a01b03163314611a0e5760405162461bcd60e51b81526004016109a690612b37565b601055565b6008546001600160a01b03163314611a3d5760405162461bcd60e51b81526004016109a690612b37565b600c805461ffff191661ffff92909216919091179055565b6008546001600160a01b03163314611a7f5760405162461bcd60e51b81526004016109a690612b37565b600c805461ffff9092166401000000000265ffff0000000019909216919091179055565b6008546001600160a01b03163314611acd5760405162461bcd60e51b81526004016109a690612b37565b6012805462ff0000198116620100009182900460ff1615909102179055565b6008546001600160a01b03163314611b165760405162461bcd60e51b81526004016109a690612b37565b600b55565b6008546001600160a01b03163314611b455760405162461bcd60e51b81526004016109a690612b37565b6001600160a01b038116611baa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a6565b610e6a81611fdd565b6009546001600160a01b03163314611c1c5760405162461bcd60e51b815260206004820152602660248201527f536f72727920796f7520646f6e742068617665207065726d697373696f6e20746044820152651bc81b5a5b9d60d21b60648201526084016109a6565b6110ef8282611c35565b60006118dd82600b5485612233565b6110ef828260405180602001604052806000815250612249565b6000805482108015610976575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611ce182611ec3565b9050836001600160a01b031681600001516001600160a01b031614611d185760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611d365750611d368533610837565b80611d51575033611d4684610cf7565b6001600160a01b0316145b905080611d7157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611d9857604051633a954ecd60e21b815260040160405180910390fd5b611da460008487611c7a565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611e78576000548214611e7857805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b604080516060810182526000808252602082018190529181019190915281600054811015611fc457600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290611fc25780516001600160a01b031615611f59579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611fbd579392505050565b611f59565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612064903390899088908890600401612a3e565b602060405180830381600087803b15801561207e57600080fd5b505af19250505080156120ae575060408051601f3d908101601f191682019092526120ab918101906128dc565b60015b612109573d8080156120dc576040519150601f19603f3d011682016040523d82523d6000602084013e6120e1565b606091505b508051612101576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600a8054610c7490612c4d565b60608161215a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612184578061216e81612c88565b915061217d9050600a83612bd7565b915061215e565b6000816001600160401b0381111561219e5761219e612cf9565b6040519080825280601f01601f1916602001820160405280156121c8576020820181803683370190505b5090505b841561211f576121dd600183612c0a565b91506121ea600a86612ca3565b6121f5906030612bbf565b60f81b81838151811061220a5761220a612ce3565b60200101906001600160f81b031916908160001a90535061222c600a86612bd7565b94506121cc565b600082612240858461240d565b14949350505050565b6000546001600160a01b03841661227257604051622e076360e81b815260040160405180910390fd5b826122905760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b156123b8575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612381600087848060010195508761202f565b61239e576040516368d2bf6b60e11b815260040160405180910390fd5b8082106123365782600054146123b357600080fd5b6123fd565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106123b9575b5060009081556117d59085838684565b600081815b845181101561247957600085828151811061242f5761242f612ce3565b602002602001015190508083116124555760008381526020829052604090209250612466565b600081815260208490526040902092505b508061247181612c88565b915050612412565b509392505050565b82805461248d90612c4d565b90600052602060002090601f0160209004810192826124af57600085556124f5565b82601f106124c857805160ff19168380011785556124f5565b828001600101855582156124f5579182015b828111156124f55782518255916020019190600101906124da565b50612501929150612505565b5090565b5b808211156125015760008155600101612506565b60006001600160401b0383111561253357612533612cf9565b612546601f8401601f1916602001612b6c565b905082815283838301111561255a57600080fd5b828260208301376000602084830101529392505050565b8035801515811461258157600080fd5b919050565b60006020828403121561259857600080fd5b81356118dd81612d0f565b6000602082840312156125b557600080fd5b81516118dd81612d0f565b600080604083850312156125d357600080fd5b82356125de81612d0f565b915060208301356125ee81612d0f565b809150509250929050565b60008060006060848603121561260e57600080fd5b833561261981612d0f565b9250602084013561262981612d0f565b929592945050506040919091013590565b6000806000806080858703121561265057600080fd5b843561265b81612d0f565b9350602085013561266b81612d0f565b92506040850135915060608501356001600160401b0381111561268d57600080fd5b8501601f8101871361269e57600080fd5b6126ad8782356020840161251a565b91505092959194509250565b600080604083850312156126cc57600080fd5b82356126d781612d0f565b91506126e560208401612571565b90509250929050565b6000806040838503121561270157600080fd5b823561270c81612d0f565b946020939093013593505050565b60008060006060848603121561272f57600080fd5b833561273a81612d0f565b92506020840135915061274f60408501612571565b90509250925092565b6000806040838503121561276b57600080fd5b82356001600160401b0381111561278157600080fd5b8301601f8101851361279257600080fd5b803560206127a76127a283612b9c565b612b6c565b80838252828201915082850189848660051b88010111156127c757600080fd5b600095505b848610156127f35780356127df81612d0f565b8352600195909501949183019183016127cc565b5095506128039050868201612571565b93505050509250929050565b6000602080838503121561282257600080fd5b82356001600160401b0381111561283857600080fd5b8301601f8101851361284957600080fd5b80356128576127a282612b9c565b80828252848201915084840188868560051b870101111561287757600080fd5b600094505b8385101561289a57803583526001949094019391850191850161287c565b50979650505050505050565b6000602082840312156128b857600080fd5b5035919050565b6000602082840312156128d157600080fd5b81356118dd81612d24565b6000602082840312156128ee57600080fd5b81516118dd81612d24565b60006020828403121561290b57600080fd5b81356001600160401b0381111561292157600080fd5b8201601f8101841361293257600080fd5b61211f8482356020840161251a565b60006020828403121561295357600080fd5b813561ffff811681146118dd57600080fd5b60008060006040848603121561297a57600080fd5b8335925060208401356001600160401b038082111561299857600080fd5b818601915086601f8301126129ac57600080fd5b8135818111156129bb57600080fd5b8760208260051b85010111156129d057600080fd5b6020830194508093505050509250925092565b600081518084526129fb816020860160208601612c21565b601f01601f19169290920160200192915050565b60008351612a21818460208801612c21565b835190830190612a35818360208801612c21565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a71908301846129e3565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612ab5578351151583529284019291840191600101612a97565b50909695505050505050565b6020815260006118dd60208301846129e3565b60208082526012908201527145786365656473204d617820537570706c7960701b604082015260600190565b6020808252601f908201527f45786365656473204d617820537570706c79206f6e2050757263686173657300604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f191681016001600160401b0381118282101715612b9457612b94612cf9565b604052919050565b60006001600160401b03821115612bb557612bb5612cf9565b5060051b60200190565b60008219821115612bd257612bd2612cb7565b500190565b600082612be657612be6612ccd565b500490565b6000816000190483118215151615612c0557612c05612cb7565b500290565b600082821015612c1c57612c1c612cb7565b500390565b60005b83811015612c3c578181015183820152602001612c24565b838111156117d55750506000910152565b600181811c90821680612c6157607f821691505b60208210811415612c8257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612c9c57612c9c612cb7565b5060010190565b600082612cb257612cb2612ccd565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e6a57600080fd5b6001600160e01b031981168114610e6a57600080fdfea26469706673582212203241a878f5832cccd0137774c1ddf80b3259a88351844dab89b9d54ae94afc7c64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000df93e81f3231afaea101861ea3f6ca109fb075aa000000000000000000000000000000000000000000000000000000000000004668747470733a2f2f75732d63656e7472616c312d6d6f666f732d36396136322e636c6f756466756e6374696f6e732e6e65742f6170702f6361766564696e6f2f746f6b656e2f0000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseUrl (string): https://us-central1-mofos-69a62.cloudfunctions.net/app/cavedino/token/
Arg [1] : _bbdContractAddress (address): 0xDf93E81F3231AfAEA101861ea3F6Ca109fB075Aa

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000df93e81f3231afaea101861ea3f6ca109fb075aa
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000046
Arg [3] : 68747470733a2f2f75732d63656e7472616c312d6d6f666f732d36396136322e
Arg [4] : 636c6f756466756e6374696f6e732e6e65742f6170702f6361766564696e6f2f
Arg [5] : 746f6b656e2f0000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

51660:8702:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32775:305;;;;;;;;;;-1:-1:-1;32775:305:0;;;;;:::i;:::-;;:::i;:::-;;;10726:14:1;;10719:22;10701:41;;10689:2;10674:18;32775:305:0;;;;;;;;59706:94;;;;;;;;;;-1:-1:-1;59706:94:0;;;;;:::i;:::-;;:::i;:::-;;54793:1278;;;;;;:::i;:::-;;:::i;35888:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37391:204::-;;;;;;;;;;-1:-1:-1;37391:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9377:32:1;;;9359:51;;9347:2;9332:18;37391:204:0;9213:203:1;36954:371:0;;;;;;;;;;-1:-1:-1;36954:371:0;;;;;:::i;:::-;;:::i;52122:32::-;;;;;;;;;;;;;;;;;;;17647:25:1;;;17635:2;17620:18;52122:32:0;17501:177:1;32015:312:0;;;;;;;;;;-1:-1:-1;32278:12:0;;32068:7;32262:13;:28;32015:312;;38256:170;;;;;;;;;;-1:-1:-1;38256:170:0;;;;;:::i;:::-;;:::i;51972:43::-;;;;;;;;;;-1:-1:-1;51972:43:0;;;;;;;;;;;;;;17482:6:1;17470:19;;;17452:38;;17440:2;17425:18;51972:43:0;17308:188:1;60204:155:0;;;:::i;60004:85::-;;;;;;;;;;;;;:::i;38497:185::-;;;;;;;;;;-1:-1:-1;38497:185:0;;;;;:::i;:::-;;:::i;58998:86::-;;;;;;;;;;-1:-1:-1;58998:86:0;;;;;:::i;:::-;;:::i;53105:657::-;;;;;;;;;;-1:-1:-1;53105:657:0;;;;;:::i;:::-;;:::i;52229:34::-;;;;;;;;;;;;;;;;57321:503;;;;;;;;;;-1:-1:-1;57321:503:0;;;;;:::i;:::-;;:::i;59808:104::-;;;;;;;;;;-1:-1:-1;59808:104:0;;;;;:::i;:::-;;:::i;52287:26::-;;;;;;;;;;-1:-1:-1;52287:26:0;;;;;;;;35696:125;;;;;;;;;;-1:-1:-1;35696:125:0;;;;;:::i;:::-;;:::i;53770:119::-;;;;;;;;;;-1:-1:-1;53770:119:0;;;;;:::i;:::-;;:::i;51782:21::-;;;;;;;;;;;;;:::i;52061:34::-;;;;;;;;;;;;;;;;59604:94;;;;;;;;;;-1:-1:-1;59604:94:0;;;;;:::i;:::-;;:::i;33144:206::-;;;;;;;;;;-1:-1:-1;33144:206:0;;;;;:::i;:::-;;:::i;8880:103::-;;;;;;;;;;;;;:::i;52769:329::-;;;;;;;;;;-1:-1:-1;52769:329:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8229:87::-;;;;;;;;;;-1:-1:-1;8302:6:0;;-1:-1:-1;;;;;8302:6:0;8229:87;;36057:104;;;;;;;;;;;;;:::i;56094:1219::-;;;;;;:::i;:::-;;:::i;37667:287::-;;;;;;;;;;-1:-1:-1;37667:287:0;;;;;:::i;:::-;;:::i;52320:29::-;;;;;;;;;;-1:-1:-1;52320:29:0;;;;;;;;;;;38753:369;;;;;;;;;;-1:-1:-1;38753:369:0;;;;;:::i;:::-;;:::i;51871:46::-;;;;;;;;;;-1:-1:-1;51871:46:0;;;;;;;;51924:41;;;;;;;;;;-1:-1:-1;51924:41:0;;;;;;;;;;;59920:75;;;;;;;;;;;;;:::i;58503:487::-;;;;;;;;;;-1:-1:-1;58503:487:0;;;;;:::i;:::-;;:::i;57832:547::-;;;;;;;;;;-1:-1:-1;57832:547:0;;;;;:::i;:::-;;:::i;59344:119::-;;;;;;;;;;-1:-1:-1;59344:119:0;;;;;:::i;:::-;;:::i;52022:32::-;;;;;;;;;;;;;;;;59092:107;;;;;;;;;;-1:-1:-1;59092:107:0;;;;;:::i;:::-;;:::i;52356:35::-;;;;;;;;;;-1:-1:-1;52356:35:0;;;;;;;;;;;52161:41;;;;;;;;;;;;;;;;59207:129;;;;;;;;;;-1:-1:-1;59207:129:0;;;;;:::i;:::-;;:::i;38025:164::-;;;;;;;;;;-1:-1:-1;38025:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;38146:25:0;;;38122:4;38146:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;38025:164;59471:125;;;;;;;;;;-1:-1:-1;59471:125:0;;;;;:::i;:::-;;:::i;60097:99::-;;;;;;;;;;;;;:::i;52503:42::-;;;;;;;;;;-1:-1:-1;52503:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;54153:101;;;;;;;;;;-1:-1:-1;54153:101:0;;;;;:::i;:::-;;:::i;9138:201::-;;;;;;;;;;-1:-1:-1;9138:201:0;;;;;:::i;:::-;;:::i;53903:242::-;;;;;;;;;;-1:-1:-1;53903:242:0;;;;;:::i;:::-;;:::i;32775:305::-;32877:4;-1:-1:-1;;;;;;32914:40:0;;-1:-1:-1;;;32914:40:0;;:105;;-1:-1:-1;;;;;;;32971:48:0;;-1:-1:-1;;;32971:48:0;32914:105;:158;;;-1:-1:-1;;;;;;;;;;21145:40:0;;;33036:36;32894:178;32775:305;-1:-1:-1;;32775:305:0:o;59706:94::-;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;;;;;;;;;59773:12:::1;:19:::0;59706:94::o;54793:1278::-;8302:6;;-1:-1:-1;;;;;8302:6:0;54918:10;:21;54914:287;;54965:6;;;;54964:7;54956:16;;;;;;54995;;;;;;;54987:53;;;;-1:-1:-1;;;54987:53:0;;11179:2:1;54987:53:0;;;11161:21:1;11218:2;11198:18;;;11191:30;11257:26;11237:18;;;11230:54;11301:18;;54987:53:0;10977:348:1;54987:53:0;55115:11;55099:13;;:27;;;;:::i;:::-;55085:9;:42;;55055:132;;;;-1:-1:-1;;;55055:132:0;;13406:2:1;55055:132:0;;;13388:21:1;13445:2;13425:18;;;13418:30;-1:-1:-1;;;13464:18:1;;;13457:46;13520:18;;55055:132:0;13204:340:1;55055:132:0;54729:25;;;55257:10;8443:2:1;8439:15;-1:-1:-1;;8435:53:1;54729:25:0;;;;8423:66:1;;;;54729:25:0;;;;;;;;;8505:12:1;;;;54729:25:0;;;54719:36;;;;;55243:33;;55270:5;;55243:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55243:7:0;;-1:-1:-1;;;55243:33:0:i;:::-;55213:120;;;;-1:-1:-1;;;55213:120:0;;16102:2:1;55213:120:0;;;16084:21:1;16141:2;16121:18;;;16114:30;-1:-1:-1;;;16160:18:1;;;16153:43;16213:18;;55213:120:0;15900:337:1;55213:120:0;55455:25;;55400:10;55383:28;;;;:16;:28;;;;;;55455:25;;;;;;;55383:42;;55414:11;;55383:42;:::i;:::-;55382:98;;55352:195;;;;-1:-1:-1;;;55352:195:0;;16805:2:1;55352:195:0;;;16787:21:1;16844:2;16824:18;;;16817:30;16883:25;16863:18;;;16856:53;16926:18;;55352:195:0;16603:347:1;55352:195:0;55627:12;;55612:11;55594:15;;:29;;;;:::i;:::-;:45;;55568:138;;;;-1:-1:-1;;;55568:138:0;;;;;;;:::i;:::-;55780:9;;55765:11;55749:13;32278:12;;32068:7;32262:13;:28;;32015:312;55749:13;:27;;;;:::i;:::-;:40;;55723:120;;;;-1:-1:-1;;;55723:120:0;;;;;;;:::i;:::-;55930:10;55913:28;;;;:16;:28;;;;;;:55;;55957:11;;55913:55;:::i;:::-;55886:10;55869:28;;;;:16;:28;;;;;:99;;;;55981:15;:30;;56000:11;;55869:28;55981:30;;56000:11;;55981:30;:::i;:::-;;;;-1:-1:-1;56029:34:0;;-1:-1:-1;56039:10:0;56051:11;56029:9;:34::i;:::-;54793:1278;;;:::o;35888:100::-;35942:13;35975:5;35968:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35888:100;:::o;37391:204::-;37459:7;37484:16;37492:7;37484;:16::i;:::-;37479:64;;37509:34;;-1:-1:-1;;;37509:34:0;;;;;;;;;;;37479:64;-1:-1:-1;37563:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;37563:24:0;;37391:204::o;36954:371::-;37027:13;37043:24;37059:7;37043:15;:24::i;:::-;37027:40;;37088:5;-1:-1:-1;;;;;37082:11:0;:2;-1:-1:-1;;;;;37082:11:0;;37078:48;;;37102:24;;-1:-1:-1;;;37102:24:0;;;;;;;;;;;37078:48;7033:10;-1:-1:-1;;;;;37143:21:0;;;;;;:63;;-1:-1:-1;37169:37:0;37186:5;7033:10;38025:164;:::i;37169:37::-;37168:38;37143:63;37139:138;;;37230:35;;-1:-1:-1;;;37230:35:0;;;;;;;;;;;37139:138;37289:28;37298:2;37302:7;37311:5;37289:8;:28::i;38256:170::-;38390:28;38400:4;38406:2;38410:7;38390:9;:28::i;60204:155::-;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;60261:7:::1;60282;8302:6:::0;;-1:-1:-1;;;;;8302:6:0;;8229:87;60282:7:::1;-1:-1:-1::0;;;;;60274:21:0::1;60303;60274:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60260:69;;;60348:2;60340:11;;;::::0;::::1;;60249:110;60204:155::o:0;60004:85::-;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;60072:9:::1;::::0;;-1:-1:-1;;60059:22:0;::::1;60072:9;::::0;;;::::1;;;60071:10;60059:22:::0;;::::1;;::::0;;60004:85::o;38497:185::-;38635:39;38652:4;38658:2;38662:7;38635:39;;;;;;;;;;;;:16;:39::i;58998:86::-;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;59061:4:::1;:15:::0;58998:86::o;53105:657::-;53185:9;;;;;;;53177:56;;;;-1:-1:-1;;;53177:56:0;;14109:2:1;53177:56:0;;;14091:21:1;14148:2;14128:18;;;14121:30;14187:34;14167:18;;;14160:62;-1:-1:-1;;;14238:18:1;;;14231:32;14280:19;;53177:56:0;13907:398:1;53177:56:0;53259:16;;53244:11;53311:385;53335:3;53331:1;:7;53311:385;;;53360:13;53376:9;53386:1;53376:12;;;;;;;;:::i;:::-;;;;;;;;;;;;53453:17;;;;:10;:17;;;;;;;;53376:12;;-1:-1:-1;53453:17:0;;53452:18;53444:63;;;;-1:-1:-1;;;53444:63:0;;16444:2:1;53444:63:0;;;16426:21:1;;;16463:18;;;16456:30;16522:34;16502:18;;;16495:62;16574:18;;53444:63:0;16242:356:1;53444:63:0;53562:6;;:21;;-1:-1:-1;;;53562:21:0;;;;;17647:25:1;;;53587:10:0;;-1:-1:-1;;;;;53562:6:0;;:14;;17620:18:1;;53562:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53562:35:0;;53554:77;;;;-1:-1:-1;;;53554:77:0;;13751:2:1;53554:77:0;;;13733:21:1;13790:2;13770:18;;;13763:30;13829:31;13809:18;;;13802:59;13878:18;;53554:77:0;13549:353:1;53554:77:0;53646:17;;;;:10;:17;;;;;:24;;-1:-1:-1;;53646:24:0;53666:4;53646:24;;;;;;53340:3;53311:385;;;;53720:26;53730:10;53742:3;53720:9;:26::i;:::-;53167:595;53105:657;:::o;57321:503::-;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;57476:9:::1;;57461:11;57445:13;32278:12:::0;;32068:7;32262:13;:28;;32015:312;57445:13:::1;:27;;;;:::i;:::-;:40;;57419:120;;;;-1:-1:-1::0;;;57419:120:0::1;;;;;;;:::i;:::-;57553:15;57550:231;;;57644:12;;57629:11;57611:15;;:29;;;;:::i;:::-;:45;;57585:138;;;;-1:-1:-1::0;;;57585:138:0::1;;;;;;;:::i;:::-;57758:11;57739:15;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;57550:231:0::1;57789:27;57799:3;57804:11;57789:9;:27::i;59808:104::-:0;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;59883:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;35696:125::-:0;35760:7;35787:21;35800:7;35787:12;:21::i;:::-;:26;;35696:125;-1:-1:-1;;35696:125:0:o;53770:119::-;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;53853:16:::1;:28:::0;;-1:-1:-1;;;;;;53853:28:0::1;-1:-1:-1::0;;;;;53853:28:0;;;::::1;::::0;;;::::1;::::0;;53770:119::o;51782:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59604:94::-;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;59671:9:::1;:19:::0;59604:94::o;33144:206::-;33208:7;-1:-1:-1;;;;;33232:19:0;;33228:60;;33260:28;;-1:-1:-1;;;33260:28:0;;;;;;;;;;;33228:60;-1:-1:-1;;;;;;33314:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;33314:27:0;;33144:206::o;8880:103::-;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;8945:30:::1;8972:1;8945:18;:30::i;:::-;8880:103::o:0;52769:329::-;52844:13;52870:16;52900:9;:16;-1:-1:-1;;;;;52889:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52889:28:0;;52870:47;;52935:9;52930:142;52954:9;:16;52950:1;:20;52930:142;;;52992:13;53008:9;53018:1;53008:12;;;;;;;;:::i;:::-;;;;;;;52992:28;;53043:10;:17;53054:5;53043:17;;;;;;;;;;;;;;;;;;;;;53035:2;53038:1;53035:5;;;;;;;;:::i;:::-;:25;;;:5;;;;;;;;;;;:25;-1:-1:-1;52972:3:0;;;;:::i;:::-;;;;52930:142;;;-1:-1:-1;53089:2:0;52769:329;-1:-1:-1;;52769:329:0:o;36057:104::-;36113:13;36146:7;36139:14;;;;;:::i;56094:1219::-;8302:6;;-1:-1:-1;;;;;8302:6:0;56169:10;:21;56165:734;;56207:23;56233:21;56243:10;56233:9;:21::i;:::-;56278:6;;56207:47;;-1:-1:-1;56278:6:0;;56277:7;56269:16;;;;;;56309;;;;;;;56308:17;56300:54;;;;-1:-1:-1;;;56300:54:0;;12286:2:1;56300:54:0;;;12268:21:1;12325:2;12305:18;;;12298:30;12364:26;12344:18;;;12337:54;12408:18;;56300:54:0;12084:348:1;56300:54:0;56391:1;56377:11;:15;56369:64;;;;-1:-1:-1;;;56369:64:0;;15697:2:1;56369:64:0;;;15679:21:1;15736:2;15716:18;;;15709:30;15775:34;15755:18;;;15748:62;-1:-1:-1;;;15826:18:1;;;15819:34;15870:19;;56369:64:0;15495:400:1;56369:64:0;56499:11;56492:4;;:18;;;;:::i;:::-;56478:9;:33;;56448:123;;;;-1:-1:-1;;;56448:123:0;;13406:2:1;56448:123:0;;;13388:21:1;13445:2;13425:18;;;13418:30;-1:-1:-1;;;13464:18:1;;;13457:46;13520:18;;56448:123:0;13204:340:1;56448:123:0;56627:27;;;;56612:42;;;56586:143;;;;-1:-1:-1;;;56586:143:0;;14512:2:1;56586:143:0;;;14494:21:1;14551:2;14531:18;;;14524:30;14590:34;14570:18;;;14563:62;-1:-1:-1;;;14641:18:1;;;14634:37;14688:19;;56586:143:0;14310:403:1;56586:143:0;56805:22;;;;;;;56771:29;56789:11;56771:15;:29;:::i;:::-;56770:57;;56744:143;;;;-1:-1:-1;;;56744:143:0;;17157:2:1;56744:143:0;;;17139:21:1;17196:2;17176:18;;;17169:30;17235:26;17215:18;;;17208:54;17279:18;;56744:143:0;16955:348:1;56744:143:0;56192:707;56165:734;56986:12;;56971:11;56953:15;;:29;;;;:::i;:::-;:45;;56927:138;;;;-1:-1:-1;;;56927:138:0;;;;;;;:::i;:::-;57139:9;;57124:11;57108:13;32278:12;;32068:7;32262:13;:28;;32015:312;57108:13;:27;;;;:::i;:::-;:40;;57082:120;;;;-1:-1:-1;;;57082:120:0;;;;;;;:::i;:::-;57249:11;57230:15;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;57271:34:0;;-1:-1:-1;57281:10:0;57293:11;57271:9;:34::i;37667:287::-;-1:-1:-1;;;;;37766:24:0;;7033:10;37766:24;37762:54;;;37799:17;;-1:-1:-1;;;37799:17:0;;;;;;;;;;;37762:54;7033:10;37829:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;37829:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;37829:53:0;;;;;;;;;;37898:48;;10701:41:1;;;37829:42:0;;7033:10;37898:48;;10674:18:1;37898:48:0;;;;;;;37667:287;;:::o;38753:369::-;38920:28;38930:4;38936:2;38940:7;38920:9;:28::i;:::-;-1:-1:-1;;;;;38963:13:0;;11225:19;:23;;38963:76;;;;;38983:56;39014:4;39020:2;39024:7;39033:5;38983:30;:56::i;:::-;38982:57;38963:76;38959:156;;;39063:40;;-1:-1:-1;;;39063:40:0;;;;;;;;;;;38959:156;38753:369;;;;:::o;59920:75::-;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;59981:6:::1;::::0;;-1:-1:-1;;59971:16:0;::::1;59981:6;::::0;;::::1;59980:7;59971:16;::::0;;59920:75::o;58503:487::-;58621:13;58674:16;58682:7;58674;:16::i;:::-;58652:113;;;;-1:-1:-1;;;58652:113:0;;15281:2:1;58652:113:0;;;15263:21:1;15320:2;15300:18;;;15293:30;15359:34;15339:18;;;15332:62;-1:-1:-1;;;15410:18:1;;;15403:45;15465:19;;58652:113:0;15079:411:1;58652:113:0;58776:28;58807:10;:8;:10::i;:::-;58776:41;;58879:1;58854:14;58848:28;:32;:134;;;;;;;;;;;;;;;;;58924:14;58940:18;:7;:16;:18::i;:::-;58907:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58848:134;58828:154;58503:487;-1:-1:-1;;;58503:487:0:o;57832:547::-;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;57949:24;;57985:215;::::1;;;58071:12;;58064:3;58046:15;;:21;;;;:::i;:::-;:37;;58020:130;;;;-1:-1:-1::0;;;58020:130:0::1;;;;;;;:::i;:::-;58185:3;58166:15;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;57985:215:0::1;58240:9;58235:126;58259:3;58255:1;:7;58235:126;;;58284:10;58297:17;58315:1;58297:20;;;;;;;;:::i;:::-;;;;;;;58284:33;;58333:16;58343:2;58347:1;58333:9;:16::i;:::-;-1:-1:-1::0;58264:3:0::1;;58235:126;;59344:119:::0;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;59423:22:::1;:32:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;59423:32:0;;::::1;::::0;;;::::1;::::0;;59344:119::o;59092:107::-;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;59167:13:::1;:24:::0;59092:107::o;59207:129::-;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;59291:27:::1;:37:::0;;-1:-1:-1;;59291:37:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;59207:129::o;59471:125::-;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;59553:25:::1;:35:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;59553:35:0;;::::1;::::0;;;::::1;::::0;;59471:125::o;60097:99::-;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;60172:16:::1;::::0;;-1:-1:-1;;60152:36:0;::::1;60172:16:::0;;;;::::1;;;60171:17;60152:36:::0;;::::1;;::::0;;60097:99::o;54153:101::-;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;54225:13:::1;:21:::0;54153:101::o;9138:201::-;8302:6;;-1:-1:-1;;;;;8302:6:0;7033:10;8449:23;8441:68;;;;-1:-1:-1;;;8441:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9227:22:0;::::1;9219:73;;;::::0;-1:-1:-1;;;9219:73:0;;11879:2:1;9219:73:0::1;::::0;::::1;11861:21:1::0;11918:2;11898:18;;;11891:30;11957:34;11937:18;;;11930:62;-1:-1:-1;;;12008:18:1;;;12001:36;12054:19;;9219:73:0::1;11677:402:1::0;9219:73:0::1;9303:28;9322:8;9303:18;:28::i;53903:242::-:0;54016:16;;-1:-1:-1;;;;;54016:16:0;54002:10;:30;53980:118;;;;-1:-1:-1;;;53980:118:0;;12999:2:1;53980:118:0;;;12981:21:1;13038:2;13018:18;;;13011:30;13077:34;13057:18;;;13050:62;-1:-1:-1;;;13128:18:1;;;13121:36;13174:19;;53980:118:0;12797:402:1;53980:118:0;54109:28;54119:8;54129:7;54109:9;:28::i;54318:215::-;54426:4;54464:51;54483:5;54490:13;;54505:9;54464:18;:51::i;39635:104::-;39704:27;39714:2;39718:8;39704:27;;;;;;;;;;;;:9;:27::i;39377:174::-;39434:4;39498:13;;39488:7;:23;39458:85;;;;-1:-1:-1;;39516:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;39516:27:0;;;;39515:28;;39377:174::o;48599:196::-;48714:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;48714:29:0;-1:-1:-1;;;;;48714:29:0;;;;;;;;;48759:28;;48714:24;;48759:28;;;;;;;48599:196;;;:::o;43547:2130::-;43662:35;43700:21;43713:7;43700:12;:21::i;:::-;43662:59;;43760:4;-1:-1:-1;;;;;43738:26:0;:13;:18;;;-1:-1:-1;;;;;43738:26:0;;43734:67;;43773:28;;-1:-1:-1;;;43773:28:0;;;;;;;;;;;43734:67;43814:22;7033:10;-1:-1:-1;;;;;43840:20:0;;;;:73;;-1:-1:-1;43877:36:0;43894:4;7033:10;38025:164;:::i;43877:36::-;43840:126;;;-1:-1:-1;7033:10:0;43930:20;43942:7;43930:11;:20::i;:::-;-1:-1:-1;;;;;43930:36:0;;43840:126;43814:153;;43985:17;43980:66;;44011:35;;-1:-1:-1;;;44011:35:0;;;;;;;;;;;43980:66;-1:-1:-1;;;;;44061:16:0;;44057:52;;44086:23;;-1:-1:-1;;;44086:23:0;;;;;;;;;;;44057:52;44230:35;44247:1;44251:7;44260:4;44230:8;:35::i;:::-;-1:-1:-1;;;;;44561:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;44561:31:0;;;-1:-1:-1;;;;;44561:31:0;;;-1:-1:-1;;44561:31:0;;;;;;;44607:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;44607:29:0;;;;;;;;;;;44687:20;;;:11;:20;;;;;;44722:18;;-1:-1:-1;;;;;;44755:49:0;;;;-1:-1:-1;;;44788:15:0;44755:49;;;;;;;;;;45078:11;;45138:24;;;;;45181:13;;44687:20;;45138:24;;45181:13;45177:384;;45391:13;;45376:11;:28;45372:174;;45429:20;;45498:28;;;;-1:-1:-1;;;;;45472:54:0;-1:-1:-1;;;45472:54:0;-1:-1:-1;;;;;;45472:54:0;;;-1:-1:-1;;;;;45429:20:0;;45472:54;;;;45372:174;44536:1036;;;45608:7;45604:2;-1:-1:-1;;;;;45589:27:0;45598:4;-1:-1:-1;;;;;45589:27:0;;;;;;;;;;;43651:2026;;43547:2130;;;:::o;34525:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;34636:7:0;34719:13;;34712:4;:20;34681:886;;;34753:31;34787:17;;;:11;:17;;;;;;;;;34753:51;;;;;;;;;-1:-1:-1;;;;;34753:51:0;;;;-1:-1:-1;;;34753:51:0;;-1:-1:-1;;;;;34753:51:0;;;;;;;;-1:-1:-1;;;34753:51:0;;;;;;;;;;;;;;34823:729;;34873:14;;-1:-1:-1;;;;;34873:28:0;;34869:101;;34937:9;34525:1109;-1:-1:-1;;;34525:1109:0:o;34869:101::-;-1:-1:-1;;;35312:6:0;35357:17;;;;:11;:17;;;;;;;;;35345:29;;;;;;;;;-1:-1:-1;;;;;35345:29:0;;;;;-1:-1:-1;;;35345:29:0;;-1:-1:-1;;;;;35345:29:0;;;;;;;;-1:-1:-1;;;35345:29:0;;;;;;;;;;;;;35405:28;35401:109;;35473:9;34525:1109;-1:-1:-1;;;34525:1109:0:o;35401:109::-;35272:261;;;34734:833;34681:886;35595:31;;-1:-1:-1;;;35595:31:0;;;;;;;;;;;9499:191;9592:6;;;-1:-1:-1;;;;;9609:17:0;;;-1:-1:-1;;;;;;9609:17:0;;;;;;;9642:40;;9592:6;;;9609:17;9592:6;;9642:40;;9573:16;;9642:40;9562:128;9499:191;:::o;49287:667::-;49471:72;;-1:-1:-1;;;49471:72:0;;49450:4;;-1:-1:-1;;;;;49471:36:0;;;;;:72;;7033:10;;49522:4;;49528:7;;49537:5;;49471:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49471:72:0;;;;;;;;-1:-1:-1;;49471:72:0;;;;;;;;;;;;:::i;:::-;;;49467:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49705:13:0;;49701:235;;49751:40;;-1:-1:-1;;;49751:40:0;;;;;;;;;;;49701:235;49894:6;49888:13;49879:6;49875:2;49871:15;49864:38;49467:480;-1:-1:-1;;;;;;49590:55:0;-1:-1:-1;;;49590:55:0;;-1:-1:-1;49467:480:0;49287:667;;;;;;:::o;58387:108::-;58447:13;58480:7;58473:14;;;;;:::i;4515:723::-;4571:13;4792:10;4788:53;;-1:-1:-1;;4819:10:0;;;;;;;;;;;;-1:-1:-1;;;4819:10:0;;;;;4515:723::o;4788:53::-;4866:5;4851:12;4907:78;4914:9;;4907:78;;4940:8;;;;:::i;:::-;;-1:-1:-1;4963:10:0;;-1:-1:-1;4971:2:0;4963:10;;:::i;:::-;;;4907:78;;;4995:19;5027:6;-1:-1:-1;;;;;5017:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5017:17:0;;4995:39;;5045:154;5052:10;;5045:154;;5079:11;5089:1;5079:11;;:::i;:::-;;-1:-1:-1;5148:10:0;5156:2;5148:5;:10;:::i;:::-;5135:24;;:2;:24;:::i;:::-;5122:39;;5105:6;5112;5105:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;5105:56:0;;;;;;;;-1:-1:-1;5176:11:0;5185:2;5176:11;;:::i;:::-;;;5045:154;;2685:190;2810:4;2863;2834:25;2847:5;2854:4;2834:12;:25::i;:::-;:33;;2685:190;-1:-1:-1;;;;2685:190:0:o;40112:1749::-;40235:20;40258:13;-1:-1:-1;;;;;40286:16:0;;40282:48;;40311:19;;-1:-1:-1;;;40311:19:0;;;;;;;;;;;40282:48;40345:13;40341:44;;40367:18;;-1:-1:-1;;;40367:18:0;;;;;;;;;;;40341:44;-1:-1:-1;;;;;40736:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;40795:49:0;;-1:-1:-1;;;;;40736:44:0;;;;;;;40795:49;;;;-1:-1:-1;;40736:44:0;;;;;;40795:49;;;;;;;;;;;;;;;;40861:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;40911:66:0;;;-1:-1:-1;;;40961:15:0;40911:66;;;;;;;;;;;;;40861:25;;41058:23;;;;11225:19;:23;41098:631;;41138:313;41169:38;;41194:12;;-1:-1:-1;;;;;41169:38:0;;;41186:1;;41169:38;;41186:1;;41169:38;41235:69;41274:1;41278:2;41282:14;;;;;;41298:5;41235:30;:69::i;:::-;41230:174;;41340:40;;-1:-1:-1;;;41340:40:0;;;;;;;;;;;41230:174;41446:3;41431:12;:18;41138:313;;41532:12;41515:13;;:29;41511:43;;41546:8;;;41511:43;41098:631;;;41595:119;41626:40;;41651:14;;;;;-1:-1:-1;;;;;41626:40:0;;;41643:1;;41626:40;;41643:1;;41626:40;41709:3;41694:12;:18;41595:119;;41098:631;-1:-1:-1;41743:13:0;:28;;;41793:60;;41826:2;41830:12;41844:8;41793:60;:::i;3236:675::-;3319:7;3362:4;3319:7;3377:497;3401:5;:12;3397:1;:16;3377:497;;;3435:20;3458:5;3464:1;3458:8;;;;;;;;:::i;:::-;;;;;;;3435:31;;3501:12;3485;:28;3481:382;;3987:13;4037:15;;;4073:4;4066:15;;;4120:4;4104:21;;3613:57;;3481:382;;;3987:13;4037:15;;;4073:4;4066:15;;;4120:4;4104:21;;3790:57;;3481:382;-1:-1:-1;3415:3:0;;;;:::i;:::-;;;;3377:497;;;-1:-1:-1;3891:12:0;3236:675;-1:-1:-1;;;3236:675:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:160::-;490:20;;546:13;;539:21;529:32;;519:60;;575:1;572;565:12;519:60;425:160;;;:::o;590:247::-;649:6;702:2;690:9;681:7;677:23;673:32;670:52;;;718:1;715;708:12;670:52;757:9;744:23;776:31;801:5;776:31;:::i;842:251::-;912:6;965:2;953:9;944:7;940:23;936:32;933:52;;;981:1;978;971:12;933:52;1013:9;1007:16;1032:31;1057:5;1032:31;:::i;1098:388::-;1166:6;1174;1227:2;1215:9;1206:7;1202:23;1198:32;1195:52;;;1243:1;1240;1233:12;1195:52;1282:9;1269:23;1301:31;1326:5;1301:31;:::i;:::-;1351:5;-1:-1:-1;1408:2:1;1393:18;;1380:32;1421:33;1380:32;1421:33;:::i;:::-;1473:7;1463:17;;;1098:388;;;;;:::o;1491:456::-;1568:6;1576;1584;1637:2;1625:9;1616:7;1612:23;1608:32;1605:52;;;1653:1;1650;1643:12;1605:52;1692:9;1679:23;1711:31;1736:5;1711:31;:::i;:::-;1761:5;-1:-1:-1;1818:2:1;1803:18;;1790:32;1831:33;1790:32;1831:33;:::i;:::-;1491:456;;1883:7;;-1:-1:-1;;;1937:2:1;1922:18;;;;1909:32;;1491:456::o;1952:794::-;2047:6;2055;2063;2071;2124:3;2112:9;2103:7;2099:23;2095:33;2092:53;;;2141:1;2138;2131:12;2092:53;2180:9;2167:23;2199:31;2224:5;2199:31;:::i;:::-;2249:5;-1:-1:-1;2306:2:1;2291:18;;2278:32;2319:33;2278:32;2319:33;:::i;:::-;2371:7;-1:-1:-1;2425:2:1;2410:18;;2397:32;;-1:-1:-1;2480:2:1;2465:18;;2452:32;-1:-1:-1;;;;;2496:30:1;;2493:50;;;2539:1;2536;2529:12;2493:50;2562:22;;2615:4;2607:13;;2603:27;-1:-1:-1;2593:55:1;;2644:1;2641;2634:12;2593:55;2667:73;2732:7;2727:2;2714:16;2709:2;2705;2701:11;2667:73;:::i;:::-;2657:83;;;1952:794;;;;;;;:::o;2751:315::-;2816:6;2824;2877:2;2865:9;2856:7;2852:23;2848:32;2845:52;;;2893:1;2890;2883:12;2845:52;2932:9;2919:23;2951:31;2976:5;2951:31;:::i;:::-;3001:5;-1:-1:-1;3025:35:1;3056:2;3041:18;;3025:35;:::i;:::-;3015:45;;2751:315;;;;;:::o;3071:::-;3139:6;3147;3200:2;3188:9;3179:7;3175:23;3171:32;3168:52;;;3216:1;3213;3206:12;3168:52;3255:9;3242:23;3274:31;3299:5;3274:31;:::i;:::-;3324:5;3376:2;3361:18;;;;3348:32;;-1:-1:-1;;;3071:315:1:o;3391:383::-;3465:6;3473;3481;3534:2;3522:9;3513:7;3509:23;3505:32;3502:52;;;3550:1;3547;3540:12;3502:52;3589:9;3576:23;3608:31;3633:5;3608:31;:::i;:::-;3658:5;-1:-1:-1;3710:2:1;3695:18;;3682:32;;-1:-1:-1;3733:35:1;3764:2;3749:18;;3733:35;:::i;:::-;3723:45;;3391:383;;;;;:::o;3779:1047::-;3869:6;3877;3930:2;3918:9;3909:7;3905:23;3901:32;3898:52;;;3946:1;3943;3936:12;3898:52;3986:9;3973:23;-1:-1:-1;;;;;4011:6:1;4008:30;4005:50;;;4051:1;4048;4041:12;4005:50;4074:22;;4127:4;4119:13;;4115:27;-1:-1:-1;4105:55:1;;4156:1;4153;4146:12;4105:55;4192:2;4179:16;4214:4;4238:60;4254:43;4294:2;4254:43;:::i;:::-;4238:60;:::i;:::-;4320:3;4344:2;4339:3;4332:15;4372:2;4367:3;4363:12;4356:19;;4403:2;4399;4395:11;4451:7;4446:2;4440;4437:1;4433:10;4429:2;4425:19;4421:28;4418:41;4415:61;;;4472:1;4469;4462:12;4415:61;4494:1;4485:10;;4504:238;4518:2;4515:1;4512:9;4504:238;;;4589:3;4576:17;4606:31;4631:5;4606:31;:::i;:::-;4650:18;;4536:1;4529:9;;;;;4688:12;;;;4720;;4504:238;;;-1:-1:-1;4761:5:1;-1:-1:-1;4785:35:1;;-1:-1:-1;4801:18:1;;;4785:35;:::i;:::-;4775:45;;;;;3779:1047;;;;;:::o;4831:902::-;4915:6;4946:2;4989;4977:9;4968:7;4964:23;4960:32;4957:52;;;5005:1;5002;4995:12;4957:52;5045:9;5032:23;-1:-1:-1;;;;;5070:6:1;5067:30;5064:50;;;5110:1;5107;5100:12;5064:50;5133:22;;5186:4;5178:13;;5174:27;-1:-1:-1;5164:55:1;;5215:1;5212;5205:12;5164:55;5251:2;5238:16;5274:60;5290:43;5330:2;5290:43;:::i;5274:60::-;5356:3;5380:2;5375:3;5368:15;5408:2;5403:3;5399:12;5392:19;;5439:2;5435;5431:11;5487:7;5482:2;5476;5473:1;5469:10;5465:2;5461:19;5457:28;5454:41;5451:61;;;5508:1;5505;5498:12;5451:61;5530:1;5521:10;;5540:163;5554:2;5551:1;5548:9;5540:163;;;5611:17;;5599:30;;5572:1;5565:9;;;;;5649:12;;;;5681;;5540:163;;;-1:-1:-1;5722:5:1;4831:902;-1:-1:-1;;;;;;;4831:902:1:o;5738:180::-;5797:6;5850:2;5838:9;5829:7;5825:23;5821:32;5818:52;;;5866:1;5863;5856:12;5818:52;-1:-1:-1;5889:23:1;;5738:180;-1:-1:-1;5738:180:1:o;5923:245::-;5981:6;6034:2;6022:9;6013:7;6009:23;6005:32;6002:52;;;6050:1;6047;6040:12;6002:52;6089:9;6076:23;6108:30;6132:5;6108:30;:::i;6173:249::-;6242:6;6295:2;6283:9;6274:7;6270:23;6266:32;6263:52;;;6311:1;6308;6301:12;6263:52;6343:9;6337:16;6362:30;6386:5;6362:30;:::i;6427:450::-;6496:6;6549:2;6537:9;6528:7;6524:23;6520:32;6517:52;;;6565:1;6562;6555:12;6517:52;6605:9;6592:23;-1:-1:-1;;;;;6630:6:1;6627:30;6624:50;;;6670:1;6667;6660:12;6624:50;6693:22;;6746:4;6738:13;;6734:27;-1:-1:-1;6724:55:1;;6775:1;6772;6765:12;6724:55;6798:73;6863:7;6858:2;6845:16;6840:2;6836;6832:11;6798:73;:::i;6882:272::-;6940:6;6993:2;6981:9;6972:7;6968:23;6964:32;6961:52;;;7009:1;7006;6999:12;6961:52;7048:9;7035:23;7098:6;7091:5;7087:18;7080:5;7077:29;7067:57;;7120:1;7117;7110:12;7344:683;7439:6;7447;7455;7508:2;7496:9;7487:7;7483:23;7479:32;7476:52;;;7524:1;7521;7514:12;7476:52;7560:9;7547:23;7537:33;;7621:2;7610:9;7606:18;7593:32;-1:-1:-1;;;;;7685:2:1;7677:6;7674:14;7671:34;;;7701:1;7698;7691:12;7671:34;7739:6;7728:9;7724:22;7714:32;;7784:7;7777:4;7773:2;7769:13;7765:27;7755:55;;7806:1;7803;7796:12;7755:55;7846:2;7833:16;7872:2;7864:6;7861:14;7858:34;;;7888:1;7885;7878:12;7858:34;7941:7;7936:2;7926:6;7923:1;7919:14;7915:2;7911:23;7907:32;7904:45;7901:65;;;7962:1;7959;7952:12;7901:65;7993:2;7989;7985:11;7975:21;;8015:6;8005:16;;;;;7344:683;;;;;:::o;8032:257::-;8073:3;8111:5;8105:12;8138:6;8133:3;8126:19;8154:63;8210:6;8203:4;8198:3;8194:14;8187:4;8180:5;8176:16;8154:63;:::i;:::-;8271:2;8250:15;-1:-1:-1;;8246:29:1;8237:39;;;;8278:4;8233:50;;8032:257;-1:-1:-1;;8032:257:1:o;8528:470::-;8707:3;8745:6;8739:13;8761:53;8807:6;8802:3;8795:4;8787:6;8783:17;8761:53;:::i;:::-;8877:13;;8836:16;;;;8899:57;8877:13;8836:16;8933:4;8921:17;;8899:57;:::i;:::-;8972:20;;8528:470;-1:-1:-1;;;;8528:470:1:o;9421:488::-;-1:-1:-1;;;;;9690:15:1;;;9672:34;;9742:15;;9737:2;9722:18;;9715:43;9789:2;9774:18;;9767:34;;;9837:3;9832:2;9817:18;;9810:31;;;9615:4;;9858:45;;9883:19;;9875:6;9858:45;:::i;:::-;9850:53;9421:488;-1:-1:-1;;;;;;9421:488:1:o;9914:642::-;10079:2;10131:21;;;10201:13;;10104:18;;;10223:22;;;10050:4;;10079:2;10302:15;;;;10276:2;10261:18;;;10050:4;10345:185;10359:6;10356:1;10353:13;10345:185;;;10434:13;;10427:21;10420:29;10408:42;;10505:15;;;;10470:12;;;;10381:1;10374:9;10345:185;;;-1:-1:-1;10547:3:1;;9914:642;-1:-1:-1;;;;;;9914:642:1:o;10753:219::-;10902:2;10891:9;10884:21;10865:4;10922:44;10962:2;10951:9;10947:18;10939:6;10922:44;:::i;11330:342::-;11532:2;11514:21;;;11571:2;11551:18;;;11544:30;-1:-1:-1;;;11605:2:1;11590:18;;11583:48;11663:2;11648:18;;11330:342::o;12437:355::-;12639:2;12621:21;;;12678:2;12658:18;;;12651:30;12717:33;12712:2;12697:18;;12690:61;12783:2;12768:18;;12437:355::o;14718:356::-;14920:2;14902:21;;;14939:18;;;14932:30;14998:34;14993:2;14978:18;;14971:62;15065:2;15050:18;;14718:356::o;17683:275::-;17754:2;17748:9;17819:2;17800:13;;-1:-1:-1;;17796:27:1;17784:40;;-1:-1:-1;;;;;17839:34:1;;17875:22;;;17836:62;17833:88;;;17901:18;;:::i;:::-;17937:2;17930:22;17683:275;;-1:-1:-1;17683:275:1:o;17963:183::-;18023:4;-1:-1:-1;;;;;18048:6:1;18045:30;18042:56;;;18078:18;;:::i;:::-;-1:-1:-1;18123:1:1;18119:14;18135:4;18115:25;;17963:183::o;18151:128::-;18191:3;18222:1;18218:6;18215:1;18212:13;18209:39;;;18228:18;;:::i;:::-;-1:-1:-1;18264:9:1;;18151:128::o;18284:120::-;18324:1;18350;18340:35;;18355:18;;:::i;:::-;-1:-1:-1;18389:9:1;;18284:120::o;18409:168::-;18449:7;18515:1;18511;18507:6;18503:14;18500:1;18497:21;18492:1;18485:9;18478:17;18474:45;18471:71;;;18522:18;;:::i;:::-;-1:-1:-1;18562:9:1;;18409:168::o;18582:125::-;18622:4;18650:1;18647;18644:8;18641:34;;;18655:18;;:::i;:::-;-1:-1:-1;18692:9:1;;18582:125::o;18712:258::-;18784:1;18794:113;18808:6;18805:1;18802:13;18794:113;;;18884:11;;;18878:18;18865:11;;;18858:39;18830:2;18823:10;18794:113;;;18925:6;18922:1;18919:13;18916:48;;;-1:-1:-1;;18960:1:1;18942:16;;18935:27;18712:258::o;18975:380::-;19054:1;19050:12;;;;19097;;;19118:61;;19172:4;19164:6;19160:17;19150:27;;19118:61;19225:2;19217:6;19214:14;19194:18;19191:38;19188:161;;;19271:10;19266:3;19262:20;19259:1;19252:31;19306:4;19303:1;19296:15;19334:4;19331:1;19324:15;19188:161;;18975:380;;;:::o;19360:135::-;19399:3;-1:-1:-1;;19420:17:1;;19417:43;;;19440:18;;:::i;:::-;-1:-1:-1;19487:1:1;19476:13;;19360:135::o;19500:112::-;19532:1;19558;19548:35;;19563:18;;:::i;:::-;-1:-1:-1;19597:9:1;;19500:112::o;19617:127::-;19678:10;19673:3;19669:20;19666:1;19659:31;19709:4;19706:1;19699:15;19733:4;19730:1;19723:15;19749:127;19810:10;19805:3;19801:20;19798:1;19791:31;19841:4;19838:1;19831:15;19865:4;19862:1;19855:15;19881:127;19942:10;19937:3;19933:20;19930:1;19923:31;19973:4;19970:1;19963:15;19997:4;19994:1;19987:15;20013:127;20074:10;20069:3;20065:20;20062:1;20055:31;20105:4;20102:1;20095:15;20129:4;20126:1;20119:15;20145:131;-1:-1:-1;;;;;20220:31:1;;20210:42;;20200:70;;20266:1;20263;20256:12;20281:131;-1:-1:-1;;;;;;20355:32:1;;20345:43;;20335:71;;20402:1;20399;20392:12

Swarm Source

ipfs://3241a878f5832cccd0137774c1ddf80b3259a88351844dab89b9d54ae94afc7c
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.