ETH Price: $3,448.15 (+4.13%)

Token

Mission 2 Mars NFT (M2M)
 

Overview

Max Total Supply

4,898 M2M

Holders

98

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 M2M
0x48e7344ecf7d1f9c4d5141f3f6b18910d3bc1410
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:
Mission2MarsNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.2.3
// 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();

    /**
     * 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 payable;

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

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

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

    /**
     * @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.3
// 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 {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    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 payable 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 {
        _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].value`.
        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 payable 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 payable 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 payable 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.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            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`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                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 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // 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: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

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


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

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _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) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _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/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: Mission2Mars.sol

//SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.4;





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

    // The next token ID to be minted.
    string _baseTokenURI;
    uint256 public _price = 0.1 ether;

    // _paused is used to pause the contract in case of an emergency
    bool public _paused;
    uint256 public maxSupply = 10000;

    constructor(string memory baseURI) ERC721A("Mission 2 Mars NFT", "M2M") {
        _baseTokenURI = baseURI;
    }

    //Returns starting tokenId
    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    /**
     * @dev setPaused makes the contract paused or unpaused
     */
    function setPaused(bool val) external onlyOwner {
        _paused = val;
    }

    /**
     * @dev change cost
     */
    function setCost(uint256 _cost) external onlyOwner {
        _price = _cost;
    }

    /**
     * @dev _baseURI overides the Openzeppelin's ERC721 implementation which by default
     * returned an empty string for the baseURI
     */
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    function setBaseURI(string memory _uri) external onlyOwner {
        _baseTokenURI = _uri;
    }

    /**
     * @dev mint allows an user to mint max of 5 NFT.
     */
    function mint(uint256 quantity) external payable {
        uint256 supply = totalSupply();
        require(!_paused, "Contract currently paused");
        require(supply + quantity <= maxSupply, "Exceed maximum supply");
        require(msg.value == _price * quantity, "Ether sent is not correct");
        require(quantity <= 5, "Exceed max mintable amount");

        _mint(msg.sender, quantity);
    }

    function reserveNFTs(uint256 _amount) external onlyOwner {
        require(totalSupply() + _amount <= maxSupply, "Max supply reached");
        _mint(msg.sender, _amount);
    }

    /**
     * @dev Get token URI
     * @param tokenId ID of the token to retrieve
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(tokenId), "URI query for nonexistent token");

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

    function withdraw() public onlyOwner {
        // address _owner = nftowner;
        uint256 amount = address(this).balance;
        (bool sent, ) = payable(owner()).call{value: amount}("");
        require(sent, "Failed to send Ether");
    }

    function withdrawERC20(address _erc20Address) public onlyOwner {
        IERC20 token = IERC20(_erc20Address);
        uint256 balance = token.balanceOf(address(this));
        // Send the specified amount of the ERC20 token to the contract owner
        token.transfer(msg.sender, balance);
    }

    //aidrop users with NFTs
    function airdrop(address[] memory _users, uint256[] memory _amounts)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < _users.length; i++) {
            _mint(_users[i], _amounts[i]);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","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":"_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"reserveNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","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":"_uri","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":"bool","name":"val","type":"bool"}],"name":"setPaused","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20Address","type":"address"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405267016345785d8a0000600a55612710600c553480156200002357600080fd5b506040516200369638038062003696833981810160405281019062000049919062000342565b6040518060400160405280601281526020017f4d697373696f6e2032204d617273204e465400000000000000000000000000008152506040518060400160405280600381526020017f4d324d0000000000000000000000000000000000000000000000000000000000815250620000d5620000c96200013f60201b60201c565b6200014760201b60201c565b8160039080519060200190620000ed92919062000214565b5080600490805190602001906200010692919062000214565b50620001176200020b60201b60201c565b600181905550505080600990805190602001906200013792919062000214565b505062000517565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b828054620002229062000428565b90600052602060002090601f01602090048101928262000246576000855562000292565b82601f106200026157805160ff191683800117855562000292565b8280016001018555821562000292579182015b828111156200029157825182559160200191906001019062000274565b5b509050620002a19190620002a5565b5090565b5b80821115620002c0576000816000905550600101620002a6565b5090565b6000620002db620002d584620003bc565b62000393565b905082815260208101848484011115620002fa57620002f9620004f7565b5b62000307848285620003f2565b509392505050565b600082601f830112620003275762000326620004f2565b5b815162000339848260208601620002c4565b91505092915050565b6000602082840312156200035b576200035a62000501565b5b600082015167ffffffffffffffff8111156200037c576200037b620004fc565b5b6200038a848285016200030f565b91505092915050565b60006200039f620003b2565b9050620003ad82826200045e565b919050565b6000604051905090565b600067ffffffffffffffff821115620003da57620003d9620004c3565b5b620003e58262000506565b9050602081019050919050565b60005b8381101562000412578082015181840152602081019050620003f5565b8381111562000422576000848401525b50505050565b600060028204905060018216806200044157607f821691505b6020821081141562000458576200045762000494565b5b50919050565b620004698262000506565b810181811067ffffffffffffffff821117156200048b576200048a620004c3565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61316f80620005276000396000f3fe6080604052600436106101b75760003560e01c806367243482116100ec578063b88d4fde1161008a578063d5abeb0111610064578063d5abeb011461059f578063e985e9c5146105ca578063f2fde38b14610607578063f4f3b20014610630576101b7565b8063b88d4fde1461051d578063bc7df09114610539578063c87b56dd14610562576101b7565b80638da5cb5b116100c65780638da5cb5b1461048257806395d89b41146104ad578063a0712d68146104d8578063a22cb465146104f4576101b7565b8063672434821461040557806370a082311461042e578063715018a61461046b576101b7565b8063235b6ea11161015957806342842e0e1161013357806342842e0e1461035a57806344a0d68a1461037657806355f804b31461039f5780636352211e146103c8576101b7565b8063235b6ea1146102fc57806323b872dd146103275780633ccfd60b14610343576101b7565b8063095ea7b311610195578063095ea7b31461026157806316c38b3c1461027d57806316c61ccc146102a657806318160ddd146102d1576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de919061252c565b610659565b6040516101f0919061294e565b60405180910390f35b34801561020557600080fd5b5061020e6106eb565b60405161021b9190612969565b60405180910390f35b34801561023057600080fd5b5061024b600480360381019061024691906125cf565b61077d565b60405161025891906128be565b60405180910390f35b61027b6004803603810190610276919061241a565b6107fc565b005b34801561028957600080fd5b506102a4600480360381019061029f91906124d2565b610940565b005b3480156102b257600080fd5b506102bb610965565b6040516102c8919061294e565b60405180910390f35b3480156102dd57600080fd5b506102e6610978565b6040516102f39190612aab565b60405180910390f35b34801561030857600080fd5b5061031161098f565b60405161031e9190612aab565b60405180910390f35b610341600480360381019061033c9190612304565b610995565b005b34801561034f57600080fd5b50610358610cba565b005b610374600480360381019061036f9190612304565b610d7e565b005b34801561038257600080fd5b5061039d600480360381019061039891906125cf565b610d9e565b005b3480156103ab57600080fd5b506103c660048036038101906103c19190612586565b610db0565b005b3480156103d457600080fd5b506103ef60048036038101906103ea91906125cf565b610dd2565b6040516103fc91906128be565b60405180910390f35b34801561041157600080fd5b5061042c6004803603810190610427919061245a565b610de4565b005b34801561043a57600080fd5b5061045560048036038101906104509190612297565b610e4e565b6040516104629190612aab565b60405180910390f35b34801561047757600080fd5b50610480610f07565b005b34801561048e57600080fd5b50610497610f1b565b6040516104a491906128be565b60405180910390f35b3480156104b957600080fd5b506104c2610f44565b6040516104cf9190612969565b60405180910390f35b6104f260048036038101906104ed91906125cf565b610fd6565b005b34801561050057600080fd5b5061051b600480360381019061051691906123da565b611123565b005b61053760048036038101906105329190612357565b61122e565b005b34801561054557600080fd5b50610560600480360381019061055b91906125cf565b6112a1565b005b34801561056e57600080fd5b50610589600480360381019061058491906125cf565b61130d565b6040516105969190612969565b60405180910390f35b3480156105ab57600080fd5b506105b46113b4565b6040516105c19190612aab565b60405180910390f35b3480156105d657600080fd5b506105f160048036038101906105ec91906122c4565b6113ba565b6040516105fe919061294e565b60405180910390f35b34801561061357600080fd5b5061062e60048036038101906106299190612297565b61144e565b005b34801561063c57600080fd5b5061065760048036038101906106529190612297565b6114d2565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106e45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546106fa90612d59565b80601f016020809104026020016040519081016040528092919081815260200182805461072690612d59565b80156107735780601f1061074857610100808354040283529160200191610773565b820191906000526020600020905b81548152906001019060200180831161075657829003601f168201915b5050505050905090565b6000610788826115ff565b6107be576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080782610dd2565b90508073ffffffffffffffffffffffffffffffffffffffff1661082861165e565b73ffffffffffffffffffffffffffffffffffffffff161461088b576108548161084f61165e565b6113ba565b61088a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610948611666565b80600b60006101000a81548160ff02191690831515021790555050565b600b60009054906101000a900460ff1681565b60006109826116e4565b6002546001540303905090565b600a5481565b60006109a0826116ed565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a07576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a13846117bb565b91509150610a298187610a2461165e565b6117e2565b610a7557610a3e86610a3961165e565b6113ba565b610a74576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610adc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ae98686866001611826565b8015610af457600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610bc285610b9e88888761182c565b7c020000000000000000000000000000000000000000000000000000000017611854565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610c4a576000600185019050600060056000838152602001908152602001600020541415610c48576001548114610c47578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610cb2868686600161187f565b505050505050565b610cc2611666565b60004790506000610cd1610f1b565b73ffffffffffffffffffffffffffffffffffffffff1682604051610cf4906128a9565b60006040518083038185875af1925050503d8060008114610d31576040519150601f19603f3d011682016040523d82523d6000602084013e610d36565b606091505b5050905080610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d71906129cb565b60405180910390fd5b5050565b610d998383836040518060200160405280600081525061122e565b505050565b610da6611666565b80600a8190555050565b610db8611666565b8060099080519060200190610dce929190611f45565b5050565b6000610ddd826116ed565b9050919050565b610dec611666565b60005b8251811015610e4957610e36838281518110610e0e57610e0d612e92565b5b6020026020010151838381518110610e2957610e28612e92565b5b6020026020010151611885565b8080610e4190612dbc565b915050610def565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eb6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610f0f611666565b610f196000611a43565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610f5390612d59565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7f90612d59565b8015610fcc5780601f10610fa157610100808354040283529160200191610fcc565b820191906000526020600020905b815481529060010190602001808311610faf57829003601f168201915b5050505050905090565b6000610fe0610978565b9050600b60009054906101000a900460ff1615611032576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102990612a2b565b60405180910390fd5b600c5482826110419190612bf3565b1115611082576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611079906129eb565b60405180910390fd5b81600a546110909190612c49565b34146110d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c890612a4b565b60405180910390fd5b6005821115611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110c90612a8b565b60405180910390fd5b61111f3383611885565b5050565b806008600061113061165e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111dd61165e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611222919061294e565b60405180910390a35050565b611239848484610995565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461129b5761126484848484611b07565b61129a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6112a9611666565b600c54816112b5610978565b6112bf9190612bf3565b1115611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f790612a6b565b60405180910390fd5b61130a3382611885565b50565b6060611318826115ff565b611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134e9061298b565b60405180910390fd5b6000611361611c67565b9050600081511161138157604051806020016040528060008152506113ac565b8061138b84611cf9565b60405160200161139c92919061287a565b6040516020818303038152906040525b915050919050565b600c5481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611456611666565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd906129ab565b60405180910390fd5b6114cf81611a43565b50565b6114da611666565b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161151a91906128be565b60206040518083038186803b15801561153257600080fd5b505afa158015611546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156a91906125fc565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016115a7929190612925565b602060405180830381600087803b1580156115c157600080fd5b505af11580156115d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f991906124ff565b50505050565b60008161160a6116e4565b11158015611619575060015482105b8015611657575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b61166e611dd1565b73ffffffffffffffffffffffffffffffffffffffff1661168c610f1b565b73ffffffffffffffffffffffffffffffffffffffff16146116e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d990612a0b565b60405180910390fd5b565b60006001905090565b600080829050806116fc6116e4565b11611784576001548110156117835760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611781575b600081141561177757600560008360019003935083815260200190815260200160002054905061174c565b80925050506117b6565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611843868684611dd9565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600154905060008214156118c7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118d46000848385611826565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061194b8361193c600086600061182c565b61194585611de2565b17611854565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146119ec57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506119b1565b506000821415611a28576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050611a3e600084838561187f565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b2d61165e565b8786866040518563ffffffff1660e01b8152600401611b4f94939291906128d9565b602060405180830381600087803b158015611b6957600080fd5b505af1925050508015611b9a57506040513d601f19601f82011682018060405250810190611b979190612559565b60015b611c14573d8060008114611bca576040519150601f19603f3d011682016040523d82523d6000602084013e611bcf565b606091505b50600081511415611c0c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611c7690612d59565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca290612d59565b8015611cef5780601f10611cc457610100808354040283529160200191611cef565b820191906000526020600020905b815481529060010190602001808311611cd257829003601f168201915b5050505050905090565b606060006001611d0884611df2565b01905060008167ffffffffffffffff811115611d2757611d26612ec1565b5b6040519080825280601f01601f191660200182016040528015611d595781602001600182028036833780820191505090505b509050600082602001820190505b600115611dc6578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611db057611daf612e34565b5b0494506000851415611dc157611dc6565b611d67565b819350505050919050565b600033905090565b60009392505050565b60006001821460e11b9050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611e50577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611e4657611e45612e34565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611e8d576d04ee2d6d415b85acef81000000008381611e8357611e82612e34565b5b0492506020810190505b662386f26fc100008310611ebc57662386f26fc100008381611eb257611eb1612e34565b5b0492506010810190505b6305f5e1008310611ee5576305f5e1008381611edb57611eda612e34565b5b0492506008810190505b6127108310611f0a576127108381611f0057611eff612e34565b5b0492506004810190505b60648310611f2d5760648381611f2357611f22612e34565b5b0492506002810190505b600a8310611f3c576001810190505b80915050919050565b828054611f5190612d59565b90600052602060002090601f016020900481019282611f735760008555611fba565b82601f10611f8c57805160ff1916838001178555611fba565b82800160010185558215611fba579182015b82811115611fb9578251825591602001919060010190611f9e565b5b509050611fc79190611fcb565b5090565b5b80821115611fe4576000816000905550600101611fcc565b5090565b6000611ffb611ff684612aeb565b612ac6565b9050808382526020820190508285602086028201111561201e5761201d612ef5565b5b60005b8581101561204e5781612034888261214c565b845260208401935060208301925050600181019050612021565b5050509392505050565b600061206b61206684612b17565b612ac6565b9050808382526020820190508285602086028201111561208e5761208d612ef5565b5b60005b858110156120be57816120a4888261226d565b845260208401935060208301925050600181019050612091565b5050509392505050565b60006120db6120d684612b43565b612ac6565b9050828152602081018484840111156120f7576120f6612efa565b5b612102848285612d17565b509392505050565b600061211d61211884612b74565b612ac6565b90508281526020810184848401111561213957612138612efa565b5b612144848285612d17565b509392505050565b60008135905061215b816130dd565b92915050565b600082601f83011261217657612175612ef0565b5b8135612186848260208601611fe8565b91505092915050565b600082601f8301126121a4576121a3612ef0565b5b81356121b4848260208601612058565b91505092915050565b6000813590506121cc816130f4565b92915050565b6000815190506121e1816130f4565b92915050565b6000813590506121f68161310b565b92915050565b60008151905061220b8161310b565b92915050565b600082601f83011261222657612225612ef0565b5b81356122368482602086016120c8565b91505092915050565b600082601f83011261225457612253612ef0565b5b813561226484826020860161210a565b91505092915050565b60008135905061227c81613122565b92915050565b60008151905061229181613122565b92915050565b6000602082840312156122ad576122ac612f04565b5b60006122bb8482850161214c565b91505092915050565b600080604083850312156122db576122da612f04565b5b60006122e98582860161214c565b92505060206122fa8582860161214c565b9150509250929050565b60008060006060848603121561231d5761231c612f04565b5b600061232b8682870161214c565b935050602061233c8682870161214c565b925050604061234d8682870161226d565b9150509250925092565b6000806000806080858703121561237157612370612f04565b5b600061237f8782880161214c565b94505060206123908782880161214c565b93505060406123a18782880161226d565b925050606085013567ffffffffffffffff8111156123c2576123c1612eff565b5b6123ce87828801612211565b91505092959194509250565b600080604083850312156123f1576123f0612f04565b5b60006123ff8582860161214c565b9250506020612410858286016121bd565b9150509250929050565b6000806040838503121561243157612430612f04565b5b600061243f8582860161214c565b92505060206124508582860161226d565b9150509250929050565b6000806040838503121561247157612470612f04565b5b600083013567ffffffffffffffff81111561248f5761248e612eff565b5b61249b85828601612161565b925050602083013567ffffffffffffffff8111156124bc576124bb612eff565b5b6124c88582860161218f565b9150509250929050565b6000602082840312156124e8576124e7612f04565b5b60006124f6848285016121bd565b91505092915050565b60006020828403121561251557612514612f04565b5b6000612523848285016121d2565b91505092915050565b60006020828403121561254257612541612f04565b5b6000612550848285016121e7565b91505092915050565b60006020828403121561256f5761256e612f04565b5b600061257d848285016121fc565b91505092915050565b60006020828403121561259c5761259b612f04565b5b600082013567ffffffffffffffff8111156125ba576125b9612eff565b5b6125c68482850161223f565b91505092915050565b6000602082840312156125e5576125e4612f04565b5b60006125f38482850161226d565b91505092915050565b60006020828403121561261257612611612f04565b5b600061262084828501612282565b91505092915050565b61263281612ca3565b82525050565b61264181612cb5565b82525050565b600061265282612ba5565b61265c8185612bbb565b935061266c818560208601612d26565b61267581612f09565b840191505092915050565b600061268b82612bb0565b6126958185612bd7565b93506126a5818560208601612d26565b6126ae81612f09565b840191505092915050565b60006126c482612bb0565b6126ce8185612be8565b93506126de818560208601612d26565b80840191505092915050565b60006126f7601f83612bd7565b915061270282612f1a565b602082019050919050565b600061271a602683612bd7565b915061272582612f43565b604082019050919050565b600061273d601483612bd7565b915061274882612f92565b602082019050919050565b6000612760601583612bd7565b915061276b82612fbb565b602082019050919050565b6000612783600583612be8565b915061278e82612fe4565b600582019050919050565b60006127a6602083612bd7565b91506127b18261300d565b602082019050919050565b60006127c9601983612bd7565b91506127d482613036565b602082019050919050565b60006127ec601983612bd7565b91506127f78261305f565b602082019050919050565b600061280f600083612bcc565b915061281a82613088565b600082019050919050565b6000612832601283612bd7565b915061283d8261308b565b602082019050919050565b6000612855601a83612bd7565b9150612860826130b4565b602082019050919050565b61287481612d0d565b82525050565b600061288682856126b9565b915061289282846126b9565b915061289d82612776565b91508190509392505050565b60006128b482612802565b9150819050919050565b60006020820190506128d36000830184612629565b92915050565b60006080820190506128ee6000830187612629565b6128fb6020830186612629565b612908604083018561286b565b818103606083015261291a8184612647565b905095945050505050565b600060408201905061293a6000830185612629565b612947602083018461286b565b9392505050565b60006020820190506129636000830184612638565b92915050565b600060208201905081810360008301526129838184612680565b905092915050565b600060208201905081810360008301526129a4816126ea565b9050919050565b600060208201905081810360008301526129c48161270d565b9050919050565b600060208201905081810360008301526129e481612730565b9050919050565b60006020820190508181036000830152612a0481612753565b9050919050565b60006020820190508181036000830152612a2481612799565b9050919050565b60006020820190508181036000830152612a44816127bc565b9050919050565b60006020820190508181036000830152612a64816127df565b9050919050565b60006020820190508181036000830152612a8481612825565b9050919050565b60006020820190508181036000830152612aa481612848565b9050919050565b6000602082019050612ac0600083018461286b565b92915050565b6000612ad0612ae1565b9050612adc8282612d8b565b919050565b6000604051905090565b600067ffffffffffffffff821115612b0657612b05612ec1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612b3257612b31612ec1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612b5e57612b5d612ec1565b5b612b6782612f09565b9050602081019050919050565b600067ffffffffffffffff821115612b8f57612b8e612ec1565b5b612b9882612f09565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612bfe82612d0d565b9150612c0983612d0d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c3e57612c3d612e05565b5b828201905092915050565b6000612c5482612d0d565b9150612c5f83612d0d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c9857612c97612e05565b5b828202905092915050565b6000612cae82612ced565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612d44578082015181840152602081019050612d29565b83811115612d53576000848401525b50505050565b60006002820490506001821680612d7157607f821691505b60208210811415612d8557612d84612e63565b5b50919050565b612d9482612f09565b810181811067ffffffffffffffff82111715612db357612db2612ec1565b5b80604052505050565b6000612dc782612d0d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612dfa57612df9612e05565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f457863656564206d6178696d756d20737570706c790000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e74726163742063757272656e746c792070617573656400000000000000600082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b50565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b7f457863656564206d6178206d696e7461626c6520616d6f756e74000000000000600082015250565b6130e681612ca3565b81146130f157600080fd5b50565b6130fd81612cb5565b811461310857600080fd5b50565b61311481612cc1565b811461311f57600080fd5b50565b61312b81612d0d565b811461313657600080fd5b5056fea264697066735822122071852213b87e05d543fde7324b4379dbfc4cc131d717d8e12c1a106673d23c1964736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101b75760003560e01c806367243482116100ec578063b88d4fde1161008a578063d5abeb0111610064578063d5abeb011461059f578063e985e9c5146105ca578063f2fde38b14610607578063f4f3b20014610630576101b7565b8063b88d4fde1461051d578063bc7df09114610539578063c87b56dd14610562576101b7565b80638da5cb5b116100c65780638da5cb5b1461048257806395d89b41146104ad578063a0712d68146104d8578063a22cb465146104f4576101b7565b8063672434821461040557806370a082311461042e578063715018a61461046b576101b7565b8063235b6ea11161015957806342842e0e1161013357806342842e0e1461035a57806344a0d68a1461037657806355f804b31461039f5780636352211e146103c8576101b7565b8063235b6ea1146102fc57806323b872dd146103275780633ccfd60b14610343576101b7565b8063095ea7b311610195578063095ea7b31461026157806316c38b3c1461027d57806316c61ccc146102a657806318160ddd146102d1576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de919061252c565b610659565b6040516101f0919061294e565b60405180910390f35b34801561020557600080fd5b5061020e6106eb565b60405161021b9190612969565b60405180910390f35b34801561023057600080fd5b5061024b600480360381019061024691906125cf565b61077d565b60405161025891906128be565b60405180910390f35b61027b6004803603810190610276919061241a565b6107fc565b005b34801561028957600080fd5b506102a4600480360381019061029f91906124d2565b610940565b005b3480156102b257600080fd5b506102bb610965565b6040516102c8919061294e565b60405180910390f35b3480156102dd57600080fd5b506102e6610978565b6040516102f39190612aab565b60405180910390f35b34801561030857600080fd5b5061031161098f565b60405161031e9190612aab565b60405180910390f35b610341600480360381019061033c9190612304565b610995565b005b34801561034f57600080fd5b50610358610cba565b005b610374600480360381019061036f9190612304565b610d7e565b005b34801561038257600080fd5b5061039d600480360381019061039891906125cf565b610d9e565b005b3480156103ab57600080fd5b506103c660048036038101906103c19190612586565b610db0565b005b3480156103d457600080fd5b506103ef60048036038101906103ea91906125cf565b610dd2565b6040516103fc91906128be565b60405180910390f35b34801561041157600080fd5b5061042c6004803603810190610427919061245a565b610de4565b005b34801561043a57600080fd5b5061045560048036038101906104509190612297565b610e4e565b6040516104629190612aab565b60405180910390f35b34801561047757600080fd5b50610480610f07565b005b34801561048e57600080fd5b50610497610f1b565b6040516104a491906128be565b60405180910390f35b3480156104b957600080fd5b506104c2610f44565b6040516104cf9190612969565b60405180910390f35b6104f260048036038101906104ed91906125cf565b610fd6565b005b34801561050057600080fd5b5061051b600480360381019061051691906123da565b611123565b005b61053760048036038101906105329190612357565b61122e565b005b34801561054557600080fd5b50610560600480360381019061055b91906125cf565b6112a1565b005b34801561056e57600080fd5b50610589600480360381019061058491906125cf565b61130d565b6040516105969190612969565b60405180910390f35b3480156105ab57600080fd5b506105b46113b4565b6040516105c19190612aab565b60405180910390f35b3480156105d657600080fd5b506105f160048036038101906105ec91906122c4565b6113ba565b6040516105fe919061294e565b60405180910390f35b34801561061357600080fd5b5061062e60048036038101906106299190612297565b61144e565b005b34801561063c57600080fd5b5061065760048036038101906106529190612297565b6114d2565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106e45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546106fa90612d59565b80601f016020809104026020016040519081016040528092919081815260200182805461072690612d59565b80156107735780601f1061074857610100808354040283529160200191610773565b820191906000526020600020905b81548152906001019060200180831161075657829003601f168201915b5050505050905090565b6000610788826115ff565b6107be576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080782610dd2565b90508073ffffffffffffffffffffffffffffffffffffffff1661082861165e565b73ffffffffffffffffffffffffffffffffffffffff161461088b576108548161084f61165e565b6113ba565b61088a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610948611666565b80600b60006101000a81548160ff02191690831515021790555050565b600b60009054906101000a900460ff1681565b60006109826116e4565b6002546001540303905090565b600a5481565b60006109a0826116ed565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a07576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a13846117bb565b91509150610a298187610a2461165e565b6117e2565b610a7557610a3e86610a3961165e565b6113ba565b610a74576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610adc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ae98686866001611826565b8015610af457600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610bc285610b9e88888761182c565b7c020000000000000000000000000000000000000000000000000000000017611854565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610c4a576000600185019050600060056000838152602001908152602001600020541415610c48576001548114610c47578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610cb2868686600161187f565b505050505050565b610cc2611666565b60004790506000610cd1610f1b565b73ffffffffffffffffffffffffffffffffffffffff1682604051610cf4906128a9565b60006040518083038185875af1925050503d8060008114610d31576040519150601f19603f3d011682016040523d82523d6000602084013e610d36565b606091505b5050905080610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d71906129cb565b60405180910390fd5b5050565b610d998383836040518060200160405280600081525061122e565b505050565b610da6611666565b80600a8190555050565b610db8611666565b8060099080519060200190610dce929190611f45565b5050565b6000610ddd826116ed565b9050919050565b610dec611666565b60005b8251811015610e4957610e36838281518110610e0e57610e0d612e92565b5b6020026020010151838381518110610e2957610e28612e92565b5b6020026020010151611885565b8080610e4190612dbc565b915050610def565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eb6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610f0f611666565b610f196000611a43565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610f5390612d59565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7f90612d59565b8015610fcc5780601f10610fa157610100808354040283529160200191610fcc565b820191906000526020600020905b815481529060010190602001808311610faf57829003601f168201915b5050505050905090565b6000610fe0610978565b9050600b60009054906101000a900460ff1615611032576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102990612a2b565b60405180910390fd5b600c5482826110419190612bf3565b1115611082576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611079906129eb565b60405180910390fd5b81600a546110909190612c49565b34146110d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c890612a4b565b60405180910390fd5b6005821115611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110c90612a8b565b60405180910390fd5b61111f3383611885565b5050565b806008600061113061165e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111dd61165e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611222919061294e565b60405180910390a35050565b611239848484610995565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461129b5761126484848484611b07565b61129a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6112a9611666565b600c54816112b5610978565b6112bf9190612bf3565b1115611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f790612a6b565b60405180910390fd5b61130a3382611885565b50565b6060611318826115ff565b611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134e9061298b565b60405180910390fd5b6000611361611c67565b9050600081511161138157604051806020016040528060008152506113ac565b8061138b84611cf9565b60405160200161139c92919061287a565b6040516020818303038152906040525b915050919050565b600c5481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611456611666565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd906129ab565b60405180910390fd5b6114cf81611a43565b50565b6114da611666565b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161151a91906128be565b60206040518083038186803b15801561153257600080fd5b505afa158015611546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156a91906125fc565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016115a7929190612925565b602060405180830381600087803b1580156115c157600080fd5b505af11580156115d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f991906124ff565b50505050565b60008161160a6116e4565b11158015611619575060015482105b8015611657575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b61166e611dd1565b73ffffffffffffffffffffffffffffffffffffffff1661168c610f1b565b73ffffffffffffffffffffffffffffffffffffffff16146116e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d990612a0b565b60405180910390fd5b565b60006001905090565b600080829050806116fc6116e4565b11611784576001548110156117835760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611781575b600081141561177757600560008360019003935083815260200190815260200160002054905061174c565b80925050506117b6565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611843868684611dd9565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600154905060008214156118c7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118d46000848385611826565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061194b8361193c600086600061182c565b61194585611de2565b17611854565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146119ec57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506119b1565b506000821415611a28576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050611a3e600084838561187f565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b2d61165e565b8786866040518563ffffffff1660e01b8152600401611b4f94939291906128d9565b602060405180830381600087803b158015611b6957600080fd5b505af1925050508015611b9a57506040513d601f19601f82011682018060405250810190611b979190612559565b60015b611c14573d8060008114611bca576040519150601f19603f3d011682016040523d82523d6000602084013e611bcf565b606091505b50600081511415611c0c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611c7690612d59565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca290612d59565b8015611cef5780601f10611cc457610100808354040283529160200191611cef565b820191906000526020600020905b815481529060010190602001808311611cd257829003601f168201915b5050505050905090565b606060006001611d0884611df2565b01905060008167ffffffffffffffff811115611d2757611d26612ec1565b5b6040519080825280601f01601f191660200182016040528015611d595781602001600182028036833780820191505090505b509050600082602001820190505b600115611dc6578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611db057611daf612e34565b5b0494506000851415611dc157611dc6565b611d67565b819350505050919050565b600033905090565b60009392505050565b60006001821460e11b9050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611e50577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611e4657611e45612e34565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611e8d576d04ee2d6d415b85acef81000000008381611e8357611e82612e34565b5b0492506020810190505b662386f26fc100008310611ebc57662386f26fc100008381611eb257611eb1612e34565b5b0492506010810190505b6305f5e1008310611ee5576305f5e1008381611edb57611eda612e34565b5b0492506008810190505b6127108310611f0a576127108381611f0057611eff612e34565b5b0492506004810190505b60648310611f2d5760648381611f2357611f22612e34565b5b0492506002810190505b600a8310611f3c576001810190505b80915050919050565b828054611f5190612d59565b90600052602060002090601f016020900481019282611f735760008555611fba565b82601f10611f8c57805160ff1916838001178555611fba565b82800160010185558215611fba579182015b82811115611fb9578251825591602001919060010190611f9e565b5b509050611fc79190611fcb565b5090565b5b80821115611fe4576000816000905550600101611fcc565b5090565b6000611ffb611ff684612aeb565b612ac6565b9050808382526020820190508285602086028201111561201e5761201d612ef5565b5b60005b8581101561204e5781612034888261214c565b845260208401935060208301925050600181019050612021565b5050509392505050565b600061206b61206684612b17565b612ac6565b9050808382526020820190508285602086028201111561208e5761208d612ef5565b5b60005b858110156120be57816120a4888261226d565b845260208401935060208301925050600181019050612091565b5050509392505050565b60006120db6120d684612b43565b612ac6565b9050828152602081018484840111156120f7576120f6612efa565b5b612102848285612d17565b509392505050565b600061211d61211884612b74565b612ac6565b90508281526020810184848401111561213957612138612efa565b5b612144848285612d17565b509392505050565b60008135905061215b816130dd565b92915050565b600082601f83011261217657612175612ef0565b5b8135612186848260208601611fe8565b91505092915050565b600082601f8301126121a4576121a3612ef0565b5b81356121b4848260208601612058565b91505092915050565b6000813590506121cc816130f4565b92915050565b6000815190506121e1816130f4565b92915050565b6000813590506121f68161310b565b92915050565b60008151905061220b8161310b565b92915050565b600082601f83011261222657612225612ef0565b5b81356122368482602086016120c8565b91505092915050565b600082601f83011261225457612253612ef0565b5b813561226484826020860161210a565b91505092915050565b60008135905061227c81613122565b92915050565b60008151905061229181613122565b92915050565b6000602082840312156122ad576122ac612f04565b5b60006122bb8482850161214c565b91505092915050565b600080604083850312156122db576122da612f04565b5b60006122e98582860161214c565b92505060206122fa8582860161214c565b9150509250929050565b60008060006060848603121561231d5761231c612f04565b5b600061232b8682870161214c565b935050602061233c8682870161214c565b925050604061234d8682870161226d565b9150509250925092565b6000806000806080858703121561237157612370612f04565b5b600061237f8782880161214c565b94505060206123908782880161214c565b93505060406123a18782880161226d565b925050606085013567ffffffffffffffff8111156123c2576123c1612eff565b5b6123ce87828801612211565b91505092959194509250565b600080604083850312156123f1576123f0612f04565b5b60006123ff8582860161214c565b9250506020612410858286016121bd565b9150509250929050565b6000806040838503121561243157612430612f04565b5b600061243f8582860161214c565b92505060206124508582860161226d565b9150509250929050565b6000806040838503121561247157612470612f04565b5b600083013567ffffffffffffffff81111561248f5761248e612eff565b5b61249b85828601612161565b925050602083013567ffffffffffffffff8111156124bc576124bb612eff565b5b6124c88582860161218f565b9150509250929050565b6000602082840312156124e8576124e7612f04565b5b60006124f6848285016121bd565b91505092915050565b60006020828403121561251557612514612f04565b5b6000612523848285016121d2565b91505092915050565b60006020828403121561254257612541612f04565b5b6000612550848285016121e7565b91505092915050565b60006020828403121561256f5761256e612f04565b5b600061257d848285016121fc565b91505092915050565b60006020828403121561259c5761259b612f04565b5b600082013567ffffffffffffffff8111156125ba576125b9612eff565b5b6125c68482850161223f565b91505092915050565b6000602082840312156125e5576125e4612f04565b5b60006125f38482850161226d565b91505092915050565b60006020828403121561261257612611612f04565b5b600061262084828501612282565b91505092915050565b61263281612ca3565b82525050565b61264181612cb5565b82525050565b600061265282612ba5565b61265c8185612bbb565b935061266c818560208601612d26565b61267581612f09565b840191505092915050565b600061268b82612bb0565b6126958185612bd7565b93506126a5818560208601612d26565b6126ae81612f09565b840191505092915050565b60006126c482612bb0565b6126ce8185612be8565b93506126de818560208601612d26565b80840191505092915050565b60006126f7601f83612bd7565b915061270282612f1a565b602082019050919050565b600061271a602683612bd7565b915061272582612f43565b604082019050919050565b600061273d601483612bd7565b915061274882612f92565b602082019050919050565b6000612760601583612bd7565b915061276b82612fbb565b602082019050919050565b6000612783600583612be8565b915061278e82612fe4565b600582019050919050565b60006127a6602083612bd7565b91506127b18261300d565b602082019050919050565b60006127c9601983612bd7565b91506127d482613036565b602082019050919050565b60006127ec601983612bd7565b91506127f78261305f565b602082019050919050565b600061280f600083612bcc565b915061281a82613088565b600082019050919050565b6000612832601283612bd7565b915061283d8261308b565b602082019050919050565b6000612855601a83612bd7565b9150612860826130b4565b602082019050919050565b61287481612d0d565b82525050565b600061288682856126b9565b915061289282846126b9565b915061289d82612776565b91508190509392505050565b60006128b482612802565b9150819050919050565b60006020820190506128d36000830184612629565b92915050565b60006080820190506128ee6000830187612629565b6128fb6020830186612629565b612908604083018561286b565b818103606083015261291a8184612647565b905095945050505050565b600060408201905061293a6000830185612629565b612947602083018461286b565b9392505050565b60006020820190506129636000830184612638565b92915050565b600060208201905081810360008301526129838184612680565b905092915050565b600060208201905081810360008301526129a4816126ea565b9050919050565b600060208201905081810360008301526129c48161270d565b9050919050565b600060208201905081810360008301526129e481612730565b9050919050565b60006020820190508181036000830152612a0481612753565b9050919050565b60006020820190508181036000830152612a2481612799565b9050919050565b60006020820190508181036000830152612a44816127bc565b9050919050565b60006020820190508181036000830152612a64816127df565b9050919050565b60006020820190508181036000830152612a8481612825565b9050919050565b60006020820190508181036000830152612aa481612848565b9050919050565b6000602082019050612ac0600083018461286b565b92915050565b6000612ad0612ae1565b9050612adc8282612d8b565b919050565b6000604051905090565b600067ffffffffffffffff821115612b0657612b05612ec1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612b3257612b31612ec1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612b5e57612b5d612ec1565b5b612b6782612f09565b9050602081019050919050565b600067ffffffffffffffff821115612b8f57612b8e612ec1565b5b612b9882612f09565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612bfe82612d0d565b9150612c0983612d0d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c3e57612c3d612e05565b5b828201905092915050565b6000612c5482612d0d565b9150612c5f83612d0d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c9857612c97612e05565b5b828202905092915050565b6000612cae82612ced565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612d44578082015181840152602081019050612d29565b83811115612d53576000848401525b50505050565b60006002820490506001821680612d7157607f821691505b60208210811415612d8557612d84612e63565b5b50919050565b612d9482612f09565b810181811067ffffffffffffffff82111715612db357612db2612ec1565b5b80604052505050565b6000612dc782612d0d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612dfa57612df9612e05565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f457863656564206d6178696d756d20737570706c790000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e74726163742063757272656e746c792070617573656400000000000000600082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b50565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b7f457863656564206d6178206d696e7461626c6520616d6f756e74000000000000600082015250565b6130e681612ca3565b81146130f157600080fd5b50565b6130fd81612cb5565b811461310857600080fd5b50565b61311481612cc1565b811461311f57600080fd5b50565b61312b81612d0d565b811461313657600080fd5b5056fea264697066735822122071852213b87e05d543fde7324b4379dbfc4cc131d717d8e12c1a106673d23c1964736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

73210:3484:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21283:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22185:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28676:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28109:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73884:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73475:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17936:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73363:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32315:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75866:248;;;;;;;;;;;;;:::i;:::-;;35236:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74015:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74385:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23578:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76462:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19120:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72289:103;;;;;;;;;;;;;:::i;:::-;;71641:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22361:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74564:412;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29234:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36027:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74984:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75268:590;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73501:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29625:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72547:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76122:302;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21283:639;21368:4;21707:10;21692:25;;:11;:25;;;;:102;;;;21784:10;21769:25;;:11;:25;;;;21692:102;:179;;;;21861:10;21846:25;;:11;:25;;;;21692:179;21672:199;;21283:639;;;:::o;22185:100::-;22239:13;22272:5;22265:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22185:100;:::o;28676:218::-;28752:7;28777:16;28785:7;28777;:16::i;:::-;28772:64;;28802:34;;;;;;;;;;;;;;28772:64;28856:15;:24;28872:7;28856:24;;;;;;;;;;;:30;;;;;;;;;;;;28849:37;;28676:218;;;:::o;28109:408::-;28198:13;28214:16;28222:7;28214;:16::i;:::-;28198:32;;28270:5;28247:28;;:19;:17;:19::i;:::-;:28;;;28243:175;;28295:44;28312:5;28319:19;:17;:19::i;:::-;28295:16;:44::i;:::-;28290:128;;28367:35;;;;;;;;;;;;;;28290:128;28243:175;28463:2;28430:15;:24;28446:7;28430:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;28501:7;28497:2;28481:28;;28490:5;28481:28;;;;;;;;;;;;28187:330;28109:408;;:::o;73884:80::-;71527:13;:11;:13::i;:::-;73953:3:::1;73943:7;;:13;;;;;;;;;;;;;;;;;;73884:80:::0;:::o;73475:19::-;;;;;;;;;;;;;:::o;17936:323::-;17997:7;18225:15;:13;:15::i;:::-;18210:12;;18194:13;;:28;:46;18187:53;;17936:323;:::o;73363:33::-;;;;:::o;32315:2825::-;32457:27;32487;32506:7;32487:18;:27::i;:::-;32457:57;;32572:4;32531:45;;32547:19;32531:45;;;32527:86;;32585:28;;;;;;;;;;;;;;32527:86;32627:27;32656:23;32683:35;32710:7;32683:26;:35::i;:::-;32626:92;;;;32818:68;32843:15;32860:4;32866:19;:17;:19::i;:::-;32818:24;:68::i;:::-;32813:180;;32906:43;32923:4;32929:19;:17;:19::i;:::-;32906:16;:43::i;:::-;32901:92;;32958:35;;;;;;;;;;;;;;32901:92;32813:180;33024:1;33010:16;;:2;:16;;;33006:52;;;33035:23;;;;;;;;;;;;;;33006:52;33071:43;33093:4;33099:2;33103:7;33112:1;33071:21;:43::i;:::-;33207:15;33204:160;;;33347:1;33326:19;33319:30;33204:160;33744:18;:24;33763:4;33744:24;;;;;;;;;;;;;;;;33742:26;;;;;;;;;;;;33813:18;:22;33832:2;33813:22;;;;;;;;;;;;;;;;33811:24;;;;;;;;;;;34135:146;34172:2;34221:45;34236:4;34242:2;34246:19;34221:14;:45::i;:::-;14335:8;34193:73;34135:18;:146::i;:::-;34106:17;:26;34124:7;34106:26;;;;;;;;;;;:175;;;;34452:1;14335:8;34401:19;:47;:52;34397:627;;;34474:19;34506:1;34496:7;:11;34474:33;;34663:1;34629:17;:30;34647:11;34629:30;;;;;;;;;;;;:35;34625:384;;;34767:13;;34752:11;:28;34748:242;;34947:19;34914:17;:30;34932:11;34914:30;;;;;;;;;;;:52;;;;34748:242;34625:384;34455:569;34397:627;35071:7;35067:2;35052:27;;35061:4;35052:27;;;;;;;;;;;;35090:42;35111:4;35117:2;35121:7;35130:1;35090:20;:42::i;:::-;32446:2694;;;32315:2825;;;:::o;75866:248::-;71527:13;:11;:13::i;:::-;75953:14:::1;75970:21;75953:38;;76003:9;76026:7;:5;:7::i;:::-;76018:21;;76047:6;76018:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76002:56;;;76077:4;76069:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;75903:211;;75866:248::o:0;35236:193::-;35382:39;35399:4;35405:2;35409:7;35382:39;;;;;;;;;;;;:16;:39::i;:::-;35236:193;;;:::o;74015:84::-;71527:13;:11;:13::i;:::-;74086:5:::1;74077:6;:14;;;;74015:84:::0;:::o;74385:98::-;71527:13;:11;:13::i;:::-;74471:4:::1;74455:13;:20;;;;;;;;;;;;:::i;:::-;;74385:98:::0;:::o;23578:152::-;23650:7;23693:27;23712:7;23693:18;:27::i;:::-;23670:52;;23578:152;;;:::o;76462:229::-;71527:13;:11;:13::i;:::-;76589:9:::1;76584:100;76608:6;:13;76604:1;:17;76584:100;;;76643:29;76649:6;76656:1;76649:9;;;;;;;;:::i;:::-;;;;;;;;76660:8;76669:1;76660:11;;;;;;;;:::i;:::-;;;;;;;;76643:5;:29::i;:::-;76623:3;;;;;:::i;:::-;;;;76584:100;;;;76462:229:::0;;:::o;19120:233::-;19192:7;19233:1;19216:19;;:5;:19;;;19212:60;;;19244:28;;;;;;;;;;;;;;19212:60;13279:13;19290:18;:25;19309:5;19290:25;;;;;;;;;;;;;;;;:55;19283:62;;19120:233;;;:::o;72289:103::-;71527:13;:11;:13::i;:::-;72354:30:::1;72381:1;72354:18;:30::i;:::-;72289:103::o:0;71641:87::-;71687:7;71714:6;;;;;;;;;;;71707:13;;71641:87;:::o;22361:104::-;22417:13;22450:7;22443:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22361:104;:::o;74564:412::-;74624:14;74641:13;:11;:13::i;:::-;74624:30;;74674:7;;;;;;;;;;;74673:8;74665:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;74751:9;;74739:8;74730:6;:17;;;;:::i;:::-;:30;;74722:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;74827:8;74818:6;;:17;;;;:::i;:::-;74805:9;:30;74797:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74896:1;74884:8;:13;;74876:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;74941:27;74947:10;74959:8;74941:5;:27::i;:::-;74613:363;74564:412;:::o;29234:234::-;29381:8;29329:18;:39;29348:19;:17;:19::i;:::-;29329:39;;;;;;;;;;;;;;;:49;29369:8;29329:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;29441:8;29405:55;;29420:19;:17;:19::i;:::-;29405:55;;;29451:8;29405:55;;;;;;:::i;:::-;;;;;;;;29234:234;;:::o;36027:407::-;36202:31;36215:4;36221:2;36225:7;36202:12;:31::i;:::-;36266:1;36248:2;:14;;;:19;36244:183;;36287:56;36318:4;36324:2;36328:7;36337:5;36287:30;:56::i;:::-;36282:145;;36371:40;;;;;;;;;;;;;;36282:145;36244:183;36027:407;;;;:::o;74984:180::-;71527:13;:11;:13::i;:::-;75087:9:::1;;75076:7;75060:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;75052:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;75130:26;75136:10;75148:7;75130:5;:26::i;:::-;74984:180:::0;:::o;75268:590::-;75386:13;75425:16;75433:7;75425;:16::i;:::-;75417:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;75490:28;75521:10;:8;:10::i;:::-;75490:41;;75593:1;75568:14;75562:28;:32;:288;;;;;;;;;;;;;;;;;75686:14;75727:25;75744:7;75727:16;:25::i;:::-;75643:166;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75562:288;75542:308;;;75268:590;;;:::o;73501:32::-;;;;:::o;29625:164::-;29722:4;29746:18;:25;29765:5;29746:25;;;;;;;;;;;;;;;:35;29772:8;29746:35;;;;;;;;;;;;;;;;;;;;;;;;;29739:42;;29625:164;;;;:::o;72547:201::-;71527:13;:11;:13::i;:::-;72656:1:::1;72636:22;;:8;:22;;;;72628:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;72712:28;72731:8;72712:18;:28::i;:::-;72547:201:::0;:::o;76122:302::-;71527:13;:11;:13::i;:::-;76196:12:::1;76218:13;76196:36;;76243:15;76261:5;:15;;;76285:4;76261:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76243:48;;76381:5;:14;;;76396:10;76408:7;76381:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;76185:239;;76122:302:::0;:::o;30047:282::-;30112:4;30168:7;30149:15;:13;:15::i;:::-;:26;;:66;;;;;30202:13;;30192:7;:23;30149:66;:153;;;;;30301:1;14055:8;30253:17;:26;30271:7;30253:26;;;;;;;;;;;;:44;:49;30149:153;30129:173;;30047:282;;;:::o;52355:105::-;52415:7;52442:10;52435:17;;52355:105;:::o;71806:132::-;71881:12;:10;:12::i;:::-;71870:23;;:7;:5;:7::i;:::-;:23;;;71862:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71806:132::o;73696:101::-;73761:7;73788:1;73781:8;;73696:101;:::o;24733:1275::-;24800:7;24820:12;24835:7;24820:22;;24903:4;24884:15;:13;:15::i;:::-;:23;24880:1061;;24937:13;;24930:4;:20;24926:1015;;;24975:14;24992:17;:23;25010:4;24992:23;;;;;;;;;;;;24975:40;;25109:1;14055:8;25081:6;:24;:29;25077:845;;;25746:113;25763:1;25753:6;:11;25746:113;;;25806:17;:25;25824:6;;;;;;;25806:25;;;;;;;;;;;;25797:34;;25746:113;;;25892:6;25885:13;;;;;;25077:845;24952:989;24926:1015;24880:1061;25969:31;;;;;;;;;;;;;;24733:1275;;;;:::o;31210:485::-;31312:27;31341:23;31382:38;31423:15;:24;31439:7;31423:24;;;;;;;;;;;31382:65;;31600:18;31577:41;;31657:19;31651:26;31632:45;;31562:126;31210:485;;;:::o;30438:659::-;30587:11;30752:16;30745:5;30741:28;30732:37;;30912:16;30901:9;30897:32;30884:45;;31062:15;31051:9;31048:30;31040:5;31029:9;31026:20;31023:56;31013:66;;30438:659;;;;;:::o;37096:159::-;;;;;:::o;51664:311::-;51799:7;51819:16;14459:3;51845:19;:41;;51819:68;;14459:3;51913:31;51924:4;51930:2;51934:9;51913:10;:31::i;:::-;51905:40;;:62;;51898:69;;;51664:311;;;;;:::o;26556:450::-;26636:14;26804:16;26797:5;26793:28;26784:37;;26981:5;26967:11;26942:23;26938:41;26935:52;26928:5;26925:63;26915:73;;26556:450;;;;:::o;37920:158::-;;;;;:::o;39696:2966::-;39769:20;39792:13;;39769:36;;39832:1;39820:8;:13;39816:44;;;39842:18;;;;;;;;;;;;;;39816:44;39873:61;39903:1;39907:2;39911:12;39925:8;39873:21;:61::i;:::-;40417:1;13417:2;40387:1;:26;;40386:32;40374:8;:45;40348:18;:22;40367:2;40348:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;40696:139;40733:2;40787:33;40810:1;40814:2;40818:1;40787:14;:33::i;:::-;40754:30;40775:8;40754:20;:30::i;:::-;:66;40696:18;:139::i;:::-;40662:17;:31;40680:12;40662:31;;;;;;;;;;;:173;;;;40852:16;40883:11;40912:8;40897:12;:23;40883:37;;41433:16;41429:2;41425:25;41413:37;;41805:12;41765:8;41724:1;41662:25;41603:1;41542;41515:335;42176:1;42162:12;42158:20;42116:346;42217:3;42208:7;42205:16;42116:346;;42435:7;42425:8;42422:1;42395:25;42392:1;42389;42384:59;42270:1;42261:7;42257:15;42246:26;;42116:346;;;42120:77;42507:1;42495:8;:13;42491:45;;;42517:19;;;;;;;;;;;;;;42491:45;42569:3;42553:13;:19;;;;40122:2462;;42594:60;42623:1;42627:2;42631:12;42645:8;42594:20;:60::i;:::-;39758:2904;39696:2966;;:::o;72908:191::-;72982:16;73001:6;;;;;;;;;;;72982:25;;73027:8;73018:6;;:17;;;;;;;;;;;;;;;;;;73082:8;73051:40;;73072:8;73051:40;;;;;;;;;;;;72971:128;72908:191;:::o;38518:716::-;38681:4;38727:2;38702:45;;;38748:19;:17;:19::i;:::-;38769:4;38775:7;38784:5;38702:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38698:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39002:1;38985:6;:13;:18;38981:235;;;39031:40;;;;;;;;;;;;;;38981:235;39174:6;39168:13;39159:6;39155:2;39151:15;39144:38;38698:529;38871:54;;;38861:64;;;:6;:64;;;;38854:71;;;38518:716;;;;;;:::o;74263:114::-;74323:13;74356;74349:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74263:114;:::o;67619:716::-;67675:13;67726:14;67763:1;67743:17;67754:5;67743:10;:17::i;:::-;:21;67726:38;;67779:20;67813:6;67802:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67779:41;;67835:11;67964:6;67960:2;67956:15;67948:6;67944:28;67937:35;;68001:288;68008:4;68001:288;;;68033:5;;;;;;;;68175:8;68170:2;68163:5;68159:14;68154:30;68149:3;68141:44;68231:2;68222:11;;;;;;:::i;:::-;;;;;68265:1;68256:5;:10;68252:21;;;68268:5;;68252:21;68001:288;;;68310:6;68303:13;;;;;67619:716;;;:::o;70192:98::-;70245:7;70272:10;70265:17;;70192:98;:::o;51365:147::-;51502:6;51365:147;;;;;:::o;27108:324::-;27178:14;27411:1;27401:8;27398:15;27372:24;27368:46;27358:56;;27108:324;;;:::o;64485:922::-;64538:7;64558:14;64575:1;64558:18;;64625:6;64616:5;:15;64612:102;;64661:6;64652:15;;;;;;:::i;:::-;;;;;64696:2;64686:12;;;;64612:102;64741:6;64732:5;:15;64728:102;;64777:6;64768:15;;;;;;:::i;:::-;;;;;64812:2;64802:12;;;;64728:102;64857:6;64848:5;:15;64844:102;;64893:6;64884:15;;;;;;:::i;:::-;;;;;64928:2;64918:12;;;;64844:102;64973:5;64964;:14;64960:99;;65008:5;64999:14;;;;;;:::i;:::-;;;;;65042:1;65032:11;;;;64960:99;65086:5;65077;:14;65073:99;;65121:5;65112:14;;;;;;:::i;:::-;;;;;65155:1;65145:11;;;;65073:99;65199:5;65190;:14;65186:99;;65234:5;65225:14;;;;;;:::i;:::-;;;;;65268:1;65258:11;;;;65186:99;65312:5;65303;:14;65299:66;;65348:1;65338:11;;;;65299:66;65393:6;65386:13;;;64485:922;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3455:5;3486:6;3480:13;3471:22;;3502:30;3526:5;3502:30;:::i;:::-;3401:137;;;;:::o;3544:::-;3589:5;3627:6;3614:20;3605:29;;3643:32;3669:5;3643:32;:::i;:::-;3544:137;;;;:::o;3687:141::-;3743:5;3774:6;3768:13;3759:22;;3790:32;3816:5;3790:32;:::i;:::-;3687:141;;;;:::o;3847:338::-;3902:5;3951:3;3944:4;3936:6;3932:17;3928:27;3918:122;;3959:79;;:::i;:::-;3918:122;4076:6;4063:20;4101:78;4175:3;4167:6;4160:4;4152:6;4148:17;4101:78;:::i;:::-;4092:87;;3908:277;3847:338;;;;:::o;4205:340::-;4261:5;4310:3;4303:4;4295:6;4291:17;4287:27;4277:122;;4318:79;;:::i;:::-;4277:122;4435:6;4422:20;4460:79;4535:3;4527:6;4520:4;4512:6;4508:17;4460:79;:::i;:::-;4451:88;;4267:278;4205:340;;;;:::o;4551:139::-;4597:5;4635:6;4622:20;4613:29;;4651:33;4678:5;4651:33;:::i;:::-;4551:139;;;;:::o;4696:143::-;4753:5;4784:6;4778:13;4769:22;;4800:33;4827:5;4800:33;:::i;:::-;4696:143;;;;:::o;4845:329::-;4904:6;4953:2;4941:9;4932:7;4928:23;4924:32;4921:119;;;4959:79;;:::i;:::-;4921:119;5079:1;5104:53;5149:7;5140:6;5129:9;5125:22;5104:53;:::i;:::-;5094:63;;5050:117;4845:329;;;;:::o;5180:474::-;5248:6;5256;5305:2;5293:9;5284:7;5280:23;5276:32;5273:119;;;5311:79;;:::i;:::-;5273:119;5431:1;5456:53;5501:7;5492:6;5481:9;5477:22;5456:53;:::i;:::-;5446:63;;5402:117;5558:2;5584:53;5629:7;5620:6;5609:9;5605:22;5584:53;:::i;:::-;5574:63;;5529:118;5180:474;;;;;:::o;5660:619::-;5737:6;5745;5753;5802:2;5790:9;5781:7;5777:23;5773:32;5770:119;;;5808:79;;:::i;:::-;5770:119;5928:1;5953:53;5998:7;5989:6;5978:9;5974:22;5953:53;:::i;:::-;5943:63;;5899:117;6055:2;6081:53;6126:7;6117:6;6106:9;6102:22;6081:53;:::i;:::-;6071:63;;6026:118;6183:2;6209:53;6254:7;6245:6;6234:9;6230:22;6209:53;:::i;:::-;6199:63;;6154:118;5660:619;;;;;:::o;6285:943::-;6380:6;6388;6396;6404;6453:3;6441:9;6432:7;6428:23;6424:33;6421:120;;;6460:79;;:::i;:::-;6421:120;6580:1;6605:53;6650:7;6641:6;6630:9;6626:22;6605:53;:::i;:::-;6595:63;;6551:117;6707:2;6733:53;6778:7;6769:6;6758:9;6754:22;6733:53;:::i;:::-;6723:63;;6678:118;6835:2;6861:53;6906:7;6897:6;6886:9;6882:22;6861:53;:::i;:::-;6851:63;;6806:118;6991:2;6980:9;6976:18;6963:32;7022:18;7014:6;7011:30;7008:117;;;7044:79;;:::i;:::-;7008:117;7149:62;7203:7;7194:6;7183:9;7179:22;7149:62;:::i;:::-;7139:72;;6934:287;6285:943;;;;;;;:::o;7234:468::-;7299:6;7307;7356:2;7344:9;7335:7;7331:23;7327:32;7324:119;;;7362:79;;:::i;:::-;7324:119;7482:1;7507:53;7552:7;7543:6;7532:9;7528:22;7507:53;:::i;:::-;7497:63;;7453:117;7609:2;7635:50;7677:7;7668:6;7657:9;7653:22;7635:50;:::i;:::-;7625:60;;7580:115;7234:468;;;;;:::o;7708:474::-;7776:6;7784;7833:2;7821:9;7812:7;7808:23;7804:32;7801:119;;;7839:79;;:::i;:::-;7801:119;7959:1;7984:53;8029:7;8020:6;8009:9;8005:22;7984:53;:::i;:::-;7974:63;;7930:117;8086:2;8112:53;8157:7;8148:6;8137:9;8133:22;8112:53;:::i;:::-;8102:63;;8057:118;7708:474;;;;;:::o;8188:894::-;8306:6;8314;8363:2;8351:9;8342:7;8338:23;8334:32;8331:119;;;8369:79;;:::i;:::-;8331:119;8517:1;8506:9;8502:17;8489:31;8547:18;8539:6;8536:30;8533:117;;;8569:79;;:::i;:::-;8533:117;8674:78;8744:7;8735:6;8724:9;8720:22;8674:78;:::i;:::-;8664:88;;8460:302;8829:2;8818:9;8814:18;8801:32;8860:18;8852:6;8849:30;8846:117;;;8882:79;;:::i;:::-;8846:117;8987:78;9057:7;9048:6;9037:9;9033:22;8987:78;:::i;:::-;8977:88;;8772:303;8188:894;;;;;:::o;9088:323::-;9144:6;9193:2;9181:9;9172:7;9168:23;9164:32;9161:119;;;9199:79;;:::i;:::-;9161:119;9319:1;9344:50;9386:7;9377:6;9366:9;9362:22;9344:50;:::i;:::-;9334:60;;9290:114;9088:323;;;;:::o;9417:345::-;9484:6;9533:2;9521:9;9512:7;9508:23;9504:32;9501:119;;;9539:79;;:::i;:::-;9501:119;9659:1;9684:61;9737:7;9728:6;9717:9;9713:22;9684:61;:::i;:::-;9674:71;;9630:125;9417:345;;;;:::o;9768:327::-;9826:6;9875:2;9863:9;9854:7;9850:23;9846:32;9843:119;;;9881:79;;:::i;:::-;9843:119;10001:1;10026:52;10070:7;10061:6;10050:9;10046:22;10026:52;:::i;:::-;10016:62;;9972:116;9768:327;;;;:::o;10101:349::-;10170:6;10219:2;10207:9;10198:7;10194:23;10190:32;10187:119;;;10225:79;;:::i;:::-;10187:119;10345:1;10370:63;10425:7;10416:6;10405:9;10401:22;10370:63;:::i;:::-;10360:73;;10316:127;10101:349;;;;:::o;10456:509::-;10525:6;10574:2;10562:9;10553:7;10549:23;10545:32;10542:119;;;10580:79;;:::i;:::-;10542:119;10728:1;10717:9;10713:17;10700:31;10758:18;10750:6;10747:30;10744:117;;;10780:79;;:::i;:::-;10744:117;10885:63;10940:7;10931:6;10920:9;10916:22;10885:63;:::i;:::-;10875:73;;10671:287;10456:509;;;;:::o;10971:329::-;11030:6;11079:2;11067:9;11058:7;11054:23;11050:32;11047:119;;;11085:79;;:::i;:::-;11047:119;11205:1;11230:53;11275:7;11266:6;11255:9;11251:22;11230:53;:::i;:::-;11220:63;;11176:117;10971:329;;;;:::o;11306:351::-;11376:6;11425:2;11413:9;11404:7;11400:23;11396:32;11393:119;;;11431:79;;:::i;:::-;11393:119;11551:1;11576:64;11632:7;11623:6;11612:9;11608:22;11576:64;:::i;:::-;11566:74;;11522:128;11306:351;;;;:::o;11663:118::-;11750:24;11768:5;11750:24;:::i;:::-;11745:3;11738:37;11663:118;;:::o;11787:109::-;11868:21;11883:5;11868:21;:::i;:::-;11863:3;11856:34;11787:109;;:::o;11902:360::-;11988:3;12016:38;12048:5;12016:38;:::i;:::-;12070:70;12133:6;12128:3;12070:70;:::i;:::-;12063:77;;12149:52;12194:6;12189:3;12182:4;12175:5;12171:16;12149:52;:::i;:::-;12226:29;12248:6;12226:29;:::i;:::-;12221:3;12217:39;12210:46;;11992:270;11902:360;;;;:::o;12268:364::-;12356:3;12384:39;12417:5;12384:39;:::i;:::-;12439:71;12503:6;12498:3;12439:71;:::i;:::-;12432:78;;12519:52;12564:6;12559:3;12552:4;12545:5;12541:16;12519:52;:::i;:::-;12596:29;12618:6;12596:29;:::i;:::-;12591:3;12587:39;12580:46;;12360:272;12268:364;;;;:::o;12638:377::-;12744:3;12772:39;12805:5;12772:39;:::i;:::-;12827:89;12909:6;12904:3;12827:89;:::i;:::-;12820:96;;12925:52;12970:6;12965:3;12958:4;12951:5;12947:16;12925:52;:::i;:::-;13002:6;12997:3;12993:16;12986:23;;12748:267;12638:377;;;;:::o;13021:366::-;13163:3;13184:67;13248:2;13243:3;13184:67;:::i;:::-;13177:74;;13260:93;13349:3;13260:93;:::i;:::-;13378:2;13373:3;13369:12;13362:19;;13021:366;;;:::o;13393:::-;13535:3;13556:67;13620:2;13615:3;13556:67;:::i;:::-;13549:74;;13632:93;13721:3;13632:93;:::i;:::-;13750:2;13745:3;13741:12;13734:19;;13393:366;;;:::o;13765:::-;13907:3;13928:67;13992:2;13987:3;13928:67;:::i;:::-;13921:74;;14004:93;14093:3;14004:93;:::i;:::-;14122:2;14117:3;14113:12;14106:19;;13765:366;;;:::o;14137:::-;14279:3;14300:67;14364:2;14359:3;14300:67;:::i;:::-;14293:74;;14376:93;14465:3;14376:93;:::i;:::-;14494:2;14489:3;14485:12;14478:19;;14137:366;;;:::o;14509:400::-;14669:3;14690:84;14772:1;14767:3;14690:84;:::i;:::-;14683:91;;14783:93;14872:3;14783:93;:::i;:::-;14901:1;14896:3;14892:11;14885:18;;14509:400;;;:::o;14915:366::-;15057:3;15078:67;15142:2;15137:3;15078:67;:::i;:::-;15071:74;;15154:93;15243:3;15154:93;:::i;:::-;15272:2;15267:3;15263:12;15256:19;;14915:366;;;:::o;15287:::-;15429:3;15450:67;15514:2;15509:3;15450:67;:::i;:::-;15443:74;;15526:93;15615:3;15526:93;:::i;:::-;15644:2;15639:3;15635:12;15628:19;;15287:366;;;:::o;15659:::-;15801:3;15822:67;15886:2;15881:3;15822:67;:::i;:::-;15815:74;;15898:93;15987:3;15898:93;:::i;:::-;16016:2;16011:3;16007:12;16000:19;;15659:366;;;:::o;16031:398::-;16190:3;16211:83;16292:1;16287:3;16211:83;:::i;:::-;16204:90;;16303:93;16392:3;16303:93;:::i;:::-;16421:1;16416:3;16412:11;16405:18;;16031:398;;;:::o;16435:366::-;16577:3;16598:67;16662:2;16657:3;16598:67;:::i;:::-;16591:74;;16674:93;16763:3;16674:93;:::i;:::-;16792:2;16787:3;16783:12;16776:19;;16435:366;;;:::o;16807:::-;16949:3;16970:67;17034:2;17029:3;16970:67;:::i;:::-;16963:74;;17046:93;17135:3;17046:93;:::i;:::-;17164:2;17159:3;17155:12;17148:19;;16807:366;;;:::o;17179:118::-;17266:24;17284:5;17266:24;:::i;:::-;17261:3;17254:37;17179:118;;:::o;17303:701::-;17584:3;17606:95;17697:3;17688:6;17606:95;:::i;:::-;17599:102;;17718:95;17809:3;17800:6;17718:95;:::i;:::-;17711:102;;17830:148;17974:3;17830:148;:::i;:::-;17823:155;;17995:3;17988:10;;17303:701;;;;;:::o;18010:379::-;18194:3;18216:147;18359:3;18216:147;:::i;:::-;18209:154;;18380:3;18373:10;;18010:379;;;:::o;18395:222::-;18488:4;18526:2;18515:9;18511:18;18503:26;;18539:71;18607:1;18596:9;18592:17;18583:6;18539:71;:::i;:::-;18395:222;;;;:::o;18623:640::-;18818:4;18856:3;18845:9;18841:19;18833:27;;18870:71;18938:1;18927:9;18923:17;18914:6;18870:71;:::i;:::-;18951:72;19019:2;19008:9;19004:18;18995:6;18951:72;:::i;:::-;19033;19101:2;19090:9;19086:18;19077:6;19033:72;:::i;:::-;19152:9;19146:4;19142:20;19137:2;19126:9;19122:18;19115:48;19180:76;19251:4;19242:6;19180:76;:::i;:::-;19172:84;;18623:640;;;;;;;:::o;19269:332::-;19390:4;19428:2;19417:9;19413:18;19405:26;;19441:71;19509:1;19498:9;19494:17;19485:6;19441:71;:::i;:::-;19522:72;19590:2;19579:9;19575:18;19566:6;19522:72;:::i;:::-;19269:332;;;;;:::o;19607:210::-;19694:4;19732:2;19721:9;19717:18;19709:26;;19745:65;19807:1;19796:9;19792:17;19783:6;19745:65;:::i;:::-;19607:210;;;;:::o;19823:313::-;19936:4;19974:2;19963:9;19959:18;19951:26;;20023:9;20017:4;20013:20;20009:1;19998:9;19994:17;19987:47;20051:78;20124:4;20115:6;20051:78;:::i;:::-;20043:86;;19823:313;;;;:::o;20142:419::-;20308:4;20346:2;20335:9;20331:18;20323:26;;20395:9;20389:4;20385:20;20381:1;20370:9;20366:17;20359:47;20423:131;20549:4;20423:131;:::i;:::-;20415:139;;20142:419;;;:::o;20567:::-;20733:4;20771:2;20760:9;20756:18;20748:26;;20820:9;20814:4;20810:20;20806:1;20795:9;20791:17;20784:47;20848:131;20974:4;20848:131;:::i;:::-;20840:139;;20567:419;;;:::o;20992:::-;21158:4;21196:2;21185:9;21181:18;21173:26;;21245:9;21239:4;21235:20;21231:1;21220:9;21216:17;21209:47;21273:131;21399:4;21273:131;:::i;:::-;21265:139;;20992:419;;;:::o;21417:::-;21583:4;21621:2;21610:9;21606:18;21598:26;;21670:9;21664:4;21660:20;21656:1;21645:9;21641:17;21634:47;21698:131;21824:4;21698:131;:::i;:::-;21690:139;;21417:419;;;:::o;21842:::-;22008:4;22046:2;22035:9;22031:18;22023:26;;22095:9;22089:4;22085:20;22081:1;22070:9;22066:17;22059:47;22123:131;22249:4;22123:131;:::i;:::-;22115:139;;21842:419;;;:::o;22267:::-;22433:4;22471:2;22460:9;22456:18;22448:26;;22520:9;22514:4;22510:20;22506:1;22495:9;22491:17;22484:47;22548:131;22674:4;22548:131;:::i;:::-;22540:139;;22267:419;;;:::o;22692:::-;22858:4;22896:2;22885:9;22881:18;22873:26;;22945:9;22939:4;22935:20;22931:1;22920:9;22916:17;22909:47;22973:131;23099:4;22973:131;:::i;:::-;22965:139;;22692:419;;;:::o;23117:::-;23283:4;23321:2;23310:9;23306:18;23298:26;;23370:9;23364:4;23360:20;23356:1;23345:9;23341:17;23334:47;23398:131;23524:4;23398:131;:::i;:::-;23390:139;;23117:419;;;:::o;23542:::-;23708:4;23746:2;23735:9;23731:18;23723:26;;23795:9;23789:4;23785:20;23781:1;23770:9;23766:17;23759:47;23823:131;23949:4;23823:131;:::i;:::-;23815:139;;23542:419;;;:::o;23967:222::-;24060:4;24098:2;24087:9;24083:18;24075:26;;24111:71;24179:1;24168:9;24164:17;24155:6;24111:71;:::i;:::-;23967:222;;;;:::o;24195:129::-;24229:6;24256:20;;:::i;:::-;24246:30;;24285:33;24313:4;24305:6;24285:33;:::i;:::-;24195:129;;;:::o;24330:75::-;24363:6;24396:2;24390:9;24380:19;;24330:75;:::o;24411:311::-;24488:4;24578:18;24570:6;24567:30;24564:56;;;24600:18;;:::i;:::-;24564:56;24650:4;24642:6;24638:17;24630:25;;24710:4;24704;24700:15;24692:23;;24411:311;;;:::o;24728:::-;24805:4;24895:18;24887:6;24884:30;24881:56;;;24917:18;;:::i;:::-;24881:56;24967:4;24959:6;24955:17;24947:25;;25027:4;25021;25017:15;25009:23;;24728:311;;;:::o;25045:307::-;25106:4;25196:18;25188:6;25185:30;25182:56;;;25218:18;;:::i;:::-;25182:56;25256:29;25278:6;25256:29;:::i;:::-;25248:37;;25340:4;25334;25330:15;25322:23;;25045:307;;;:::o;25358:308::-;25420:4;25510:18;25502:6;25499:30;25496:56;;;25532:18;;:::i;:::-;25496:56;25570:29;25592:6;25570:29;:::i;:::-;25562:37;;25654:4;25648;25644:15;25636:23;;25358:308;;;:::o;25672:98::-;25723:6;25757:5;25751:12;25741:22;;25672:98;;;:::o;25776:99::-;25828:6;25862:5;25856:12;25846:22;;25776:99;;;:::o;25881:168::-;25964:11;25998:6;25993:3;25986:19;26038:4;26033:3;26029:14;26014:29;;25881:168;;;;:::o;26055:147::-;26156:11;26193:3;26178:18;;26055:147;;;;:::o;26208:169::-;26292:11;26326:6;26321:3;26314:19;26366:4;26361:3;26357:14;26342:29;;26208:169;;;;:::o;26383:148::-;26485:11;26522:3;26507:18;;26383:148;;;;:::o;26537:305::-;26577:3;26596:20;26614:1;26596:20;:::i;:::-;26591:25;;26630:20;26648:1;26630:20;:::i;:::-;26625:25;;26784:1;26716:66;26712:74;26709:1;26706:81;26703:107;;;26790:18;;:::i;:::-;26703:107;26834:1;26831;26827:9;26820:16;;26537:305;;;;:::o;26848:348::-;26888:7;26911:20;26929:1;26911:20;:::i;:::-;26906:25;;26945:20;26963:1;26945:20;:::i;:::-;26940:25;;27133:1;27065:66;27061:74;27058:1;27055:81;27050:1;27043:9;27036:17;27032:105;27029:131;;;27140:18;;:::i;:::-;27029:131;27188:1;27185;27181:9;27170:20;;26848:348;;;;:::o;27202:96::-;27239:7;27268:24;27286:5;27268:24;:::i;:::-;27257:35;;27202:96;;;:::o;27304:90::-;27338:7;27381:5;27374:13;27367:21;27356:32;;27304:90;;;:::o;27400:149::-;27436:7;27476:66;27469:5;27465:78;27454:89;;27400:149;;;:::o;27555:126::-;27592:7;27632:42;27625:5;27621:54;27610:65;;27555:126;;;:::o;27687:77::-;27724:7;27753:5;27742:16;;27687:77;;;:::o;27770:154::-;27854:6;27849:3;27844;27831:30;27916:1;27907:6;27902:3;27898:16;27891:27;27770:154;;;:::o;27930:307::-;27998:1;28008:113;28022:6;28019:1;28016:13;28008:113;;;28107:1;28102:3;28098:11;28092:18;28088:1;28083:3;28079:11;28072:39;28044:2;28041:1;28037:10;28032:15;;28008:113;;;28139:6;28136:1;28133:13;28130:101;;;28219:1;28210:6;28205:3;28201:16;28194:27;28130:101;27979:258;27930:307;;;:::o;28243:320::-;28287:6;28324:1;28318:4;28314:12;28304:22;;28371:1;28365:4;28361:12;28392:18;28382:81;;28448:4;28440:6;28436:17;28426:27;;28382:81;28510:2;28502:6;28499:14;28479:18;28476:38;28473:84;;;28529:18;;:::i;:::-;28473:84;28294:269;28243:320;;;:::o;28569:281::-;28652:27;28674:4;28652:27;:::i;:::-;28644:6;28640:40;28782:6;28770:10;28767:22;28746:18;28734:10;28731:34;28728:62;28725:88;;;28793:18;;:::i;:::-;28725:88;28833:10;28829:2;28822:22;28612:238;28569:281;;:::o;28856:233::-;28895:3;28918:24;28936:5;28918:24;:::i;:::-;28909:33;;28964:66;28957:5;28954:77;28951:103;;;29034:18;;:::i;:::-;28951:103;29081:1;29074:5;29070:13;29063:20;;28856:233;;;:::o;29095:180::-;29143:77;29140:1;29133:88;29240:4;29237:1;29230:15;29264:4;29261:1;29254:15;29281:180;29329:77;29326:1;29319:88;29426:4;29423:1;29416:15;29450:4;29447:1;29440:15;29467:180;29515:77;29512:1;29505:88;29612:4;29609:1;29602:15;29636:4;29633:1;29626:15;29653:180;29701:77;29698:1;29691:88;29798:4;29795:1;29788:15;29822:4;29819:1;29812:15;29839:180;29887:77;29884:1;29877:88;29984:4;29981:1;29974:15;30008:4;30005:1;29998:15;30025:117;30134:1;30131;30124:12;30148:117;30257:1;30254;30247:12;30271:117;30380:1;30377;30370:12;30394:117;30503:1;30500;30493:12;30517:117;30626:1;30623;30616:12;30640:102;30681:6;30732:2;30728:7;30723:2;30716:5;30712:14;30708:28;30698:38;;30640:102;;;:::o;30748:181::-;30888:33;30884:1;30876:6;30872:14;30865:57;30748:181;:::o;30935:225::-;31075:34;31071:1;31063:6;31059:14;31052:58;31144:8;31139:2;31131:6;31127:15;31120:33;30935:225;:::o;31166:170::-;31306:22;31302:1;31294:6;31290:14;31283:46;31166:170;:::o;31342:171::-;31482:23;31478:1;31470:6;31466:14;31459:47;31342:171;:::o;31519:155::-;31659:7;31655:1;31647:6;31643:14;31636:31;31519:155;:::o;31680:182::-;31820:34;31816:1;31808:6;31804:14;31797:58;31680:182;:::o;31868:175::-;32008:27;32004:1;31996:6;31992:14;31985:51;31868:175;:::o;32049:::-;32189:27;32185:1;32177:6;32173:14;32166:51;32049:175;:::o;32230:114::-;;:::o;32350:168::-;32490:20;32486:1;32478:6;32474:14;32467:44;32350:168;:::o;32524:176::-;32664:28;32660:1;32652:6;32648:14;32641:52;32524:176;:::o;32706:122::-;32779:24;32797:5;32779:24;:::i;:::-;32772:5;32769:35;32759:63;;32818:1;32815;32808:12;32759:63;32706:122;:::o;32834:116::-;32904:21;32919:5;32904:21;:::i;:::-;32897:5;32894:32;32884:60;;32940:1;32937;32930:12;32884:60;32834:116;:::o;32956:120::-;33028:23;33045:5;33028:23;:::i;:::-;33021:5;33018:34;33008:62;;33066:1;33063;33056:12;33008:62;32956:120;:::o;33082:122::-;33155:24;33173:5;33155:24;:::i;:::-;33148:5;33145:35;33135:63;;33194:1;33191;33184:12;33135:63;33082:122;:::o

Swarm Source

ipfs://71852213b87e05d543fde7324b4379dbfc4cc131d717d8e12c1a106673d23c19
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.