ETH Price: $3,383.90 (+2.70%)

Token

Rare gabe (Raregabe)
 

Overview

Max Total Supply

100 Raregabe

Holders

64

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Raregabe
0x205698ce308ac7dd4bf2cda5926836dcb0316e19
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:
Raregabe

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

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

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`,
     * 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,
        bytes calldata data
    ) external;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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

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

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

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

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Reference type for token approval.
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

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

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

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

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

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

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

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

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

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

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

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

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

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

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

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

    /**
     * Sets the auxiliary 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 virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

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

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public virtual override {
        address owner = ownerOf(tokenId);

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

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

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

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

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

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

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

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

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

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

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, 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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

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

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

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

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

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

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

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

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

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

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

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

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

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

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

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

// File: RareGabes.sol


pragma solidity >=0.8.0 <0.9.0;





contract Raregabe is ERC721A, Ownable, ReentrancyGuard {
  using Strings for uint256;

  string public _baseTokenURI;
  string public hiddenMetadataUri;

  uint256 public cost = 0 ether;
  uint256 public maxSupply = 100;
  uint256 public maxMintAmountPerTx = 1;
  uint256 public nftPerAddressLimit = 1;


  bool public paused = true;
  bool public revealed;

  constructor(
    string memory _hiddenMetadataUri,
    address[] memory _airdropAddress
  ) ERC721A("Rare gabe", "Raregabe") {
    _safeMint(msg.sender, 1);
    setHiddenMetadataUri(_hiddenMetadataUri);
    airdrop(_airdropAddress);
  }

  function mint(uint256 _mintAmount) public payable nonReentrant {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!");
    require(totalSupply() + _mintAmount <= maxSupply, "Max supply exceeded!");
    require(!paused, "The contract is paused!");
    require(msg.value >= cost * _mintAmount, "Insufficient funds!");

    _safeMint(_msgSender(), _mintAmount);
  }

  function airdrop(address[] memory airdropAddress) internal {
    for (uint16 i; i < airdropAddress.length; i ++) {
      _safeMint(airdropAddress[i], 1);
    }
  }
  function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
    nftPerAddressLimit = _limit;
  }

  function mintForAddress(uint256 _mintAmount, address _receiver) public onlyOwner {
    _safeMint(_receiver, _mintAmount);
  }

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

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

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

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

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

  function withdraw() public onlyOwner nonReentrant {
    payable(owner()).transfer(address(this).balance);
  }

  // METADATA HANDLING

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setBaseURI(string calldata baseURI) public onlyOwner {
    _baseTokenURI = baseURI;
  }

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

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
      require(_exists(_tokenId), "URI does not exist!");

      if (revealed) {
          return string(abi.encodePacked(_baseURI(), _tokenId.toString(), ".json"));
      } else {
          return hiddenMetadataUri;
      }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"},{"internalType":"address[]","name":"_airdropAddress","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c556064600d556001600e556001600f556001601060006101000a81548160ff0219169083151502179055503480156200004057600080fd5b506040516200420a3803806200420a833981810160405281019062000066919062000a94565b6040518060400160405280600981526020017f52617265206761626500000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f52617265676162650000000000000000000000000000000000000000000000008152508160029080519060200190620000ea92919062000858565b5080600390805190602001906200010392919062000858565b50620001146200018160201b60201c565b60008190555050506200013c620001306200018a60201b60201c565b6200019260201b60201c565b6001600981905550620001573360016200025860201b60201c565b62000168826200027e60201b60201c565b6200017981620002aa60201b60201c565b505062000f61565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200027a8282604051806020016040528060008152506200030960201b60201c565b5050565b6200028e620003ba60201b60201c565b80600b9080519060200190620002a692919062000858565b5050565b60005b81518161ffff1610156200030557620002ef828261ffff1681518110620002d957620002d862000e7c565b5b602002602001015160016200025860201b60201c565b8080620002fc9062000dee565b915050620002ad565b5050565b6200031b83836200044b60201b60201c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14620003b557600080549050600083820390505b6200036460008683806001019450866200063460201b60201c565b6200039b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811062000349578160005414620003b257600080fd5b50505b505050565b620003ca6200018a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003f0620007a660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000449576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004409062000bf7565b60405180910390fd5b565b60008054905060008214156200048d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620004a26000848385620007d060201b60201c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506200053183620005136000866000620007d660201b60201c565b62000524856200080660201b60201c565b176200081660201b60201c565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114620005d457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905062000597565b50600082141562000611576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506200062f60008483856200084160201b60201c565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006626200084760201b60201c565b8786866040518563ffffffff1660e01b815260040162000686949392919062000ba3565b602060405180830381600087803b158015620006a157600080fd5b505af1925050508015620006d557506040513d601f19601f82011682018060405250810190620006d2919062000a62565b60015b62000753573d806000811462000708576040519150601f19603f3d011682016040523d82523d6000602084013e6200070d565b606091505b506000815114156200074b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b50505050565b60008060e883901c905060e8620007f58686846200084f60201b60201c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60009392505050565b828054620008669062000d82565b90600052602060002090601f0160209004810192826200088a5760008555620008d6565b82601f10620008a557805160ff1916838001178555620008d6565b82800160010185558215620008d6579182015b82811115620008d5578251825591602001919060010190620008b8565b5b509050620008e59190620008e9565b5090565b5b8082111562000904576000816000905550600101620008ea565b5090565b60006200091f620009198462000c42565b62000c19565b9050808382526020820190508285602086028201111562000945576200094462000edf565b5b60005b858110156200097957816200095e8882620009ce565b84526020840193506020830192505060018101905062000948565b5050509392505050565b60006200099a620009948462000c71565b62000c19565b905082815260208101848484011115620009b957620009b862000ee4565b5b620009c684828562000d4c565b509392505050565b600081519050620009df8162000f2d565b92915050565b600082601f830112620009fd57620009fc62000eda565b5b815162000a0f84826020860162000908565b91505092915050565b60008151905062000a298162000f47565b92915050565b600082601f83011262000a475762000a4662000eda565b5b815162000a5984826020860162000983565b91505092915050565b60006020828403121562000a7b5762000a7a62000eee565b5b600062000a8b8482850162000a18565b91505092915050565b6000806040838503121562000aae5762000aad62000eee565b5b600083015167ffffffffffffffff81111562000acf5762000ace62000ee9565b5b62000add8582860162000a2f565b925050602083015167ffffffffffffffff81111562000b015762000b0062000ee9565b5b62000b0f85828601620009e5565b9150509250929050565b62000b248162000cd4565b82525050565b600062000b378262000ca7565b62000b43818562000cb2565b935062000b5581856020860162000d4c565b62000b608162000ef3565b840191505092915050565b600062000b7a60208362000cc3565b915062000b878262000f04565b602082019050919050565b62000b9d8162000d42565b82525050565b600060808201905062000bba600083018762000b19565b62000bc9602083018662000b19565b62000bd8604083018562000b92565b818103606083015262000bec818462000b2a565b905095945050505050565b6000602082019050818103600083015262000c128162000b6b565b9050919050565b600062000c2562000c38565b905062000c33828262000db8565b919050565b6000604051905090565b600067ffffffffffffffff82111562000c605762000c5f62000eab565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000c8f5762000c8e62000eab565b5b62000c9a8262000ef3565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000ce18262000d22565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000d6c57808201518184015260208101905062000d4f565b8381111562000d7c576000848401525b50505050565b6000600282049050600182168062000d9b57607f821691505b6020821081141562000db25762000db162000e4d565b5b50919050565b62000dc38262000ef3565b810181811067ffffffffffffffff8211171562000de55762000de462000eab565b5b80604052505050565b600062000dfb8262000d14565b915061ffff82141562000e135762000e1262000e1e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b62000f388162000cd4565b811462000f4457600080fd5b50565b62000f528162000ce8565b811462000f5e57600080fd5b50565b6132998062000f716000396000f3fe6080604052600436106102045760003560e01c8063715018a611610118578063ba7d2c76116100a0578063d5abeb011161006f578063d5abeb0114610720578063e0a808531461074b578063e985e9c514610774578063efbd73f4146107b1578063f2fde38b146107da57610204565b8063ba7d2c7614610664578063c87b56dd1461068f578063cfc86f7b146106cc578063d0eb26b0146106f757610204565b8063a0712d68116100e7578063a0712d68146105a2578063a22cb465146105be578063a45ba8e7146105e7578063b071401b14610612578063b88d4fde1461063b57610204565b8063715018a61461050a5780638da5cb5b1461052157806394354fd01461054c57806395d89b411461057757610204565b80633ccfd60b1161019b578063518302271161016a578063518302271461041157806355f804b31461043c5780635c975abb146104655780636352211e1461049057806370a08231146104cd57610204565b80633ccfd60b1461037f57806342842e0e1461039657806344a0d68a146103bf5780634fdd43cb146103e857610204565b806313faede6116101d757806313faede6146102d757806316c38b3c1461030257806318160ddd1461032b57806323b872dd1461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061268e565b610803565b60405161023d9190612a8c565b60405180910390f35b34801561025257600080fd5b5061025b610895565b6040516102689190612aa7565b60405180910390f35b34801561027d57600080fd5b506102986004803603810190610293919061277e565b610927565b6040516102a59190612a25565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190612621565b6109a6565b005b3480156102e357600080fd5b506102ec610aea565b6040516102f99190612bc9565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190612661565b610af0565b005b34801561033757600080fd5b50610340610b15565b60405161034d9190612bc9565b60405180910390f35b34801561036257600080fd5b5061037d6004803603810190610378919061250b565b610b2c565b005b34801561038b57600080fd5b50610394610e51565b005b3480156103a257600080fd5b506103bd60048036038101906103b8919061250b565b610eff565b005b3480156103cb57600080fd5b506103e660048036038101906103e1919061277e565b610f1f565b005b3480156103f457600080fd5b5061040f600480360381019061040a9190612735565b610f31565b005b34801561041d57600080fd5b50610426610f53565b6040516104339190612a8c565b60405180910390f35b34801561044857600080fd5b50610463600480360381019061045e91906126e8565b610f66565b005b34801561047157600080fd5b5061047a610f84565b6040516104879190612a8c565b60405180910390f35b34801561049c57600080fd5b506104b760048036038101906104b2919061277e565b610f97565b6040516104c49190612a25565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef919061249e565b610fa9565b6040516105019190612bc9565b60405180910390f35b34801561051657600080fd5b5061051f611062565b005b34801561052d57600080fd5b50610536611076565b6040516105439190612a25565b60405180910390f35b34801561055857600080fd5b506105616110a0565b60405161056e9190612bc9565b60405180910390f35b34801561058357600080fd5b5061058c6110a6565b6040516105999190612aa7565b60405180910390f35b6105bc60048036038101906105b7919061277e565b611138565b005b3480156105ca57600080fd5b506105e560048036038101906105e091906125e1565b6112ea565b005b3480156105f357600080fd5b506105fc611462565b6040516106099190612aa7565b60405180910390f35b34801561061e57600080fd5b506106396004803603810190610634919061277e565b6114f0565b005b34801561064757600080fd5b50610662600480360381019061065d919061255e565b611502565b005b34801561067057600080fd5b50610679611575565b6040516106869190612bc9565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b1919061277e565b61157b565b6040516106c39190612aa7565b60405180910390f35b3480156106d857600080fd5b506106e16116a5565b6040516106ee9190612aa7565b60405180910390f35b34801561070357600080fd5b5061071e6004803603810190610719919061277e565b611733565b005b34801561072c57600080fd5b50610735611745565b6040516107429190612bc9565b60405180910390f35b34801561075757600080fd5b50610772600480360381019061076d9190612661565b61174b565b005b34801561078057600080fd5b5061079b600480360381019061079691906124cb565b611770565b6040516107a89190612a8c565b60405180910390f35b3480156107bd57600080fd5b506107d860048036038101906107d391906127ab565b611804565b005b3480156107e657600080fd5b5061080160048036038101906107fc919061249e565b61181a565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061085e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061088e5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108a490612e79565b80601f01602080910402602001604051908101604052809291908181526020018280546108d090612e79565b801561091d5780601f106108f25761010080835404028352916020019161091d565b820191906000526020600020905b81548152906001019060200180831161090057829003601f168201915b5050505050905090565b60006109328261189e565b610968576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109b182610f97565b90508073ffffffffffffffffffffffffffffffffffffffff166109d26118fd565b73ffffffffffffffffffffffffffffffffffffffff1614610a35576109fe816109f96118fd565b611770565b610a34576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c5481565b610af8611905565b80601060006101000a81548160ff02191690831515021790555050565b6000610b1f611983565b6001546000540303905090565b6000610b378261198c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b9e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610baa84611a5a565b91509150610bc08187610bbb6118fd565b611a81565b610c0c57610bd586610bd06118fd565b611770565b610c0b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c73576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c808686866001611ac5565b8015610c8b57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d5985610d35888887611acb565b7c020000000000000000000000000000000000000000000000000000000017611af3565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610de1576000600185019050600060046000838152602001908152602001600020541415610ddf576000548114610dde578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e498686866001611b1e565b505050505050565b610e59611905565b60026009541415610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9690612b69565b60405180910390fd5b6002600981905550610eaf611076565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ef4573d6000803e3d6000fd5b506001600981905550565b610f1a83838360405180602001604052806000815250611502565b505050565b610f27611905565b80600c8190555050565b610f39611905565b80600b9080519060200190610f4f9291906121d6565b5050565b601060019054906101000a900460ff1681565b610f6e611905565b8181600a9190610f7f92919061225c565b505050565b601060009054906101000a900460ff1681565b6000610fa28261198c565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611011576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61106a611905565b6110746000611b24565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600380546110b590612e79565b80601f01602080910402602001604051908101604052809291908181526020018280546110e190612e79565b801561112e5780601f106111035761010080835404028352916020019161112e565b820191906000526020600020905b81548152906001019060200180831161111157829003601f168201915b5050505050905090565b6002600954141561117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117590612b69565b60405180910390fd5b60026009819055506000811180156111985750600e548111155b6111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce90612ae9565b60405180910390fd5b600d54816111e3610b15565b6111ed9190612cae565b111561122e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122590612b49565b60405180910390fd5b601060009054906101000a900460ff161561127e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127590612b29565b60405180910390fd5b80600c5461128c9190612d35565b3410156112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c590612ba9565b60405180910390fd5b6112df6112d9611bea565b82611bf2565b600160098190555050565b6112f26118fd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611357576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006113646118fd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114116118fd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114569190612a8c565b60405180910390a35050565b600b805461146f90612e79565b80601f016020809104026020016040519081016040528092919081815260200182805461149b90612e79565b80156114e85780601f106114bd576101008083540402835291602001916114e8565b820191906000526020600020905b8154815290600101906020018083116114cb57829003601f168201915b505050505081565b6114f8611905565b80600e8190555050565b61150d848484610b2c565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461156f5761153884848484611c10565b61156e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600f5481565b60606115868261189e565b6115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bc90612b89565b60405180910390fd5b601060019054906101000a900460ff1615611612576115e2611d70565b6115eb83611e02565b6040516020016115fc9291906129f6565b60405160208183030381529060405290506116a0565b600b805461161f90612e79565b80601f016020809104026020016040519081016040528092919081815260200182805461164b90612e79565b80156116985780601f1061166d57610100808354040283529160200191611698565b820191906000526020600020905b81548152906001019060200180831161167b57829003601f168201915b505050505090505b919050565b600a80546116b290612e79565b80601f01602080910402602001604051908101604052809291908181526020018280546116de90612e79565b801561172b5780601f106117005761010080835404028352916020019161172b565b820191906000526020600020905b81548152906001019060200180831161170e57829003601f168201915b505050505081565b61173b611905565b80600f8190555050565b600d5481565b611753611905565b80601060016101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61180c611905565b6118168183611bf2565b5050565b611822611905565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188990612ac9565b60405180910390fd5b61189b81611b24565b50565b6000816118a9611983565b111580156118b8575060005482105b80156118f6575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b61190d611bea565b73ffffffffffffffffffffffffffffffffffffffff1661192b611076565b73ffffffffffffffffffffffffffffffffffffffff1614611981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197890612b09565b60405180910390fd5b565b60006001905090565b6000808290508061199b611983565b11611a2357600054811015611a225760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611a20575b6000811415611a165760046000836001900393508381526020019081526020016000205490506119eb565b8092505050611a55565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611ae2868684611f63565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b611c0c828260405180602001604052806000815250611f6c565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c366118fd565b8786866040518563ffffffff1660e01b8152600401611c589493929190612a40565b602060405180830381600087803b158015611c7257600080fd5b505af1925050508015611ca357506040513d601f19601f82011682018060405250810190611ca091906126bb565b60015b611d1d573d8060008114611cd3576040519150601f19603f3d011682016040523d82523d6000602084013e611cd8565b606091505b50600081511415611d15576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054611d7f90612e79565b80601f0160208091040260200160405190810160405280929190818152602001828054611dab90612e79565b8015611df85780601f10611dcd57610100808354040283529160200191611df8565b820191906000526020600020905b815481529060010190602001808311611ddb57829003601f168201915b5050505050905090565b60606000821415611e4a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f5e565b600082905060005b60008214611e7c578080611e6590612edc565b915050600a82611e759190612d04565b9150611e52565b60008167ffffffffffffffff811115611e9857611e97613012565b5b6040519080825280601f01601f191660200182016040528015611eca5781602001600182028036833780820191505090505b5090505b60008514611f5757600182611ee39190612d8f565b9150600a85611ef29190612f25565b6030611efe9190612cae565b60f81b818381518110611f1457611f13612fe3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f509190612d04565b9450611ece565b8093505050505b919050565b60009392505050565b611f768383612009565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461200457600080549050600083820390505b611fb66000868380600101945086611c10565b611fec576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611fa357816000541461200157600080fd5b50505b505050565b600080549050600082141561204a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120576000848385611ac5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506120ce836120bf6000866000611acb565b6120c8856121c6565b17611af3565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461216f57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612134565b5060008214156121ab576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506121c16000848385611b1e565b505050565b60006001821460e11b9050919050565b8280546121e290612e79565b90600052602060002090601f016020900481019282612204576000855561224b565b82601f1061221d57805160ff191683800117855561224b565b8280016001018555821561224b579182015b8281111561224a57825182559160200191906001019061222f565b5b50905061225891906122e2565b5090565b82805461226890612e79565b90600052602060002090601f01602090048101928261228a57600085556122d1565b82601f106122a357803560ff19168380011785556122d1565b828001600101855582156122d1579182015b828111156122d05782358255916020019190600101906122b5565b5b5090506122de91906122e2565b5090565b5b808211156122fb5760008160009055506001016122e3565b5090565b600061231261230d84612c09565b612be4565b90508281526020810184848401111561232e5761232d613050565b5b612339848285612e37565b509392505050565b600061235461234f84612c3a565b612be4565b9050828152602081018484840111156123705761236f613050565b5b61237b848285612e37565b509392505050565b60008135905061239281613207565b92915050565b6000813590506123a78161321e565b92915050565b6000813590506123bc81613235565b92915050565b6000815190506123d181613235565b92915050565b600082601f8301126123ec576123eb613046565b5b81356123fc8482602086016122ff565b91505092915050565b60008083601f84011261241b5761241a613046565b5b8235905067ffffffffffffffff81111561243857612437613041565b5b6020830191508360018202830111156124545761245361304b565b5b9250929050565b600082601f8301126124705761246f613046565b5b8135612480848260208601612341565b91505092915050565b6000813590506124988161324c565b92915050565b6000602082840312156124b4576124b361305a565b5b60006124c284828501612383565b91505092915050565b600080604083850312156124e2576124e161305a565b5b60006124f085828601612383565b925050602061250185828601612383565b9150509250929050565b6000806000606084860312156125245761252361305a565b5b600061253286828701612383565b935050602061254386828701612383565b925050604061255486828701612489565b9150509250925092565b600080600080608085870312156125785761257761305a565b5b600061258687828801612383565b945050602061259787828801612383565b93505060406125a887828801612489565b925050606085013567ffffffffffffffff8111156125c9576125c8613055565b5b6125d5878288016123d7565b91505092959194509250565b600080604083850312156125f8576125f761305a565b5b600061260685828601612383565b925050602061261785828601612398565b9150509250929050565b600080604083850312156126385761263761305a565b5b600061264685828601612383565b925050602061265785828601612489565b9150509250929050565b6000602082840312156126775761267661305a565b5b600061268584828501612398565b91505092915050565b6000602082840312156126a4576126a361305a565b5b60006126b2848285016123ad565b91505092915050565b6000602082840312156126d1576126d061305a565b5b60006126df848285016123c2565b91505092915050565b600080602083850312156126ff576126fe61305a565b5b600083013567ffffffffffffffff81111561271d5761271c613055565b5b61272985828601612405565b92509250509250929050565b60006020828403121561274b5761274a61305a565b5b600082013567ffffffffffffffff81111561276957612768613055565b5b6127758482850161245b565b91505092915050565b6000602082840312156127945761279361305a565b5b60006127a284828501612489565b91505092915050565b600080604083850312156127c2576127c161305a565b5b60006127d085828601612489565b92505060206127e185828601612383565b9150509250929050565b6127f481612dc3565b82525050565b61280381612dd5565b82525050565b600061281482612c6b565b61281e8185612c81565b935061282e818560208601612e46565b6128378161305f565b840191505092915050565b600061284d82612c76565b6128578185612c92565b9350612867818560208601612e46565b6128708161305f565b840191505092915050565b600061288682612c76565b6128908185612ca3565b93506128a0818560208601612e46565b80840191505092915050565b60006128b9602683612c92565b91506128c482613070565b604082019050919050565b60006128dc601483612c92565b91506128e7826130bf565b602082019050919050565b60006128ff600583612ca3565b915061290a826130e8565b600582019050919050565b6000612922602083612c92565b915061292d82613111565b602082019050919050565b6000612945601783612c92565b91506129508261313a565b602082019050919050565b6000612968601483612c92565b915061297382613163565b602082019050919050565b600061298b601f83612c92565b91506129968261318c565b602082019050919050565b60006129ae601383612c92565b91506129b9826131b5565b602082019050919050565b60006129d1601383612c92565b91506129dc826131de565b602082019050919050565b6129f081612e2d565b82525050565b6000612a02828561287b565b9150612a0e828461287b565b9150612a19826128f2565b91508190509392505050565b6000602082019050612a3a60008301846127eb565b92915050565b6000608082019050612a5560008301876127eb565b612a6260208301866127eb565b612a6f60408301856129e7565b8181036060830152612a818184612809565b905095945050505050565b6000602082019050612aa160008301846127fa565b92915050565b60006020820190508181036000830152612ac18184612842565b905092915050565b60006020820190508181036000830152612ae2816128ac565b9050919050565b60006020820190508181036000830152612b02816128cf565b9050919050565b60006020820190508181036000830152612b2281612915565b9050919050565b60006020820190508181036000830152612b4281612938565b9050919050565b60006020820190508181036000830152612b628161295b565b9050919050565b60006020820190508181036000830152612b828161297e565b9050919050565b60006020820190508181036000830152612ba2816129a1565b9050919050565b60006020820190508181036000830152612bc2816129c4565b9050919050565b6000602082019050612bde60008301846129e7565b92915050565b6000612bee612bff565b9050612bfa8282612eab565b919050565b6000604051905090565b600067ffffffffffffffff821115612c2457612c23613012565b5b612c2d8261305f565b9050602081019050919050565b600067ffffffffffffffff821115612c5557612c54613012565b5b612c5e8261305f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612cb982612e2d565b9150612cc483612e2d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612cf957612cf8612f56565b5b828201905092915050565b6000612d0f82612e2d565b9150612d1a83612e2d565b925082612d2a57612d29612f85565b5b828204905092915050565b6000612d4082612e2d565b9150612d4b83612e2d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d8457612d83612f56565b5b828202905092915050565b6000612d9a82612e2d565b9150612da583612e2d565b925082821015612db857612db7612f56565b5b828203905092915050565b6000612dce82612e0d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612e64578082015181840152602081019050612e49565b83811115612e73576000848401525b50505050565b60006002820490506001821680612e9157607f821691505b60208210811415612ea557612ea4612fb4565b5b50919050565b612eb48261305f565b810181811067ffffffffffffffff82111715612ed357612ed2613012565b5b80604052505050565b6000612ee782612e2d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f1a57612f19612f56565b5b600182019050919050565b6000612f3082612e2d565b9150612f3b83612e2d565b925082612f4b57612f4a612f85565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f55524920646f6573206e6f742065786973742100000000000000000000000000600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61321081612dc3565b811461321b57600080fd5b50565b61322781612dd5565b811461323257600080fd5b50565b61323e81612de1565b811461324957600080fd5b50565b61325581612e2d565b811461326057600080fd5b5056fea264697066735822122089b692cb9d7b6f267cf8565d72cbd31647a723fee9a214f770c8abbc1da3c72a64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000016100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000013333cc71956ed0d947fd07674d0d9e741a599b000000000000000000000000fdfbaec3bd13c491ad830e7c1c7d237cb465c0890000000000000000000000004a17394f12f9e0c53fffa278d8b6fd4f31af05fc000000000000000000000000f9b3d44918302f55a996c371a214d195202b51470000000000000000000000007b5ba62d8e8d8a2ad433df7a4317b6ed7e364ac9000000000000000000000000e8b102c80969012f49cddfeb834211517b33f0e20000000000000000000000000abe019d2138c8585d78e59a5f0f4a9c39222231000000000000000000000000a828890f231072e54f28c40abb024e61d35b877d00000000000000000000000054d58b9b52a7e567d935a983679854c4205c6863000000000000000000000000cd0033fd31964144da6b403fc5f18dc59efcea01

Deployed Bytecode

0x6080604052600436106102045760003560e01c8063715018a611610118578063ba7d2c76116100a0578063d5abeb011161006f578063d5abeb0114610720578063e0a808531461074b578063e985e9c514610774578063efbd73f4146107b1578063f2fde38b146107da57610204565b8063ba7d2c7614610664578063c87b56dd1461068f578063cfc86f7b146106cc578063d0eb26b0146106f757610204565b8063a0712d68116100e7578063a0712d68146105a2578063a22cb465146105be578063a45ba8e7146105e7578063b071401b14610612578063b88d4fde1461063b57610204565b8063715018a61461050a5780638da5cb5b1461052157806394354fd01461054c57806395d89b411461057757610204565b80633ccfd60b1161019b578063518302271161016a578063518302271461041157806355f804b31461043c5780635c975abb146104655780636352211e1461049057806370a08231146104cd57610204565b80633ccfd60b1461037f57806342842e0e1461039657806344a0d68a146103bf5780634fdd43cb146103e857610204565b806313faede6116101d757806313faede6146102d757806316c38b3c1461030257806318160ddd1461032b57806323b872dd1461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061268e565b610803565b60405161023d9190612a8c565b60405180910390f35b34801561025257600080fd5b5061025b610895565b6040516102689190612aa7565b60405180910390f35b34801561027d57600080fd5b506102986004803603810190610293919061277e565b610927565b6040516102a59190612a25565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190612621565b6109a6565b005b3480156102e357600080fd5b506102ec610aea565b6040516102f99190612bc9565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190612661565b610af0565b005b34801561033757600080fd5b50610340610b15565b60405161034d9190612bc9565b60405180910390f35b34801561036257600080fd5b5061037d6004803603810190610378919061250b565b610b2c565b005b34801561038b57600080fd5b50610394610e51565b005b3480156103a257600080fd5b506103bd60048036038101906103b8919061250b565b610eff565b005b3480156103cb57600080fd5b506103e660048036038101906103e1919061277e565b610f1f565b005b3480156103f457600080fd5b5061040f600480360381019061040a9190612735565b610f31565b005b34801561041d57600080fd5b50610426610f53565b6040516104339190612a8c565b60405180910390f35b34801561044857600080fd5b50610463600480360381019061045e91906126e8565b610f66565b005b34801561047157600080fd5b5061047a610f84565b6040516104879190612a8c565b60405180910390f35b34801561049c57600080fd5b506104b760048036038101906104b2919061277e565b610f97565b6040516104c49190612a25565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef919061249e565b610fa9565b6040516105019190612bc9565b60405180910390f35b34801561051657600080fd5b5061051f611062565b005b34801561052d57600080fd5b50610536611076565b6040516105439190612a25565b60405180910390f35b34801561055857600080fd5b506105616110a0565b60405161056e9190612bc9565b60405180910390f35b34801561058357600080fd5b5061058c6110a6565b6040516105999190612aa7565b60405180910390f35b6105bc60048036038101906105b7919061277e565b611138565b005b3480156105ca57600080fd5b506105e560048036038101906105e091906125e1565b6112ea565b005b3480156105f357600080fd5b506105fc611462565b6040516106099190612aa7565b60405180910390f35b34801561061e57600080fd5b506106396004803603810190610634919061277e565b6114f0565b005b34801561064757600080fd5b50610662600480360381019061065d919061255e565b611502565b005b34801561067057600080fd5b50610679611575565b6040516106869190612bc9565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b1919061277e565b61157b565b6040516106c39190612aa7565b60405180910390f35b3480156106d857600080fd5b506106e16116a5565b6040516106ee9190612aa7565b60405180910390f35b34801561070357600080fd5b5061071e6004803603810190610719919061277e565b611733565b005b34801561072c57600080fd5b50610735611745565b6040516107429190612bc9565b60405180910390f35b34801561075757600080fd5b50610772600480360381019061076d9190612661565b61174b565b005b34801561078057600080fd5b5061079b600480360381019061079691906124cb565b611770565b6040516107a89190612a8c565b60405180910390f35b3480156107bd57600080fd5b506107d860048036038101906107d391906127ab565b611804565b005b3480156107e657600080fd5b5061080160048036038101906107fc919061249e565b61181a565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061085e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061088e5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108a490612e79565b80601f01602080910402602001604051908101604052809291908181526020018280546108d090612e79565b801561091d5780601f106108f25761010080835404028352916020019161091d565b820191906000526020600020905b81548152906001019060200180831161090057829003601f168201915b5050505050905090565b60006109328261189e565b610968576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109b182610f97565b90508073ffffffffffffffffffffffffffffffffffffffff166109d26118fd565b73ffffffffffffffffffffffffffffffffffffffff1614610a35576109fe816109f96118fd565b611770565b610a34576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c5481565b610af8611905565b80601060006101000a81548160ff02191690831515021790555050565b6000610b1f611983565b6001546000540303905090565b6000610b378261198c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b9e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610baa84611a5a565b91509150610bc08187610bbb6118fd565b611a81565b610c0c57610bd586610bd06118fd565b611770565b610c0b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c73576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c808686866001611ac5565b8015610c8b57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d5985610d35888887611acb565b7c020000000000000000000000000000000000000000000000000000000017611af3565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610de1576000600185019050600060046000838152602001908152602001600020541415610ddf576000548114610dde578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e498686866001611b1e565b505050505050565b610e59611905565b60026009541415610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9690612b69565b60405180910390fd5b6002600981905550610eaf611076565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ef4573d6000803e3d6000fd5b506001600981905550565b610f1a83838360405180602001604052806000815250611502565b505050565b610f27611905565b80600c8190555050565b610f39611905565b80600b9080519060200190610f4f9291906121d6565b5050565b601060019054906101000a900460ff1681565b610f6e611905565b8181600a9190610f7f92919061225c565b505050565b601060009054906101000a900460ff1681565b6000610fa28261198c565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611011576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61106a611905565b6110746000611b24565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600380546110b590612e79565b80601f01602080910402602001604051908101604052809291908181526020018280546110e190612e79565b801561112e5780601f106111035761010080835404028352916020019161112e565b820191906000526020600020905b81548152906001019060200180831161111157829003601f168201915b5050505050905090565b6002600954141561117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117590612b69565b60405180910390fd5b60026009819055506000811180156111985750600e548111155b6111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce90612ae9565b60405180910390fd5b600d54816111e3610b15565b6111ed9190612cae565b111561122e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122590612b49565b60405180910390fd5b601060009054906101000a900460ff161561127e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127590612b29565b60405180910390fd5b80600c5461128c9190612d35565b3410156112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c590612ba9565b60405180910390fd5b6112df6112d9611bea565b82611bf2565b600160098190555050565b6112f26118fd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611357576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006113646118fd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114116118fd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114569190612a8c565b60405180910390a35050565b600b805461146f90612e79565b80601f016020809104026020016040519081016040528092919081815260200182805461149b90612e79565b80156114e85780601f106114bd576101008083540402835291602001916114e8565b820191906000526020600020905b8154815290600101906020018083116114cb57829003601f168201915b505050505081565b6114f8611905565b80600e8190555050565b61150d848484610b2c565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461156f5761153884848484611c10565b61156e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600f5481565b60606115868261189e565b6115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bc90612b89565b60405180910390fd5b601060019054906101000a900460ff1615611612576115e2611d70565b6115eb83611e02565b6040516020016115fc9291906129f6565b60405160208183030381529060405290506116a0565b600b805461161f90612e79565b80601f016020809104026020016040519081016040528092919081815260200182805461164b90612e79565b80156116985780601f1061166d57610100808354040283529160200191611698565b820191906000526020600020905b81548152906001019060200180831161167b57829003601f168201915b505050505090505b919050565b600a80546116b290612e79565b80601f01602080910402602001604051908101604052809291908181526020018280546116de90612e79565b801561172b5780601f106117005761010080835404028352916020019161172b565b820191906000526020600020905b81548152906001019060200180831161170e57829003601f168201915b505050505081565b61173b611905565b80600f8190555050565b600d5481565b611753611905565b80601060016101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61180c611905565b6118168183611bf2565b5050565b611822611905565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188990612ac9565b60405180910390fd5b61189b81611b24565b50565b6000816118a9611983565b111580156118b8575060005482105b80156118f6575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b61190d611bea565b73ffffffffffffffffffffffffffffffffffffffff1661192b611076565b73ffffffffffffffffffffffffffffffffffffffff1614611981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197890612b09565b60405180910390fd5b565b60006001905090565b6000808290508061199b611983565b11611a2357600054811015611a225760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611a20575b6000811415611a165760046000836001900393508381526020019081526020016000205490506119eb565b8092505050611a55565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611ae2868684611f63565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b611c0c828260405180602001604052806000815250611f6c565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c366118fd565b8786866040518563ffffffff1660e01b8152600401611c589493929190612a40565b602060405180830381600087803b158015611c7257600080fd5b505af1925050508015611ca357506040513d601f19601f82011682018060405250810190611ca091906126bb565b60015b611d1d573d8060008114611cd3576040519150601f19603f3d011682016040523d82523d6000602084013e611cd8565b606091505b50600081511415611d15576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054611d7f90612e79565b80601f0160208091040260200160405190810160405280929190818152602001828054611dab90612e79565b8015611df85780601f10611dcd57610100808354040283529160200191611df8565b820191906000526020600020905b815481529060010190602001808311611ddb57829003601f168201915b5050505050905090565b60606000821415611e4a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f5e565b600082905060005b60008214611e7c578080611e6590612edc565b915050600a82611e759190612d04565b9150611e52565b60008167ffffffffffffffff811115611e9857611e97613012565b5b6040519080825280601f01601f191660200182016040528015611eca5781602001600182028036833780820191505090505b5090505b60008514611f5757600182611ee39190612d8f565b9150600a85611ef29190612f25565b6030611efe9190612cae565b60f81b818381518110611f1457611f13612fe3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f509190612d04565b9450611ece565b8093505050505b919050565b60009392505050565b611f768383612009565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461200457600080549050600083820390505b611fb66000868380600101945086611c10565b611fec576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611fa357816000541461200157600080fd5b50505b505050565b600080549050600082141561204a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120576000848385611ac5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506120ce836120bf6000866000611acb565b6120c8856121c6565b17611af3565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461216f57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612134565b5060008214156121ab576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506121c16000848385611b1e565b505050565b60006001821460e11b9050919050565b8280546121e290612e79565b90600052602060002090601f016020900481019282612204576000855561224b565b82601f1061221d57805160ff191683800117855561224b565b8280016001018555821561224b579182015b8281111561224a57825182559160200191906001019061222f565b5b50905061225891906122e2565b5090565b82805461226890612e79565b90600052602060002090601f01602090048101928261228a57600085556122d1565b82601f106122a357803560ff19168380011785556122d1565b828001600101855582156122d1579182015b828111156122d05782358255916020019190600101906122b5565b5b5090506122de91906122e2565b5090565b5b808211156122fb5760008160009055506001016122e3565b5090565b600061231261230d84612c09565b612be4565b90508281526020810184848401111561232e5761232d613050565b5b612339848285612e37565b509392505050565b600061235461234f84612c3a565b612be4565b9050828152602081018484840111156123705761236f613050565b5b61237b848285612e37565b509392505050565b60008135905061239281613207565b92915050565b6000813590506123a78161321e565b92915050565b6000813590506123bc81613235565b92915050565b6000815190506123d181613235565b92915050565b600082601f8301126123ec576123eb613046565b5b81356123fc8482602086016122ff565b91505092915050565b60008083601f84011261241b5761241a613046565b5b8235905067ffffffffffffffff81111561243857612437613041565b5b6020830191508360018202830111156124545761245361304b565b5b9250929050565b600082601f8301126124705761246f613046565b5b8135612480848260208601612341565b91505092915050565b6000813590506124988161324c565b92915050565b6000602082840312156124b4576124b361305a565b5b60006124c284828501612383565b91505092915050565b600080604083850312156124e2576124e161305a565b5b60006124f085828601612383565b925050602061250185828601612383565b9150509250929050565b6000806000606084860312156125245761252361305a565b5b600061253286828701612383565b935050602061254386828701612383565b925050604061255486828701612489565b9150509250925092565b600080600080608085870312156125785761257761305a565b5b600061258687828801612383565b945050602061259787828801612383565b93505060406125a887828801612489565b925050606085013567ffffffffffffffff8111156125c9576125c8613055565b5b6125d5878288016123d7565b91505092959194509250565b600080604083850312156125f8576125f761305a565b5b600061260685828601612383565b925050602061261785828601612398565b9150509250929050565b600080604083850312156126385761263761305a565b5b600061264685828601612383565b925050602061265785828601612489565b9150509250929050565b6000602082840312156126775761267661305a565b5b600061268584828501612398565b91505092915050565b6000602082840312156126a4576126a361305a565b5b60006126b2848285016123ad565b91505092915050565b6000602082840312156126d1576126d061305a565b5b60006126df848285016123c2565b91505092915050565b600080602083850312156126ff576126fe61305a565b5b600083013567ffffffffffffffff81111561271d5761271c613055565b5b61272985828601612405565b92509250509250929050565b60006020828403121561274b5761274a61305a565b5b600082013567ffffffffffffffff81111561276957612768613055565b5b6127758482850161245b565b91505092915050565b6000602082840312156127945761279361305a565b5b60006127a284828501612489565b91505092915050565b600080604083850312156127c2576127c161305a565b5b60006127d085828601612489565b92505060206127e185828601612383565b9150509250929050565b6127f481612dc3565b82525050565b61280381612dd5565b82525050565b600061281482612c6b565b61281e8185612c81565b935061282e818560208601612e46565b6128378161305f565b840191505092915050565b600061284d82612c76565b6128578185612c92565b9350612867818560208601612e46565b6128708161305f565b840191505092915050565b600061288682612c76565b6128908185612ca3565b93506128a0818560208601612e46565b80840191505092915050565b60006128b9602683612c92565b91506128c482613070565b604082019050919050565b60006128dc601483612c92565b91506128e7826130bf565b602082019050919050565b60006128ff600583612ca3565b915061290a826130e8565b600582019050919050565b6000612922602083612c92565b915061292d82613111565b602082019050919050565b6000612945601783612c92565b91506129508261313a565b602082019050919050565b6000612968601483612c92565b915061297382613163565b602082019050919050565b600061298b601f83612c92565b91506129968261318c565b602082019050919050565b60006129ae601383612c92565b91506129b9826131b5565b602082019050919050565b60006129d1601383612c92565b91506129dc826131de565b602082019050919050565b6129f081612e2d565b82525050565b6000612a02828561287b565b9150612a0e828461287b565b9150612a19826128f2565b91508190509392505050565b6000602082019050612a3a60008301846127eb565b92915050565b6000608082019050612a5560008301876127eb565b612a6260208301866127eb565b612a6f60408301856129e7565b8181036060830152612a818184612809565b905095945050505050565b6000602082019050612aa160008301846127fa565b92915050565b60006020820190508181036000830152612ac18184612842565b905092915050565b60006020820190508181036000830152612ae2816128ac565b9050919050565b60006020820190508181036000830152612b02816128cf565b9050919050565b60006020820190508181036000830152612b2281612915565b9050919050565b60006020820190508181036000830152612b4281612938565b9050919050565b60006020820190508181036000830152612b628161295b565b9050919050565b60006020820190508181036000830152612b828161297e565b9050919050565b60006020820190508181036000830152612ba2816129a1565b9050919050565b60006020820190508181036000830152612bc2816129c4565b9050919050565b6000602082019050612bde60008301846129e7565b92915050565b6000612bee612bff565b9050612bfa8282612eab565b919050565b6000604051905090565b600067ffffffffffffffff821115612c2457612c23613012565b5b612c2d8261305f565b9050602081019050919050565b600067ffffffffffffffff821115612c5557612c54613012565b5b612c5e8261305f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612cb982612e2d565b9150612cc483612e2d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612cf957612cf8612f56565b5b828201905092915050565b6000612d0f82612e2d565b9150612d1a83612e2d565b925082612d2a57612d29612f85565b5b828204905092915050565b6000612d4082612e2d565b9150612d4b83612e2d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d8457612d83612f56565b5b828202905092915050565b6000612d9a82612e2d565b9150612da583612e2d565b925082821015612db857612db7612f56565b5b828203905092915050565b6000612dce82612e0d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612e64578082015181840152602081019050612e49565b83811115612e73576000848401525b50505050565b60006002820490506001821680612e9157607f821691505b60208210811415612ea557612ea4612fb4565b5b50919050565b612eb48261305f565b810181811067ffffffffffffffff82111715612ed357612ed2613012565b5b80604052505050565b6000612ee782612e2d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f1a57612f19612f56565b5b600182019050919050565b6000612f3082612e2d565b9150612f3b83612e2d565b925082612f4b57612f4a612f85565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f55524920646f6573206e6f742065786973742100000000000000000000000000600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61321081612dc3565b811461321b57600080fd5b50565b61322781612dd5565b811461323257600080fd5b50565b61323e81612de1565b811461324957600080fd5b50565b61325581612e2d565b811461326057600080fd5b5056fea264697066735822122089b692cb9d7b6f267cf8565d72cbd31647a723fee9a214f770c8abbc1da3c72a64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000016100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000013333cc71956ed0d947fd07674d0d9e741a599b000000000000000000000000fdfbaec3bd13c491ad830e7c1c7d237cb465c0890000000000000000000000004a17394f12f9e0c53fffa278d8b6fd4f31af05fc000000000000000000000000f9b3d44918302f55a996c371a214d195202b51470000000000000000000000007b5ba62d8e8d8a2ad433df7a4317b6ed7e364ac9000000000000000000000000e8b102c80969012f49cddfeb834211517b33f0e20000000000000000000000000abe019d2138c8585d78e59a5f0f4a9c39222231000000000000000000000000a828890f231072e54f28c40abb024e61d35b877d00000000000000000000000054d58b9b52a7e567d935a983679854c4205c6863000000000000000000000000cd0033fd31964144da6b403fc5f18dc59efcea01

-----Decoded View---------------
Arg [0] : _hiddenMetadataUri (string): a
Arg [1] : _airdropAddress (address[]): 0x013333cC71956Ed0d947fd07674D0D9E741A599B,0xFDfBaec3Bd13c491aD830e7C1C7d237CB465c089,0x4a17394f12F9E0c53fffa278d8b6fD4F31AF05Fc,0xF9b3D44918302F55A996c371a214D195202B5147,0x7B5ba62d8E8D8A2ad433Df7a4317B6eD7E364ac9,0xe8B102C80969012f49cDdfeB834211517b33F0e2,0x0ABE019D2138c8585D78e59a5f0f4A9c39222231,0xa828890f231072e54F28c40Abb024e61d35b877D,0x54d58B9B52a7e567D935a983679854C4205C6863,0xCd0033FD31964144dA6B403FC5F18Dc59EFCea01

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 6100000000000000000000000000000000000000000000000000000000000000
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [5] : 000000000000000000000000013333cc71956ed0d947fd07674d0d9e741a599b
Arg [6] : 000000000000000000000000fdfbaec3bd13c491ad830e7c1c7d237cb465c089
Arg [7] : 0000000000000000000000004a17394f12f9e0c53fffa278d8b6fd4f31af05fc
Arg [8] : 000000000000000000000000f9b3d44918302f55a996c371a214d195202b5147
Arg [9] : 0000000000000000000000007b5ba62d8e8d8a2ad433df7a4317b6ed7e364ac9
Arg [10] : 000000000000000000000000e8b102c80969012f49cddfeb834211517b33f0e2
Arg [11] : 0000000000000000000000000abe019d2138c8585d78e59a5f0f4a9c39222231
Arg [12] : 000000000000000000000000a828890f231072e54f28c40abb024e61d35b877d
Arg [13] : 00000000000000000000000054d58b9b52a7e567d935a983679854c4205c6863
Arg [14] : 000000000000000000000000cd0033fd31964144da6b403fc5f18dc59efcea01


Deployed Bytecode Sourcemap

59746:2768:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27284:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28186:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34669:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34110:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59908:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61601:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23937:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38376:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61684:111;;;;;;;;;;;;;:::i;:::-;;41289:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61385:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61827:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60095:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61965:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60065:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29579:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25121:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8032:103;;;;;;;;;;;;;:::i;:::-;;7384:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59977:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28362:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60371:406;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35227:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59870:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61465:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42072:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60019:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62185:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59838:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60954:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59942:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61298:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35692:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61064:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8290:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27284:639;27369:4;27708:10;27693:25;;:11;:25;;;;:102;;;;27785:10;27770:25;;:11;:25;;;;27693:102;:179;;;;27862:10;27847:25;;:11;:25;;;;27693:179;27673:199;;27284:639;;;:::o;28186:100::-;28240:13;28273:5;28266:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28186:100;:::o;34669:218::-;34745:7;34770:16;34778:7;34770;:16::i;:::-;34765:64;;34795:34;;;;;;;;;;;;;;34765:64;34849:15;:24;34865:7;34849:24;;;;;;;;;;;:30;;;;;;;;;;;;34842:37;;34669:218;;;:::o;34110:400::-;34191:13;34207:16;34215:7;34207;:16::i;:::-;34191:32;;34263:5;34240:28;;:19;:17;:19::i;:::-;:28;;;34236:175;;34288:44;34305:5;34312:19;:17;:19::i;:::-;34288:16;:44::i;:::-;34283:128;;34360:35;;;;;;;;;;;;;;34283:128;34236:175;34456:2;34423:15;:24;34439:7;34423:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34494:7;34490:2;34474:28;;34483:5;34474:28;;;;;;;;;;;;34180:330;34110:400;;:::o;59908:29::-;;;;:::o;61601:77::-;7270:13;:11;:13::i;:::-;61666:6:::1;61657;;:15;;;;;;;;;;;;;;;;;;61601:77:::0;:::o;23937:323::-;23998:7;24226:15;:13;:15::i;:::-;24211:12;;24195:13;;:28;:46;24188:53;;23937:323;:::o;38376:2817::-;38510:27;38540;38559:7;38540:18;:27::i;:::-;38510:57;;38625:4;38584:45;;38600:19;38584:45;;;38580:86;;38638:28;;;;;;;;;;;;;;38580:86;38680:27;38709:23;38736:35;38763:7;38736:26;:35::i;:::-;38679:92;;;;38871:68;38896:15;38913:4;38919:19;:17;:19::i;:::-;38871:24;:68::i;:::-;38866:180;;38959:43;38976:4;38982:19;:17;:19::i;:::-;38959:16;:43::i;:::-;38954:92;;39011:35;;;;;;;;;;;;;;38954:92;38866:180;39077:1;39063:16;;:2;:16;;;39059:52;;;39088:23;;;;;;;;;;;;;;39059:52;39124:43;39146:4;39152:2;39156:7;39165:1;39124:21;:43::i;:::-;39260:15;39257:160;;;39400:1;39379:19;39372:30;39257:160;39797:18;:24;39816:4;39797:24;;;;;;;;;;;;;;;;39795:26;;;;;;;;;;;;39866:18;:22;39885:2;39866:22;;;;;;;;;;;;;;;;39864:24;;;;;;;;;;;40188:146;40225:2;40274:45;40289:4;40295:2;40299:19;40274:14;:45::i;:::-;20336:8;40246:73;40188:18;:146::i;:::-;40159:17;:26;40177:7;40159:26;;;;;;;;;;;:175;;;;40505:1;20336:8;40454:19;:47;:52;40450:627;;;40527:19;40559:1;40549:7;:11;40527:33;;40716:1;40682:17;:30;40700:11;40682:30;;;;;;;;;;;;:35;40678:384;;;40820:13;;40805:11;:28;40801:242;;41000:19;40967:17;:30;40985:11;40967:30;;;;;;;;;;;:52;;;;40801:242;40678:384;40508:569;40450:627;41124:7;41120:2;41105:27;;41114:4;41105:27;;;;;;;;;;;;41143:42;41164:4;41170:2;41174:7;41183:1;41143:20;:42::i;:::-;38499:2694;;;38376:2817;;;:::o;61684:111::-;7270:13;:11;:13::i;:::-;4309:1:::1;4907:7;;:19;;4899:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4309:1;5040:7;:18;;;;61749:7:::2;:5;:7::i;:::-;61741:25;;:48;61767:21;61741:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;4265:1:::1;5219:7;:22;;;;61684:111::o:0;41289:185::-;41427:39;41444:4;41450:2;41454:7;41427:39;;;;;;;;;;;;:16;:39::i;:::-;41289:185;;;:::o;61385:74::-;7270:13;:11;:13::i;:::-;61448:5:::1;61441:4;:12;;;;61385:74:::0;:::o;61827:132::-;7270:13;:11;:13::i;:::-;61935:18:::1;61915:17;:38;;;;;;;;;;;;:::i;:::-;;61827:132:::0;:::o;60095:20::-;;;;;;;;;;;;;:::o;61965:98::-;7270:13;:11;:13::i;:::-;62050:7:::1;;62034:13;:23;;;;;;;:::i;:::-;;61965:98:::0;;:::o;60065:25::-;;;;;;;;;;;;;:::o;29579:152::-;29651:7;29694:27;29713:7;29694:18;:27::i;:::-;29671:52;;29579:152;;;:::o;25121:233::-;25193:7;25234:1;25217:19;;:5;:19;;;25213:60;;;25245:28;;;;;;;;;;;;;;25213:60;19280:13;25291:18;:25;25310:5;25291:25;;;;;;;;;;;;;;;;:55;25284:62;;25121:233;;;:::o;8032:103::-;7270:13;:11;:13::i;:::-;8097:30:::1;8124:1;8097:18;:30::i;:::-;8032:103::o:0;7384:87::-;7430:7;7457:6;;;;;;;;;;;7450:13;;7384:87;:::o;59977:37::-;;;;:::o;28362:104::-;28418:13;28451:7;28444:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28362:104;:::o;60371:406::-;4309:1;4907:7;;:19;;4899:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4309:1;5040:7;:18;;;;60463:1:::1;60449:11;:15;:52;;;;;60483:18;;60468:11;:33;;60449:52;60441:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;60572:9;;60557:11;60541:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;60533:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;60622:6;;;;;;;;;;;60621:7;60613:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;60691:11;60684:4;;:18;;;;:::i;:::-;60671:9;:31;;60663:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;60735:36;60745:12;:10;:12::i;:::-;60759:11;60735:9;:36::i;:::-;4265:1:::0;5219:7;:22;;;;60371:406;:::o;35227:308::-;35338:19;:17;:19::i;:::-;35326:31;;:8;:31;;;35322:61;;;35366:17;;;;;;;;;;;;;;35322:61;35448:8;35396:18;:39;35415:19;:17;:19::i;:::-;35396:39;;;;;;;;;;;;;;;:49;35436:8;35396:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;35508:8;35472:55;;35487:19;:17;:19::i;:::-;35472:55;;;35518:8;35472:55;;;;;;:::i;:::-;;;;;;;;35227:308;;:::o;59870:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61465:130::-;7270:13;:11;:13::i;:::-;61570:19:::1;61549:18;:40;;;;61465:130:::0;:::o;42072:399::-;42239:31;42252:4;42258:2;42262:7;42239:12;:31::i;:::-;42303:1;42285:2;:14;;;:19;42281:183;;42324:56;42355:4;42361:2;42365:7;42374:5;42324:30;:56::i;:::-;42319:145;;42408:40;;;;;;;;;;;;;;42319:145;42281:183;42072:399;;;;:::o;60019:37::-;;;;:::o;62185:326::-;62259:13;62291:17;62299:8;62291:7;:17::i;:::-;62283:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;62347:8;;;;;;;;;;;62343:163;;;62401:10;:8;:10::i;:::-;62413:19;:8;:17;:19::i;:::-;62384:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62370:73;;;;62343:163;62479:17;62472:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62185:326;;;;:::o;59838:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60954:104::-;7270:13;:11;:13::i;:::-;61046:6:::1;61025:18;:27;;;;60954:104:::0;:::o;59942:30::-;;;;:::o;61298:81::-;7270:13;:11;:13::i;:::-;61367:6:::1;61356:8;;:17;;;;;;;;;;;;;;;;;;61298:81:::0;:::o;35692:164::-;35789:4;35813:18;:25;35832:5;35813:25;;;;;;;;;;;;;;;:35;35839:8;35813:35;;;;;;;;;;;;;;;;;;;;;;;;;35806:42;;35692:164;;;;:::o;61064:127::-;7270:13;:11;:13::i;:::-;61152:33:::1;61162:9;61173:11;61152:9;:33::i;:::-;61064:127:::0;;:::o;8290:201::-;7270:13;:11;:13::i;:::-;8399:1:::1;8379:22;;:8;:22;;;;8371:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8455:28;8474:8;8455:18;:28::i;:::-;8290:201:::0;:::o;36114:282::-;36179:4;36235:7;36216:15;:13;:15::i;:::-;:26;;:66;;;;;36269:13;;36259:7;:23;36216:66;:153;;;;;36368:1;20056:8;36320:17;:26;36338:7;36320:26;;;;;;;;;;;;:44;:49;36216:153;36196:173;;36114:282;;;:::o;57880:105::-;57940:7;57967:10;57960:17;;57880:105;:::o;7549:132::-;7624:12;:10;:12::i;:::-;7613:23;;:7;:5;:7::i;:::-;:23;;;7605:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7549:132::o;61197:95::-;61262:7;61285:1;61278:8;;61197:95;:::o;30734:1275::-;30801:7;30821:12;30836:7;30821:22;;30904:4;30885:15;:13;:15::i;:::-;:23;30881:1061;;30938:13;;30931:4;:20;30927:1015;;;30976:14;30993:17;:23;31011:4;30993:23;;;;;;;;;;;;30976:40;;31110:1;20056:8;31082:6;:24;:29;31078:845;;;31747:113;31764:1;31754:6;:11;31747:113;;;31807:17;:25;31825:6;;;;;;;31807:25;;;;;;;;;;;;31798:34;;31747:113;;;31893:6;31886:13;;;;;;31078:845;30953:989;30927:1015;30881:1061;31970:31;;;;;;;;;;;;;;30734:1275;;;;:::o;37277:479::-;37379:27;37408:23;37449:38;37490:15;:24;37506:7;37490:24;;;;;;;;;;;37449:65;;37661:18;37638:41;;37718:19;37712:26;37693:45;;37623:126;37277:479;;;:::o;36505:659::-;36654:11;36819:16;36812:5;36808:28;36799:37;;36979:16;36968:9;36964:32;36951:45;;37129:15;37118:9;37115:30;37107:5;37096:9;37093:20;37090:56;37080:66;;36505:659;;;;;:::o;43133:159::-;;;;;:::o;57189:311::-;57324:7;57344:16;20460:3;57370:19;:41;;57344:68;;20460:3;57438:31;57449:4;57455:2;57459:9;57438:10;:31::i;:::-;57430:40;;:62;;57423:69;;;57189:311;;;;;:::o;32557:450::-;32637:14;32805:16;32798:5;32794:28;32785:37;;32982:5;32968:11;32943:23;32939:41;32936:52;32929:5;32926:63;32916:73;;32557:450;;;;:::o;43957:158::-;;;;;:::o;8651:191::-;8725:16;8744:6;;;;;;;;;;;8725:25;;8770:8;8761:6;;:17;;;;;;;;;;;;;;;;;;8825:8;8794:40;;8815:8;8794:40;;;;;;;;;;;;8714:128;8651:191;:::o;5935:98::-;5988:7;6015:10;6008:17;;5935:98;:::o;51712:112::-;51789:27;51799:2;51803:8;51789:27;;;;;;;;;;;;:9;:27::i;:::-;51712:112;;:::o;44555:716::-;44718:4;44764:2;44739:45;;;44785:19;:17;:19::i;:::-;44806:4;44812:7;44821:5;44739:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44735:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45039:1;45022:6;:13;:18;45018:235;;;45068:40;;;;;;;;;;;;;;45018:235;45211:6;45205:13;45196:6;45192:2;45188:15;45181:38;44735:529;44908:54;;;44898:64;;;:6;:64;;;;44891:71;;;44555:716;;;;;;:::o;62069:110::-;62129:13;62160;62153:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62069:110;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;56890:147::-;57027:6;56890:147;;;;;:::o;50939:689::-;51070:19;51076:2;51080:8;51070:5;:19::i;:::-;51149:1;51131:2;:14;;;:19;51127:483;;51171:11;51185:13;;51171:27;;51217:13;51239:8;51233:3;:14;51217:30;;51266:233;51297:62;51336:1;51340:2;51344:7;;;;;;51353:5;51297:30;:62::i;:::-;51292:167;;51395:40;;;;;;;;;;;;;;51292:167;51494:3;51486:5;:11;51266:233;;51581:3;51564:13;;:20;51560:34;;51586:8;;;51560:34;51152:458;;51127:483;50939:689;;;:::o;45733:2454::-;45806:20;45829:13;;45806:36;;45869:1;45857:8;:13;45853:44;;;45879:18;;;;;;;;;;;;;;45853:44;45910:61;45940:1;45944:2;45948:12;45962:8;45910:21;:61::i;:::-;46454:1;19418:2;46424:1;:26;;46423:32;46411:8;:45;46385:18;:22;46404:2;46385:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;46733:139;46770:2;46824:33;46847:1;46851:2;46855:1;46824:14;:33::i;:::-;46791:30;46812:8;46791:20;:30::i;:::-;:66;46733:18;:139::i;:::-;46699:17;:31;46717:12;46699:31;;;;;;;;;;;:173;;;;46889:16;46920:11;46949:8;46934:12;:23;46920:37;;47204:16;47200:2;47196:25;47184:37;;47576:12;47536:8;47495:1;47433:25;47374:1;47313;47286:335;47701:1;47687:12;47683:20;47641:346;47742:3;47733:7;47730:16;47641:346;;47960:7;47950:8;47947:1;47920:25;47917:1;47914;47909:59;47795:1;47786:7;47782:15;47771:26;;47641:346;;;47645:77;48032:1;48020:8;:13;48016:45;;;48042:19;;;;;;;;;;;;;;48016:45;48094:3;48078:13;:19;;;;46159:1950;;48119:60;48148:1;48152:2;48156:12;48170:8;48119:20;:60::i;:::-;45795:2392;45733:2454;;:::o;33109:324::-;33179:14;33412:1;33402:8;33399:15;33373:24;33369:46;33359:56;;33109:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:553::-;1844:8;1854:6;1904:3;1897:4;1889:6;1885:17;1881:27;1871:122;;1912:79;;:::i;:::-;1871:122;2025:6;2012:20;2002:30;;2055:18;2047:6;2044:30;2041:117;;;2077:79;;:::i;:::-;2041:117;2191:4;2183:6;2179:17;2167:29;;2245:3;2237:4;2229:6;2225:17;2215:8;2211:32;2208:41;2205:128;;;2252:79;;:::i;:::-;2205:128;1786:553;;;;;:::o;2359:340::-;2415:5;2464:3;2457:4;2449:6;2445:17;2441:27;2431:122;;2472:79;;:::i;:::-;2431:122;2589:6;2576:20;2614:79;2689:3;2681:6;2674:4;2666:6;2662:17;2614:79;:::i;:::-;2605:88;;2421:278;2359:340;;;;:::o;2705:139::-;2751:5;2789:6;2776:20;2767:29;;2805:33;2832:5;2805:33;:::i;:::-;2705:139;;;;:::o;2850:329::-;2909:6;2958:2;2946:9;2937:7;2933:23;2929:32;2926:119;;;2964:79;;:::i;:::-;2926:119;3084:1;3109:53;3154:7;3145:6;3134:9;3130:22;3109:53;:::i;:::-;3099:63;;3055:117;2850:329;;;;:::o;3185:474::-;3253:6;3261;3310:2;3298:9;3289:7;3285:23;3281:32;3278:119;;;3316:79;;:::i;:::-;3278:119;3436:1;3461:53;3506:7;3497:6;3486:9;3482:22;3461:53;:::i;:::-;3451:63;;3407:117;3563:2;3589:53;3634:7;3625:6;3614:9;3610:22;3589:53;:::i;:::-;3579:63;;3534:118;3185:474;;;;;:::o;3665:619::-;3742:6;3750;3758;3807:2;3795:9;3786:7;3782:23;3778:32;3775:119;;;3813:79;;:::i;:::-;3775:119;3933:1;3958:53;4003:7;3994:6;3983:9;3979:22;3958:53;:::i;:::-;3948:63;;3904:117;4060:2;4086:53;4131:7;4122:6;4111:9;4107:22;4086:53;:::i;:::-;4076:63;;4031:118;4188:2;4214:53;4259:7;4250:6;4239:9;4235:22;4214:53;:::i;:::-;4204:63;;4159:118;3665:619;;;;;:::o;4290:943::-;4385:6;4393;4401;4409;4458:3;4446:9;4437:7;4433:23;4429:33;4426:120;;;4465:79;;:::i;:::-;4426:120;4585:1;4610:53;4655:7;4646:6;4635:9;4631:22;4610:53;:::i;:::-;4600:63;;4556:117;4712:2;4738:53;4783:7;4774:6;4763:9;4759:22;4738:53;:::i;:::-;4728:63;;4683:118;4840:2;4866:53;4911:7;4902:6;4891:9;4887:22;4866:53;:::i;:::-;4856:63;;4811:118;4996:2;4985:9;4981:18;4968:32;5027:18;5019:6;5016:30;5013:117;;;5049:79;;:::i;:::-;5013:117;5154:62;5208:7;5199:6;5188:9;5184:22;5154:62;:::i;:::-;5144:72;;4939:287;4290:943;;;;;;;:::o;5239:468::-;5304:6;5312;5361:2;5349:9;5340:7;5336:23;5332:32;5329:119;;;5367:79;;:::i;:::-;5329:119;5487:1;5512:53;5557:7;5548:6;5537:9;5533:22;5512:53;:::i;:::-;5502:63;;5458:117;5614:2;5640:50;5682:7;5673:6;5662:9;5658:22;5640:50;:::i;:::-;5630:60;;5585:115;5239:468;;;;;:::o;5713:474::-;5781:6;5789;5838:2;5826:9;5817:7;5813:23;5809:32;5806:119;;;5844:79;;:::i;:::-;5806:119;5964:1;5989:53;6034:7;6025:6;6014:9;6010:22;5989:53;:::i;:::-;5979:63;;5935:117;6091:2;6117:53;6162:7;6153:6;6142:9;6138:22;6117:53;:::i;:::-;6107:63;;6062:118;5713:474;;;;;:::o;6193:323::-;6249:6;6298:2;6286:9;6277:7;6273:23;6269:32;6266:119;;;6304:79;;:::i;:::-;6266:119;6424:1;6449:50;6491:7;6482:6;6471:9;6467:22;6449:50;:::i;:::-;6439:60;;6395:114;6193:323;;;;:::o;6522:327::-;6580:6;6629:2;6617:9;6608:7;6604:23;6600:32;6597:119;;;6635:79;;:::i;:::-;6597:119;6755:1;6780:52;6824:7;6815:6;6804:9;6800:22;6780:52;:::i;:::-;6770:62;;6726:116;6522:327;;;;:::o;6855:349::-;6924:6;6973:2;6961:9;6952:7;6948:23;6944:32;6941:119;;;6979:79;;:::i;:::-;6941:119;7099:1;7124:63;7179:7;7170:6;7159:9;7155:22;7124:63;:::i;:::-;7114:73;;7070:127;6855:349;;;;:::o;7210:529::-;7281:6;7289;7338:2;7326:9;7317:7;7313:23;7309:32;7306:119;;;7344:79;;:::i;:::-;7306:119;7492:1;7481:9;7477:17;7464:31;7522:18;7514:6;7511:30;7508:117;;;7544:79;;:::i;:::-;7508:117;7657:65;7714:7;7705:6;7694:9;7690:22;7657:65;:::i;:::-;7639:83;;;;7435:297;7210:529;;;;;:::o;7745:509::-;7814:6;7863:2;7851:9;7842:7;7838:23;7834:32;7831:119;;;7869:79;;:::i;:::-;7831:119;8017:1;8006:9;8002:17;7989:31;8047:18;8039:6;8036:30;8033:117;;;8069:79;;:::i;:::-;8033:117;8174:63;8229:7;8220:6;8209:9;8205:22;8174:63;:::i;:::-;8164:73;;7960:287;7745:509;;;;:::o;8260:329::-;8319:6;8368:2;8356:9;8347:7;8343:23;8339:32;8336:119;;;8374:79;;:::i;:::-;8336:119;8494:1;8519:53;8564:7;8555:6;8544:9;8540:22;8519:53;:::i;:::-;8509:63;;8465:117;8260:329;;;;:::o;8595:474::-;8663:6;8671;8720:2;8708:9;8699:7;8695:23;8691:32;8688:119;;;8726:79;;:::i;:::-;8688:119;8846:1;8871:53;8916:7;8907:6;8896:9;8892:22;8871:53;:::i;:::-;8861:63;;8817:117;8973:2;8999:53;9044:7;9035:6;9024:9;9020:22;8999:53;:::i;:::-;8989:63;;8944:118;8595:474;;;;;:::o;9075:118::-;9162:24;9180:5;9162:24;:::i;:::-;9157:3;9150:37;9075:118;;:::o;9199:109::-;9280:21;9295:5;9280:21;:::i;:::-;9275:3;9268:34;9199:109;;:::o;9314:360::-;9400:3;9428:38;9460:5;9428:38;:::i;:::-;9482:70;9545:6;9540:3;9482:70;:::i;:::-;9475:77;;9561:52;9606:6;9601:3;9594:4;9587:5;9583:16;9561:52;:::i;:::-;9638:29;9660:6;9638:29;:::i;:::-;9633:3;9629:39;9622:46;;9404:270;9314:360;;;;:::o;9680:364::-;9768:3;9796:39;9829:5;9796:39;:::i;:::-;9851:71;9915:6;9910:3;9851:71;:::i;:::-;9844:78;;9931:52;9976:6;9971:3;9964:4;9957:5;9953:16;9931:52;:::i;:::-;10008:29;10030:6;10008:29;:::i;:::-;10003:3;9999:39;9992:46;;9772:272;9680:364;;;;:::o;10050:377::-;10156:3;10184:39;10217:5;10184:39;:::i;:::-;10239:89;10321:6;10316:3;10239:89;:::i;:::-;10232:96;;10337:52;10382:6;10377:3;10370:4;10363:5;10359:16;10337:52;:::i;:::-;10414:6;10409:3;10405:16;10398:23;;10160:267;10050:377;;;;:::o;10433:366::-;10575:3;10596:67;10660:2;10655:3;10596:67;:::i;:::-;10589:74;;10672:93;10761:3;10672:93;:::i;:::-;10790:2;10785:3;10781:12;10774:19;;10433:366;;;:::o;10805:::-;10947:3;10968:67;11032:2;11027:3;10968:67;:::i;:::-;10961:74;;11044:93;11133:3;11044:93;:::i;:::-;11162:2;11157:3;11153:12;11146:19;;10805:366;;;:::o;11177:400::-;11337:3;11358:84;11440:1;11435:3;11358:84;:::i;:::-;11351:91;;11451:93;11540:3;11451:93;:::i;:::-;11569:1;11564:3;11560:11;11553:18;;11177:400;;;:::o;11583:366::-;11725:3;11746:67;11810:2;11805:3;11746:67;:::i;:::-;11739:74;;11822:93;11911:3;11822:93;:::i;:::-;11940:2;11935:3;11931:12;11924:19;;11583:366;;;:::o;11955:::-;12097:3;12118:67;12182:2;12177:3;12118:67;:::i;:::-;12111:74;;12194:93;12283:3;12194:93;:::i;:::-;12312:2;12307:3;12303:12;12296:19;;11955:366;;;:::o;12327:::-;12469:3;12490:67;12554:2;12549:3;12490:67;:::i;:::-;12483:74;;12566:93;12655:3;12566:93;:::i;:::-;12684:2;12679:3;12675:12;12668:19;;12327:366;;;:::o;12699:::-;12841:3;12862:67;12926:2;12921:3;12862:67;:::i;:::-;12855:74;;12938:93;13027:3;12938:93;:::i;:::-;13056:2;13051:3;13047:12;13040:19;;12699:366;;;:::o;13071:::-;13213:3;13234:67;13298:2;13293:3;13234:67;:::i;:::-;13227:74;;13310:93;13399:3;13310:93;:::i;:::-;13428:2;13423:3;13419:12;13412:19;;13071:366;;;:::o;13443:::-;13585:3;13606:67;13670:2;13665:3;13606:67;:::i;:::-;13599:74;;13682:93;13771:3;13682:93;:::i;:::-;13800:2;13795:3;13791:12;13784:19;;13443:366;;;:::o;13815:118::-;13902:24;13920:5;13902:24;:::i;:::-;13897:3;13890:37;13815:118;;:::o;13939:701::-;14220:3;14242:95;14333:3;14324:6;14242:95;:::i;:::-;14235:102;;14354:95;14445:3;14436:6;14354:95;:::i;:::-;14347:102;;14466:148;14610:3;14466:148;:::i;:::-;14459:155;;14631:3;14624:10;;13939:701;;;;;:::o;14646:222::-;14739:4;14777:2;14766:9;14762:18;14754:26;;14790:71;14858:1;14847:9;14843:17;14834:6;14790:71;:::i;:::-;14646:222;;;;:::o;14874:640::-;15069:4;15107:3;15096:9;15092:19;15084:27;;15121:71;15189:1;15178:9;15174:17;15165:6;15121:71;:::i;:::-;15202:72;15270:2;15259:9;15255:18;15246:6;15202:72;:::i;:::-;15284;15352:2;15341:9;15337:18;15328:6;15284:72;:::i;:::-;15403:9;15397:4;15393:20;15388:2;15377:9;15373:18;15366:48;15431:76;15502:4;15493:6;15431:76;:::i;:::-;15423:84;;14874:640;;;;;;;:::o;15520:210::-;15607:4;15645:2;15634:9;15630:18;15622:26;;15658:65;15720:1;15709:9;15705:17;15696:6;15658:65;:::i;:::-;15520:210;;;;:::o;15736:313::-;15849:4;15887:2;15876:9;15872:18;15864:26;;15936:9;15930:4;15926:20;15922:1;15911:9;15907:17;15900:47;15964:78;16037:4;16028:6;15964:78;:::i;:::-;15956:86;;15736:313;;;;:::o;16055:419::-;16221:4;16259:2;16248:9;16244:18;16236:26;;16308:9;16302:4;16298:20;16294:1;16283:9;16279:17;16272:47;16336:131;16462:4;16336:131;:::i;:::-;16328:139;;16055:419;;;:::o;16480:::-;16646:4;16684:2;16673:9;16669:18;16661:26;;16733:9;16727:4;16723:20;16719:1;16708:9;16704:17;16697:47;16761:131;16887:4;16761:131;:::i;:::-;16753:139;;16480:419;;;:::o;16905:::-;17071:4;17109:2;17098:9;17094:18;17086:26;;17158:9;17152:4;17148:20;17144:1;17133:9;17129:17;17122:47;17186:131;17312:4;17186:131;:::i;:::-;17178:139;;16905:419;;;:::o;17330:::-;17496:4;17534:2;17523:9;17519:18;17511:26;;17583:9;17577:4;17573:20;17569:1;17558:9;17554:17;17547:47;17611:131;17737:4;17611:131;:::i;:::-;17603:139;;17330:419;;;:::o;17755:::-;17921:4;17959:2;17948:9;17944:18;17936:26;;18008:9;18002:4;17998:20;17994:1;17983:9;17979:17;17972:47;18036:131;18162:4;18036:131;:::i;:::-;18028:139;;17755:419;;;:::o;18180:::-;18346:4;18384:2;18373:9;18369:18;18361:26;;18433:9;18427:4;18423:20;18419:1;18408:9;18404:17;18397:47;18461:131;18587:4;18461:131;:::i;:::-;18453:139;;18180:419;;;:::o;18605:::-;18771:4;18809:2;18798:9;18794:18;18786:26;;18858:9;18852:4;18848:20;18844:1;18833:9;18829:17;18822:47;18886:131;19012:4;18886:131;:::i;:::-;18878:139;;18605:419;;;:::o;19030:::-;19196:4;19234:2;19223:9;19219:18;19211:26;;19283:9;19277:4;19273:20;19269:1;19258:9;19254:17;19247:47;19311:131;19437:4;19311:131;:::i;:::-;19303:139;;19030:419;;;:::o;19455:222::-;19548:4;19586:2;19575:9;19571:18;19563:26;;19599:71;19667:1;19656:9;19652:17;19643:6;19599:71;:::i;:::-;19455:222;;;;:::o;19683:129::-;19717:6;19744:20;;:::i;:::-;19734:30;;19773:33;19801:4;19793:6;19773:33;:::i;:::-;19683:129;;;:::o;19818:75::-;19851:6;19884:2;19878:9;19868:19;;19818:75;:::o;19899:307::-;19960:4;20050:18;20042:6;20039:30;20036:56;;;20072:18;;:::i;:::-;20036:56;20110:29;20132:6;20110:29;:::i;:::-;20102:37;;20194:4;20188;20184:15;20176:23;;19899:307;;;:::o;20212:308::-;20274:4;20364:18;20356:6;20353:30;20350:56;;;20386:18;;:::i;:::-;20350:56;20424:29;20446:6;20424:29;:::i;:::-;20416:37;;20508:4;20502;20498:15;20490:23;;20212:308;;;:::o;20526:98::-;20577:6;20611:5;20605:12;20595:22;;20526:98;;;:::o;20630:99::-;20682:6;20716:5;20710:12;20700:22;;20630:99;;;:::o;20735:168::-;20818:11;20852:6;20847:3;20840:19;20892:4;20887:3;20883:14;20868:29;;20735:168;;;;:::o;20909:169::-;20993:11;21027:6;21022:3;21015:19;21067:4;21062:3;21058:14;21043:29;;20909:169;;;;:::o;21084:148::-;21186:11;21223:3;21208:18;;21084:148;;;;:::o;21238:305::-;21278:3;21297:20;21315:1;21297:20;:::i;:::-;21292:25;;21331:20;21349:1;21331:20;:::i;:::-;21326:25;;21485:1;21417:66;21413:74;21410:1;21407:81;21404:107;;;21491:18;;:::i;:::-;21404:107;21535:1;21532;21528:9;21521:16;;21238:305;;;;:::o;21549:185::-;21589:1;21606:20;21624:1;21606:20;:::i;:::-;21601:25;;21640:20;21658:1;21640:20;:::i;:::-;21635:25;;21679:1;21669:35;;21684:18;;:::i;:::-;21669:35;21726:1;21723;21719:9;21714:14;;21549:185;;;;:::o;21740:348::-;21780:7;21803:20;21821:1;21803:20;:::i;:::-;21798:25;;21837:20;21855:1;21837:20;:::i;:::-;21832:25;;22025:1;21957:66;21953:74;21950:1;21947:81;21942:1;21935:9;21928:17;21924:105;21921:131;;;22032:18;;:::i;:::-;21921:131;22080:1;22077;22073:9;22062:20;;21740:348;;;;:::o;22094:191::-;22134:4;22154:20;22172:1;22154:20;:::i;:::-;22149:25;;22188:20;22206:1;22188:20;:::i;:::-;22183:25;;22227:1;22224;22221:8;22218:34;;;22232:18;;:::i;:::-;22218:34;22277:1;22274;22270:9;22262:17;;22094:191;;;;:::o;22291:96::-;22328:7;22357:24;22375:5;22357:24;:::i;:::-;22346:35;;22291:96;;;:::o;22393:90::-;22427:7;22470:5;22463:13;22456:21;22445:32;;22393:90;;;:::o;22489:149::-;22525:7;22565:66;22558:5;22554:78;22543:89;;22489:149;;;:::o;22644:126::-;22681:7;22721:42;22714:5;22710:54;22699:65;;22644:126;;;:::o;22776:77::-;22813:7;22842:5;22831:16;;22776:77;;;:::o;22859:154::-;22943:6;22938:3;22933;22920:30;23005:1;22996:6;22991:3;22987:16;22980:27;22859:154;;;:::o;23019:307::-;23087:1;23097:113;23111:6;23108:1;23105:13;23097:113;;;23196:1;23191:3;23187:11;23181:18;23177:1;23172:3;23168:11;23161:39;23133:2;23130:1;23126:10;23121:15;;23097:113;;;23228:6;23225:1;23222:13;23219:101;;;23308:1;23299:6;23294:3;23290:16;23283:27;23219:101;23068:258;23019:307;;;:::o;23332:320::-;23376:6;23413:1;23407:4;23403:12;23393:22;;23460:1;23454:4;23450:12;23481:18;23471:81;;23537:4;23529:6;23525:17;23515:27;;23471:81;23599:2;23591:6;23588:14;23568:18;23565:38;23562:84;;;23618:18;;:::i;:::-;23562:84;23383:269;23332:320;;;:::o;23658:281::-;23741:27;23763:4;23741:27;:::i;:::-;23733:6;23729:40;23871:6;23859:10;23856:22;23835:18;23823:10;23820:34;23817:62;23814:88;;;23882:18;;:::i;:::-;23814:88;23922:10;23918:2;23911:22;23701:238;23658:281;;:::o;23945:233::-;23984:3;24007:24;24025:5;24007:24;:::i;:::-;23998:33;;24053:66;24046:5;24043:77;24040:103;;;24123:18;;:::i;:::-;24040:103;24170:1;24163:5;24159:13;24152:20;;23945:233;;;:::o;24184:176::-;24216:1;24233:20;24251:1;24233:20;:::i;:::-;24228:25;;24267:20;24285:1;24267:20;:::i;:::-;24262:25;;24306:1;24296:35;;24311:18;;:::i;:::-;24296:35;24352:1;24349;24345:9;24340:14;;24184:176;;;;:::o;24366:180::-;24414:77;24411:1;24404:88;24511:4;24508:1;24501:15;24535:4;24532:1;24525:15;24552:180;24600:77;24597:1;24590:88;24697:4;24694:1;24687:15;24721:4;24718:1;24711:15;24738:180;24786:77;24783:1;24776:88;24883:4;24880:1;24873:15;24907:4;24904:1;24897:15;24924:180;24972:77;24969:1;24962:88;25069:4;25066:1;25059:15;25093:4;25090:1;25083:15;25110:180;25158:77;25155:1;25148:88;25255:4;25252:1;25245:15;25279:4;25276:1;25269:15;25296:117;25405:1;25402;25395:12;25419:117;25528:1;25525;25518:12;25542:117;25651:1;25648;25641:12;25665:117;25774:1;25771;25764:12;25788:117;25897:1;25894;25887:12;25911:117;26020:1;26017;26010:12;26034:102;26075:6;26126:2;26122:7;26117:2;26110:5;26106:14;26102:28;26092:38;;26034:102;;;:::o;26142:225::-;26282:34;26278:1;26270:6;26266:14;26259:58;26351:8;26346:2;26338:6;26334:15;26327:33;26142:225;:::o;26373:170::-;26513:22;26509:1;26501:6;26497:14;26490:46;26373:170;:::o;26549:155::-;26689:7;26685:1;26677:6;26673:14;26666:31;26549:155;:::o;26710:182::-;26850:34;26846:1;26838:6;26834:14;26827:58;26710:182;:::o;26898:173::-;27038:25;27034:1;27026:6;27022:14;27015:49;26898:173;:::o;27077:170::-;27217:22;27213:1;27205:6;27201:14;27194:46;27077:170;:::o;27253:181::-;27393:33;27389:1;27381:6;27377:14;27370:57;27253:181;:::o;27440:169::-;27580:21;27576:1;27568:6;27564:14;27557:45;27440:169;:::o;27615:::-;27755:21;27751:1;27743:6;27739:14;27732:45;27615:169;:::o;27790:122::-;27863:24;27881:5;27863:24;:::i;:::-;27856:5;27853:35;27843:63;;27902:1;27899;27892:12;27843:63;27790:122;:::o;27918:116::-;27988:21;28003:5;27988:21;:::i;:::-;27981:5;27978:32;27968:60;;28024:1;28021;28014:12;27968:60;27918:116;:::o;28040:120::-;28112:23;28129:5;28112:23;:::i;:::-;28105:5;28102:34;28092:62;;28150:1;28147;28140:12;28092:62;28040:120;:::o;28166:122::-;28239:24;28257:5;28239:24;:::i;:::-;28232:5;28229:35;28219:63;;28278:1;28275;28268:12;28219:63;28166:122;:::o

Swarm Source

ipfs://89b692cb9d7b6f267cf8565d72cbd31647a723fee9a214f770c8abbc1da3c72a
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.