ETH Price: $3,395.19 (+1.35%)
Gas: 6 Gwei

Token

Lazynaire (LAZYNAIRE)
 

Overview

Max Total Supply

150 LAZYNAIRE

Holders

42

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 LAZYNAIRE
0x122c04b765b1e1d4e432f2ae2c1164a4169c5cbe
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:
Lazynaire

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-07-30
*/

// Sources flattened with hardhat v2.14.0 https://hardhat.org
// SPDX-License-Identifier: MIT
// File @openzeppelin/contracts/utils/[email protected]

// 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/[email protected]


// OpenZeppelin Contracts (last updated v4.9.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. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]


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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/interfaces/[email protected]


// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(
        uint256 tokenId,
        uint256 salePrice
    ) external view returns (address receiver, uint256 royaltyAmount);
}


// File @openzeppelin/contracts/utils/introspection/[email protected]


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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/common/[email protected]


// OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}


// File @openzeppelin/contracts/utils/cryptography/[email protected]


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

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

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


// File contracts/closedsea/OperatorFilterer.sol


pragma solidity ^0.8.4;

/// @notice Optimized and flexible operator filterer to abide to OpenSea's
/// mandatory on-chain royalty enforcement in order for new collections to
/// receive royalties.
/// For more information, see:
/// See: https://github.com/ProjectOpenSea/operator-filter-registry
abstract contract OperatorFilterer {
    /// @dev The default OpenSea operator blocklist subscription.
    address internal constant _DEFAULT_SUBSCRIPTION =
        0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

    /// @dev The OpenSea operator filter registry.
    address internal constant _OPERATOR_FILTER_REGISTRY =
        0x000000000000AAeB6D7670E522A718067333cd4E;

    /// @dev Registers the current contract to OpenSea's operator filter,
    /// and subscribe to the default OpenSea operator blocklist.
    /// Note: Will not revert nor update existing settings for repeated registration.
    function _registerForOperatorFiltering() internal virtual {
        _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true);
    }

    /// @dev Registers the current contract to OpenSea's operator filter.
    /// Note: Will not revert nor update existing settings for repeated registration.
    function _registerForOperatorFiltering(
        address subscriptionOrRegistrantToCopy,
        bool subscribe
    ) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`.

            // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty.
            subscriptionOrRegistrantToCopy := shr(
                96,
                shl(96, subscriptionOrRegistrantToCopy)
            )

            for {

            } iszero(subscribe) {

            } {
                if iszero(subscriptionOrRegistrantToCopy) {
                    functionSelector := 0x4420e486 // `register(address)`.
                    break
                }
                functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`.
                break
            }
            // Store the function selector.
            mstore(0x00, shl(224, functionSelector))
            // Store the `address(this)`.
            mstore(0x04, address())
            // Store the `subscriptionOrRegistrantToCopy`.
            mstore(0x24, subscriptionOrRegistrantToCopy)
            // Register into the registry.
            if iszero(
                call(
                    gas(),
                    _OPERATOR_FILTER_REGISTRY,
                    0,
                    0x00,
                    0x44,
                    0x00,
                    0x04
                )
            ) {
                // If the function selector has not been overwritten,
                // it is an out-of-gas error.
                if eq(shr(224, mload(0x00)), functionSelector) {
                    // To prevent gas under-estimation.
                    revert(0, 0)
                }
            }
            // Restore the part of the free memory pointer that was overwritten,
            // which is guaranteed to be zero, because of Solidity's memory size limits.
            mstore(0x24, 0)
        }
    }

    /// @dev Modifier to guard a function and revert if the caller is a blocked operator.
    modifier onlyAllowedOperator(address from) virtual {
        if (from != msg.sender) {
            if (!_isPriorityOperator(msg.sender)) {
                if (_operatorFilteringEnabled()) _revertIfBlocked(msg.sender);
            }
        }
        _;
    }

    /// @dev Modifier to guard a function from approving a blocked operator..
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        if (!_isPriorityOperator(operator)) {
            if (_operatorFilteringEnabled()) _revertIfBlocked(operator);
        }
        _;
    }

    /// @dev Helper function that reverts if the `operator` is blocked by the registry.
    function _revertIfBlocked(address operator) private view {
        /// @solidity memory-safe-assembly
        assembly {
            // Store the function selector of `isOperatorAllowed(address,address)`,
            // shifted left by 6 bytes, which is enough for 8tb of memory.
            // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL).
            mstore(0x00, 0xc6171134001122334455)
            // Store the `address(this)`.
            mstore(0x1a, address())
            // Store the `operator`.
            mstore(0x3a, operator)

            // `isOperatorAllowed` always returns true if it does not revert.
            if iszero(
                staticcall(
                    gas(),
                    _OPERATOR_FILTER_REGISTRY,
                    0x16,
                    0x44,
                    0x00,
                    0x00
                )
            ) {
                // Bubble up the revert if the staticcall reverts.
                returndatacopy(0x00, 0x00, returndatasize())
                revert(0x00, returndatasize())
            }

            // We'll skip checking if `from` is inside the blacklist.
            // Even though that can block transferring out of wrapper contracts,
            // we don't want tokens to be stuck.

            // Restore the part of the free memory pointer that was overwritten,
            // which is guaranteed to be zero, if less than 8tb of memory is used.
            mstore(0x3a, 0)
        }
    }

    /// @dev For deriving contracts to override, so that operator filtering
    /// can be turned on / off.
    /// Returns true by default.
    function _operatorFilteringEnabled() internal view virtual returns (bool) {
        return true;
    }

    /// @dev For deriving contracts to override, so that preferred marketplaces can
    /// skip operator filtering, helping users save gas.
    /// Returns false for all inputs by default.
    function _isPriorityOperator(address) internal view virtual returns (bool) {
        return false;
    }
}


// File erc721a/contracts/[email protected]


// 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/[email protected]


// 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 erc721a/contracts/extensions/[email protected]


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

pragma solidity ^0.8.4;

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

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

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

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

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


// File erc721a/contracts/extensions/[email protected]


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

pragma solidity ^0.8.4;


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

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

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

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


// File contracts/Lazynaire.sol

pragma solidity 0.8.20;

contract Lazynaire is
    ERC721A,
    ERC721AQueryable,
    ERC2981,
    Ownable,
    OperatorFilterer
{
    string private _baseTokenURI;
    string private _preRevealURI;
    bool internal _isRevealed;
    // Whether operator filtering is enabled
    bool public operatorFilteringEnabled;
    bool public isPaused;
    Phases internal _currentPhase;
    uint256 internal _collectionSize;
    uint32 public maxMintPerWallet = 2;
    uint256 public standardMintPrice = 0.025 ether;
    uint256 public OGMintPrice = 0.016 ether;
    mapping(address => uint256) public numberMintedPublicSales;
    mapping(Roles => bytes32) private merkleRoot;
    enum Phases {
        PRE_MINT,
        OG,
        WL,
        PUBLIC
    }

    mapping(Phases => uint32[2]) internal _phaseConfig;

    enum Roles {
        OG_HONOURED,
        OG,
        WL,
        ALLOWLIST,
        PUBLIC
    }

    event SetPhaseConfig(uint _phase, uint32 _startTime, uint32 _endTime);

    event UpdateCollectionSize(
        uint256 oldCollectionSize,
        uint256 collectionSize_
    );

    event SetMerkleRoot(Roles _roles, bytes32 merkleRoot);

    /* ============ Errors ============ */
    error Overflow(uint256 mintable, uint256 maxMintPerWallet);
    error IsPaused();
    error NotValidPhase(uint phase);
    error ExceedsCollectionSize(
        uint256 totalSupply,
        uint256 amount,
        uint256 collectionSize
    );
    error NotEligibleToMint(address user, Roles role, Phases currentPhase);
    error ExeedsUsersMintLimit(address user, uint256 amount, uint256 mintable);
    error InsufficientFunds(address user, uint256 value, uint256 mintPrice);
    error ZeroAddress();

    constructor(
        uint256 collectionSize_,
        address _royaltyReceiver
    ) ERC721A("Lazynaire", "LAZYNAIRE") {
        _collectionSize = collectionSize_;

        // 7.5% royalties
        _setDefaultRoyalty(_royaltyReceiver, 750);

        // Setup marketplace operator filtering
        _registerForOperatorFiltering();
        operatorFilteringEnabled = true;
    }

    /* ============ Public Functions ============ */
    /**
     * Retrieves user's role, if none, will return PUBLIC role
     * @param user_ user's address to check role
     * @param proof_  merkle proof for user's address
     */
    function getRole(
        address user_,
        bytes32[] memory proof_
    ) public view returns (Roles) {
        for (uint256 role = 0; role < uint8(Roles.PUBLIC); role++) {
            if (_isRole(Roles(role), user_, proof_)) return Roles(role);
        }

        return Roles.PUBLIC;
    }

    /**
     * Retrieve user's role, only called by front end
     * @param user_ user's address to check role
     * @param proof_ an array of merkle proofs for user's address
     */
    function getRoleFromProofs(
        address user_,
        bytes32[][4] memory proof_
    ) external view returns (Roles) {
        for (uint256 role = 0; role < uint8(Roles.PUBLIC); role++) {
            if (_isRole(Roles(role), user_, proof_[role])) return Roles(role);
        }

        return Roles.PUBLIC;
    }

    /**
     * Owner-only function to set current phase
     * @param phase_ Current phase to be set
     */
    function setCurrentPhase(uint phase_) external onlyOwner {
        if (!(Phases(phase_) >= Phases.OG || Phases(phase_) <= Phases.PUBLIC)) {
            revert NotValidPhase(phase_);
        }
        _currentPhase = Phases(phase_);
    }

    /**
     * Updates collection size for this collection
     * @param collectionSize_ new collection size
     */
    function updateCollectionSize(uint256 collectionSize_) external onlyOwner {
        uint256 oldCollectionSize = _collectionSize;
        _collectionSize = collectionSize_;

        emit UpdateCollectionSize(oldCollectionSize, collectionSize_);
    }

    /**
     * Function to set the Phase configuration
     * @param phase_ Phase to be set
     * @param startTime_ Start time of Phase
     * @param endTime_  End time of Phase
     */
    function setPhaseConfig(
        uint phase_,
        uint32 startTime_,
        uint32 endTime_
    ) external onlyOwner {
        _phaseConfig[Phases(phase_)] = [startTime_, endTime_];

        emit SetPhaseConfig(phase_, startTime_, endTime_);
    }

    /**
     * Function to set merkleroot for all roles
     * @param role_ role to set merkle root
     * @param root_  merkle root
     */
    function setMerkleRoot(Roles role_, bytes32 root_) external onlyOwner {
        merkleRoot[Roles(role_)] = root_;

        emit SetMerkleRoot(Roles(role_), merkleRoot[Roles(role_)]);
    }

    /**
     * Mint free tokens, only can be called by contract owner
     * @param to_ address to mint tokens to
     * @param amount_ amount to mint
     */
    function devMint(address to_, uint256 amount_) external onlyOwner {
        if (to_ == address(0)) {
            revert ZeroAddress();
        }
        // Check if the total supply does not exceed the collection size
        if (!(totalSupply() + amount_ <= _collectionSize)) {
            revert ExceedsCollectionSize(
                totalSupply(),
                amount_,
                _collectionSize
            );
        }

        _mint(to_, amount_);
    }

    /**
     * Function to withdraw funds from contract
     * @param to_ address to withdraw funds to
     */
    function withdrawAll(address payable to_) external onlyOwner {
        if (to_ == address(0)) {
            revert ZeroAddress();
        }
        to_.transfer(address(this).balance);
    }

    // =========================================================================
    //                                 Metadata
    // =========================================================================
    function setBaseURI(string calldata baseURI_) external onlyOwner {
        _baseTokenURI = baseURI_;
    }

    function setpreRevealURI(string calldata preRevealURI_) external onlyOwner {
        _preRevealURI = preRevealURI_;
    }

    function isRevealed(bool isReveal_) external onlyOwner {
        _isRevealed = isReveal_;
    }

    function getRevealedBool() public view returns (bool) {
        return _isRevealed;
    }

    /**
     * Function to retrieve the metadata uri for a given token. Reverts for tokens that don't exist.
     * @param tokenId Token Id to get metadata for
     */
    function tokenURI(
        uint256 tokenId
    ) public view override(ERC721A, IERC721A) returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        if (!_isRevealed) {
            return
                bytes(_preRevealURI).length != 0
                    ? string(
                        abi.encodePacked(
                            _preRevealURI,
                            _toString(tokenId + 1),
                            ".json"
                        )
                    )
                    : "";
        }
        string memory baseURI = _baseURI();
        return
            bytes(baseURI).length != 0
                ? string(
                    abi.encodePacked(baseURI, _toString(tokenId + 1), ".json")
                )
                : "";
    }

    // =========================================================================
    //                                  ERC165
    // =========================================================================

    /**
     * Overridden supportsInterface with IERC721 support and ERC2981 support
     * @param interfaceId Interface Id to check
     */
    function supportsInterface(
        bytes4 interfaceId
    ) public view override(ERC721A, IERC721A, ERC2981) returns (bool) {
        // Supports the following `interfaceId`s:
        // - IERC165: 0x01ffc9a7
        // - IERC721: 0x80ac58cd
        // - IERC721Metadata: 0x5b5e139f
        // - IERC2981: 0x2a55205a
        return
            ERC721A.supportsInterface(interfaceId) ||
            ERC2981.supportsInterface(interfaceId);
    }

    // =========================================================================
    //                           Operator filtering
    // =========================================================================

    /**
     * Overridden setApprovalForAll with operator filtering.
     */
    function setApprovalForAll(
        address operator,
        bool approved
    ) public override(ERC721A, IERC721A) onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    /**
     * Overridden approve with operator filtering.
     */
    function approve(
        address operator,
        uint256 tokenId
    )
        public
        payable
        override(ERC721A, IERC721A)
        onlyAllowedOperatorApproval(operator)
    {
        super.approve(operator, tokenId);
    }

    /**
     * Overridden transferFrom with operator filtering. For ERC721A, this will also add
     * operator filtering for both safeTransferFrom functions.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable override(ERC721A, IERC721A) onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    /**
     * Owner-only function to toggle operator filtering.
     * @param value Whether operator filtering is on/off.
     */
    function setOperatorFilteringEnabled(bool value) public onlyOwner {
        operatorFilteringEnabled = value;
    }

    // =========================================================================
    //                                 ERC2891
    // =========================================================================

    /**
     * Owner-only function to set the royalty receiver and royalty rate
     * @param receiver Address that will receive royalties
     * @param feeNumerator Royalty amount in basis points. Denominated by 10000
     */
    function setDefaultRoyalty(
        address receiver,
        uint96 feeNumerator
    ) public onlyOwner {
        if (receiver == address(0)) {
            revert ZeroAddress();
        }
        _setDefaultRoyalty(receiver, feeNumerator);
    }

    // =========================================================================
    //                              Minting Logic
    // =========================================================================

    /**
     * Mint function.
     * @param amount_ amount of tokens to mint
     * @param proof_  proof for merkle root validation
     */
    function mint(uint256 amount_, bytes32[] memory proof_) external payable {
        //Check if contract is paused
        if (isPaused) {
            revert IsPaused();
        }

        // Check if the user is eligible to mint
        if (!(getMintEligibilityAtCurrentPhase(msg.sender, proof_))) {
            revert NotEligibleToMint(
                msg.sender,
                getRole(msg.sender, proof_),
                _currentPhase
            );
        }

        // Check the maximum mintable amount based on the current phase
        if (!(amount_ <= getMintable(msg.sender))) {
            revert ExeedsUsersMintLimit(
                msg.sender,
                amount_,
                getMintable(msg.sender)
            );
        }

        // Check if the total supply does not exceed the collection size
        if (!(totalSupply() + amount_ <= _collectionSize)) {
            revert ExceedsCollectionSize(
                totalSupply(),
                amount_,
                _collectionSize
            );
        }

        // Calculate the total mint price based on the current phase and amount
        uint256 mintPrice = calculateTotalMintPrice(
            msg.sender,
            amount_,
            proof_
        );

        // Check if the user has sent enough Ether to cover the mint price
        if (!(msg.value == mintPrice)) {
            revert InsufficientFunds(msg.sender, msg.value, mintPrice);
        }

        if (_currentPhase == Phases.PUBLIC) {
            numberMintedPublicSales[msg.sender] += amount_;
        }
        // Mint the specified amount of tokens to the user
        _mint(msg.sender, amount_);
    }

    /**
     * Retrieves current phase info
     * @return phase current phase
     * @return startTime start time of current phase
     * @return endTime end time of current phase
     */
    function getCurrentPhase()
        external
        view
        returns (Phases phase, uint32 startTime, uint32 endTime)
    {
        phase = Phases(_currentPhase);
        startTime = _phaseConfig[Phases(phase)][0];
        endTime = _phaseConfig[Phases(phase)][1];

        return (phase, startTime, endTime);
    }

    /**
     * Retrievs collection size and total supply
     * @return collectionSize collection size
     * @return totalSupply_ existing total supply
     */
    function getSupplyInfo()
        external
        view
        returns (uint256 collectionSize, uint256 totalSupply_)
    {
        collectionSize = _collectionSize;
        totalSupply_ = totalSupply();

        return (collectionSize, totalSupply_);
    }

    /**
     * Retrieves total mint price for user's desired amount
     * @param user_ user to calculate mint price
     * @param amount_ amount to calculate
     * @param proof_ user's merkle proof
     */
    function calculateTotalMintPrice(
        address user_,
        uint256 amount_,
        bytes32[] memory proof_
    ) public view returns (uint256 totalMintPrice) {
        bool mintEligibility = getMintEligibilityAtCurrentPhase(user_, proof_);
        if (!(mintEligibility)) {
            revert NotEligibleToMint(
                user_,
                getRole(user_, proof_),
                _currentPhase
            );
        }
        uint256 mintable = getMintable(user_);
        if (!(amount_ <= mintable)) {
            revert ExeedsUsersMintLimit(user_, amount_, getMintable(user_));
        }
        if (amount_ == 0) {
            return 0;
        }

        Roles role = getRole(user_, proof_);
        /**********OG Phase**********/
        //OG_Honoured and OG roles can mint
        if (_currentPhase == Phases.OG) {
            if (role == Roles.OG_HONOURED) {
                // No cost for minting for OG_HONOURED role
                return totalMintPrice = 0;
            } else if (role == Roles.OG) {
                if (mintable == 2 && (amount_ == 2 || amount_ == 1)) {
                    return totalMintPrice = OGMintPrice;
                }
                //user has minted 1 before
                else if (mintable == 1) {
                    return totalMintPrice = 0;
                }
            }
        }
        /**********WL Phase**********/
        //WL and Allowlist roles can mint
        else if (_currentPhase == Phases.WL) {
            if (role == Roles.WL) {
                if (mintable == 2 && (amount_ == 2 || amount_ == 1)) {
                    return totalMintPrice = standardMintPrice;
                } else if (mintable == 1) {
                    return totalMintPrice = 0;
                }
            } else if (role == Roles.ALLOWLIST) {
                return totalMintPrice = amount_ * standardMintPrice;
            }
        }

        /**********Public Phase**********/
        //Everyone can mint
        return totalMintPrice = amount_ * standardMintPrice;
    }

    /**
     * Retrieves number of available mint for user
     * @param _user user's address to check
     */
    function getMintable(address _user) public view returns (uint256 mintable) {
        uint256 numberMinted;
        if (_currentPhase != Phases.PUBLIC) {
            numberMinted = _numberMinted(_user);
        } else {
            numberMinted = numberMintedPublicSales[_user];
        }

        unchecked {
            mintable = maxMintPerWallet - numberMinted;
            if (mintable > maxMintPerWallet) {
                revert Overflow(mintable, maxMintPerWallet);
            }
        }
        return mintable;
    }

    function setPauseContract(bool pause_) external onlyOwner {
        isPaused = pause_;
    }

    function setStandardMintPrice(uint256 newMintPrice_) external onlyOwner {
        standardMintPrice = newMintPrice_;
    }

    function setOGMintPrice(uint256 newOGMintPrice_) external onlyOwner {
        OGMintPrice = newOGMintPrice_;
    }

    function getMintEligibilityAtCurrentPhase(
        address user_,
        bytes32[] memory proof_
    ) public view returns (bool mintEligibility) {
        Roles role = getRole(user_, proof_);
        mintEligibility = false;
        if (_currentPhase == Phases.OG) {
            if (role == Roles.OG_HONOURED || role == Roles.OG) {
                mintEligibility = true;
            }
        } else if (_currentPhase == Phases.WL) {
            if (role == Roles.WL || role == Roles.ALLOWLIST) {
                mintEligibility = true;
            }
        } else if (_currentPhase == Phases.PUBLIC) {
            mintEligibility = true;
        }

        return mintEligibility;
    }

    /* ============ Internal Functions ============ */
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    function _isRole(
        Roles role_,
        address user_,
        bytes32[] memory proof_
    ) internal view returns (bool) {
        if (role_ == Roles.OG_HONOURED) {
            return _isOGHonoured(user_, proof_);
        } else if (role_ == Roles.OG) {
            return _isOG(user_, proof_);
        } else if (role_ == Roles.WL) {
            return _isWL(user_, proof_);
        } else if (role_ == Roles.ALLOWLIST) {
            return _isAllowlist(user_, proof_);
        }
        revert("Role does not exist");
    }

    function _isOGHonoured(
        address user_,
        bytes32[] memory proof_
    ) internal view returns (bool) {
        return _verify(proof_, user_, merkleRoot[Roles.OG_HONOURED]);
    }

    function _isOG(
        address user_,
        bytes32[] memory proof_
    ) internal view returns (bool) {
        return _verify(proof_, user_, merkleRoot[Roles.OG]);
    }

    function _isWL(
        address user_,
        bytes32[] memory proof_
    ) internal view returns (bool) {
        return _verify(proof_, user_, merkleRoot[Roles.WL]);
    }

    function _isAllowlist(
        address user_,
        bytes32[] memory proof_
    ) internal view returns (bool) {
        return _verify(proof_, user_, merkleRoot[Roles.ALLOWLIST]);
    }

    /**
     * Internal function to get merkle tree verification result
     * @param proof_ Merkle proof for validation
     * @param user_  Address of user for validation
     * @param root_  Merkle root hash
     */
    function _verify(
        bytes32[] memory proof_,
        address user_,
        bytes32 root_
    ) internal pure returns (bool) {
        bytes32 leaf = keccak256(bytes.concat(keccak256(abi.encode(user_))));
        bool verifyResult = MerkleProof.verify(proof_, root_, leaf);
        if (verifyResult) return true;
        else return false;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"collectionSize_","type":"uint256"},{"internalType":"address","name":"_royaltyReceiver","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"collectionSize","type":"uint256"}],"name":"ExceedsCollectionSize","type":"error"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"mintable","type":"uint256"}],"name":"ExeedsUsersMintLimit","type":"error"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"InsufficientFunds","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"IsPaused","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"enum Lazynaire.Roles","name":"role","type":"uint8"},{"internalType":"enum Lazynaire.Phases","name":"currentPhase","type":"uint8"}],"name":"NotEligibleToMint","type":"error"},{"inputs":[{"internalType":"uint256","name":"phase","type":"uint256"}],"name":"NotValidPhase","type":"error"},{"inputs":[{"internalType":"uint256","name":"mintable","type":"uint256"},{"internalType":"uint256","name":"maxMintPerWallet","type":"uint256"}],"name":"Overflow","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"},{"inputs":[],"name":"ZeroAddress","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":false,"internalType":"enum Lazynaire.Roles","name":"_roles","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"SetMerkleRoot","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_phase","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"_startTime","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"_endTime","type":"uint32"}],"name":"SetPhaseConfig","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldCollectionSize","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"collectionSize_","type":"uint256"}],"name":"UpdateCollectionSize","type":"event"},{"inputs":[],"name":"OGMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","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":"address","name":"user_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"calculateTotalMintPrice","outputs":[{"internalType":"uint256","name":"totalMintPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentPhase","outputs":[{"internalType":"enum Lazynaire.Phases","name":"phase","type":"uint8"},{"internalType":"uint32","name":"startTime","type":"uint32"},{"internalType":"uint32","name":"endTime","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"getMintEligibilityAtCurrentPhase","outputs":[{"internalType":"bool","name":"mintEligibility","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getMintable","outputs":[{"internalType":"uint256","name":"mintable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRevealedBool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"getRole","outputs":[{"internalType":"enum Lazynaire.Roles","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"},{"internalType":"bytes32[][4]","name":"proof_","type":"bytes32[][4]"}],"name":"getRoleFromProofs","outputs":[{"internalType":"enum Lazynaire.Roles","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSupplyInfo","outputs":[{"internalType":"uint256","name":"collectionSize","type":"uint256"},{"internalType":"uint256","name":"totalSupply_","type":"uint256"}],"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":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"isReveal_","type":"bool"}],"name":"isRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMintPerWallet","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numberMintedPublicSales","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"phase_","type":"uint256"}],"name":"setCurrentPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Lazynaire.Roles","name":"role_","type":"uint8"},{"internalType":"bytes32","name":"root_","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newOGMintPrice_","type":"uint256"}],"name":"setOGMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"pause_","type":"bool"}],"name":"setPauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"phase_","type":"uint256"},{"internalType":"uint32","name":"startTime_","type":"uint32"},{"internalType":"uint32","name":"endTime_","type":"uint32"}],"name":"setPhaseConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintPrice_","type":"uint256"}],"name":"setStandardMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"preRevealURI_","type":"string"}],"name":"setpreRevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"standardMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionSize_","type":"uint256"}],"name":"updateCollectionSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to_","type":"address"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526002600f5f6101000a81548163ffffffff021916908363ffffffff1602179055506658d15e176280006010556638d7ea4c68000060115534801562000047575f80fd5b50604051620063b5380380620063b583398181016040528101906200006d919062000531565b6040518060400160405280600981526020017f4c617a796e6169726500000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f4c415a594e4149524500000000000000000000000000000000000000000000008152508160029081620000ea9190620007d1565b508060039081620000fc9190620007d1565b506200010d6200018260201b60201c565b5f81905550505062000134620001286200018660201b60201c565b6200018d60201b60201c565b81600e819055506200014f816102ee6200025060201b60201c565b6200015f620003ee60201b60201c565b6001600d60016101000a81548160ff0219169083151502179055505050620009c7565b5f90565b5f33905090565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002606200041760201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620002c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002b89062000939565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000332576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200032990620009a7565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681525060085f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b62000415733cc6cdda760b79bafa08df41ecfa224f810dceb660016200042060201b60201c565b565b5f612710905090565b637d3e3dbe8260601b60601c9250816200044f57826200044757634420e48690506200044f565b63a0af290390505b8060e01b5f52306004528260245260045f60445f806daaeb6d7670e522a718067333cd4e5af16200048b57805f5160e01c036200048a575f80fd5b5b5f602452505050565b5f80fd5b5f819050919050565b620004ac8162000498565b8114620004b7575f80fd5b50565b5f81519050620004ca81620004a1565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620004fb82620004d0565b9050919050565b6200050d81620004ef565b811462000518575f80fd5b50565b5f815190506200052b8162000502565b92915050565b5f80604083850312156200054a576200054962000494565b5b5f6200055985828601620004ba565b92505060206200056c858286016200051b565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620005f257607f821691505b602082108103620006085762000607620005ad565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200066c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200062f565b6200067886836200062f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f620006b9620006b3620006ad8462000498565b62000690565b62000498565b9050919050565b5f819050919050565b620006d48362000699565b620006ec620006e382620006c0565b8484546200063b565b825550505050565b5f90565b62000702620006f4565b6200070f818484620006c9565b505050565b5b8181101562000736576200072a5f82620006f8565b60018101905062000715565b5050565b601f82111562000785576200074f816200060e565b6200075a8462000620565b810160208510156200076a578190505b62000782620007798562000620565b83018262000714565b50505b505050565b5f82821c905092915050565b5f620007a75f19846008026200078a565b1980831691505092915050565b5f620007c1838362000796565b9150826002028217905092915050565b620007dc8262000576565b67ffffffffffffffff811115620007f857620007f762000580565b5b620008048254620005da565b620008118282856200073a565b5f60209050601f83116001811462000847575f841562000832578287015190505b6200083e8582620007b4565b865550620008ad565b601f19841662000857866200060e565b5f5b82811015620008805784890151825560018201915060208501945060208101905062000859565b86831015620008a057848901516200089c601f89168262000796565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c206578636565645f8201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b5f62000921602a83620008b5565b91506200092e82620008c5565b604082019050919050565b5f6020820190508181035f830152620009528162000913565b9050919050565b7f455243323938313a20696e76616c6964207265636569766572000000000000005f82015250565b5f6200098f601983620008b5565b91506200099c8262000959565b602082019050919050565b5f6020820190508181035f830152620009c08162000981565b9050919050565b6159e080620009d55f395ff3fe6080604052600436106102e3575f3560e01c80637d3e1ee41161018f578063c23dc68f116100db578063e601af7311610094578063f2fde38b1161006e578063f2fde38b14610b5f578063fa09e63014610b87578063fb796e6c14610baf578063fd6ce9e414610bd9576102e3565b8063e601af7314610abf578063e985e9c514610ae7578063f299218714610b23576102e3565b8063c23dc68f1461097f578063c87b56dd146109bb578063ca286de7146109f7578063d089f41614610a33578063e25aca3214610a5b578063e2a26d7314610a83576102e3565b8063a3a40ea511610148578063b228d92511610122578063b228d925146108f5578063b7c0b8e81461091f578063b88d4fde14610947578063ba41b0c614610963576102e3565b8063a3a40ea514610875578063ae440f48146108a1578063b187bd26146108cb576102e3565b80637d3e1ee4146107595780638462151c146107815780638da5cb5b146107bd57806395d89b41146107e757806399a2557a14610811578063a22cb4651461084d576102e3565b806342842e0e1161024e578063593df74a116102075780636352211e116101e15780636352211e146106a357806370a08231146106df578063715018a61461071b57806374e6ddf714610731576102e3565b8063593df74a146106035780635bbb21771461063f578063627804af1461067b576102e3565b806342842e0e146104f75780634b1097d2146105135780634e810e261461054f57806354d77e0e1461058b57806355f804b3146105b357806357f9f9a9146105db576102e3565b806318160ddd116102a057806318160ddd146103f757806320edeaf31461042157806323b872dd1461044c5780632a55205a14610468578063301f8cfc146104a55780633fecf819146104cd576102e3565b806301ffc9a7146102e757806302830aa61461032357806304634d8d1461034d57806306fdde0314610375578063081812fc1461039f578063095ea7b3146103db575b5f80fd5b3480156102f2575f80fd5b5061030d60048036038101906103089190613ee1565b610c01565b60405161031a9190613f26565b60405180910390f35b34801561032e575f80fd5b50610337610c22565b6040516103449190613f57565b60405180910390f35b348015610358575f80fd5b50610373600480360381019061036e919061400b565b610c28565b005b348015610380575f80fd5b50610389610ca3565b60405161039691906140d3565b60405180910390f35b3480156103aa575f80fd5b506103c560048036038101906103c0919061411d565b610d33565b6040516103d29190614157565b60405180910390f35b6103f560048036038101906103f09190614170565b610dad565b005b348015610402575f80fd5b5061040b610de2565b6040516104189190613f57565b60405180910390f35b34801561042c575f80fd5b50610435610df7565b6040516104439291906141ae565b60405180910390f35b610466600480360381019061046191906141d5565b610e0c565b005b348015610473575f80fd5b5061048e60048036038101906104899190614225565b610e77565b60405161049c929190614263565b60405180910390f35b3480156104b0575f80fd5b506104cb60048036038101906104c691906142b4565b611053565b005b3480156104d8575f80fd5b506104e1611077565b6040516104ee9190613f26565b60405180910390f35b610511600480360381019061050c91906141d5565b61108c565b005b34801561051e575f80fd5b5061053960048036038101906105349190614452565b6110ab565b604051610546919061451f565b60405180910390f35b34801561055a575f80fd5b5061057560048036038101906105709190614538565b61112a565b6040516105829190613f57565b60405180910390f35b348015610596575f80fd5b506105b160048036038101906105ac9190614586565b61113f565b005b3480156105be575f80fd5b506105d960048036038101906105d4919061461d565b6111f3565b005b3480156105e6575f80fd5b5061060160048036038101906105fc919061461d565b611211565b005b34801561060e575f80fd5b5061062960048036038101906106249190614452565b61122f565b6040516106369190613f26565b60405180910390f35b34801561064a575f80fd5b50610665600480360381019061066091906146bd565b6113c9565b6040516106729190614860565b60405180910390f35b348015610686575f80fd5b506106a1600480360381019061069c9190614170565b611489565b005b3480156106ae575f80fd5b506106c960048036038101906106c4919061411d565b61156a565b6040516106d69190614157565b60405180910390f35b3480156106ea575f80fd5b5061070560048036038101906107009190614538565b61157b565b6040516107129190613f57565b60405180910390f35b348015610726575f80fd5b5061072f611630565b005b34801561073c575f80fd5b506107576004803603810190610752919061411d565b611643565b005b348015610764575f80fd5b5061077f600480360381019061077a919061411d565b611655565b005b34801561078c575f80fd5b506107a760048036038101906107a29190614538565b611759565b6040516107b49190614937565b60405180910390f35b3480156107c8575f80fd5b506107d1611895565b6040516107de9190614157565b60405180910390f35b3480156107f2575f80fd5b506107fb6118bd565b60405161080891906140d3565b60405180910390f35b34801561081c575f80fd5b5061083760048036038101906108329190614957565b61194d565b6040516108449190614937565b60405180910390f35b348015610858575f80fd5b50610873600480360381019061086e91906149a7565b611b4c565b005b348015610880575f80fd5b50610889611b81565b60405161089893929190614a49565b60405180910390f35b3480156108ac575f80fd5b506108b5611c66565b6040516108c29190613f57565b60405180910390f35b3480156108d6575f80fd5b506108df611c6c565b6040516108ec9190613f26565b60405180910390f35b348015610900575f80fd5b50610909611c7f565b6040516109169190614a7e565b60405180910390f35b34801561092a575f80fd5b50610945600480360381019061094091906142b4565b611c94565b005b610961600480360381019061095c9190614b47565b611cb9565b005b61097d60048036038101906109789190614bc7565b611d2b565b005b34801561098a575f80fd5b506109a560048036038101906109a0919061411d565b611f8b565b6040516109b29190614c74565b60405180910390f35b3480156109c6575f80fd5b506109e160048036038101906109dc919061411d565b611ff5565b6040516109ee91906140d3565b60405180910390f35b348015610a02575f80fd5b50610a1d6004803603810190610a189190614538565b612118565b604051610a2a9190613f57565b60405180910390f35b348015610a3e575f80fd5b50610a596004803603810190610a54919061411d565b612236565b005b348015610a66575f80fd5b50610a816004803603810190610a7c9190614cb7565b612248565b005b348015610a8e575f80fd5b50610aa96004803603810190610aa49190614dd3565b612313565b604051610ab6919061451f565b60405180910390f35b348015610aca575f80fd5b50610ae56004803603810190610ae091906142b4565b6123a9565b005b348015610af2575f80fd5b50610b0d6004803603810190610b089190614e2d565b6123ce565b604051610b1a9190613f26565b60405180910390f35b348015610b2e575f80fd5b50610b496004803603810190610b449190614e6b565b61245c565b604051610b569190613f57565b60405180910390f35b348015610b6a575f80fd5b50610b856004803603810190610b809190614538565b612734565b005b348015610b92575f80fd5b50610bad6004803603810190610ba89190614f12565b6127b6565b005b348015610bba575f80fd5b50610bc361286a565b604051610bd09190613f26565b60405180910390f35b348015610be4575f80fd5b50610bff6004803603810190610bfa919061411d565b61287d565b005b5f610c0b826128cf565b80610c1b5750610c1a82612960565b5b9050919050565b60105481565b610c306129d9565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c95576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c9f8282612a57565b5050565b606060028054610cb290614f6a565b80601f0160208091040260200160405190810160405280929190818152602001828054610cde90614f6a565b8015610d295780601f10610d0057610100808354040283529160200191610d29565b820191905f5260205f20905b815481529060010190602001808311610d0c57829003601f168201915b5050505050905090565b5f610d3d82612be7565b610d73576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610db781612c41565b610dd357610dc3612c47565b15610dd257610dd181612c4f565b5b5b610ddd8383612c8e565b505050565b5f610deb612dcd565b6001545f540303905090565b5f80600e549150610e06610de2565b90509091565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e6657610e4933612c41565b610e6557610e55612c47565b15610e6457610e6333612c4f565b5b5b5b610e71848484612dd1565b50505050565b5f805f60095f8681526020019081526020015f206040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16036110005760086040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b5f6110096130df565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866110359190614fc7565b61103f9190615035565b9050815f0151819350935050509250929050565b61105b6129d9565b80600d5f6101000a81548160ff02191690831515021790555050565b5f600d5f9054906101000a900460ff16905090565b6110a683838360405180602001604052805f815250611cb9565b505050565b5f805f90505b6004808111156110c4576110c36144ac565b5b60ff1681101561111e576110eb8160048111156110e4576110e36144ac565b5b85856130e8565b1561110b57806004811115611103576111026144ac565b5b915050611124565b808061111690615065565b9150506110b1565b50600490505b92915050565b6012602052805f5260405f205f915090505481565b6111476129d9565b8060135f84600481111561115e5761115d6144ac565b5b60048111156111705761116f6144ac565b5b81526020019081526020015f20819055507f089a30a7f1f4e31d61218561e77dba54e848084676ee8aa106075cb12467d4c98260135f8560048111156111b9576111b86144ac565b5b60048111156111cb576111ca6144ac565b5b81526020019081526020015f20546040516111e79291906150bb565b60405180910390a15050565b6111fb6129d9565b8181600b918261120c929190615289565b505050565b6112196129d9565b8181600c918261122a929190615289565b505050565b5f8061123b84846110ab565b90505f915060016003811115611254576112536144ac565b5b600d60039054906101000a900460ff166003811115611276576112756144ac565b5b036112e0575f600481111561128e5761128d6144ac565b5b8160048111156112a1576112a06144ac565b5b14806112d15750600160048111156112bc576112bb6144ac565b5b8160048111156112cf576112ce6144ac565b5b145b156112db57600191505b6113c2565b600260038111156112f4576112f36144ac565b5b600d60039054906101000a900460ff166003811115611316576113156144ac565b5b03611381576002600481111561132f5761132e6144ac565b5b816004811115611342576113416144ac565b5b148061137257506003600481111561135d5761135c6144ac565b5b8160048111156113705761136f6144ac565b5b145b1561137c57600191505b6113c1565b600380811115611394576113936144ac565b5b600d60039054906101000a900460ff1660038111156113b6576113b56144ac565b5b036113c057600191505b5b5b5092915050565b60605f8383905090505f8167ffffffffffffffff8111156113ed576113ec6142e3565b5b60405190808252806020026020018201604052801561142657816020015b611413613d73565b81526020019060019003908161140b5790505b5090505f5b82811461147d5761145486868381811061144857611447615356565b5b90506020020135611f8b565b82828151811061146757611466615356565b5b602002602001018190525080600101905061142b565b50809250505092915050565b6114916129d9565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114f6576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e5481611502610de2565b61150c9190615383565b111561155c5761151a610de2565b81600e546040517f9667b1fc000000000000000000000000000000000000000000000000000000008152600401611553939291906153b6565b60405180910390fd5b611566828261321e565b5050565b5f611574826133c7565b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115e1576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b6116386129d9565b6116415f61348a565b565b61164b6129d9565b8060118190555050565b61165d6129d9565b60016003811115611671576116706144ac565b5b816003811115611684576116836144ac565b5b6003811115611696576116956144ac565b5b1015806116d957506003808111156116b1576116b06144ac565b5b8160038111156116c4576116c36144ac565b5b60038111156116d6576116d56144ac565b5b11155b61171a57806040517fd557d6ec0000000000000000000000000000000000000000000000000000000081526004016117119190613f57565b60405180910390fd5b80600381111561172d5761172c6144ac565b5b600d60036101000a81548160ff02191690836003811115611751576117506144ac565b5b021790555050565b60605f805f6117678561157b565b90505f8167ffffffffffffffff811115611784576117836142e3565b5b6040519080825280602002602001820160405280156117b25781602001602082028036833780820191505090505b5090506117bd613d73565b5f6117c6612dcd565b90505b838614611887576117d98161354d565b9150816040015161187c575f73ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff161461182157815f015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361187b578083878060010198508151811061186e5761186d615356565b5b6020026020010181815250505b5b8060010190506117c9565b508195505050505050919050565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546118cc90614f6a565b80601f01602080910402602001604051908101604052809291908181526020018280546118f890614f6a565b80156119435780601f1061191a57610100808354040283529160200191611943565b820191905f5260205f20905b81548152906001019060200180831161192657829003601f168201915b5050505050905090565b6060818310611988576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80611992613576565b905061199c612dcd565b8510156119ae576119ab612dcd565b94505b808411156119ba578093505b5f6119c48761157b565b9050848610156119e6575f8686039050818110156119e0578091505b506119ea565b5f90505b5f8167ffffffffffffffff811115611a0557611a046142e3565b5b604051908082528060200260200182016040528015611a335781602001602082028036833780820191505090505b5090505f8203611a495780945050505050611b45565b5f611a5388611f8b565b90505f8160400151611a6657815f015190505b5f8990505b888114158015611a7b5750848714155b15611b3757611a898161354d565b92508260400151611b2c575f73ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff1614611ad157825f015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b2b5780848880600101995081518110611b1e57611b1d615356565b5b6020026020010181815250505b5b806001019050611a6b565b508583528296505050505050505b9392505050565b81611b5681612c41565b611b7257611b62612c47565b15611b7157611b7081612c4f565b5b5b611b7c838361357e565b505050565b5f805f600d60039054906101000a900460ff16925060145f846003811115611bac57611bab6144ac565b5b6003811115611bbe57611bbd6144ac565b5b81526020019081526020015f205f60028110611bdd57611bdc615356565b5b600891828204019190066004029054906101000a900463ffffffff16915060145f846003811115611c1157611c106144ac565b5b6003811115611c2357611c226144ac565b5b81526020019081526020015f20600160028110611c4357611c42615356565b5b600891828204019190066004029054906101000a900463ffffffff169050909192565b60115481565b600d60029054906101000a900460ff1681565b600f5f9054906101000a900463ffffffff1681565b611c9c6129d9565b80600d60016101000a81548160ff02191690831515021790555050565b611cc4848484610e0c565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14611d2557611cee84848484613684565b611d24576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600d60029054906101000a900460ff1615611d72576040517f1309a56300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d7c338261122f565b611dd95733611d8b33836110ab565b600d60039054906101000a900460ff166040517fa82f2e89000000000000000000000000000000000000000000000000000000008152600401611dd0939291906153eb565b60405180910390fd5b611de233612118565b821115611e32573382611df433612118565b6040517f3e1544e7000000000000000000000000000000000000000000000000000000008152600401611e2993929190615420565b60405180910390fd5b600e5482611e3e610de2565b611e489190615383565b1115611e9857611e56610de2565b82600e546040517f9667b1fc000000000000000000000000000000000000000000000000000000008152600401611e8f939291906153b6565b60405180910390fd5b5f611ea433848461245c565b9050803414611eee573334826040517f5c54305e000000000000000000000000000000000000000000000000000000008152600401611ee593929190615420565b60405180910390fd5b600380811115611f0157611f006144ac565b5b600d60039054906101000a900460ff166003811115611f2357611f226144ac565b5b03611f7c578260125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611f749190615383565b925050819055505b611f86338461321e565b505050565b611f93613d73565b611f9b613d73565b611fa3612dcd565b831080611fb75750611fb3613576565b8310155b15611fc55780915050611ff0565b611fce8361354d565b9050806040015115611fe35780915050611ff0565b611fec836137cf565b9150505b919050565b606061200082612be7565b612036576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5f9054906101000a900460ff166120b1575f600c805461205790614f6a565b9050036120725760405180602001604052805f8152506120aa565b600c6120896001846120849190615383565b6137ef565b60405160200161209a929190615559565b6040516020818303038152906040525b9050612113565b5f6120ba61383e565b90505f8151036120d85760405180602001604052805f81525061210f565b806120ee6001856120e99190615383565b6137ef565b6040516020016120ff929190615587565b6040516020818303038152906040525b9150505b919050565b5f8060038081111561212d5761212c6144ac565b5b600d60039054906101000a900460ff16600381111561214f5761214e6144ac565b5b146121645761215d836138ce565b90506121a5565b60125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505b80600f5f9054906101000a900463ffffffff1663ffffffff16039150600f5f9054906101000a900463ffffffff1663ffffffff168211156122305781600f5f9054906101000a900463ffffffff166040517f7ae596850000000000000000000000000000000000000000000000000000000081526004016122279291906155e5565b60405180910390fd5b50919050565b61223e6129d9565b8060108190555050565b6122506129d9565b60405180604001604052808363ffffffff1663ffffffff1681526020018263ffffffff1663ffffffff1681525060145f856003811115612293576122926144ac565b5b60038111156122a5576122a46144ac565b5b60038111156122b7576122b66144ac565b5b81526020019081526020015f209060026122d2929190613dbe565b507f7337c2ac1c7e3527afc90887e9d5e335bdba7b517a1d36fd47bf52dc046ee96e8383836040516123069392919061560c565b60405180910390a1505050565b5f805f90505b60048081111561232c5761232b6144ac565b5b60ff1681101561239d5761236a81600481111561234c5761234b6144ac565b5b858584600481106123605761235f615356565b5b60200201516130e8565b1561238a57806004811115612382576123816144ac565b5b9150506123a3565b808061239590615065565b915050612319565b50600490505b92915050565b6123b16129d9565b80600d60026101000a81548160ff02191690831515021790555050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f80612468858461122f565b9050806124c8578461247a86856110ab565b600d60039054906101000a900460ff166040517fa82f2e890000000000000000000000000000000000000000000000000000000081526004016124bf939291906153eb565b60405180910390fd5b5f6124d286612118565b9050808511156125255785856124e788612118565b6040517f3e1544e700000000000000000000000000000000000000000000000000000000815260040161251c93929190615420565b60405180910390fd5b5f8503612536575f9250505061272d565b5f61254187866110ab565b905060016003811115612557576125566144ac565b5b600d60039054906101000a900460ff166003811115612579576125786144ac565b5b03612626575f6004811115612591576125906144ac565b5b8160048111156125a4576125a36144ac565b5b036125b4575f935050505061272d565b600160048111156125c8576125c76144ac565b5b8160048111156125db576125da6144ac565b5b03612621576002821480156125fb575060028614806125fa5750600186145b5b1561260d57601154935050505061272d565b60018203612620575f935050505061272d565b5b612719565b6002600381111561263a576126396144ac565b5b600d60039054906101000a900460ff16600381111561265c5761265b6144ac565b5b036127185760026004811115612675576126746144ac565b5b816004811115612688576126876144ac565b5b036126d2576002821480156126a8575060028614806126a75750600186145b5b156126ba57601054935050505061272d565b600182036126cd575f935050505061272d565b612717565b600360048111156126e6576126e56144ac565b5b8160048111156126f9576126f86144ac565b5b03612716576010548661270c9190614fc7565b935050505061272d565b5b5b5b601054866127279190614fc7565b93505050505b9392505050565b61273c6129d9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036127aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a1906156b1565b60405180910390fd5b6127b38161348a565b50565b6127be6129d9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612823576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015612866573d5f803e3d5ffd5b5050565b600d60019054906101000a900460ff1681565b6128856129d9565b5f600e54905081600e819055507f37e39534cefc6f74cd145104ad190940e0fa968dc44d7f4e50cf4549a318477e81836040516128c39291906141ae565b60405180910390a15050565b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061292957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806129595750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129d257506129d182613922565b5b9050919050565b6129e161398b565b73ffffffffffffffffffffffffffffffffffffffff166129ff611895565b73ffffffffffffffffffffffffffffffffffffffff1614612a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4c90615719565b60405180910390fd5b565b612a5f6130df565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab4906157a7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b229061580f565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681525060085f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b5f81612bf1612dcd565b11158015612bff57505f5482105b8015612c3a57505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f919050565b5f6001905090565b69c61711340011223344555f5230601a5280603a525f80604460166daaeb6d7670e522a718067333cd4e5afa612c87573d5f803e3d5ffd5b5f603a5250565b5f612c988261156a565b90508073ffffffffffffffffffffffffffffffffffffffff16612cb9613992565b73ffffffffffffffffffffffffffffffffffffffff1614612d1c57612ce581612ce0613992565b6123ce565b612d1b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f90565b5f612ddb826133c7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612e42576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80612e4d84613999565b91509150612e638187612e5e613992565b6139bc565b612eaf57612e7886612e73613992565b6123ce565b612eae576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f14576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f2186868660016139ff565b8015612f2b575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815460010191905081905550612ff385612fcf888887613a05565b7c020000000000000000000000000000000000000000000000000000000017613a2c565b60045f8681526020019081526020015f20819055505f7c020000000000000000000000000000000000000000000000000000000084160361306f575f6001850190505f60045f8381526020019081526020015f20540361306d575f54811461306c578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130d78686866001613a56565b505050505050565b5f612710905090565b5f8060048111156130fc576130fb6144ac565b5b84600481111561310f5761310e6144ac565b5b036131255761311e8383613a5c565b9050613217565b60016004811115613139576131386144ac565b5b84600481111561314c5761314b6144ac565b5b036131625761315b8383613aa5565b9050613217565b60026004811115613176576131756144ac565b5b846004811115613189576131886144ac565b5b0361319f576131988383613aef565b9050613217565b600360048111156131b3576131b26144ac565b5b8460048111156131c6576131c56144ac565b5b036131dc576131d58383613b39565b9050613217565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320e90615877565b60405180910390fd5b9392505050565b5f805490505f820361325c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132685f8483856139ff565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055506132da836132cb5f865f613a05565b6132d485613b83565b17613a2c565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146133745780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460018101905061333b565b505f82036133ae576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f8190555050506133c25f848385613a56565b505050565b5f80829050806133d5612dcd565b11613453575f54811015613452575f60045f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603613450575b5f81036134465760045f836001900393508381526020019081526020015f2054905061341f565b8092505050613485565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613555613d73565b61356f60045f8481526020019081526020015f2054613b92565b9050919050565b5f8054905090565b8060075f61358a613992565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16613633613992565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516136789190613f26565b60405180910390a35050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136a9613992565b8786866040518563ffffffff1660e01b81526004016136cb94939291906158e7565b6020604051808303815f875af192505050801561370657506040513d601f19601f820116820180604052508101906137039190615945565b60015b61377c573d805f8114613734576040519150601f19603f3d011682016040523d82523d5f602084013e613739565b606091505b505f815103613774576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6137d7613d73565b6137e86137e3836133c7565b613b92565b9050919050565b606060a060405101806040526020810391505f825281835b60011561382957600184039350600a81066030018453600a8104905080613807575b50828103602084039350808452505050919050565b6060600b805461384d90614f6a565b80601f016020809104026020016040519081016040528092919081815260200182805461387990614f6a565b80156138c45780601f1061389b576101008083540402835291602001916138c4565b820191905f5260205f20905b8154815290600101906020018083116138a757829003601f168201915b5050505050905090565b5f67ffffffffffffffff604060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054901c169050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b5f33905090565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8613a1b868684613c46565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b5f613a9d828460135f806004811115613a7857613a776144ac565b5b6004811115613a8a57613a896144ac565b5b81526020019081526020015f2054613c4e565b905092915050565b5f613ae7828460135f60016004811115613ac257613ac16144ac565b5b6004811115613ad457613ad36144ac565b5b81526020019081526020015f2054613c4e565b905092915050565b5f613b31828460135f60026004811115613b0c57613b0b6144ac565b5b6004811115613b1e57613b1d6144ac565b5b81526020019081526020015f2054613c4e565b905092915050565b5f613b7b828460135f60036004811115613b5657613b556144ac565b5b6004811115613b6857613b676144ac565b5b81526020019081526020015f2054613c4e565b905092915050565b5f6001821460e11b9050919050565b613b9a613d73565b81815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff16815250505f7c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b5f9392505050565b5f8083604051602001613c619190614157565b60405160208183030381529060405280519060200120604051602001613c879190615990565b6040516020818303038152906040528051906020012090505f613cab868584613ccb565b90508015613cbe57600192505050613cc4565b5f925050505b9392505050565b5f82613cd78584613ce1565b1490509392505050565b5f808290505f5b8451811015613d2a57613d1582868381518110613d0857613d07615356565b5b6020026020010151613d35565b91508080613d2290615065565b915050613ce8565b508091505092915050565b5f818310613d4c57613d478284613d5f565b613d57565b613d568383613d5f565b5b905092915050565b5f825f528160205260405f20905092915050565b60405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f62ffffff1681525090565b826002600701600890048101928215613e4f579160200282015f5b83821115613e1d57835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302613dd9565b8015613e4d5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302613e1d565b505b509050613e5c9190613e60565b5090565b5b80821115613e77575f815f905550600101613e61565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ec081613e8c565b8114613eca575f80fd5b50565b5f81359050613edb81613eb7565b92915050565b5f60208284031215613ef657613ef5613e84565b5b5f613f0384828501613ecd565b91505092915050565b5f8115159050919050565b613f2081613f0c565b82525050565b5f602082019050613f395f830184613f17565b92915050565b5f819050919050565b613f5181613f3f565b82525050565b5f602082019050613f6a5f830184613f48565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613f9982613f70565b9050919050565b613fa981613f8f565b8114613fb3575f80fd5b50565b5f81359050613fc481613fa0565b92915050565b5f6bffffffffffffffffffffffff82169050919050565b613fea81613fca565b8114613ff4575f80fd5b50565b5f8135905061400581613fe1565b92915050565b5f806040838503121561402157614020613e84565b5b5f61402e85828601613fb6565b925050602061403f85828601613ff7565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015614080578082015181840152602081019050614065565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6140a582614049565b6140af8185614053565b93506140bf818560208601614063565b6140c88161408b565b840191505092915050565b5f6020820190508181035f8301526140eb818461409b565b905092915050565b6140fc81613f3f565b8114614106575f80fd5b50565b5f81359050614117816140f3565b92915050565b5f6020828403121561413257614131613e84565b5b5f61413f84828501614109565b91505092915050565b61415181613f8f565b82525050565b5f60208201905061416a5f830184614148565b92915050565b5f806040838503121561418657614185613e84565b5b5f61419385828601613fb6565b92505060206141a485828601614109565b9150509250929050565b5f6040820190506141c15f830185613f48565b6141ce6020830184613f48565b9392505050565b5f805f606084860312156141ec576141eb613e84565b5b5f6141f986828701613fb6565b935050602061420a86828701613fb6565b925050604061421b86828701614109565b9150509250925092565b5f806040838503121561423b5761423a613e84565b5b5f61424885828601614109565b925050602061425985828601614109565b9150509250929050565b5f6040820190506142765f830185614148565b6142836020830184613f48565b9392505050565b61429381613f0c565b811461429d575f80fd5b50565b5f813590506142ae8161428a565b92915050565b5f602082840312156142c9576142c8613e84565b5b5f6142d6848285016142a0565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6143198261408b565b810181811067ffffffffffffffff82111715614338576143376142e3565b5b80604052505050565b5f61434a613e7b565b90506143568282614310565b919050565b5f67ffffffffffffffff821115614375576143746142e3565b5b602082029050602081019050919050565b5f80fd5b5f819050919050565b61439c8161438a565b81146143a6575f80fd5b50565b5f813590506143b781614393565b92915050565b5f6143cf6143ca8461435b565b614341565b905080838252602082019050602084028301858111156143f2576143f1614386565b5b835b8181101561441b578061440788826143a9565b8452602084019350506020810190506143f4565b5050509392505050565b5f82601f830112614439576144386142df565b5b81356144498482602086016143bd565b91505092915050565b5f806040838503121561446857614467613e84565b5b5f61447585828601613fb6565b925050602083013567ffffffffffffffff81111561449657614495613e88565b5b6144a285828601614425565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600581106144ea576144e96144ac565b5b50565b5f8190506144fa826144d9565b919050565b5f614509826144ed565b9050919050565b614519816144ff565b82525050565b5f6020820190506145325f830184614510565b92915050565b5f6020828403121561454d5761454c613e84565b5b5f61455a84828501613fb6565b91505092915050565b6005811061456f575f80fd5b50565b5f8135905061458081614563565b92915050565b5f806040838503121561459c5761459b613e84565b5b5f6145a985828601614572565b92505060206145ba858286016143a9565b9150509250929050565b5f80fd5b5f8083601f8401126145dd576145dc6142df565b5b8235905067ffffffffffffffff8111156145fa576145f96145c4565b5b60208301915083600182028301111561461657614615614386565b5b9250929050565b5f806020838503121561463357614632613e84565b5b5f83013567ffffffffffffffff8111156146505761464f613e88565b5b61465c858286016145c8565b92509250509250929050565b5f8083601f84011261467d5761467c6142df565b5b8235905067ffffffffffffffff81111561469a576146996145c4565b5b6020830191508360208202830111156146b6576146b5614386565b5b9250929050565b5f80602083850312156146d3576146d2613e84565b5b5f83013567ffffffffffffffff8111156146f0576146ef613e88565b5b6146fc85828601614668565b92509250509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61473a81613f8f565b82525050565b5f67ffffffffffffffff82169050919050565b61475c81614740565b82525050565b61476b81613f0c565b82525050565b5f62ffffff82169050919050565b61478881614771565b82525050565b608082015f8201516147a25f850182614731565b5060208201516147b56020850182614753565b5060408201516147c86040850182614762565b5060608201516147db606085018261477f565b50505050565b5f6147ec838361478e565b60808301905092915050565b5f602082019050919050565b5f61480e82614708565b6148188185614712565b935061482383614722565b805f5b8381101561485357815161483a88826147e1565b9750614845836147f8565b925050600181019050614826565b5085935050505092915050565b5f6020820190508181035f8301526148788184614804565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6148b281613f3f565b82525050565b5f6148c383836148a9565b60208301905092915050565b5f602082019050919050565b5f6148e582614880565b6148ef818561488a565b93506148fa8361489a565b805f5b8381101561492a57815161491188826148b8565b975061491c836148cf565b9250506001810190506148fd565b5085935050505092915050565b5f6020820190508181035f83015261494f81846148db565b905092915050565b5f805f6060848603121561496e5761496d613e84565b5b5f61497b86828701613fb6565b935050602061498c86828701614109565b925050604061499d86828701614109565b9150509250925092565b5f80604083850312156149bd576149bc613e84565b5b5f6149ca85828601613fb6565b92505060206149db858286016142a0565b9150509250929050565b600481106149f6576149f56144ac565b5b50565b5f819050614a06826149e5565b919050565b5f614a15826149f9565b9050919050565b614a2581614a0b565b82525050565b5f63ffffffff82169050919050565b614a4381614a2b565b82525050565b5f606082019050614a5c5f830186614a1c565b614a696020830185614a3a565b614a766040830184614a3a565b949350505050565b5f602082019050614a915f830184614a3a565b92915050565b5f80fd5b5f67ffffffffffffffff821115614ab557614ab46142e3565b5b614abe8261408b565b9050602081019050919050565b828183375f83830152505050565b5f614aeb614ae684614a9b565b614341565b905082815260208101848484011115614b0757614b06614a97565b5b614b12848285614acb565b509392505050565b5f82601f830112614b2e57614b2d6142df565b5b8135614b3e848260208601614ad9565b91505092915050565b5f805f8060808587031215614b5f57614b5e613e84565b5b5f614b6c87828801613fb6565b9450506020614b7d87828801613fb6565b9350506040614b8e87828801614109565b925050606085013567ffffffffffffffff811115614baf57614bae613e88565b5b614bbb87828801614b1a565b91505092959194509250565b5f8060408385031215614bdd57614bdc613e84565b5b5f614bea85828601614109565b925050602083013567ffffffffffffffff811115614c0b57614c0a613e88565b5b614c1785828601614425565b9150509250929050565b608082015f820151614c355f850182614731565b506020820151614c486020850182614753565b506040820151614c5b6040850182614762565b506060820151614c6e606085018261477f565b50505050565b5f608082019050614c875f830184614c21565b92915050565b614c9681614a2b565b8114614ca0575f80fd5b50565b5f81359050614cb181614c8d565b92915050565b5f805f60608486031215614cce57614ccd613e84565b5b5f614cdb86828701614109565b9350506020614cec86828701614ca3565b9250506040614cfd86828701614ca3565b9150509250925092565b5f67ffffffffffffffff821115614d2157614d206142e3565b5b602082029050919050565b5f614d3e614d3984614d07565b614341565b90508060208402830185811115614d5857614d57614386565b5b835b81811015614d9f57803567ffffffffffffffff811115614d7d57614d7c6142df565b5b808601614d8a8982614425565b85526020850194505050602081019050614d5a565b5050509392505050565b5f82601f830112614dbd57614dbc6142df565b5b6004614dca848285614d2c565b91505092915050565b5f8060408385031215614de957614de8613e84565b5b5f614df685828601613fb6565b925050602083013567ffffffffffffffff811115614e1757614e16613e88565b5b614e2385828601614da9565b9150509250929050565b5f8060408385031215614e4357614e42613e84565b5b5f614e5085828601613fb6565b9250506020614e6185828601613fb6565b9150509250929050565b5f805f60608486031215614e8257614e81613e84565b5b5f614e8f86828701613fb6565b9350506020614ea086828701614109565b925050604084013567ffffffffffffffff811115614ec157614ec0613e88565b5b614ecd86828701614425565b9150509250925092565b5f614ee182613f70565b9050919050565b614ef181614ed7565b8114614efb575f80fd5b50565b5f81359050614f0c81614ee8565b92915050565b5f60208284031215614f2757614f26613e84565b5b5f614f3484828501614efe565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614f8157607f821691505b602082108103614f9457614f93614f3d565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614fd182613f3f565b9150614fdc83613f3f565b9250828202614fea81613f3f565b9150828204841483151761500157615000614f9a565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61503f82613f3f565b915061504a83613f3f565b92508261505a57615059615008565b5b828204905092915050565b5f61506f82613f3f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036150a1576150a0614f9a565b5b600182019050919050565b6150b58161438a565b82525050565b5f6040820190506150ce5f830185614510565b6150db60208301846150ac565b9392505050565b5f82905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026151487fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261510d565b615152868361510d565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61518d61518861518384613f3f565b61516a565b613f3f565b9050919050565b5f819050919050565b6151a683615173565b6151ba6151b282615194565b848454615119565b825550505050565b5f90565b6151ce6151c2565b6151d981848461519d565b505050565b5b818110156151fc576151f15f826151c6565b6001810190506151df565b5050565b601f82111561524157615212816150ec565b61521b846150fe565b8101602085101561522a578190505b61523e615236856150fe565b8301826151de565b50505b505050565b5f82821c905092915050565b5f6152615f1984600802615246565b1980831691505092915050565b5f6152798383615252565b9150826002028217905092915050565b61529383836150e2565b67ffffffffffffffff8111156152ac576152ab6142e3565b5b6152b68254614f6a565b6152c1828285615200565b5f601f8311600181146152ee575f84156152dc578287013590505b6152e6858261526e565b86555061534d565b601f1984166152fc866150ec565b5f5b82811015615323578489013582556001820191506020850194506020810190506152fe565b86831015615340578489013561533c601f891682615252565b8355505b6001600288020188555050505b50505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61538d82613f3f565b915061539883613f3f565b92508282019050808211156153b0576153af614f9a565b5b92915050565b5f6060820190506153c95f830186613f48565b6153d66020830185613f48565b6153e36040830184613f48565b949350505050565b5f6060820190506153fe5f830186614148565b61540b6020830185614510565b6154186040830184614a1c565b949350505050565b5f6060820190506154335f830186614148565b6154406020830185613f48565b61544d6040830184613f48565b949350505050565b5f81905092915050565b5f815461546b81614f6a565b6154758186615455565b9450600182165f811461548f57600181146154a4576154d6565b60ff19831686528115158202860193506154d6565b6154ad856150ec565b5f5b838110156154ce578154818901526001820191506020810190506154af565b838801955050505b50505092915050565b5f6154e982614049565b6154f38185615455565b9350615503818560208601614063565b80840191505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f615543600583615455565b915061554e8261550f565b600582019050919050565b5f615564828561545f565b915061557082846154df565b915061557b82615537565b91508190509392505050565b5f61559282856154df565b915061559e82846154df565b91506155a982615537565b91508190509392505050565b5f6155cf6155ca6155c584614a2b565b61516a565b613f3f565b9050919050565b6155df816155b5565b82525050565b5f6040820190506155f85f830185613f48565b61560560208301846155d6565b9392505050565b5f60608201905061561f5f830186613f48565b61562c6020830185614a3a565b6156396040830184614a3a565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61569b602683614053565b91506156a682615641565b604082019050919050565b5f6020820190508181035f8301526156c88161568f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f615703602083614053565b915061570e826156cf565b602082019050919050565b5f6020820190508181035f830152615730816156f7565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c206578636565645f8201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b5f615791602a83614053565b915061579c82615737565b604082019050919050565b5f6020820190508181035f8301526157be81615785565b9050919050565b7f455243323938313a20696e76616c6964207265636569766572000000000000005f82015250565b5f6157f9601983614053565b9150615804826157c5565b602082019050919050565b5f6020820190508181035f830152615826816157ed565b9050919050565b7f526f6c6520646f6573206e6f74206578697374000000000000000000000000005f82015250565b5f615861601383614053565b915061586c8261582d565b602082019050919050565b5f6020820190508181035f83015261588e81615855565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6158b982615895565b6158c3818561589f565b93506158d3818560208601614063565b6158dc8161408b565b840191505092915050565b5f6080820190506158fa5f830187614148565b6159076020830186614148565b6159146040830185613f48565b818103606083015261592681846158af565b905095945050505050565b5f8151905061593f81613eb7565b92915050565b5f6020828403121561595a57615959613e84565b5b5f61596784828501615931565b91505092915050565b5f819050919050565b61598a6159858261438a565b615970565b82525050565b5f61599b8284615979565b6020820191508190509291505056fea2646970667358221220e343b903dc5dea315b847e7450a1885ef94b770aacc1c5a4c6e0f1fb91b91ed464736f6c6343000814003300000000000000000000000000000000000000000000000000000000000003e700000000000000000000000012d9e9f49abad38e5fa7f646f4f7652ecce44638

Deployed Bytecode

0x6080604052600436106102e3575f3560e01c80637d3e1ee41161018f578063c23dc68f116100db578063e601af7311610094578063f2fde38b1161006e578063f2fde38b14610b5f578063fa09e63014610b87578063fb796e6c14610baf578063fd6ce9e414610bd9576102e3565b8063e601af7314610abf578063e985e9c514610ae7578063f299218714610b23576102e3565b8063c23dc68f1461097f578063c87b56dd146109bb578063ca286de7146109f7578063d089f41614610a33578063e25aca3214610a5b578063e2a26d7314610a83576102e3565b8063a3a40ea511610148578063b228d92511610122578063b228d925146108f5578063b7c0b8e81461091f578063b88d4fde14610947578063ba41b0c614610963576102e3565b8063a3a40ea514610875578063ae440f48146108a1578063b187bd26146108cb576102e3565b80637d3e1ee4146107595780638462151c146107815780638da5cb5b146107bd57806395d89b41146107e757806399a2557a14610811578063a22cb4651461084d576102e3565b806342842e0e1161024e578063593df74a116102075780636352211e116101e15780636352211e146106a357806370a08231146106df578063715018a61461071b57806374e6ddf714610731576102e3565b8063593df74a146106035780635bbb21771461063f578063627804af1461067b576102e3565b806342842e0e146104f75780634b1097d2146105135780634e810e261461054f57806354d77e0e1461058b57806355f804b3146105b357806357f9f9a9146105db576102e3565b806318160ddd116102a057806318160ddd146103f757806320edeaf31461042157806323b872dd1461044c5780632a55205a14610468578063301f8cfc146104a55780633fecf819146104cd576102e3565b806301ffc9a7146102e757806302830aa61461032357806304634d8d1461034d57806306fdde0314610375578063081812fc1461039f578063095ea7b3146103db575b5f80fd5b3480156102f2575f80fd5b5061030d60048036038101906103089190613ee1565b610c01565b60405161031a9190613f26565b60405180910390f35b34801561032e575f80fd5b50610337610c22565b6040516103449190613f57565b60405180910390f35b348015610358575f80fd5b50610373600480360381019061036e919061400b565b610c28565b005b348015610380575f80fd5b50610389610ca3565b60405161039691906140d3565b60405180910390f35b3480156103aa575f80fd5b506103c560048036038101906103c0919061411d565b610d33565b6040516103d29190614157565b60405180910390f35b6103f560048036038101906103f09190614170565b610dad565b005b348015610402575f80fd5b5061040b610de2565b6040516104189190613f57565b60405180910390f35b34801561042c575f80fd5b50610435610df7565b6040516104439291906141ae565b60405180910390f35b610466600480360381019061046191906141d5565b610e0c565b005b348015610473575f80fd5b5061048e60048036038101906104899190614225565b610e77565b60405161049c929190614263565b60405180910390f35b3480156104b0575f80fd5b506104cb60048036038101906104c691906142b4565b611053565b005b3480156104d8575f80fd5b506104e1611077565b6040516104ee9190613f26565b60405180910390f35b610511600480360381019061050c91906141d5565b61108c565b005b34801561051e575f80fd5b5061053960048036038101906105349190614452565b6110ab565b604051610546919061451f565b60405180910390f35b34801561055a575f80fd5b5061057560048036038101906105709190614538565b61112a565b6040516105829190613f57565b60405180910390f35b348015610596575f80fd5b506105b160048036038101906105ac9190614586565b61113f565b005b3480156105be575f80fd5b506105d960048036038101906105d4919061461d565b6111f3565b005b3480156105e6575f80fd5b5061060160048036038101906105fc919061461d565b611211565b005b34801561060e575f80fd5b5061062960048036038101906106249190614452565b61122f565b6040516106369190613f26565b60405180910390f35b34801561064a575f80fd5b50610665600480360381019061066091906146bd565b6113c9565b6040516106729190614860565b60405180910390f35b348015610686575f80fd5b506106a1600480360381019061069c9190614170565b611489565b005b3480156106ae575f80fd5b506106c960048036038101906106c4919061411d565b61156a565b6040516106d69190614157565b60405180910390f35b3480156106ea575f80fd5b5061070560048036038101906107009190614538565b61157b565b6040516107129190613f57565b60405180910390f35b348015610726575f80fd5b5061072f611630565b005b34801561073c575f80fd5b506107576004803603810190610752919061411d565b611643565b005b348015610764575f80fd5b5061077f600480360381019061077a919061411d565b611655565b005b34801561078c575f80fd5b506107a760048036038101906107a29190614538565b611759565b6040516107b49190614937565b60405180910390f35b3480156107c8575f80fd5b506107d1611895565b6040516107de9190614157565b60405180910390f35b3480156107f2575f80fd5b506107fb6118bd565b60405161080891906140d3565b60405180910390f35b34801561081c575f80fd5b5061083760048036038101906108329190614957565b61194d565b6040516108449190614937565b60405180910390f35b348015610858575f80fd5b50610873600480360381019061086e91906149a7565b611b4c565b005b348015610880575f80fd5b50610889611b81565b60405161089893929190614a49565b60405180910390f35b3480156108ac575f80fd5b506108b5611c66565b6040516108c29190613f57565b60405180910390f35b3480156108d6575f80fd5b506108df611c6c565b6040516108ec9190613f26565b60405180910390f35b348015610900575f80fd5b50610909611c7f565b6040516109169190614a7e565b60405180910390f35b34801561092a575f80fd5b50610945600480360381019061094091906142b4565b611c94565b005b610961600480360381019061095c9190614b47565b611cb9565b005b61097d60048036038101906109789190614bc7565b611d2b565b005b34801561098a575f80fd5b506109a560048036038101906109a0919061411d565b611f8b565b6040516109b29190614c74565b60405180910390f35b3480156109c6575f80fd5b506109e160048036038101906109dc919061411d565b611ff5565b6040516109ee91906140d3565b60405180910390f35b348015610a02575f80fd5b50610a1d6004803603810190610a189190614538565b612118565b604051610a2a9190613f57565b60405180910390f35b348015610a3e575f80fd5b50610a596004803603810190610a54919061411d565b612236565b005b348015610a66575f80fd5b50610a816004803603810190610a7c9190614cb7565b612248565b005b348015610a8e575f80fd5b50610aa96004803603810190610aa49190614dd3565b612313565b604051610ab6919061451f565b60405180910390f35b348015610aca575f80fd5b50610ae56004803603810190610ae091906142b4565b6123a9565b005b348015610af2575f80fd5b50610b0d6004803603810190610b089190614e2d565b6123ce565b604051610b1a9190613f26565b60405180910390f35b348015610b2e575f80fd5b50610b496004803603810190610b449190614e6b565b61245c565b604051610b569190613f57565b60405180910390f35b348015610b6a575f80fd5b50610b856004803603810190610b809190614538565b612734565b005b348015610b92575f80fd5b50610bad6004803603810190610ba89190614f12565b6127b6565b005b348015610bba575f80fd5b50610bc361286a565b604051610bd09190613f26565b60405180910390f35b348015610be4575f80fd5b50610bff6004803603810190610bfa919061411d565b61287d565b005b5f610c0b826128cf565b80610c1b5750610c1a82612960565b5b9050919050565b60105481565b610c306129d9565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c95576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c9f8282612a57565b5050565b606060028054610cb290614f6a565b80601f0160208091040260200160405190810160405280929190818152602001828054610cde90614f6a565b8015610d295780601f10610d0057610100808354040283529160200191610d29565b820191905f5260205f20905b815481529060010190602001808311610d0c57829003601f168201915b5050505050905090565b5f610d3d82612be7565b610d73576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610db781612c41565b610dd357610dc3612c47565b15610dd257610dd181612c4f565b5b5b610ddd8383612c8e565b505050565b5f610deb612dcd565b6001545f540303905090565b5f80600e549150610e06610de2565b90509091565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e6657610e4933612c41565b610e6557610e55612c47565b15610e6457610e6333612c4f565b5b5b5b610e71848484612dd1565b50505050565b5f805f60095f8681526020019081526020015f206040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16036110005760086040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b5f6110096130df565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866110359190614fc7565b61103f9190615035565b9050815f0151819350935050509250929050565b61105b6129d9565b80600d5f6101000a81548160ff02191690831515021790555050565b5f600d5f9054906101000a900460ff16905090565b6110a683838360405180602001604052805f815250611cb9565b505050565b5f805f90505b6004808111156110c4576110c36144ac565b5b60ff1681101561111e576110eb8160048111156110e4576110e36144ac565b5b85856130e8565b1561110b57806004811115611103576111026144ac565b5b915050611124565b808061111690615065565b9150506110b1565b50600490505b92915050565b6012602052805f5260405f205f915090505481565b6111476129d9565b8060135f84600481111561115e5761115d6144ac565b5b60048111156111705761116f6144ac565b5b81526020019081526020015f20819055507f089a30a7f1f4e31d61218561e77dba54e848084676ee8aa106075cb12467d4c98260135f8560048111156111b9576111b86144ac565b5b60048111156111cb576111ca6144ac565b5b81526020019081526020015f20546040516111e79291906150bb565b60405180910390a15050565b6111fb6129d9565b8181600b918261120c929190615289565b505050565b6112196129d9565b8181600c918261122a929190615289565b505050565b5f8061123b84846110ab565b90505f915060016003811115611254576112536144ac565b5b600d60039054906101000a900460ff166003811115611276576112756144ac565b5b036112e0575f600481111561128e5761128d6144ac565b5b8160048111156112a1576112a06144ac565b5b14806112d15750600160048111156112bc576112bb6144ac565b5b8160048111156112cf576112ce6144ac565b5b145b156112db57600191505b6113c2565b600260038111156112f4576112f36144ac565b5b600d60039054906101000a900460ff166003811115611316576113156144ac565b5b03611381576002600481111561132f5761132e6144ac565b5b816004811115611342576113416144ac565b5b148061137257506003600481111561135d5761135c6144ac565b5b8160048111156113705761136f6144ac565b5b145b1561137c57600191505b6113c1565b600380811115611394576113936144ac565b5b600d60039054906101000a900460ff1660038111156113b6576113b56144ac565b5b036113c057600191505b5b5b5092915050565b60605f8383905090505f8167ffffffffffffffff8111156113ed576113ec6142e3565b5b60405190808252806020026020018201604052801561142657816020015b611413613d73565b81526020019060019003908161140b5790505b5090505f5b82811461147d5761145486868381811061144857611447615356565b5b90506020020135611f8b565b82828151811061146757611466615356565b5b602002602001018190525080600101905061142b565b50809250505092915050565b6114916129d9565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114f6576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e5481611502610de2565b61150c9190615383565b111561155c5761151a610de2565b81600e546040517f9667b1fc000000000000000000000000000000000000000000000000000000008152600401611553939291906153b6565b60405180910390fd5b611566828261321e565b5050565b5f611574826133c7565b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115e1576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b6116386129d9565b6116415f61348a565b565b61164b6129d9565b8060118190555050565b61165d6129d9565b60016003811115611671576116706144ac565b5b816003811115611684576116836144ac565b5b6003811115611696576116956144ac565b5b1015806116d957506003808111156116b1576116b06144ac565b5b8160038111156116c4576116c36144ac565b5b60038111156116d6576116d56144ac565b5b11155b61171a57806040517fd557d6ec0000000000000000000000000000000000000000000000000000000081526004016117119190613f57565b60405180910390fd5b80600381111561172d5761172c6144ac565b5b600d60036101000a81548160ff02191690836003811115611751576117506144ac565b5b021790555050565b60605f805f6117678561157b565b90505f8167ffffffffffffffff811115611784576117836142e3565b5b6040519080825280602002602001820160405280156117b25781602001602082028036833780820191505090505b5090506117bd613d73565b5f6117c6612dcd565b90505b838614611887576117d98161354d565b9150816040015161187c575f73ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff161461182157815f015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361187b578083878060010198508151811061186e5761186d615356565b5b6020026020010181815250505b5b8060010190506117c9565b508195505050505050919050565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546118cc90614f6a565b80601f01602080910402602001604051908101604052809291908181526020018280546118f890614f6a565b80156119435780601f1061191a57610100808354040283529160200191611943565b820191905f5260205f20905b81548152906001019060200180831161192657829003601f168201915b5050505050905090565b6060818310611988576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80611992613576565b905061199c612dcd565b8510156119ae576119ab612dcd565b94505b808411156119ba578093505b5f6119c48761157b565b9050848610156119e6575f8686039050818110156119e0578091505b506119ea565b5f90505b5f8167ffffffffffffffff811115611a0557611a046142e3565b5b604051908082528060200260200182016040528015611a335781602001602082028036833780820191505090505b5090505f8203611a495780945050505050611b45565b5f611a5388611f8b565b90505f8160400151611a6657815f015190505b5f8990505b888114158015611a7b5750848714155b15611b3757611a898161354d565b92508260400151611b2c575f73ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff1614611ad157825f015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b2b5780848880600101995081518110611b1e57611b1d615356565b5b6020026020010181815250505b5b806001019050611a6b565b508583528296505050505050505b9392505050565b81611b5681612c41565b611b7257611b62612c47565b15611b7157611b7081612c4f565b5b5b611b7c838361357e565b505050565b5f805f600d60039054906101000a900460ff16925060145f846003811115611bac57611bab6144ac565b5b6003811115611bbe57611bbd6144ac565b5b81526020019081526020015f205f60028110611bdd57611bdc615356565b5b600891828204019190066004029054906101000a900463ffffffff16915060145f846003811115611c1157611c106144ac565b5b6003811115611c2357611c226144ac565b5b81526020019081526020015f20600160028110611c4357611c42615356565b5b600891828204019190066004029054906101000a900463ffffffff169050909192565b60115481565b600d60029054906101000a900460ff1681565b600f5f9054906101000a900463ffffffff1681565b611c9c6129d9565b80600d60016101000a81548160ff02191690831515021790555050565b611cc4848484610e0c565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14611d2557611cee84848484613684565b611d24576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600d60029054906101000a900460ff1615611d72576040517f1309a56300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d7c338261122f565b611dd95733611d8b33836110ab565b600d60039054906101000a900460ff166040517fa82f2e89000000000000000000000000000000000000000000000000000000008152600401611dd0939291906153eb565b60405180910390fd5b611de233612118565b821115611e32573382611df433612118565b6040517f3e1544e7000000000000000000000000000000000000000000000000000000008152600401611e2993929190615420565b60405180910390fd5b600e5482611e3e610de2565b611e489190615383565b1115611e9857611e56610de2565b82600e546040517f9667b1fc000000000000000000000000000000000000000000000000000000008152600401611e8f939291906153b6565b60405180910390fd5b5f611ea433848461245c565b9050803414611eee573334826040517f5c54305e000000000000000000000000000000000000000000000000000000008152600401611ee593929190615420565b60405180910390fd5b600380811115611f0157611f006144ac565b5b600d60039054906101000a900460ff166003811115611f2357611f226144ac565b5b03611f7c578260125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611f749190615383565b925050819055505b611f86338461321e565b505050565b611f93613d73565b611f9b613d73565b611fa3612dcd565b831080611fb75750611fb3613576565b8310155b15611fc55780915050611ff0565b611fce8361354d565b9050806040015115611fe35780915050611ff0565b611fec836137cf565b9150505b919050565b606061200082612be7565b612036576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5f9054906101000a900460ff166120b1575f600c805461205790614f6a565b9050036120725760405180602001604052805f8152506120aa565b600c6120896001846120849190615383565b6137ef565b60405160200161209a929190615559565b6040516020818303038152906040525b9050612113565b5f6120ba61383e565b90505f8151036120d85760405180602001604052805f81525061210f565b806120ee6001856120e99190615383565b6137ef565b6040516020016120ff929190615587565b6040516020818303038152906040525b9150505b919050565b5f8060038081111561212d5761212c6144ac565b5b600d60039054906101000a900460ff16600381111561214f5761214e6144ac565b5b146121645761215d836138ce565b90506121a5565b60125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505b80600f5f9054906101000a900463ffffffff1663ffffffff16039150600f5f9054906101000a900463ffffffff1663ffffffff168211156122305781600f5f9054906101000a900463ffffffff166040517f7ae596850000000000000000000000000000000000000000000000000000000081526004016122279291906155e5565b60405180910390fd5b50919050565b61223e6129d9565b8060108190555050565b6122506129d9565b60405180604001604052808363ffffffff1663ffffffff1681526020018263ffffffff1663ffffffff1681525060145f856003811115612293576122926144ac565b5b60038111156122a5576122a46144ac565b5b60038111156122b7576122b66144ac565b5b81526020019081526020015f209060026122d2929190613dbe565b507f7337c2ac1c7e3527afc90887e9d5e335bdba7b517a1d36fd47bf52dc046ee96e8383836040516123069392919061560c565b60405180910390a1505050565b5f805f90505b60048081111561232c5761232b6144ac565b5b60ff1681101561239d5761236a81600481111561234c5761234b6144ac565b5b858584600481106123605761235f615356565b5b60200201516130e8565b1561238a57806004811115612382576123816144ac565b5b9150506123a3565b808061239590615065565b915050612319565b50600490505b92915050565b6123b16129d9565b80600d60026101000a81548160ff02191690831515021790555050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f80612468858461122f565b9050806124c8578461247a86856110ab565b600d60039054906101000a900460ff166040517fa82f2e890000000000000000000000000000000000000000000000000000000081526004016124bf939291906153eb565b60405180910390fd5b5f6124d286612118565b9050808511156125255785856124e788612118565b6040517f3e1544e700000000000000000000000000000000000000000000000000000000815260040161251c93929190615420565b60405180910390fd5b5f8503612536575f9250505061272d565b5f61254187866110ab565b905060016003811115612557576125566144ac565b5b600d60039054906101000a900460ff166003811115612579576125786144ac565b5b03612626575f6004811115612591576125906144ac565b5b8160048111156125a4576125a36144ac565b5b036125b4575f935050505061272d565b600160048111156125c8576125c76144ac565b5b8160048111156125db576125da6144ac565b5b03612621576002821480156125fb575060028614806125fa5750600186145b5b1561260d57601154935050505061272d565b60018203612620575f935050505061272d565b5b612719565b6002600381111561263a576126396144ac565b5b600d60039054906101000a900460ff16600381111561265c5761265b6144ac565b5b036127185760026004811115612675576126746144ac565b5b816004811115612688576126876144ac565b5b036126d2576002821480156126a8575060028614806126a75750600186145b5b156126ba57601054935050505061272d565b600182036126cd575f935050505061272d565b612717565b600360048111156126e6576126e56144ac565b5b8160048111156126f9576126f86144ac565b5b03612716576010548661270c9190614fc7565b935050505061272d565b5b5b5b601054866127279190614fc7565b93505050505b9392505050565b61273c6129d9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036127aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a1906156b1565b60405180910390fd5b6127b38161348a565b50565b6127be6129d9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612823576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015612866573d5f803e3d5ffd5b5050565b600d60019054906101000a900460ff1681565b6128856129d9565b5f600e54905081600e819055507f37e39534cefc6f74cd145104ad190940e0fa968dc44d7f4e50cf4549a318477e81836040516128c39291906141ae565b60405180910390a15050565b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061292957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806129595750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129d257506129d182613922565b5b9050919050565b6129e161398b565b73ffffffffffffffffffffffffffffffffffffffff166129ff611895565b73ffffffffffffffffffffffffffffffffffffffff1614612a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4c90615719565b60405180910390fd5b565b612a5f6130df565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab4906157a7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b229061580f565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681525060085f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b5f81612bf1612dcd565b11158015612bff57505f5482105b8015612c3a57505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f919050565b5f6001905090565b69c61711340011223344555f5230601a5280603a525f80604460166daaeb6d7670e522a718067333cd4e5afa612c87573d5f803e3d5ffd5b5f603a5250565b5f612c988261156a565b90508073ffffffffffffffffffffffffffffffffffffffff16612cb9613992565b73ffffffffffffffffffffffffffffffffffffffff1614612d1c57612ce581612ce0613992565b6123ce565b612d1b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f90565b5f612ddb826133c7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612e42576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80612e4d84613999565b91509150612e638187612e5e613992565b6139bc565b612eaf57612e7886612e73613992565b6123ce565b612eae576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f14576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f2186868660016139ff565b8015612f2b575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815460010191905081905550612ff385612fcf888887613a05565b7c020000000000000000000000000000000000000000000000000000000017613a2c565b60045f8681526020019081526020015f20819055505f7c020000000000000000000000000000000000000000000000000000000084160361306f575f6001850190505f60045f8381526020019081526020015f20540361306d575f54811461306c578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130d78686866001613a56565b505050505050565b5f612710905090565b5f8060048111156130fc576130fb6144ac565b5b84600481111561310f5761310e6144ac565b5b036131255761311e8383613a5c565b9050613217565b60016004811115613139576131386144ac565b5b84600481111561314c5761314b6144ac565b5b036131625761315b8383613aa5565b9050613217565b60026004811115613176576131756144ac565b5b846004811115613189576131886144ac565b5b0361319f576131988383613aef565b9050613217565b600360048111156131b3576131b26144ac565b5b8460048111156131c6576131c56144ac565b5b036131dc576131d58383613b39565b9050613217565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320e90615877565b60405180910390fd5b9392505050565b5f805490505f820361325c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132685f8483856139ff565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055506132da836132cb5f865f613a05565b6132d485613b83565b17613a2c565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146133745780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460018101905061333b565b505f82036133ae576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f8190555050506133c25f848385613a56565b505050565b5f80829050806133d5612dcd565b11613453575f54811015613452575f60045f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603613450575b5f81036134465760045f836001900393508381526020019081526020015f2054905061341f565b8092505050613485565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613555613d73565b61356f60045f8481526020019081526020015f2054613b92565b9050919050565b5f8054905090565b8060075f61358a613992565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16613633613992565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516136789190613f26565b60405180910390a35050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136a9613992565b8786866040518563ffffffff1660e01b81526004016136cb94939291906158e7565b6020604051808303815f875af192505050801561370657506040513d601f19601f820116820180604052508101906137039190615945565b60015b61377c573d805f8114613734576040519150601f19603f3d011682016040523d82523d5f602084013e613739565b606091505b505f815103613774576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6137d7613d73565b6137e86137e3836133c7565b613b92565b9050919050565b606060a060405101806040526020810391505f825281835b60011561382957600184039350600a81066030018453600a8104905080613807575b50828103602084039350808452505050919050565b6060600b805461384d90614f6a565b80601f016020809104026020016040519081016040528092919081815260200182805461387990614f6a565b80156138c45780601f1061389b576101008083540402835291602001916138c4565b820191905f5260205f20905b8154815290600101906020018083116138a757829003601f168201915b5050505050905090565b5f67ffffffffffffffff604060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054901c169050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b5f33905090565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8613a1b868684613c46565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b5f613a9d828460135f806004811115613a7857613a776144ac565b5b6004811115613a8a57613a896144ac565b5b81526020019081526020015f2054613c4e565b905092915050565b5f613ae7828460135f60016004811115613ac257613ac16144ac565b5b6004811115613ad457613ad36144ac565b5b81526020019081526020015f2054613c4e565b905092915050565b5f613b31828460135f60026004811115613b0c57613b0b6144ac565b5b6004811115613b1e57613b1d6144ac565b5b81526020019081526020015f2054613c4e565b905092915050565b5f613b7b828460135f60036004811115613b5657613b556144ac565b5b6004811115613b6857613b676144ac565b5b81526020019081526020015f2054613c4e565b905092915050565b5f6001821460e11b9050919050565b613b9a613d73565b81815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff16815250505f7c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b5f9392505050565b5f8083604051602001613c619190614157565b60405160208183030381529060405280519060200120604051602001613c879190615990565b6040516020818303038152906040528051906020012090505f613cab868584613ccb565b90508015613cbe57600192505050613cc4565b5f925050505b9392505050565b5f82613cd78584613ce1565b1490509392505050565b5f808290505f5b8451811015613d2a57613d1582868381518110613d0857613d07615356565b5b6020026020010151613d35565b91508080613d2290615065565b915050613ce8565b508091505092915050565b5f818310613d4c57613d478284613d5f565b613d57565b613d568383613d5f565b5b905092915050565b5f825f528160205260405f20905092915050565b60405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f62ffffff1681525090565b826002600701600890048101928215613e4f579160200282015f5b83821115613e1d57835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302613dd9565b8015613e4d5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302613e1d565b505b509050613e5c9190613e60565b5090565b5b80821115613e77575f815f905550600101613e61565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ec081613e8c565b8114613eca575f80fd5b50565b5f81359050613edb81613eb7565b92915050565b5f60208284031215613ef657613ef5613e84565b5b5f613f0384828501613ecd565b91505092915050565b5f8115159050919050565b613f2081613f0c565b82525050565b5f602082019050613f395f830184613f17565b92915050565b5f819050919050565b613f5181613f3f565b82525050565b5f602082019050613f6a5f830184613f48565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613f9982613f70565b9050919050565b613fa981613f8f565b8114613fb3575f80fd5b50565b5f81359050613fc481613fa0565b92915050565b5f6bffffffffffffffffffffffff82169050919050565b613fea81613fca565b8114613ff4575f80fd5b50565b5f8135905061400581613fe1565b92915050565b5f806040838503121561402157614020613e84565b5b5f61402e85828601613fb6565b925050602061403f85828601613ff7565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015614080578082015181840152602081019050614065565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6140a582614049565b6140af8185614053565b93506140bf818560208601614063565b6140c88161408b565b840191505092915050565b5f6020820190508181035f8301526140eb818461409b565b905092915050565b6140fc81613f3f565b8114614106575f80fd5b50565b5f81359050614117816140f3565b92915050565b5f6020828403121561413257614131613e84565b5b5f61413f84828501614109565b91505092915050565b61415181613f8f565b82525050565b5f60208201905061416a5f830184614148565b92915050565b5f806040838503121561418657614185613e84565b5b5f61419385828601613fb6565b92505060206141a485828601614109565b9150509250929050565b5f6040820190506141c15f830185613f48565b6141ce6020830184613f48565b9392505050565b5f805f606084860312156141ec576141eb613e84565b5b5f6141f986828701613fb6565b935050602061420a86828701613fb6565b925050604061421b86828701614109565b9150509250925092565b5f806040838503121561423b5761423a613e84565b5b5f61424885828601614109565b925050602061425985828601614109565b9150509250929050565b5f6040820190506142765f830185614148565b6142836020830184613f48565b9392505050565b61429381613f0c565b811461429d575f80fd5b50565b5f813590506142ae8161428a565b92915050565b5f602082840312156142c9576142c8613e84565b5b5f6142d6848285016142a0565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6143198261408b565b810181811067ffffffffffffffff82111715614338576143376142e3565b5b80604052505050565b5f61434a613e7b565b90506143568282614310565b919050565b5f67ffffffffffffffff821115614375576143746142e3565b5b602082029050602081019050919050565b5f80fd5b5f819050919050565b61439c8161438a565b81146143a6575f80fd5b50565b5f813590506143b781614393565b92915050565b5f6143cf6143ca8461435b565b614341565b905080838252602082019050602084028301858111156143f2576143f1614386565b5b835b8181101561441b578061440788826143a9565b8452602084019350506020810190506143f4565b5050509392505050565b5f82601f830112614439576144386142df565b5b81356144498482602086016143bd565b91505092915050565b5f806040838503121561446857614467613e84565b5b5f61447585828601613fb6565b925050602083013567ffffffffffffffff81111561449657614495613e88565b5b6144a285828601614425565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600581106144ea576144e96144ac565b5b50565b5f8190506144fa826144d9565b919050565b5f614509826144ed565b9050919050565b614519816144ff565b82525050565b5f6020820190506145325f830184614510565b92915050565b5f6020828403121561454d5761454c613e84565b5b5f61455a84828501613fb6565b91505092915050565b6005811061456f575f80fd5b50565b5f8135905061458081614563565b92915050565b5f806040838503121561459c5761459b613e84565b5b5f6145a985828601614572565b92505060206145ba858286016143a9565b9150509250929050565b5f80fd5b5f8083601f8401126145dd576145dc6142df565b5b8235905067ffffffffffffffff8111156145fa576145f96145c4565b5b60208301915083600182028301111561461657614615614386565b5b9250929050565b5f806020838503121561463357614632613e84565b5b5f83013567ffffffffffffffff8111156146505761464f613e88565b5b61465c858286016145c8565b92509250509250929050565b5f8083601f84011261467d5761467c6142df565b5b8235905067ffffffffffffffff81111561469a576146996145c4565b5b6020830191508360208202830111156146b6576146b5614386565b5b9250929050565b5f80602083850312156146d3576146d2613e84565b5b5f83013567ffffffffffffffff8111156146f0576146ef613e88565b5b6146fc85828601614668565b92509250509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61473a81613f8f565b82525050565b5f67ffffffffffffffff82169050919050565b61475c81614740565b82525050565b61476b81613f0c565b82525050565b5f62ffffff82169050919050565b61478881614771565b82525050565b608082015f8201516147a25f850182614731565b5060208201516147b56020850182614753565b5060408201516147c86040850182614762565b5060608201516147db606085018261477f565b50505050565b5f6147ec838361478e565b60808301905092915050565b5f602082019050919050565b5f61480e82614708565b6148188185614712565b935061482383614722565b805f5b8381101561485357815161483a88826147e1565b9750614845836147f8565b925050600181019050614826565b5085935050505092915050565b5f6020820190508181035f8301526148788184614804565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6148b281613f3f565b82525050565b5f6148c383836148a9565b60208301905092915050565b5f602082019050919050565b5f6148e582614880565b6148ef818561488a565b93506148fa8361489a565b805f5b8381101561492a57815161491188826148b8565b975061491c836148cf565b9250506001810190506148fd565b5085935050505092915050565b5f6020820190508181035f83015261494f81846148db565b905092915050565b5f805f6060848603121561496e5761496d613e84565b5b5f61497b86828701613fb6565b935050602061498c86828701614109565b925050604061499d86828701614109565b9150509250925092565b5f80604083850312156149bd576149bc613e84565b5b5f6149ca85828601613fb6565b92505060206149db858286016142a0565b9150509250929050565b600481106149f6576149f56144ac565b5b50565b5f819050614a06826149e5565b919050565b5f614a15826149f9565b9050919050565b614a2581614a0b565b82525050565b5f63ffffffff82169050919050565b614a4381614a2b565b82525050565b5f606082019050614a5c5f830186614a1c565b614a696020830185614a3a565b614a766040830184614a3a565b949350505050565b5f602082019050614a915f830184614a3a565b92915050565b5f80fd5b5f67ffffffffffffffff821115614ab557614ab46142e3565b5b614abe8261408b565b9050602081019050919050565b828183375f83830152505050565b5f614aeb614ae684614a9b565b614341565b905082815260208101848484011115614b0757614b06614a97565b5b614b12848285614acb565b509392505050565b5f82601f830112614b2e57614b2d6142df565b5b8135614b3e848260208601614ad9565b91505092915050565b5f805f8060808587031215614b5f57614b5e613e84565b5b5f614b6c87828801613fb6565b9450506020614b7d87828801613fb6565b9350506040614b8e87828801614109565b925050606085013567ffffffffffffffff811115614baf57614bae613e88565b5b614bbb87828801614b1a565b91505092959194509250565b5f8060408385031215614bdd57614bdc613e84565b5b5f614bea85828601614109565b925050602083013567ffffffffffffffff811115614c0b57614c0a613e88565b5b614c1785828601614425565b9150509250929050565b608082015f820151614c355f850182614731565b506020820151614c486020850182614753565b506040820151614c5b6040850182614762565b506060820151614c6e606085018261477f565b50505050565b5f608082019050614c875f830184614c21565b92915050565b614c9681614a2b565b8114614ca0575f80fd5b50565b5f81359050614cb181614c8d565b92915050565b5f805f60608486031215614cce57614ccd613e84565b5b5f614cdb86828701614109565b9350506020614cec86828701614ca3565b9250506040614cfd86828701614ca3565b9150509250925092565b5f67ffffffffffffffff821115614d2157614d206142e3565b5b602082029050919050565b5f614d3e614d3984614d07565b614341565b90508060208402830185811115614d5857614d57614386565b5b835b81811015614d9f57803567ffffffffffffffff811115614d7d57614d7c6142df565b5b808601614d8a8982614425565b85526020850194505050602081019050614d5a565b5050509392505050565b5f82601f830112614dbd57614dbc6142df565b5b6004614dca848285614d2c565b91505092915050565b5f8060408385031215614de957614de8613e84565b5b5f614df685828601613fb6565b925050602083013567ffffffffffffffff811115614e1757614e16613e88565b5b614e2385828601614da9565b9150509250929050565b5f8060408385031215614e4357614e42613e84565b5b5f614e5085828601613fb6565b9250506020614e6185828601613fb6565b9150509250929050565b5f805f60608486031215614e8257614e81613e84565b5b5f614e8f86828701613fb6565b9350506020614ea086828701614109565b925050604084013567ffffffffffffffff811115614ec157614ec0613e88565b5b614ecd86828701614425565b9150509250925092565b5f614ee182613f70565b9050919050565b614ef181614ed7565b8114614efb575f80fd5b50565b5f81359050614f0c81614ee8565b92915050565b5f60208284031215614f2757614f26613e84565b5b5f614f3484828501614efe565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614f8157607f821691505b602082108103614f9457614f93614f3d565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614fd182613f3f565b9150614fdc83613f3f565b9250828202614fea81613f3f565b9150828204841483151761500157615000614f9a565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61503f82613f3f565b915061504a83613f3f565b92508261505a57615059615008565b5b828204905092915050565b5f61506f82613f3f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036150a1576150a0614f9a565b5b600182019050919050565b6150b58161438a565b82525050565b5f6040820190506150ce5f830185614510565b6150db60208301846150ac565b9392505050565b5f82905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026151487fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261510d565b615152868361510d565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61518d61518861518384613f3f565b61516a565b613f3f565b9050919050565b5f819050919050565b6151a683615173565b6151ba6151b282615194565b848454615119565b825550505050565b5f90565b6151ce6151c2565b6151d981848461519d565b505050565b5b818110156151fc576151f15f826151c6565b6001810190506151df565b5050565b601f82111561524157615212816150ec565b61521b846150fe565b8101602085101561522a578190505b61523e615236856150fe565b8301826151de565b50505b505050565b5f82821c905092915050565b5f6152615f1984600802615246565b1980831691505092915050565b5f6152798383615252565b9150826002028217905092915050565b61529383836150e2565b67ffffffffffffffff8111156152ac576152ab6142e3565b5b6152b68254614f6a565b6152c1828285615200565b5f601f8311600181146152ee575f84156152dc578287013590505b6152e6858261526e565b86555061534d565b601f1984166152fc866150ec565b5f5b82811015615323578489013582556001820191506020850194506020810190506152fe565b86831015615340578489013561533c601f891682615252565b8355505b6001600288020188555050505b50505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61538d82613f3f565b915061539883613f3f565b92508282019050808211156153b0576153af614f9a565b5b92915050565b5f6060820190506153c95f830186613f48565b6153d66020830185613f48565b6153e36040830184613f48565b949350505050565b5f6060820190506153fe5f830186614148565b61540b6020830185614510565b6154186040830184614a1c565b949350505050565b5f6060820190506154335f830186614148565b6154406020830185613f48565b61544d6040830184613f48565b949350505050565b5f81905092915050565b5f815461546b81614f6a565b6154758186615455565b9450600182165f811461548f57600181146154a4576154d6565b60ff19831686528115158202860193506154d6565b6154ad856150ec565b5f5b838110156154ce578154818901526001820191506020810190506154af565b838801955050505b50505092915050565b5f6154e982614049565b6154f38185615455565b9350615503818560208601614063565b80840191505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f615543600583615455565b915061554e8261550f565b600582019050919050565b5f615564828561545f565b915061557082846154df565b915061557b82615537565b91508190509392505050565b5f61559282856154df565b915061559e82846154df565b91506155a982615537565b91508190509392505050565b5f6155cf6155ca6155c584614a2b565b61516a565b613f3f565b9050919050565b6155df816155b5565b82525050565b5f6040820190506155f85f830185613f48565b61560560208301846155d6565b9392505050565b5f60608201905061561f5f830186613f48565b61562c6020830185614a3a565b6156396040830184614a3a565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61569b602683614053565b91506156a682615641565b604082019050919050565b5f6020820190508181035f8301526156c88161568f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f615703602083614053565b915061570e826156cf565b602082019050919050565b5f6020820190508181035f830152615730816156f7565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c206578636565645f8201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b5f615791602a83614053565b915061579c82615737565b604082019050919050565b5f6020820190508181035f8301526157be81615785565b9050919050565b7f455243323938313a20696e76616c6964207265636569766572000000000000005f82015250565b5f6157f9601983614053565b9150615804826157c5565b602082019050919050565b5f6020820190508181035f830152615826816157ed565b9050919050565b7f526f6c6520646f6573206e6f74206578697374000000000000000000000000005f82015250565b5f615861601383614053565b915061586c8261582d565b602082019050919050565b5f6020820190508181035f83015261588e81615855565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6158b982615895565b6158c3818561589f565b93506158d3818560208601614063565b6158dc8161408b565b840191505092915050565b5f6080820190506158fa5f830187614148565b6159076020830186614148565b6159146040830185613f48565b818103606083015261592681846158af565b905095945050505050565b5f8151905061593f81613eb7565b92915050565b5f6020828403121561595a57615959613e84565b5b5f61596784828501615931565b91505092915050565b5f819050919050565b61598a6159858261438a565b615970565b82525050565b5f61599b8284615979565b6020820191508190509291505056fea2646970667358221220e343b903dc5dea315b847e7450a1885ef94b770aacc1c5a4c6e0f1fb91b91ed464736f6c63430008140033

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

00000000000000000000000000000000000000000000000000000000000003e700000000000000000000000012d9e9f49abad38e5fa7f646f4f7652ecce44638

-----Decoded View---------------
Arg [0] : collectionSize_ (uint256): 999
Arg [1] : _royaltyReceiver (address): 0x12d9E9F49AbAd38e5Fa7f646f4F7652ecCe44638

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000003e7
Arg [1] : 00000000000000000000000012d9e9f49abad38e5fa7f646f4f7652ecce44638


Deployed Bytecode Sourcemap

88454:19690:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96240:455;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88905:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98667:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46009:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52758:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97300:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41650:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101712:266;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;97729:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8216:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;94657:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94762:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59578:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90834:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89005:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93024:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94410:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94526:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;105325:710;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83607:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93388:483;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47465:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42834:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2875:103;;;;;;;;;;;;;:::i;:::-;;105201:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91784:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87483:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2234:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46185:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84523:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97002:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101209:329;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;88958:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88762:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88864:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98096:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60369:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99291:1715;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83020:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95033:840;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104417:542;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105069:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92610:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91337:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104967:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53748:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102200:2094;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3133:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93994:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88719:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92155:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;96240:455;96361:4;96594:38;96620:11;96594:25;:38::i;:::-;:93;;;;96649:38;96675:11;96649:25;:38::i;:::-;96594:93;96574:113;;96240:455;;;:::o;88905:46::-;;;;:::o;98667:254::-;2120:13;:11;:13::i;:::-;98810:1:::1;98790:22;;:8;:22;;::::0;98786:75:::1;;98836:13;;;;;;;;;;;;;;98786:75;98871:42;98890:8;98900:12;98871:18;:42::i;:::-;98667:254:::0;;:::o;46009:100::-;46063:13;46096:5;46089:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46009:100;:::o;52758:234::-;52850:7;52875:16;52883:7;52875;:16::i;:::-;52870:64;;52900:34;;;;;;;;;;;;;;52870:64;52954:15;:24;52970:7;52954:24;;;;;;;;;;;:30;;;;;;;;;;;;52947:37;;52758:234;;;:::o;97300:250::-;97484:8;24240:29;24260:8;24240:19;:29::i;:::-;24235:122;;24290:27;:25;:27::i;:::-;24286:59;;;24319:26;24336:8;24319:16;:26::i;:::-;24286:59;24235:122;97510:32:::1;97524:8;97534:7;97510:13;:32::i;:::-;97300:250:::0;;;:::o;41650:323::-;41711:7;41939:15;:13;:15::i;:::-;41924:12;;41908:13;;:28;:46;41901:53;;41650:323;:::o;101712:266::-;101787:22;101811:20;101866:15;;101849:32;;101907:13;:11;:13::i;:::-;101892:28;;101712:266;;:::o;97729:224::-;97891:4;23883:10;23875:18;;:4;:18;;;23871:184;;23915:31;23935:10;23915:19;:31::i;:::-;23910:134;;23971:27;:25;:27::i;:::-;23967:61;;;24000:28;24017:10;24000:16;:28::i;:::-;23967:61;23910:134;23871:184;97908:37:::1;97927:4;97933:2;97937:7;97908:18;:37::i;:::-;97729:224:::0;;;;:::o;8216:438::-;8311:7;8320;8340:26;8369:17;:26;8387:7;8369:26;;;;;;;;;;;8340:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8440:1;8412:30;;:7;:16;;;:30;;;8408:92;;8469:19;8459:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8408:92;8512:21;8576:17;:15;:17::i;:::-;8536:57;;8549:7;:23;;;8537:35;;:9;:35;;;;:::i;:::-;8536:57;;;;:::i;:::-;8512:81;;8614:7;:16;;;8632:13;8606:40;;;;;;8216:438;;;;;:::o;94657:97::-;2120:13;:11;:13::i;:::-;94737:9:::1;94723:11;;:23;;;;;;;;;;;;;;;;;;94657:97:::0;:::o;94762:91::-;94810:4;94834:11;;;;;;;;;;;94827:18;;94762:91;:::o;59578:193::-;59724:39;59741:4;59747:2;59751:7;59724:39;;;;;;;;;;;;:16;:39::i;:::-;59578:193;;;:::o;90834:305::-;90937:5;90960:12;90975:1;90960:16;;90955:145;90991:12;90985:19;;;;;;;;:::i;:::-;;90978:26;;:4;:26;90955:145;;;91033:35;91047:4;91041:11;;;;;;;;:::i;:::-;;91054:5;91061:6;91033:7;:35::i;:::-;91029:59;;;91083:4;91077:11;;;;;;;;:::i;:::-;;91070:18;;;;;91029:59;91006:6;;;;;:::i;:::-;;;;90955:145;;;;91119:12;91112:19;;90834:305;;;;;:::o;89005:58::-;;;;;;;;;;;;;;;;;:::o;93024:192::-;2120:13;:11;:13::i;:::-;93132:5:::1;93105:10;:24;93122:5;93105:24;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:32;;;;93155:53;93175:5;93183:10;:24;93200:5;93183:24;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;93155:53;;;;;;;:::i;:::-;;;;;;;;93024:192:::0;;:::o;94410:108::-;2120:13;:11;:13::i;:::-;94502:8:::1;;94486:13;:24;;;;;;;:::i;:::-;;94410:108:::0;;:::o;94526:123::-;2120:13;:11;:13::i;:::-;94628::::1;;94612;:29;;;;;;;:::i;:::-;;94526:123:::0;;:::o;105325:710::-;105453:20;105486:10;105499:22;105507:5;105514:6;105499:7;:22::i;:::-;105486:35;;105550:5;105532:23;;105587:9;105570:26;;;;;;;;:::i;:::-;;:13;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;105566:427;;105625:17;105617:25;;;;;;;;:::i;:::-;;:4;:25;;;;;;;;:::i;:::-;;;:45;;;;105654:8;105646:16;;;;;;;;:::i;:::-;;:4;:16;;;;;;;;:::i;:::-;;;105617:45;105613:108;;;105701:4;105683:22;;105613:108;105566:427;;;105759:9;105742:26;;;;;;;;:::i;:::-;;:13;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;105738:255;;105797:8;105789:16;;;;;;;;:::i;:::-;;:4;:16;;;;;;;;:::i;:::-;;;:43;;;;105817:15;105809:23;;;;;;;;:::i;:::-;;:4;:23;;;;;;;;:::i;:::-;;;105789:43;105785:106;;;105871:4;105853:22;;105785:106;105738:255;;;105929:13;105912:30;;;;;;;;:::i;:::-;;:13;;;;;;;;;;;:30;;;;;;;;:::i;:::-;;;105908:85;;105977:4;105959:22;;105908:85;105738:255;105566:427;106005:22;105325:710;;;;:::o;83607:528::-;83751:23;83817:22;83842:8;;:15;;83817:40;;83872:34;83930:14;83909:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;83872:73;;83965:9;83960:125;83981:14;83976:1;:19;83960:125;;84037:32;84057:8;;84066:1;84057:11;;;;;;;:::i;:::-;;;;;;;;84037:19;:32::i;:::-;84021:10;84032:1;84021:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;83997:3;;;;;83960:125;;;;84106:10;84099:17;;;;83607:528;;;;:::o;93388:483::-;2120:13;:11;:13::i;:::-;93484:1:::1;93469:17;;:3;:17;;::::0;93465:70:::1;;93510:13;;;;;;;;;;;;;;93465:70;93652:15;;93641:7;93625:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:42;;93619:213;;93732:13;:11;:13::i;:::-;93764:7;93790:15;;93692:128;;;;;;;;;;;;;:::i;:::-;;;;;;;;93619:213;93844:19;93850:3;93855:7;93844:5;:19::i;:::-;93388:483:::0;;:::o;47465:168::-;47553:7;47596:27;47615:7;47596:18;:27::i;:::-;47573:52;;47465:168;;;:::o;42834:249::-;42922:7;42963:1;42946:19;;:5;:19;;;42942:60;;42974:28;;;;;;;;;;;;;;42942:60;36993:13;43020:18;:25;43039:5;43020:25;;;;;;;;;;;;;;;;:55;43013:62;;42834:249;;;:::o;2875:103::-;2120:13;:11;:13::i;:::-;2940:30:::1;2967:1;2940:18;:30::i;:::-;2875:103::o:0;105201:116::-;2120:13;:11;:13::i;:::-;105294:15:::1;105280:11;:29;;;;105201:116:::0;:::o;91784:242::-;2120:13;:11;:13::i;:::-;91876:9:::1;91858:27;;;;;;;;:::i;:::-;;91865:6;91858:14;;;;;;;;:::i;:::-;;:27;;;;;;;;:::i;:::-;;;;:62;;;;91907:13;91889:31:::0;::::1;;;;;;;:::i;:::-;;91896:6;91889:14;;;;;;;;:::i;:::-;;:31;;;;;;;;:::i;:::-;;;;91858:62;91852:126;;91959:6;91945:21;;;;;;;;;;;:::i;:::-;;;;;;;;91852:126;92011:6;92004:14;;;;;;;;:::i;:::-;;91988:13;;:30;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;91784:242:::0;:::o;87483:900::-;87561:16;87615:19;87649:25;87689:22;87714:16;87724:5;87714:9;:16::i;:::-;87689:41;;87745:25;87787:14;87773:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87745:57;;87817:31;;:::i;:::-;87868:9;87880:15;:13;:15::i;:::-;87868:27;;87863:472;87912:14;87897:11;:29;87863:472;;87964:15;87977:1;87964:12;:15::i;:::-;87952:27;;88002:9;:16;;;88043:8;87998:73;88119:1;88093:28;;:9;:14;;;:28;;;88089:111;;88166:9;:14;;;88146:34;;88089:111;88243:5;88222:26;;:17;:26;;;88218:102;;88299:1;88273:8;88282:13;;;;;;88273:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;88218:102;87863:472;87928:3;;;;;87863:472;;;;88356:8;88349:15;;;;;;;87483:900;;;:::o;2234:87::-;2280:7;2307:6;;;;;;;;;;;2300:13;;2234:87;:::o;46185:104::-;46241:13;46274:7;46267:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46185:104;:::o;84523:2513::-;84666:16;84733:4;84724:5;:13;84720:45;;84746:19;;;;;;;;;;;;;;84720:45;84780:19;84814:17;84834:14;:12;:14::i;:::-;84814:34;;84934:15;:13;:15::i;:::-;84926:5;:23;84922:87;;;84978:15;:13;:15::i;:::-;84970:23;;84922:87;85085:9;85078:4;:16;85074:73;;;85122:9;85115:16;;85074:73;85161:25;85189:16;85199:5;85189:9;:16::i;:::-;85161:44;;85383:4;85375:5;:12;85371:278;;;85408:19;85437:5;85430:4;:12;85408:34;;85479:17;85465:11;:31;85461:111;;;85541:11;85521:31;;85461:111;85389:198;85371:278;;;85632:1;85612:21;;85371:278;85663:25;85705:17;85691:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85663:60;;85763:1;85742:17;:22;85738:78;;85792:8;85785:15;;;;;;;;85738:78;85960:31;85994:26;86014:5;85994:19;:26::i;:::-;85960:60;;86035:25;86280:9;:16;;;86275:92;;86337:9;:14;;;86317:34;;86275:92;86386:9;86398:5;86386:17;;86381:478;86410:4;86405:1;:9;;:45;;;;;86433:17;86418:11;:32;;86405:45;86381:478;;;86488:15;86501:1;86488:12;:15::i;:::-;86476:27;;86526:9;:16;;;86567:8;86522:73;86643:1;86617:28;;:9;:14;;;:28;;;86613:111;;86690:9;:14;;;86670:34;;86613:111;86767:5;86746:26;;:17;:26;;;86742:102;;86823:1;86797:8;86806:13;;;;;;86797:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;86742:102;86381:478;86452:3;;;;;86381:478;;;;86961:11;86951:8;86944:29;87009:8;87002:15;;;;;;;;84523:2513;;;;;;:::o;97002:220::-;97150:8;24240:29;24260:8;24240:19;:29::i;:::-;24235:122;;24290:27;:25;:27::i;:::-;24286:59;;;24319:26;24336:8;24319:16;:26::i;:::-;24286:59;24235:122;97171:43:::1;97195:8;97205;97171:23;:43::i;:::-;97002:220:::0;;;:::o;101209:329::-;101286:12;101300:16;101318:14;101365:13;;;;;;;;;;;101350:29;;101402:12;:27;101422:5;101402:27;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;101430:1;101402:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;101390:42;;101453:12;:27;101473:5;101453:27;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;101481:1;101453:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;101443:40;;101209:329;;;:::o;88958:40::-;;;;:::o;88762:20::-;;;;;;;;;;;;;:::o;88864:34::-;;;;;;;;;;;;;:::o;98096:117::-;2120:13;:11;:13::i;:::-;98200:5:::1;98173:24;;:32;;;;;;;;;;;;;;;;;;98096:117:::0;:::o;60369:407::-;60544:31;60557:4;60563:2;60567:7;60544:12;:31::i;:::-;60608:1;60590:2;:14;;;:19;60586:183;;60629:56;60660:4;60666:2;60670:7;60679:5;60629:30;:56::i;:::-;60624:145;;60713:40;;;;;;;;;;;;;;60624:145;60586:183;60369:407;;;;:::o;99291:1715::-;99418:8;;;;;;;;;;;99414:58;;;99450:10;;;;;;;;;;;;;;99414:58;99540:52;99573:10;99585:6;99540:32;:52::i;:::-;99534:234;;99653:10;99682:27;99690:10;99702:6;99682:7;:27::i;:::-;99728:13;;;;;;;;;;;99617:139;;;;;;;;;;;;;:::i;:::-;;;;;;;;99534:234;99870:23;99882:10;99870:11;:23::i;:::-;99859:7;:34;;99853:209;;99957:10;99986:7;100012:23;100024:10;100012:11;:23::i;:::-;99918:132;;;;;;;;;;;;;:::i;:::-;;;;;;;;99853:209;100181:15;;100170:7;100154:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:42;;100148:213;;100261:13;:11;:13::i;:::-;100293:7;100319:15;;100221:128;;;;;;;;;;;;;:::i;:::-;;;;;;;;100148:213;100454:17;100474:102;100512:10;100537:7;100559:6;100474:23;:102::i;:::-;100454:122;;100684:9;100671;:22;100665:116;;100736:10;100748:9;100759;100718:51;;;;;;;;;;;;;:::i;:::-;;;;;;;;100665:116;100814:13;100797:30;;;;;;;;:::i;:::-;;:13;;;;;;;;;;;:30;;;;;;;;:::i;:::-;;;100793:109;;100883:7;100844:23;:35;100868:10;100844:35;;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;;;;;;;100793:109;100972:26;100978:10;100990:7;100972:5;:26::i;:::-;99364:1642;99291:1715;;:::o;83020:428::-;83104:21;;:::i;:::-;83138:31;;:::i;:::-;83194:15;:13;:15::i;:::-;83184:7;:25;:54;;;;83224:14;:12;:14::i;:::-;83213:7;:25;;83184:54;83180:103;;;83262:9;83255:16;;;;;83180:103;83305:21;83318:7;83305:12;:21::i;:::-;83293:33;;83341:9;:16;;;83337:65;;;83381:9;83374:16;;;;;83337:65;83419:21;83432:7;83419:12;:21::i;:::-;83412:28;;;83020:428;;;;:::o;95033:840::-;95133:13;95164:16;95172:7;95164;:16::i;:::-;95159:59;;95189:29;;;;;;;;;;;;;;95159:59;95236:11;;;;;;;;;;;95231:385;;95319:1;95294:13;95288:27;;;;;:::i;:::-;;;:32;:316;;;;;;;;;;;;;;;;;95424:13;95468:22;95488:1;95478:7;:11;;;;:::i;:::-;95468:9;:22::i;:::-;95377:178;;;;;;;;;:::i;:::-;;;;;;;;;;;;;95288:316;95264:340;;;;95231:385;95626:21;95650:10;:8;:10::i;:::-;95626:34;;95716:1;95697:7;95691:21;:26;:174;;;;;;;;;;;;;;;;;95783:7;95792:22;95812:1;95802:7;:11;;;;:::i;:::-;95792:9;:22::i;:::-;95766:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;95691:174;95671:194;;;95033:840;;;;:::o;104417:542::-;104474:16;104503:20;104555:13;104538:30;;;;;;;;:::i;:::-;;:13;;;;;;;;;;;:30;;;;;;;;:::i;:::-;;;104534:176;;104600:20;104614:5;104600:13;:20::i;:::-;104585:35;;104534:176;;;104668:23;:30;104692:5;104668:30;;;;;;;;;;;;;;;;104653:45;;104534:176;104777:12;104758:16;;;;;;;;;;;:31;;;104747:42;;104819:16;;;;;;;;;;;104808:27;;:8;:27;104804:111;;;104872:8;104882:16;;;;;;;;;;;104863:36;;;;;;;;;;;;:::i;:::-;;;;;;;;104804:111;104936:15;104417:542;;;:::o;105069:124::-;2120:13;:11;:13::i;:::-;105172::::1;105152:17;:33;;;;105069:124:::0;:::o;92610:260::-;2120:13;:11;:13::i;:::-;92747:53:::1;;;;;;;;92779:10;92747:53;;;;;;;;92791:8;92747:53;;;;;;::::0;:12:::1;:28;92767:6;92760:14;;;;;;;;:::i;:::-;;92747:28;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:53;;;;;;;:::i;:::-;;92818:44;92833:6;92841:10;92853:8;92818:44;;;;;;;;:::i;:::-;;;;;;;;92610:260:::0;;;:::o;91337:326::-;91455:5;91478:12;91493:1;91478:16;;91473:151;91509:12;91503:19;;;;;;;;:::i;:::-;;91496:26;;:4;:26;91473:151;;;91551:41;91565:4;91559:11;;;;;;;;:::i;:::-;;91572:5;91579:6;91586:4;91579:12;;;;;;;:::i;:::-;;;;;;91551:7;:41::i;:::-;91547:65;;;91607:4;91601:11;;;;;;;;:::i;:::-;;91594:18;;;;;91547:65;91524:6;;;;;:::i;:::-;;;;91473:151;;;;91643:12;91636:19;;91337:326;;;;;:::o;104967:94::-;2120:13;:11;:13::i;:::-;105047:6:::1;105036:8;;:17;;;;;;;;;;;;;;;;;;104967:94:::0;:::o;53748:189::-;53870:4;53894:18;:25;53913:5;53894:25;;;;;;;;;;;;;;;:35;53920:8;53894:35;;;;;;;;;;;;;;;;;;;;;;;;;53887:42;;53748:189;;;;:::o;102200:2094::-;102345:22;102380:20;102403:47;102436:5;102443:6;102403:32;:47::i;:::-;102380:70;;102467:15;102461:187;;102543:5;102567:22;102575:5;102582:6;102567:7;:22::i;:::-;102608:13;;;;;;;;;;;102507:129;;;;;;;;;;;;;:::i;:::-;;;;;;;;102461:187;102658:16;102677:18;102689:5;102677:11;:18::i;:::-;102658:37;;102723:8;102712:7;:19;;102706:118;;102777:5;102784:7;102793:18;102805:5;102793:11;:18::i;:::-;102756:56;;;;;;;;;;;;;:::i;:::-;;;;;;;;102706:118;102849:1;102838:7;:12;102834:53;;102874:1;102867:8;;;;;;102834:53;102899:10;102912:22;102920:5;102927:6;102912:7;:22::i;:::-;102899:35;;103051:9;103034:26;;;;;;;;:::i;:::-;;:13;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;103030:1120;;103089:17;103081:25;;;;;;;;:::i;:::-;;:4;:25;;;;;;;;:::i;:::-;;;103077:499;;103212:1;103195:18;;103188:25;;;;;103077:499;103247:8;103239:16;;;;;;;;:::i;:::-;;:4;:16;;;;;;;;:::i;:::-;;;103235:341;;103292:1;103280:8;:13;:47;;;;;103309:1;103298:7;:12;:28;;;;103325:1;103314:7;:12;103298:28;103280:47;103276:285;;;103376:11;;103359:28;;103352:35;;;;;103276:285;103490:1;103478:8;:13;103474:87;;103540:1;103523:18;;103516:25;;;;;103474:87;103235:341;103030:1120;;;103706:9;103689:26;;;;;;;;:::i;:::-;;:13;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;103685:465;;103744:8;103736:16;;;;;;;;:::i;:::-;;:4;:16;;;;;;;;:::i;:::-;;;103732:407;;103789:1;103777:8;:13;:47;;;;;103806:1;103795:7;:12;:28;;;;103822:1;103811:7;:12;103795:28;103777:47;103773:230;;;103873:17;;103856:34;;103849:41;;;;;103773:230;103932:1;103920:8;:13;103916:87;;103982:1;103965:18;;103958:25;;;;;103916:87;103732:407;;;104036:15;104028:23;;;;;;;;:::i;:::-;;:4;:23;;;;;;;;:::i;:::-;;;104024:115;;104106:17;;104096:7;:27;;;;:::i;:::-;104079:44;;104072:51;;;;;104024:115;103732:407;103685:465;103030:1120;104269:17;;104259:7;:27;;;;:::i;:::-;104242:44;;104235:51;;;102200:2094;;;;;;:::o;3133:201::-;2120:13;:11;:13::i;:::-;3242:1:::1;3222:22;;:8;:22;;::::0;3214:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3298:28;3317:8;3298:18;:28::i;:::-;3133:201:::0;:::o;93994:195::-;2120:13;:11;:13::i;:::-;94085:1:::1;94070:17;;:3;:17;;::::0;94066:70:::1;;94111:13;;;;;;;;;;;;;;94066:70;94146:3;:12;;:35;94159:21;94146:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;93994:195:::0;:::o;88719:36::-;;;;;;;;;;;;;:::o;92155:254::-;2120:13;:11;:13::i;:::-;92240:25:::1;92268:15;;92240:43;;92312:15;92294;:33;;;;92345:56;92366:17;92385:15;92345:56;;;;;;;:::i;:::-;;;;;;;;92229:180;92155:254:::0;:::o;45091:655::-;45192:4;45531:10;45516:25;;:11;:25;;;;:102;;;;45608:10;45593:25;;:11;:25;;;;45516:102;:179;;;;45685:10;45670:25;;:11;:25;;;;45516:179;45496:199;;45091:655;;;:::o;7946:215::-;8048:4;8087:26;8072:41;;;:11;:41;;;;:81;;;;8117:36;8141:11;8117:23;:36::i;:::-;8072:81;8065:88;;7946:215;;;:::o;2399:132::-;2474:12;:10;:12::i;:::-;2463:23;;:7;:5;:7::i;:::-;:23;;;2455:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2399:132::o;9304:332::-;9423:17;:15;:17::i;:::-;9407:33;;:12;:33;;;;9399:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;9526:1;9506:22;;:8;:22;;;9498:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;9593:35;;;;;;;;9605:8;9593:35;;;;;;9615:12;9593:35;;;;;9571:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9304:332;;:::o;54195:282::-;54260:4;54316:7;54297:15;:13;:15::i;:::-;:26;;:66;;;;;54350:13;;54340:7;:23;54297:66;:153;;;;;54449:1;37769:8;54401:17;:26;54419:7;54401:26;;;;;;;;;;;;:44;:49;54297:153;54277:173;;54195:282;;;:::o;26466:106::-;26535:4;26466:106;;;:::o;26161:104::-;26229:4;26253;26246:11;;26161:104;:::o;24473:1536::-;24866:22;24860:4;24853:36;24959:9;24953:4;24946:23;25034:8;25028:4;25021:22;25356:4;25329;25302;25275;25227:25;25199:5;25166:213;25138:451;;25509:16;25503:4;25497;25482:44;25557:16;25551:4;25544:30;25138:451;25989:1;25983:4;25976:15;24473:1536;:::o;52166:433::-;52280:13;52296:16;52304:7;52296;:16::i;:::-;52280:32;;52352:5;52329:28;;:19;:17;:19::i;:::-;:28;;;52325:175;;52377:44;52394:5;52401:19;:17;:19::i;:::-;52377:16;:44::i;:::-;52372:128;;52449:35;;;;;;;;;;;;;;52372:128;52325:175;52545:2;52512:15;:24;52528:7;52512:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;52583:7;52579:2;52563:28;;52572:5;52563:28;;;;;;;;;;;;52269:330;52166:433;;:::o;41166:92::-;41222:7;41166:92;:::o;56479:3003::-;56621:27;56651;56670:7;56651:18;:27::i;:::-;56621:57;;56736:4;56695:45;;56711:19;56695:45;;;56691:99;;56762:28;;;;;;;;;;;;;;56691:99;56818:27;56860:23;56897:35;56924:7;56897:26;:35::i;:::-;56803:129;;;;57046:134;57089:15;57123:4;57146:19;:17;:19::i;:::-;57046:24;:134::i;:::-;57027:287;;57210:43;57227:4;57233:19;:17;:19::i;:::-;57210:16;:43::i;:::-;57205:109;;57279:35;;;;;;;;;;;;;;57205:109;57027:287;57345:1;57331:16;;:2;:16;;;57327:52;;57356:23;;;;;;;;;;;;;;57327:52;57392:43;57414:4;57420:2;57424:7;57433:1;57392:21;:43::i;:::-;57528:15;57525:160;;;57668:1;57647:19;57640:30;57525:160;58065:18;:24;58084:4;58065:24;;;;;;;;;;;;;;;;58063:26;;;;;;;;;;;;58134:18;:22;58153:2;58134:22;;;;;;;;;;;;;;;;58132:24;;;;;;;;;;;58456:167;58493:2;58563:45;58578:4;58584:2;58588:19;58563:14;:45::i;:::-;38049:8;58514:94;58456:18;:167::i;:::-;58427:17;:26;58445:7;58427:26;;;;;;;;;;;:196;;;;58794:1;38049:8;58743:19;:47;:52;58739:627;;58816:19;58848:1;58838:7;:11;58816:33;;59005:1;58971:17;:30;58989:11;58971:30;;;;;;;;;;;;:35;58967:384;;59109:13;;59094:11;:28;59090:242;;59289:19;59256:17;:30;59274:11;59256:30;;;;;;;;;;;:52;;;;59090:242;58967:384;58797:569;58739:627;59413:7;59409:2;59394:27;;59403:4;59394:27;;;;;;;;;;;;59432:42;59453:4;59459:2;59463:7;59472:1;59432:20;:42::i;:::-;56610:2872;;;56479:3003;;;:::o;8936:97::-;8994:6;9020:5;9013:12;;8936:97;:::o;106221:548::-;106348:4;106378:17;106369:26;;;;;;;;:::i;:::-;;:5;:26;;;;;;;;:::i;:::-;;;106365:357;;106419:28;106433:5;106440:6;106419:13;:28::i;:::-;106412:35;;;;106365:357;106478:8;106469:17;;;;;;;;:::i;:::-;;:5;:17;;;;;;;;:::i;:::-;;;106465:257;;106510:20;106516:5;106523:6;106510:5;:20::i;:::-;106503:27;;;;106465:257;106561:8;106552:17;;;;;;;;:::i;:::-;;:5;:17;;;;;;;;:::i;:::-;;;106548:174;;106593:20;106599:5;106606:6;106593:5;:20::i;:::-;106586:27;;;;106548:174;106644:15;106635:24;;;;;;;;:::i;:::-;;:5;:24;;;;;;;;:::i;:::-;;;106631:91;;106683:27;106696:5;106703:6;106683:12;:27::i;:::-;106676:34;;;;106631:91;106732:29;;;;;;;;;;:::i;:::-;;;;;;;;106221:548;;;;;;:::o;64153:3021::-;64226:20;64249:13;;64226:36;;64289:1;64277:8;:13;64273:44;;64299:18;;;;;;;;;;;;;;64273:44;64330:61;64360:1;64364:2;64368:12;64382:8;64330:21;:61::i;:::-;64908:1;37131:2;64878:1;:26;;64877:32;64848:8;:62;64805:18;:22;64824:2;64805:22;;;;;;;;;;;;;;;;:105;;;;;;;;;;;65187:160;65224:2;65299:33;65322:1;65326:2;65330:1;65299:14;:33::i;:::-;65245:30;65266:8;65245:20;:30::i;:::-;:87;65187:18;:160::i;:::-;65153:17;:31;65171:12;65153:31;;;;;;;;;;;:194;;;;65364:16;65395:11;65424:8;65409:12;:23;65395:37;;65945:16;65941:2;65937:25;65925:37;;66317:12;66277:8;66236:1;66174:25;66115:1;66054;66027:335;66688:1;66674:12;66670:20;66628:346;66729:3;66720:7;66717:16;66628:346;;66947:7;66937:8;66934:1;66907:25;66904:1;66901;66896:59;66782:1;66773:7;66769:15;66758:26;;66628:346;;;66632:77;67019:1;67007:8;:13;67003:45;;67029:19;;;;;;;;;;;;;;67003:45;67081:3;67065:13;:19;;;;64579:2517;;67106:60;67135:1;67139:2;67143:12;67157:8;67106:20;:60::i;:::-;64215:2959;64153:3021;;:::o;48668:1291::-;48751:7;48771:12;48786:7;48771:22;;48854:4;48835:15;:13;:15::i;:::-;:23;48831:1061;;48888:13;;48881:4;:20;48877:1015;;;48926:14;48943:17;:23;48961:4;48943:23;;;;;;;;;;;;48926:40;;49060:1;37769:8;49032:6;:24;:29;49028:845;;49697:113;49714:1;49704:6;:11;49697:113;;49757:17;:25;49775:6;;;;;;;49757:25;;;;;;;;;;;;49748:34;;49697:113;;;49843:6;49836:13;;;;;;49028:845;48903:989;48877:1015;48831:1061;49920:31;;;;;;;;;;;;;;48668:1291;;;;:::o;3494:191::-;3568:16;3587:6;;;;;;;;;;;3568:25;;3613:8;3604:6;;:17;;;;;;;;;;;;;;;;;;3668:8;3637:40;;3658:8;3637:40;;;;;;;;;;;;3557:128;3494:191;:::o;48100:177::-;48184:21;;:::i;:::-;48225:44;48244:17;:24;48262:5;48244:24;;;;;;;;;;;;48225:18;:44::i;:::-;48218:51;;48100:177;;;:::o;41337:103::-;41392:7;41419:13;;41412:20;;41337:103;:::o;53332:259::-;53504:8;53452:18;:39;53471:19;:17;:19::i;:::-;53452:39;;;;;;;;;;;;;;;:49;53492:8;53452:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;53564:8;53528:55;;53543:19;:17;:19::i;:::-;53528:55;;;53574:8;53528:55;;;;;;:::i;:::-;;;;;;;;53332:259;;:::o;62860:831::-;63023:4;63082:2;63057:45;;;63121:19;:17;:19::i;:::-;63159:4;63182:7;63208:5;63057:171;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;63040:644;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63459:1;63442:6;:13;:18;63438:235;;63488:40;;;;;;;;;;;;;;63438:235;63631:6;63625:13;63616:6;63612:2;63608:15;63601:38;63040:644;63328:54;;;63301:81;;;:6;:81;;;;63277:105;;;62860:831;;;;;;:::o;47822:182::-;47908:21;;:::i;:::-;47949:47;47968:27;47987:7;47968:18;:27::i;:::-;47949:18;:47::i;:::-;47942:54;;47822:182;;;:::o;77635:1761::-;77716:17;78150:4;78143;78137:11;78133:22;78242:1;78236:4;78229:15;78317:4;78314:1;78310:12;78303:19;;78399:1;78394:3;78387:14;78503:3;78742:5;78724:428;78750:1;78724:428;;;78790:1;78785:3;78781:11;78774:18;;78961:2;78955:4;78951:13;78947:2;78943:22;78938:3;78930:36;79055:2;79049:4;79045:13;79037:21;;79122:4;78724:428;79112:25;78724:428;78728:21;79191:3;79186;79182:13;79306:4;79301:3;79297:14;79290:21;;79371:6;79366:3;79359:19;77755:1634;;;77635:1761;;;:::o;106099:114::-;106159:13;106192;106185:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106099:114;:::o;43165:204::-;43226:7;36993:13;37131:2;43267:18;:25;43286:5;43267:25;;;;;;;;;;;;;;;;:50;;43266:95;43246:115;;43165:204;;;:::o;6390:157::-;6475:4;6514:25;6499:40;;;:11;:40;;;;6492:47;;6390:157;;;:::o;779:98::-;832:7;859:10;852:17;;779:98;:::o;77428:105::-;77488:7;77515:10;77508:17;;77428:105;:::o;55358:501::-;55476:27;55505:23;55546:38;55587:15;:24;55603:7;55587:24;;;;;;;;;;;55546:65;;55764:18;55741:41;;55821:19;55815:26;55796:45;;55726:126;55358:501;;;:::o;54586:659::-;54735:11;54900:16;54893:5;54889:28;54880:37;;55060:16;55049:9;55045:32;55032:45;;55210:15;55199:9;55196:30;55188:5;55177:9;55174:20;55171:56;55161:66;;54586:659;;;;;:::o;61438:159::-;;;;;:::o;76737:311::-;76872:7;76892:16;38173:3;76918:19;:41;;76892:68;;38173:3;76986:31;76997:4;77003:2;77007:9;76986:10;:31::i;:::-;76978:40;;:62;;76971:69;;;76737:311;;;;;:::o;50523:524::-;50628:14;50796:16;50789:5;50785:28;50776:37;;51008:5;50994:11;50969:23;50965:41;50962:52;50938:5;50917:112;50907:122;;50523:524;;;;:::o;62262:158::-;;;;;:::o;106777:196::-;106888:4;106912:53;106920:6;106928:5;106935:10;:29;106946:17;106935:29;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;106912:7;:53::i;:::-;106905:60;;106777:196;;;;:::o;106981:179::-;107084:4;107108:44;107116:6;107124:5;107131:10;:20;107142:8;107131:20;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;107108:7;:44::i;:::-;107101:51;;106981:179;;;;:::o;107168:::-;107271:4;107295:44;107303:6;107311:5;107318:10;:20;107329:8;107318:20;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;107295:7;:44::i;:::-;107288:51;;107168:179;;;;:::o;107355:193::-;107465:4;107489:51;107497:6;107505:5;107512:10;:27;107523:15;107512:27;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;107489:7;:51::i;:::-;107482:58;;107355:193;;;;:::o;51149:340::-;51235:14;51468:1;51458:8;51455:15;51429:24;51425:46;51415:56;;51149:340;;;:::o;50058:382::-;50140:31;;:::i;:::-;50217:6;50184:9;:14;;:41;;;;;;;;;;;37652:3;50270:6;:33;;50236:9;:24;;:68;;;;;;;;;;;50362:1;37769:8;50334:6;:24;:29;;50315:9;:16;;:48;;;;;;;;;;;38173:3;50403:6;:28;;50374:9;:19;;:58;;;;;;;;;;;50058:382;;;:::o;76438:147::-;76575:6;76438:147;;;;;:::o;107781:360::-;107910:4;107927:12;107986:5;107975:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;107965:28;;;;;;107952:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;107942:53;;;;;;107927:68;;108006:17;108026:39;108045:6;108053:5;108060:4;108026:18;:39::i;:::-;108006:59;;108080:12;108076:57;;;108101:4;108094:11;;;;;;108076:57;108128:5;108121:12;;;;107781:360;;;;;;:::o;11905:156::-;11996:4;12049;12020:25;12033:5;12040:4;12020:12;:25::i;:::-;:33;12013:40;;11905:156;;;;;:::o;12704:296::-;12787:7;12807:20;12830:4;12807:27;;12850:9;12845:118;12869:5;:12;12865:1;:16;12845:118;;;12918:33;12928:12;12942:5;12948:1;12942:8;;;;;;;;:::i;:::-;;;;;;;;12918:9;:33::i;:::-;12903:48;;12883:3;;;;;:::i;:::-;;;;12845:118;;;;12980:12;12973:19;;;12704:296;;;;:::o;19908:149::-;19971:7;20002:1;19998;:5;:51;;20029:20;20044:1;20047;20029:14;:20::i;:::-;19998:51;;;20006:20;20021:1;20024;20006:14;:20::i;:::-;19998:51;19991:58;;19908:149;;;;:::o;20065:268::-;20133:13;20240:1;20234:4;20227:15;20269:1;20263:4;20256:15;20310:4;20304;20294:21;20285:30;;20065:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:126::-;1990:7;2030:42;2023:5;2019:54;2008:65;;1953:126;;;:::o;2085:96::-;2122:7;2151:24;2169:5;2151:24;:::i;:::-;2140:35;;2085:96;;;:::o;2187:122::-;2260:24;2278:5;2260:24;:::i;:::-;2253:5;2250:35;2240:63;;2299:1;2296;2289:12;2240:63;2187:122;:::o;2315:139::-;2361:5;2399:6;2386:20;2377:29;;2415:33;2442:5;2415:33;:::i;:::-;2315:139;;;;:::o;2460:109::-;2496:7;2536:26;2529:5;2525:38;2514:49;;2460:109;;;:::o;2575:120::-;2647:23;2664:5;2647:23;:::i;:::-;2640:5;2637:34;2627:62;;2685:1;2682;2675:12;2627:62;2575:120;:::o;2701:137::-;2746:5;2784:6;2771:20;2762:29;;2800:32;2826:5;2800:32;:::i;:::-;2701:137;;;;:::o;2844:472::-;2911:6;2919;2968:2;2956:9;2947:7;2943:23;2939:32;2936:119;;;2974:79;;:::i;:::-;2936:119;3094:1;3119:53;3164:7;3155:6;3144:9;3140:22;3119:53;:::i;:::-;3109:63;;3065:117;3221:2;3247:52;3291:7;3282:6;3271:9;3267:22;3247:52;:::i;:::-;3237:62;;3192:117;2844:472;;;;;:::o;3322:99::-;3374:6;3408:5;3402:12;3392:22;;3322:99;;;:::o;3427:169::-;3511:11;3545:6;3540:3;3533:19;3585:4;3580:3;3576:14;3561:29;;3427:169;;;;:::o;3602:246::-;3683:1;3693:113;3707:6;3704:1;3701:13;3693:113;;;3792:1;3787:3;3783:11;3777:18;3773:1;3768:3;3764:11;3757:39;3729:2;3726:1;3722:10;3717:15;;3693:113;;;3840:1;3831:6;3826:3;3822:16;3815:27;3664:184;3602:246;;;:::o;3854:102::-;3895:6;3946:2;3942:7;3937:2;3930:5;3926:14;3922:28;3912:38;;3854:102;;;:::o;3962:377::-;4050:3;4078:39;4111:5;4078:39;:::i;:::-;4133:71;4197:6;4192:3;4133:71;:::i;:::-;4126:78;;4213:65;4271:6;4266:3;4259:4;4252:5;4248:16;4213:65;:::i;:::-;4303:29;4325:6;4303:29;:::i;:::-;4298:3;4294:39;4287:46;;4054:285;3962:377;;;;:::o;4345:313::-;4458:4;4496:2;4485:9;4481:18;4473:26;;4545:9;4539:4;4535:20;4531:1;4520:9;4516:17;4509:47;4573:78;4646:4;4637:6;4573:78;:::i;:::-;4565:86;;4345:313;;;;:::o;4664:122::-;4737:24;4755:5;4737:24;:::i;:::-;4730:5;4727:35;4717:63;;4776:1;4773;4766:12;4717:63;4664:122;:::o;4792:139::-;4838:5;4876:6;4863:20;4854:29;;4892:33;4919:5;4892:33;:::i;:::-;4792:139;;;;:::o;4937:329::-;4996:6;5045:2;5033:9;5024:7;5020:23;5016:32;5013:119;;;5051:79;;:::i;:::-;5013:119;5171:1;5196:53;5241:7;5232:6;5221:9;5217:22;5196:53;:::i;:::-;5186:63;;5142:117;4937:329;;;;:::o;5272:118::-;5359:24;5377:5;5359:24;:::i;:::-;5354:3;5347:37;5272:118;;:::o;5396:222::-;5489:4;5527:2;5516:9;5512:18;5504:26;;5540:71;5608:1;5597:9;5593:17;5584:6;5540:71;:::i;:::-;5396:222;;;;:::o;5624:474::-;5692:6;5700;5749:2;5737:9;5728:7;5724:23;5720:32;5717:119;;;5755:79;;:::i;:::-;5717:119;5875:1;5900:53;5945:7;5936:6;5925:9;5921:22;5900:53;:::i;:::-;5890:63;;5846:117;6002:2;6028:53;6073:7;6064:6;6053:9;6049:22;6028:53;:::i;:::-;6018:63;;5973:118;5624:474;;;;;:::o;6104:332::-;6225:4;6263:2;6252:9;6248:18;6240:26;;6276:71;6344:1;6333:9;6329:17;6320:6;6276:71;:::i;:::-;6357:72;6425:2;6414:9;6410:18;6401:6;6357:72;:::i;:::-;6104:332;;;;;:::o;6442:619::-;6519:6;6527;6535;6584:2;6572:9;6563:7;6559:23;6555:32;6552:119;;;6590:79;;:::i;:::-;6552:119;6710:1;6735:53;6780:7;6771:6;6760:9;6756:22;6735:53;:::i;:::-;6725:63;;6681:117;6837:2;6863:53;6908:7;6899:6;6888:9;6884:22;6863:53;:::i;:::-;6853:63;;6808:118;6965:2;6991:53;7036:7;7027:6;7016:9;7012:22;6991:53;:::i;:::-;6981:63;;6936:118;6442:619;;;;;:::o;7067:474::-;7135:6;7143;7192:2;7180:9;7171:7;7167:23;7163:32;7160:119;;;7198:79;;:::i;:::-;7160:119;7318:1;7343:53;7388:7;7379:6;7368:9;7364:22;7343:53;:::i;:::-;7333:63;;7289:117;7445:2;7471:53;7516:7;7507:6;7496:9;7492:22;7471:53;:::i;:::-;7461:63;;7416:118;7067:474;;;;;:::o;7547:332::-;7668:4;7706:2;7695:9;7691:18;7683:26;;7719:71;7787:1;7776:9;7772:17;7763:6;7719:71;:::i;:::-;7800:72;7868:2;7857:9;7853:18;7844:6;7800:72;:::i;:::-;7547:332;;;;;:::o;7885:116::-;7955:21;7970:5;7955:21;:::i;:::-;7948:5;7945:32;7935:60;;7991:1;7988;7981:12;7935:60;7885:116;:::o;8007:133::-;8050:5;8088:6;8075:20;8066:29;;8104:30;8128:5;8104:30;:::i;:::-;8007:133;;;;:::o;8146:323::-;8202:6;8251:2;8239:9;8230:7;8226:23;8222:32;8219:119;;;8257:79;;:::i;:::-;8219:119;8377:1;8402:50;8444:7;8435:6;8424:9;8420:22;8402:50;:::i;:::-;8392:60;;8348:114;8146:323;;;;:::o;8475:117::-;8584:1;8581;8574:12;8598:180;8646:77;8643:1;8636:88;8743:4;8740:1;8733:15;8767:4;8764:1;8757:15;8784:281;8867:27;8889:4;8867:27;:::i;:::-;8859:6;8855:40;8997:6;8985:10;8982:22;8961:18;8949:10;8946:34;8943:62;8940:88;;;9008:18;;:::i;:::-;8940:88;9048:10;9044:2;9037:22;8827:238;8784:281;;:::o;9071:129::-;9105:6;9132:20;;:::i;:::-;9122:30;;9161:33;9189:4;9181:6;9161:33;:::i;:::-;9071:129;;;:::o;9206:311::-;9283:4;9373:18;9365:6;9362:30;9359:56;;;9395:18;;:::i;:::-;9359:56;9445:4;9437:6;9433:17;9425:25;;9505:4;9499;9495:15;9487:23;;9206:311;;;:::o;9523:117::-;9632:1;9629;9622:12;9646:77;9683:7;9712:5;9701:16;;9646:77;;;:::o;9729:122::-;9802:24;9820:5;9802:24;:::i;:::-;9795:5;9792:35;9782:63;;9841:1;9838;9831:12;9782:63;9729:122;:::o;9857:139::-;9903:5;9941:6;9928:20;9919:29;;9957:33;9984:5;9957:33;:::i;:::-;9857:139;;;;:::o;10019:710::-;10115:5;10140:81;10156:64;10213:6;10156:64;:::i;:::-;10140:81;:::i;:::-;10131:90;;10241:5;10270:6;10263:5;10256:21;10304:4;10297:5;10293:16;10286:23;;10357:4;10349:6;10345:17;10337:6;10333:30;10386:3;10378:6;10375:15;10372:122;;;10405:79;;:::i;:::-;10372:122;10520:6;10503:220;10537:6;10532:3;10529:15;10503:220;;;10612:3;10641:37;10674:3;10662:10;10641:37;:::i;:::-;10636:3;10629:50;10708:4;10703:3;10699:14;10692:21;;10579:144;10563:4;10558:3;10554:14;10547:21;;10503:220;;;10507:21;10121:608;;10019:710;;;;;:::o;10752:370::-;10823:5;10872:3;10865:4;10857:6;10853:17;10849:27;10839:122;;10880:79;;:::i;:::-;10839:122;10997:6;10984:20;11022:94;11112:3;11104:6;11097:4;11089:6;11085:17;11022:94;:::i;:::-;11013:103;;10829:293;10752:370;;;;:::o;11128:684::-;11221:6;11229;11278:2;11266:9;11257:7;11253:23;11249:32;11246:119;;;11284:79;;:::i;:::-;11246:119;11404:1;11429:53;11474:7;11465:6;11454:9;11450:22;11429:53;:::i;:::-;11419:63;;11375:117;11559:2;11548:9;11544:18;11531:32;11590:18;11582:6;11579:30;11576:117;;;11612:79;;:::i;:::-;11576:117;11717:78;11787:7;11778:6;11767:9;11763:22;11717:78;:::i;:::-;11707:88;;11502:303;11128:684;;;;;:::o;11818:180::-;11866:77;11863:1;11856:88;11963:4;11960:1;11953:15;11987:4;11984:1;11977:15;12004:115;12087:1;12080:5;12077:12;12067:46;;12093:18;;:::i;:::-;12067:46;12004:115;:::o;12125:131::-;12172:7;12201:5;12190:16;;12207:43;12244:5;12207:43;:::i;:::-;12125:131;;;:::o;12262:::-;12320:9;12353:34;12381:5;12353:34;:::i;:::-;12340:47;;12262:131;;;:::o;12399:147::-;12494:45;12533:5;12494:45;:::i;:::-;12489:3;12482:58;12399:147;;:::o;12552:238::-;12653:4;12691:2;12680:9;12676:18;12668:26;;12704:79;12780:1;12769:9;12765:17;12756:6;12704:79;:::i;:::-;12552:238;;;;:::o;12796:329::-;12855:6;12904:2;12892:9;12883:7;12879:23;12875:32;12872:119;;;12910:79;;:::i;:::-;12872:119;13030:1;13055:53;13100:7;13091:6;13080:9;13076:22;13055:53;:::i;:::-;13045:63;;13001:117;12796:329;;;;:::o;13131:109::-;13214:1;13207:5;13204:12;13194:40;;13230:1;13227;13220:12;13194:40;13131:109;:::o;13246:159::-;13302:5;13340:6;13327:20;13318:29;;13356:43;13393:5;13356:43;:::i;:::-;13246:159;;;;:::o;13411:494::-;13489:6;13497;13546:2;13534:9;13525:7;13521:23;13517:32;13514:119;;;13552:79;;:::i;:::-;13514:119;13672:1;13697:63;13752:7;13743:6;13732:9;13728:22;13697:63;:::i;:::-;13687:73;;13643:127;13809:2;13835:53;13880:7;13871:6;13860:9;13856:22;13835:53;:::i;:::-;13825:63;;13780:118;13411:494;;;;;:::o;13911:117::-;14020:1;14017;14010:12;14048:553;14106:8;14116:6;14166:3;14159:4;14151:6;14147:17;14143:27;14133:122;;14174:79;;:::i;:::-;14133:122;14287:6;14274:20;14264:30;;14317:18;14309:6;14306:30;14303:117;;;14339:79;;:::i;:::-;14303:117;14453:4;14445:6;14441:17;14429:29;;14507:3;14499:4;14491:6;14487:17;14477:8;14473:32;14470:41;14467:128;;;14514:79;;:::i;:::-;14467:128;14048:553;;;;;:::o;14607:529::-;14678:6;14686;14735:2;14723:9;14714:7;14710:23;14706:32;14703:119;;;14741:79;;:::i;:::-;14703:119;14889:1;14878:9;14874:17;14861:31;14919:18;14911:6;14908:30;14905:117;;;14941:79;;:::i;:::-;14905:117;15054:65;15111:7;15102:6;15091:9;15087:22;15054:65;:::i;:::-;15036:83;;;;14832:297;14607:529;;;;;:::o;15159:568::-;15232:8;15242:6;15292:3;15285:4;15277:6;15273:17;15269:27;15259:122;;15300:79;;:::i;:::-;15259:122;15413:6;15400:20;15390:30;;15443:18;15435:6;15432:30;15429:117;;;15465:79;;:::i;:::-;15429:117;15579:4;15571:6;15567:17;15555:29;;15633:3;15625:4;15617:6;15613:17;15603:8;15599:32;15596:41;15593:128;;;15640:79;;:::i;:::-;15593:128;15159:568;;;;;:::o;15733:559::-;15819:6;15827;15876:2;15864:9;15855:7;15851:23;15847:32;15844:119;;;15882:79;;:::i;:::-;15844:119;16030:1;16019:9;16015:17;16002:31;16060:18;16052:6;16049:30;16046:117;;;16082:79;;:::i;:::-;16046:117;16195:80;16267:7;16258:6;16247:9;16243:22;16195:80;:::i;:::-;16177:98;;;;15973:312;15733:559;;;;;:::o;16298:146::-;16397:6;16431:5;16425:12;16415:22;;16298:146;;;:::o;16450:216::-;16581:11;16615:6;16610:3;16603:19;16655:4;16650:3;16646:14;16631:29;;16450:216;;;;:::o;16672:164::-;16771:4;16794:3;16786:11;;16824:4;16819:3;16815:14;16807:22;;16672:164;;;:::o;16842:108::-;16919:24;16937:5;16919:24;:::i;:::-;16914:3;16907:37;16842:108;;:::o;16956:101::-;16992:7;17032:18;17025:5;17021:30;17010:41;;16956:101;;;:::o;17063:105::-;17138:23;17155:5;17138:23;:::i;:::-;17133:3;17126:36;17063:105;;:::o;17174:99::-;17245:21;17260:5;17245:21;:::i;:::-;17240:3;17233:34;17174:99;;:::o;17279:91::-;17315:7;17355:8;17348:5;17344:20;17333:31;;17279:91;;;:::o;17376:105::-;17451:23;17468:5;17451:23;:::i;:::-;17446:3;17439:36;17376:105;;:::o;17559:866::-;17710:4;17705:3;17701:14;17797:4;17790:5;17786:16;17780:23;17816:63;17873:4;17868:3;17864:14;17850:12;17816:63;:::i;:::-;17725:164;17981:4;17974:5;17970:16;17964:23;18000:61;18055:4;18050:3;18046:14;18032:12;18000:61;:::i;:::-;17899:172;18155:4;18148:5;18144:16;18138:23;18174:57;18225:4;18220:3;18216:14;18202:12;18174:57;:::i;:::-;18081:160;18328:4;18321:5;18317:16;18311:23;18347:61;18402:4;18397:3;18393:14;18379:12;18347:61;:::i;:::-;18251:167;17679:746;17559:866;;:::o;18431:307::-;18564:10;18585:110;18691:3;18683:6;18585:110;:::i;:::-;18727:4;18722:3;18718:14;18704:28;;18431:307;;;;:::o;18744:145::-;18846:4;18878;18873:3;18869:14;18861:22;;18744:145;;;:::o;18971:988::-;19154:3;19183:86;19263:5;19183:86;:::i;:::-;19285:118;19396:6;19391:3;19285:118;:::i;:::-;19278:125;;19427:88;19509:5;19427:88;:::i;:::-;19538:7;19569:1;19554:380;19579:6;19576:1;19573:13;19554:380;;;19655:6;19649:13;19682:127;19805:3;19790:13;19682:127;:::i;:::-;19675:134;;19832:92;19917:6;19832:92;:::i;:::-;19822:102;;19614:320;19601:1;19598;19594:9;19589:14;;19554:380;;;19558:14;19950:3;19943:10;;19159:800;;;18971:988;;;;:::o;19965:501::-;20172:4;20210:2;20199:9;20195:18;20187:26;;20259:9;20253:4;20249:20;20245:1;20234:9;20230:17;20223:47;20287:172;20454:4;20445:6;20287:172;:::i;:::-;20279:180;;19965:501;;;;:::o;20472:114::-;20539:6;20573:5;20567:12;20557:22;;20472:114;;;:::o;20592:184::-;20691:11;20725:6;20720:3;20713:19;20765:4;20760:3;20756:14;20741:29;;20592:184;;;;:::o;20782:132::-;20849:4;20872:3;20864:11;;20902:4;20897:3;20893:14;20885:22;;20782:132;;;:::o;20920:108::-;20997:24;21015:5;20997:24;:::i;:::-;20992:3;20985:37;20920:108;;:::o;21034:179::-;21103:10;21124:46;21166:3;21158:6;21124:46;:::i;:::-;21202:4;21197:3;21193:14;21179:28;;21034:179;;;;:::o;21219:113::-;21289:4;21321;21316:3;21312:14;21304:22;;21219:113;;;:::o;21368:732::-;21487:3;21516:54;21564:5;21516:54;:::i;:::-;21586:86;21665:6;21660:3;21586:86;:::i;:::-;21579:93;;21696:56;21746:5;21696:56;:::i;:::-;21775:7;21806:1;21791:284;21816:6;21813:1;21810:13;21791:284;;;21892:6;21886:13;21919:63;21978:3;21963:13;21919:63;:::i;:::-;21912:70;;22005:60;22058:6;22005:60;:::i;:::-;21995:70;;21851:224;21838:1;21835;21831:9;21826:14;;21791:284;;;21795:14;22091:3;22084:10;;21492:608;;;21368:732;;;;:::o;22106:373::-;22249:4;22287:2;22276:9;22272:18;22264:26;;22336:9;22330:4;22326:20;22322:1;22311:9;22307:17;22300:47;22364:108;22467:4;22458:6;22364:108;:::i;:::-;22356:116;;22106:373;;;;:::o;22485:619::-;22562:6;22570;22578;22627:2;22615:9;22606:7;22602:23;22598:32;22595:119;;;22633:79;;:::i;:::-;22595:119;22753:1;22778:53;22823:7;22814:6;22803:9;22799:22;22778:53;:::i;:::-;22768:63;;22724:117;22880:2;22906:53;22951:7;22942:6;22931:9;22927:22;22906:53;:::i;:::-;22896:63;;22851:118;23008:2;23034:53;23079:7;23070:6;23059:9;23055:22;23034:53;:::i;:::-;23024:63;;22979:118;22485:619;;;;;:::o;23110:468::-;23175:6;23183;23232:2;23220:9;23211:7;23207:23;23203:32;23200:119;;;23238:79;;:::i;:::-;23200:119;23358:1;23383:53;23428:7;23419:6;23408:9;23404:22;23383:53;:::i;:::-;23373:63;;23329:117;23485:2;23511:50;23553:7;23544:6;23533:9;23529:22;23511:50;:::i;:::-;23501:60;;23456:115;23110:468;;;;;:::o;23584:116::-;23668:1;23661:5;23658:12;23648:46;;23674:18;;:::i;:::-;23648:46;23584:116;:::o;23706:133::-;23754:7;23783:5;23772:16;;23789:44;23827:5;23789:44;:::i;:::-;23706:133;;;:::o;23845:::-;23904:9;23937:35;23966:5;23937:35;:::i;:::-;23924:48;;23845:133;;;:::o;23984:149::-;24080:46;24120:5;24080:46;:::i;:::-;24075:3;24068:59;23984:149;;:::o;24139:93::-;24175:7;24215:10;24208:5;24204:22;24193:33;;24139:93;;;:::o;24238:115::-;24323:23;24340:5;24323:23;:::i;:::-;24318:3;24311:36;24238:115;;:::o;24359:452::-;24513:4;24551:2;24540:9;24536:18;24528:26;;24564:80;24641:1;24630:9;24626:17;24617:6;24564:80;:::i;:::-;24654:70;24720:2;24709:9;24705:18;24696:6;24654:70;:::i;:::-;24734;24800:2;24789:9;24785:18;24776:6;24734:70;:::i;:::-;24359:452;;;;;;:::o;24817:218::-;24908:4;24946:2;24935:9;24931:18;24923:26;;24959:69;25025:1;25014:9;25010:17;25001:6;24959:69;:::i;:::-;24817:218;;;;:::o;25041:117::-;25150:1;25147;25140:12;25164:307;25225:4;25315:18;25307:6;25304:30;25301:56;;;25337:18;;:::i;:::-;25301:56;25375:29;25397:6;25375:29;:::i;:::-;25367:37;;25459:4;25453;25449:15;25441:23;;25164:307;;;:::o;25477:146::-;25574:6;25569:3;25564;25551:30;25615:1;25606:6;25601:3;25597:16;25590:27;25477:146;;;:::o;25629:423::-;25706:5;25731:65;25747:48;25788:6;25747:48;:::i;:::-;25731:65;:::i;:::-;25722:74;;25819:6;25812:5;25805:21;25857:4;25850:5;25846:16;25895:3;25886:6;25881:3;25877:16;25874:25;25871:112;;;25902:79;;:::i;:::-;25871:112;25992:54;26039:6;26034:3;26029;25992:54;:::i;:::-;25712:340;25629:423;;;;;:::o;26071:338::-;26126:5;26175:3;26168:4;26160:6;26156:17;26152:27;26142:122;;26183:79;;:::i;:::-;26142:122;26300:6;26287:20;26325:78;26399:3;26391:6;26384:4;26376:6;26372:17;26325:78;:::i;:::-;26316:87;;26132:277;26071:338;;;;:::o;26415:943::-;26510:6;26518;26526;26534;26583:3;26571:9;26562:7;26558:23;26554:33;26551:120;;;26590:79;;:::i;:::-;26551:120;26710:1;26735:53;26780:7;26771:6;26760:9;26756:22;26735:53;:::i;:::-;26725:63;;26681:117;26837:2;26863:53;26908:7;26899:6;26888:9;26884:22;26863:53;:::i;:::-;26853:63;;26808:118;26965:2;26991:53;27036:7;27027:6;27016:9;27012:22;26991:53;:::i;:::-;26981:63;;26936:118;27121:2;27110:9;27106:18;27093:32;27152:18;27144:6;27141:30;27138:117;;;27174:79;;:::i;:::-;27138:117;27279:62;27333:7;27324:6;27313:9;27309:22;27279:62;:::i;:::-;27269:72;;27064:287;26415:943;;;;;;;:::o;27364:684::-;27457:6;27465;27514:2;27502:9;27493:7;27489:23;27485:32;27482:119;;;27520:79;;:::i;:::-;27482:119;27640:1;27665:53;27710:7;27701:6;27690:9;27686:22;27665:53;:::i;:::-;27655:63;;27611:117;27795:2;27784:9;27780:18;27767:32;27826:18;27818:6;27815:30;27812:117;;;27848:79;;:::i;:::-;27812:117;27953:78;28023:7;28014:6;28003:9;27999:22;27953:78;:::i;:::-;27943:88;;27738:303;27364:684;;;;;:::o;28126:876::-;28287:4;28282:3;28278:14;28374:4;28367:5;28363:16;28357:23;28393:63;28450:4;28445:3;28441:14;28427:12;28393:63;:::i;:::-;28302:164;28558:4;28551:5;28547:16;28541:23;28577:61;28632:4;28627:3;28623:14;28609:12;28577:61;:::i;:::-;28476:172;28732:4;28725:5;28721:16;28715:23;28751:57;28802:4;28797:3;28793:14;28779:12;28751:57;:::i;:::-;28658:160;28905:4;28898:5;28894:16;28888:23;28924:61;28979:4;28974:3;28970:14;28956:12;28924:61;:::i;:::-;28828:167;28256:746;28126:876;;:::o;29008:351::-;29165:4;29203:3;29192:9;29188:19;29180:27;;29217:135;29349:1;29338:9;29334:17;29325:6;29217:135;:::i;:::-;29008:351;;;;:::o;29365:120::-;29437:23;29454:5;29437:23;:::i;:::-;29430:5;29427:34;29417:62;;29475:1;29472;29465:12;29417:62;29365:120;:::o;29491:137::-;29536:5;29574:6;29561:20;29552:29;;29590:32;29616:5;29590:32;:::i;:::-;29491:137;;;;:::o;29634:615::-;29709:6;29717;29725;29774:2;29762:9;29753:7;29749:23;29745:32;29742:119;;;29780:79;;:::i;:::-;29742:119;29900:1;29925:53;29970:7;29961:6;29950:9;29946:22;29925:53;:::i;:::-;29915:63;;29871:117;30027:2;30053:52;30097:7;30088:6;30077:9;30073:22;30053:52;:::i;:::-;30043:62;;29998:117;30154:2;30180:52;30224:7;30215:6;30204:9;30200:22;30180:52;:::i;:::-;30170:62;;30125:117;29634:615;;;;;:::o;30255:274::-;30355:4;30445:18;30437:6;30434:30;30431:56;;;30467:18;;:::i;:::-;30431:56;30517:4;30509:6;30505:17;30497:25;;30255:274;;;:::o;30555:923::-;30674:5;30699:104;30715:87;30795:6;30715:87;:::i;:::-;30699:104;:::i;:::-;30690:113;;30823:5;30876:4;30868:6;30864:17;30856:6;30852:30;30905:3;30897:6;30894:15;30891:122;;;30924:79;;:::i;:::-;30891:122;31039:6;31022:450;31056:6;31051:3;31048:15;31022:450;;;31145:3;31132:17;31181:18;31168:11;31165:35;31162:122;;;31203:79;;:::i;:::-;31162:122;31327:11;31319:6;31315:24;31365:62;31423:3;31411:10;31365:62;:::i;:::-;31360:3;31353:75;31457:4;31452:3;31448:14;31441:21;;31098:374;;31082:4;31077:3;31073:14;31066:21;;31022:450;;;31026:21;30680:798;;30555:923;;;;;:::o;31504:389::-;31598:5;31647:3;31640:4;31632:6;31628:17;31624:27;31614:122;;31655:79;;:::i;:::-;31614:122;31759:4;31781:106;31883:3;31875:6;31867;31781:106;:::i;:::-;31772:115;;31604:289;31504:389;;;;:::o;31899:730::-;32015:6;32023;32072:2;32060:9;32051:7;32047:23;32043:32;32040:119;;;32078:79;;:::i;:::-;32040:119;32198:1;32223:53;32268:7;32259:6;32248:9;32244:22;32223:53;:::i;:::-;32213:63;;32169:117;32353:2;32342:9;32338:18;32325:32;32384:18;32376:6;32373:30;32370:117;;;32406:79;;:::i;:::-;32370:117;32511:101;32604:7;32595:6;32584:9;32580:22;32511:101;:::i;:::-;32501:111;;32296:326;31899:730;;;;;:::o;32635:474::-;32703:6;32711;32760:2;32748:9;32739:7;32735:23;32731:32;32728:119;;;32766:79;;:::i;:::-;32728:119;32886:1;32911:53;32956:7;32947:6;32936:9;32932:22;32911:53;:::i;:::-;32901:63;;32857:117;33013:2;33039:53;33084:7;33075:6;33064:9;33060:22;33039:53;:::i;:::-;33029:63;;32984:118;32635:474;;;;;:::o;33115:829::-;33217:6;33225;33233;33282:2;33270:9;33261:7;33257:23;33253:32;33250:119;;;33288:79;;:::i;:::-;33250:119;33408:1;33433:53;33478:7;33469:6;33458:9;33454:22;33433:53;:::i;:::-;33423:63;;33379:117;33535:2;33561:53;33606:7;33597:6;33586:9;33582:22;33561:53;:::i;:::-;33551:63;;33506:118;33691:2;33680:9;33676:18;33663:32;33722:18;33714:6;33711:30;33708:117;;;33744:79;;:::i;:::-;33708:117;33849:78;33919:7;33910:6;33899:9;33895:22;33849:78;:::i;:::-;33839:88;;33634:303;33115:829;;;;;:::o;33950:104::-;33995:7;34024:24;34042:5;34024:24;:::i;:::-;34013:35;;33950:104;;;:::o;34060:138::-;34141:32;34167:5;34141:32;:::i;:::-;34134:5;34131:43;34121:71;;34188:1;34185;34178:12;34121:71;34060:138;:::o;34204:155::-;34258:5;34296:6;34283:20;34274:29;;34312:41;34347:5;34312:41;:::i;:::-;34204:155;;;;:::o;34365:345::-;34432:6;34481:2;34469:9;34460:7;34456:23;34452:32;34449:119;;;34487:79;;:::i;:::-;34449:119;34607:1;34632:61;34685:7;34676:6;34665:9;34661:22;34632:61;:::i;:::-;34622:71;;34578:125;34365:345;;;;:::o;34716:180::-;34764:77;34761:1;34754:88;34861:4;34858:1;34851:15;34885:4;34882:1;34875:15;34902:320;34946:6;34983:1;34977:4;34973:12;34963:22;;35030:1;35024:4;35020:12;35051:18;35041:81;;35107:4;35099:6;35095:17;35085:27;;35041:81;35169:2;35161:6;35158:14;35138:18;35135:38;35132:84;;35188:18;;:::i;:::-;35132:84;34953:269;34902:320;;;:::o;35228:180::-;35276:77;35273:1;35266:88;35373:4;35370:1;35363:15;35397:4;35394:1;35387:15;35414:410;35454:7;35477:20;35495:1;35477:20;:::i;:::-;35472:25;;35511:20;35529:1;35511:20;:::i;:::-;35506:25;;35566:1;35563;35559:9;35588:30;35606:11;35588:30;:::i;:::-;35577:41;;35767:1;35758:7;35754:15;35751:1;35748:22;35728:1;35721:9;35701:83;35678:139;;35797:18;;:::i;:::-;35678:139;35462:362;35414:410;;;;:::o;35830:180::-;35878:77;35875:1;35868:88;35975:4;35972:1;35965:15;35999:4;35996:1;35989:15;36016:185;36056:1;36073:20;36091:1;36073:20;:::i;:::-;36068:25;;36107:20;36125:1;36107:20;:::i;:::-;36102:25;;36146:1;36136:35;;36151:18;;:::i;:::-;36136:35;36193:1;36190;36186:9;36181:14;;36016:185;;;;:::o;36207:233::-;36246:3;36269:24;36287:5;36269:24;:::i;:::-;36260:33;;36315:66;36308:5;36305:77;36302:103;;36385:18;;:::i;:::-;36302:103;36432:1;36425:5;36421:13;36414:20;;36207:233;;;:::o;36446:118::-;36533:24;36551:5;36533:24;:::i;:::-;36528:3;36521:37;36446:118;;:::o;36570:348::-;36699:4;36737:2;36726:9;36722:18;36714:26;;36750:79;36826:1;36815:9;36811:17;36802:6;36750:79;:::i;:::-;36839:72;36907:2;36896:9;36892:18;36883:6;36839:72;:::i;:::-;36570:348;;;;;:::o;36924:97::-;36983:6;37011:3;37001:13;;36924:97;;;;:::o;37027:141::-;37076:4;37099:3;37091:11;;37122:3;37119:1;37112:14;37156:4;37153:1;37143:18;37135:26;;37027:141;;;:::o;37174:93::-;37211:6;37258:2;37253;37246:5;37242:14;37238:23;37228:33;;37174:93;;;:::o;37273:107::-;37317:8;37367:5;37361:4;37357:16;37336:37;;37273:107;;;;:::o;37386:393::-;37455:6;37505:1;37493:10;37489:18;37528:97;37558:66;37547:9;37528:97;:::i;:::-;37646:39;37676:8;37665:9;37646:39;:::i;:::-;37634:51;;37718:4;37714:9;37707:5;37703:21;37694:30;;37767:4;37757:8;37753:19;37746:5;37743:30;37733:40;;37462:317;;37386:393;;;;;:::o;37785:60::-;37813:3;37834:5;37827:12;;37785:60;;;:::o;37851:142::-;37901:9;37934:53;37952:34;37961:24;37979:5;37961:24;:::i;:::-;37952:34;:::i;:::-;37934:53;:::i;:::-;37921:66;;37851:142;;;:::o;37999:75::-;38042:3;38063:5;38056:12;;37999:75;;;:::o;38080:269::-;38190:39;38221:7;38190:39;:::i;:::-;38251:91;38300:41;38324:16;38300:41;:::i;:::-;38292:6;38285:4;38279:11;38251:91;:::i;:::-;38245:4;38238:105;38156:193;38080:269;;;:::o;38355:73::-;38400:3;38355:73;:::o;38434:189::-;38511:32;;:::i;:::-;38552:65;38610:6;38602;38596:4;38552:65;:::i;:::-;38487:136;38434:189;;:::o;38629:186::-;38689:120;38706:3;38699:5;38696:14;38689:120;;;38760:39;38797:1;38790:5;38760:39;:::i;:::-;38733:1;38726:5;38722:13;38713:22;;38689:120;;;38629:186;;:::o;38821:543::-;38922:2;38917:3;38914:11;38911:446;;;38956:38;38988:5;38956:38;:::i;:::-;39040:29;39058:10;39040:29;:::i;:::-;39030:8;39026:44;39223:2;39211:10;39208:18;39205:49;;;39244:8;39229:23;;39205:49;39267:80;39323:22;39341:3;39323:22;:::i;:::-;39313:8;39309:37;39296:11;39267:80;:::i;:::-;38926:431;;38911:446;38821:543;;;:::o;39370:117::-;39424:8;39474:5;39468:4;39464:16;39443:37;;39370:117;;;;:::o;39493:169::-;39537:6;39570:51;39618:1;39614:6;39606:5;39603:1;39599:13;39570:51;:::i;:::-;39566:56;39651:4;39645;39641:15;39631:25;;39544:118;39493:169;;;;:::o;39667:295::-;39743:4;39889:29;39914:3;39908:4;39889:29;:::i;:::-;39881:37;;39951:3;39948:1;39944:11;39938:4;39935:21;39927:29;;39667:295;;;;:::o;39967:1403::-;40091:44;40131:3;40126;40091:44;:::i;:::-;40200:18;40192:6;40189:30;40186:56;;;40222:18;;:::i;:::-;40186:56;40266:38;40298:4;40292:11;40266:38;:::i;:::-;40351:67;40411:6;40403;40397:4;40351:67;:::i;:::-;40445:1;40474:2;40466:6;40463:14;40491:1;40486:632;;;;41162:1;41179:6;41176:84;;;41235:9;41230:3;41226:19;41213:33;41204:42;;41176:84;41286:67;41346:6;41339:5;41286:67;:::i;:::-;41280:4;41273:81;41135:229;40456:908;;40486:632;40538:4;40534:9;40526:6;40522:22;40572:37;40604:4;40572:37;:::i;:::-;40631:1;40645:215;40659:7;40656:1;40653:14;40645:215;;;40745:9;40740:3;40736:19;40723:33;40715:6;40708:49;40796:1;40788:6;40784:14;40774:24;;40843:2;40832:9;40828:18;40815:31;;40682:4;40679:1;40675:12;40670:17;;40645:215;;;40888:6;40879:7;40876:19;40873:186;;;40953:9;40948:3;40944:19;40931:33;40996:48;41038:4;41030:6;41026:17;41015:9;40996:48;:::i;:::-;40988:6;40981:64;40896:163;40873:186;41105:1;41101;41093:6;41089:14;41085:22;41079:4;41072:36;40493:625;;;40456:908;;40066:1304;;;39967:1403;;;:::o;41376:180::-;41424:77;41421:1;41414:88;41521:4;41518:1;41511:15;41545:4;41542:1;41535:15;41562:191;41602:3;41621:20;41639:1;41621:20;:::i;:::-;41616:25;;41655:20;41673:1;41655:20;:::i;:::-;41650:25;;41698:1;41695;41691:9;41684:16;;41719:3;41716:1;41713:10;41710:36;;;41726:18;;:::i;:::-;41710:36;41562:191;;;;:::o;41759:442::-;41908:4;41946:2;41935:9;41931:18;41923:26;;41959:71;42027:1;42016:9;42012:17;42003:6;41959:71;:::i;:::-;42040:72;42108:2;42097:9;42093:18;42084:6;42040:72;:::i;:::-;42122;42190:2;42179:9;42175:18;42166:6;42122:72;:::i;:::-;41759:442;;;;;;:::o;42207:476::-;42373:4;42411:2;42400:9;42396:18;42388:26;;42424:71;42492:1;42481:9;42477:17;42468:6;42424:71;:::i;:::-;42505:80;42581:2;42570:9;42566:18;42557:6;42505:80;:::i;:::-;42595:81;42672:2;42661:9;42657:18;42648:6;42595:81;:::i;:::-;42207:476;;;;;;:::o;42689:442::-;42838:4;42876:2;42865:9;42861:18;42853:26;;42889:71;42957:1;42946:9;42942:17;42933:6;42889:71;:::i;:::-;42970:72;43038:2;43027:9;43023:18;43014:6;42970:72;:::i;:::-;43052;43120:2;43109:9;43105:18;43096:6;43052:72;:::i;:::-;42689:442;;;;;;:::o;43137:148::-;43239:11;43276:3;43261:18;;43137:148;;;;:::o;43315:874::-;43418:3;43455:5;43449:12;43484:36;43510:9;43484:36;:::i;:::-;43536:89;43618:6;43613:3;43536:89;:::i;:::-;43529:96;;43656:1;43645:9;43641:17;43672:1;43667:166;;;;43847:1;43842:341;;;;43634:549;;43667:166;43751:4;43747:9;43736;43732:25;43727:3;43720:38;43813:6;43806:14;43799:22;43791:6;43787:35;43782:3;43778:45;43771:52;;43667:166;;43842:341;43909:38;43941:5;43909:38;:::i;:::-;43969:1;43983:154;43997:6;43994:1;43991:13;43983:154;;;44071:7;44065:14;44061:1;44056:3;44052:11;44045:35;44121:1;44112:7;44108:15;44097:26;;44019:4;44016:1;44012:12;44007:17;;43983:154;;;44166:6;44161:3;44157:16;44150:23;;43849:334;;43634:549;;43422:767;;43315:874;;;;:::o;44195:390::-;44301:3;44329:39;44362:5;44329:39;:::i;:::-;44384:89;44466:6;44461:3;44384:89;:::i;:::-;44377:96;;44482:65;44540:6;44535:3;44528:4;44521:5;44517:16;44482:65;:::i;:::-;44572:6;44567:3;44563:16;44556:23;;44305:280;44195:390;;;;:::o;44591:155::-;44731:7;44727:1;44719:6;44715:14;44708:31;44591:155;:::o;44752:400::-;44912:3;44933:84;45015:1;45010:3;44933:84;:::i;:::-;44926:91;;45026:93;45115:3;45026:93;:::i;:::-;45144:1;45139:3;45135:11;45128:18;;44752:400;;;:::o;45158:695::-;45436:3;45458:92;45546:3;45537:6;45458:92;:::i;:::-;45451:99;;45567:95;45658:3;45649:6;45567:95;:::i;:::-;45560:102;;45679:148;45823:3;45679:148;:::i;:::-;45672:155;;45844:3;45837:10;;45158:695;;;;;:::o;45859:701::-;46140:3;46162:95;46253:3;46244:6;46162:95;:::i;:::-;46155:102;;46274:95;46365:3;46356:6;46274:95;:::i;:::-;46267:102;;46386:148;46530:3;46386:148;:::i;:::-;46379:155;;46551:3;46544:10;;45859:701;;;;;:::o;46566:140::-;46615:9;46648:52;46666:33;46675:23;46692:5;46675:23;:::i;:::-;46666:33;:::i;:::-;46648:52;:::i;:::-;46635:65;;46566:140;;;:::o;46712:129::-;46798:36;46828:5;46798:36;:::i;:::-;46793:3;46786:49;46712:129;;:::o;46847:330::-;46967:4;47005:2;46994:9;46990:18;46982:26;;47018:71;47086:1;47075:9;47071:17;47062:6;47018:71;:::i;:::-;47099;47166:2;47155:9;47151:18;47142:6;47099:71;:::i;:::-;46847:330;;;;;:::o;47183:434::-;47328:4;47366:2;47355:9;47351:18;47343:26;;47379:71;47447:1;47436:9;47432:17;47423:6;47379:71;:::i;:::-;47460:70;47526:2;47515:9;47511:18;47502:6;47460:70;:::i;:::-;47540;47606:2;47595:9;47591:18;47582:6;47540:70;:::i;:::-;47183:434;;;;;;:::o;47623:225::-;47763:34;47759:1;47751:6;47747:14;47740:58;47832:8;47827:2;47819:6;47815:15;47808:33;47623:225;:::o;47854:366::-;47996:3;48017:67;48081:2;48076:3;48017:67;:::i;:::-;48010:74;;48093:93;48182:3;48093:93;:::i;:::-;48211:2;48206:3;48202:12;48195:19;;47854:366;;;:::o;48226:419::-;48392:4;48430:2;48419:9;48415:18;48407:26;;48479:9;48473:4;48469:20;48465:1;48454:9;48450:17;48443:47;48507:131;48633:4;48507:131;:::i;:::-;48499:139;;48226:419;;;:::o;48651:182::-;48791:34;48787:1;48779:6;48775:14;48768:58;48651:182;:::o;48839:366::-;48981:3;49002:67;49066:2;49061:3;49002:67;:::i;:::-;48995:74;;49078:93;49167:3;49078:93;:::i;:::-;49196:2;49191:3;49187:12;49180:19;;48839:366;;;:::o;49211:419::-;49377:4;49415:2;49404:9;49400:18;49392:26;;49464:9;49458:4;49454:20;49450:1;49439:9;49435:17;49428:47;49492:131;49618:4;49492:131;:::i;:::-;49484:139;;49211:419;;;:::o;49636:229::-;49776:34;49772:1;49764:6;49760:14;49753:58;49845:12;49840:2;49832:6;49828:15;49821:37;49636:229;:::o;49871:366::-;50013:3;50034:67;50098:2;50093:3;50034:67;:::i;:::-;50027:74;;50110:93;50199:3;50110:93;:::i;:::-;50228:2;50223:3;50219:12;50212:19;;49871:366;;;:::o;50243:419::-;50409:4;50447:2;50436:9;50432:18;50424:26;;50496:9;50490:4;50486:20;50482:1;50471:9;50467:17;50460:47;50524:131;50650:4;50524:131;:::i;:::-;50516:139;;50243:419;;;:::o;50668:175::-;50808:27;50804:1;50796:6;50792:14;50785:51;50668:175;:::o;50849:366::-;50991:3;51012:67;51076:2;51071:3;51012:67;:::i;:::-;51005:74;;51088:93;51177:3;51088:93;:::i;:::-;51206:2;51201:3;51197:12;51190:19;;50849:366;;;:::o;51221:419::-;51387:4;51425:2;51414:9;51410:18;51402:26;;51474:9;51468:4;51464:20;51460:1;51449:9;51445:17;51438:47;51502:131;51628:4;51502:131;:::i;:::-;51494:139;;51221:419;;;:::o;51646:169::-;51786:21;51782:1;51774:6;51770:14;51763:45;51646:169;:::o;51821:366::-;51963:3;51984:67;52048:2;52043:3;51984:67;:::i;:::-;51977:74;;52060:93;52149:3;52060:93;:::i;:::-;52178:2;52173:3;52169:12;52162:19;;51821:366;;;:::o;52193:419::-;52359:4;52397:2;52386:9;52382:18;52374:26;;52446:9;52440:4;52436:20;52432:1;52421:9;52417:17;52410:47;52474:131;52600:4;52474:131;:::i;:::-;52466:139;;52193:419;;;:::o;52618:98::-;52669:6;52703:5;52697:12;52687:22;;52618:98;;;:::o;52722:168::-;52805:11;52839:6;52834:3;52827:19;52879:4;52874:3;52870:14;52855:29;;52722:168;;;;:::o;52896:373::-;52982:3;53010:38;53042:5;53010:38;:::i;:::-;53064:70;53127:6;53122:3;53064:70;:::i;:::-;53057:77;;53143:65;53201:6;53196:3;53189:4;53182:5;53178:16;53143:65;:::i;:::-;53233:29;53255:6;53233:29;:::i;:::-;53228:3;53224:39;53217:46;;52986:283;52896:373;;;;:::o;53275:640::-;53470:4;53508:3;53497:9;53493:19;53485:27;;53522:71;53590:1;53579:9;53575:17;53566:6;53522:71;:::i;:::-;53603:72;53671:2;53660:9;53656:18;53647:6;53603:72;:::i;:::-;53685;53753:2;53742:9;53738:18;53729:6;53685:72;:::i;:::-;53804:9;53798:4;53794:20;53789:2;53778:9;53774:18;53767:48;53832:76;53903:4;53894:6;53832:76;:::i;:::-;53824:84;;53275:640;;;;;;;:::o;53921:141::-;53977:5;54008:6;54002:13;53993:22;;54024:32;54050:5;54024:32;:::i;:::-;53921:141;;;;:::o;54068:349::-;54137:6;54186:2;54174:9;54165:7;54161:23;54157:32;54154:119;;;54192:79;;:::i;:::-;54154:119;54312:1;54337:63;54392:7;54383:6;54372:9;54368:22;54337:63;:::i;:::-;54327:73;;54283:127;54068:349;;;;:::o;54423:79::-;54462:7;54491:5;54480:16;;54423:79;;;:::o;54508:157::-;54613:45;54633:24;54651:5;54633:24;:::i;:::-;54613:45;:::i;:::-;54608:3;54601:58;54508:157;;:::o;54671:256::-;54783:3;54798:75;54869:3;54860:6;54798:75;:::i;:::-;54898:2;54893:3;54889:12;54882:19;;54918:3;54911:10;;54671:256;;;;:::o

Swarm Source

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