ETH Price: $2,647.26 (+0.79%)

Token

MintyFins (FINS)
 

Overview

Max Total Supply

999 FINS

Holders

204

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Welcome, welcome! Fancy a companion? Well, you must prove your worth by catching one. Perhaps then you'll just have enough to enter the POND.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MintyFins

Compiler Version
v0.8.18+commit.87f61d96

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-11
*/

// File: Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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

}
// File: ReentrancyGuard.sol



pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

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

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

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}
// File: 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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}
// File: 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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}
// File: Constants.sol


pragma solidity ^0.8.13;

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;
// File: IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    /**
     * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns
     *         true if supplied registrant address is not registered.
     */
    function isOperatorAllowed(
        address registrant,
        address operator
    ) external view returns (bool);

    /**
     * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner.
     */
    function register(address registrant) external;

    /**
     * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes.
     */
    function registerAndSubscribe(
        address registrant,
        address subscription
    ) external;

    /**
     * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another
     *         address without subscribing.
     */
    function registerAndCopyEntries(
        address registrant,
        address registrantToCopy
    ) external;

    /**
     * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner.
     *         Note that this does not remove any filtered addresses or codeHashes.
     *         Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes.
     */
    function unregister(address addr) external;

    /**
     * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered.
     */
    function updateOperator(
        address registrant,
        address operator,
        bool filtered
    ) external;

    /**
     * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates.
     */
    function updateOperators(
        address registrant,
        address[] calldata operators,
        bool filtered
    ) external;

    /**
     * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered.
     */
    function updateCodeHash(
        address registrant,
        bytes32 codehash,
        bool filtered
    ) external;

    /**
     * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates.
     */
    function updateCodeHashes(
        address registrant,
        bytes32[] calldata codeHashes,
        bool filtered
    ) external;

    /**
     * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous
     *         subscription if present.
     *         Note that accounts with subscriptions may go on to subscribe to other accounts - in this case,
     *         subscriptions will not be forwarded. Instead the former subscription's existing entries will still be
     *         used.
     */
    function subscribe(
        address registrant,
        address registrantToSubscribe
    ) external;

    /**
     * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes.
     */
    function unsubscribe(address registrant, bool copyExistingEntries) external;

    /**
     * @notice Get the subscription address of a given registrant, if any.
     */
    function subscriptionOf(address addr) external returns (address registrant);

    /**
     * @notice Get the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscribers(
        address registrant
    ) external returns (address[] memory);

    /**
     * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscriberAt(
        address registrant,
        uint256 index
    ) external returns (address);

    /**
     * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr.
     */
    function copyEntriesOf(
        address registrant,
        address registrantToCopy
    ) external;

    /**
     * @notice Returns true if operator is filtered by a given address or its subscription.
     */
    function isOperatorFiltered(
        address registrant,
        address operator
    ) external returns (bool);

    /**
     * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription.
     */
    function isCodeHashOfFiltered(
        address registrant,
        address operatorWithCode
    ) external returns (bool);

    /**
     * @notice Returns true if a codeHash is filtered by a given address or its subscription.
     */
    function isCodeHashFiltered(
        address registrant,
        bytes32 codeHash
    ) external returns (bool);

    /**
     * @notice Returns a list of filtered operators for a given address or its subscription.
     */
    function filteredOperators(
        address addr
    ) external returns (address[] memory);

    /**
     * @notice Returns the set of filtered codeHashes for a given address or its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashes(
        address addr
    ) external returns (bytes32[] memory);

    /**
     * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredOperatorAt(
        address registrant,
        uint256 index
    ) external returns (address);

    /**
     * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashAt(
        address registrant,
        uint256 index
    ) external returns (bytes32);

    /**
     * @notice Returns true if an address has registered
     */
    function isRegistered(address addr) external returns (bool);

    /**
     * @dev Convenience method to compute the code hash of an arbitrary contract
     */
    function codeHashOf(address addr) external returns (bytes32);
}
// File: OperatorFilterer.sol


pragma solidity ^0.8.13;



/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 *         Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract OperatorFilterer {
    /// @dev Emitted when an operator is not allowed.
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);

    /// @dev The constructor that is called when the contract is being deployed.
    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(
                    address(this),
                    subscriptionOrRegistrantToCopy
                );
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(
                        address(this),
                        subscriptionOrRegistrantToCopy
                    );
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    /**
     * @dev A helper function to check if an operator approval is allowed.
     */
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // under normal circumstances, this function will revert rather than return false, but inheriting contracts
            // may specify their own OperatorFilterRegistry implementations, which may behave differently
            if (
                !OPERATOR_FILTER_REGISTRY.isOperatorAllowed(
                    address(this),
                    operator
                )
            ) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}
// File: DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;



/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 * @dev    Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    /// @dev The constructor that is called when the contract is being deployed.
    constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}
// File: IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`,
     * checking first that contract recipients are aware of the ERC721 protocol
     * to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move
     * this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external payable;

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    mapping(uint256 => TokenOwnership) private _ownerships;

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

        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 Returns whether the ownership slot at `index` is initialized.
     * An uninitialized slot does not necessarily mean that the slot has no owner.
     */
    function _ownershipIsInitialized(
        uint256 index
    ) internal view virtual returns (bool) {
        return _packedOwnerships[index] != 0;
    }

    /**
     * @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 packed) {
        if (_startTokenId() <= tokenId) {
            packed = _packedOwnerships[tokenId];
            // If the data at the starting slot does not exist, start the scan.
            if (packed == 0) {
                if (tokenId >= _currentIndex)
                    _revert(OwnerQueryForNonexistentToken.selector);
                // 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, `tokenId` will not underflow.
                //
                // We can directly compare the packed value.
                // If the address is zero, packed will be zero.
                for (;;) {
                    unchecked {
                        packed = _packedOwnerships[--tokenId];
                    }
                    if (packed == 0) continue;
                    if (packed & _BITMASK_BURNED == 0) return packed;
                    // Otherwise, the token is burned, and we must revert.
                    // This handles the case of batch burned tokens, where only the burned bit
                    // of the starting slot is set, and remaining slots are left uninitialized.
                    _revert(OwnerQueryForNonexistentToken.selector);
                }
            }
            // Otherwise, the data exists and we can skip the scan.
            // This is possible because we have already achieved the target condition.
            // This saves 2143 gas on transfers of initialized tokens.
            // If the token is not burned, return `packed`. Otherwise, revert.
            if (packed & _BITMASK_BURNED == 0) return packed;
        }
        _revert(OwnerQueryForNonexistentToken.selector);
    }

    /**
     * @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. See {ERC721A-_approve}.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     */
    function approve(
        address to,
        uint256 tokenId
    ) public payable virtual override {
        _approve(to, tokenId, true);
    }

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

        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 result) {
        if (_startTokenId() <= tokenId) {
            if (tokenId < _currentIndex) {
                uint256 packed;
                while ((packed = _packedOwnerships[tokenId]) == 0) --tokenId;
                result = packed & _BITMASK_BURNED == 0;
            }
        }
    }

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

        // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
        from = address(uint160(uint256(uint160(from)) & _BITMASK_ADDRESS));

        if (address(uint160(prevOwnershipPacked)) != from)
            _revert(TransferFromIncorrectOwner.selector);

        (
            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.selector);

        _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;
                    }
                }
            }
        }

        // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
        uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS;
        assembly {
            // 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.
                from, // `from`.
                toMasked, // `to`.
                tokenId // `tokenId`.
            )
        }
        if (toMasked == 0) _revert(TransferToZeroAddress.selector);

        _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.selector);
            }
    }

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

        _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:
            // - `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)
            );

            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] +=
                quantity *
                ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
            uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS;

            if (toMasked == 0) _revert(MintToZeroAddress.selector);

            uint256 end = startTokenId + quantity;
            uint256 tokenId = startTokenId;

            do {
                assembly {
                    // 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`.
                        tokenId // `tokenId`.
                    )
                }
                // The `!=` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
            } while (++tokenId != end);

            _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.selector);
        if (quantity == 0) _revert(MintZeroQuantity.selector);
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT)
            _revert(MintERC2309QuantityExceedsLimit.selector);

        _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.selector
                        );
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) _revert(bytes4(0));
            }
        }
    }

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

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

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

    /**
     * @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:
     *
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        bool approvalCheck
    ) internal virtual {
        address owner = ownerOf(tokenId);

        if (approvalCheck && _msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                _revert(ApprovalCallerNotOwnerNorApproved.selector);
            }

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

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

        _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.selector);
        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)
        }
    }

    /**
     * @dev For more efficient reverts.
     */
    function _revert(bytes4 errorSelector) internal pure {
        assembly {
            mstore(0x00, errorSelector)
            revert(0x00, 0x04)
        }
    }
}
// File: Project.sol



pragma solidity ^0.8.0;






contract MintyFins is
    Ownable,
    ERC721A,
    ReentrancyGuard,
    DefaultOperatorFilterer
{
    uint256 public maxSupply = 999;
    uint256 public maxMintPerTx = 5;
    uint256 public price = 0.1 * 10 ** 18;
    bool public publicPaused = true;
    bool public revealed = false;
    string public baseURI;
    string public hiddenMetadataUri =
        "ipfs://bafkreibjjiqzxyq65g2ks2adm7sdlvexsn7am2rrqre6tw4edq5bdygixq";

    mapping(address => bool) public isAllowedToMint;

    constructor() ERC721A("MintyFins", "FINS") {
        initializeWhitelist();
    }

    function mint(uint256 amount) external payable {
        uint256 ts = totalSupply();
        require(publicPaused == false, "Mint not open for public");
        require(ts + amount <= maxSupply, "Purchase would exceed max tokens");
        require(
            amount <= maxMintPerTx,
            "Amount should not exceed max mint number"
        );

        require(msg.value >= price * amount, "Please send the exact amount.");

        _safeMint(msg.sender, amount);
    }

    function openPublicMint(bool paused) external onlyOwner {
        publicPaused = paused;
    }

    function setPrice(uint256 _price) external onlyOwner {
        price = _price;
    }

    function whitelistStop(uint256 _maxSupply) external onlyOwner {
        maxSupply = _maxSupply;
    }

    function setMaxPerTx(uint256 _maxMintPerTx) external onlyOwner {
        maxMintPerTx = _maxMintPerTx;
    }

    function updateMetadata(string calldata _newMetadata) external onlyOwner {
        hiddenMetadataUri = _newMetadata;
    }

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

    function setBaseURI(string calldata newBaseURI) external onlyOwner {
        baseURI = newBaseURI;
    }

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

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

    function withdraw() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    function claim(uint256 tokenId) external onlyOwner {
        _burn(tokenId);
    }

    // OVERRIDDEN PUBLIC WRITE CONTRACT FUNCTIONS: OpenSea's Royalty Filterer Implementation. //

    function approve(
        address operator,
        uint256 tokenId
    ) public payable override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function setApprovalForAll(
        address operator,
        bool approved
    ) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public payable override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    // WHITELIST

        function whitelistMint(uint256 amount) public payable {
            uint256 ts = totalSupply();
            require(ts + amount <= maxSupply, "Purchase would exceed max tokens");
            require(isAllowedToMint[msg.sender], "You are not on whitelist");
            _safeMint(msg.sender, amount);
        }

        function zaddWhitelist(address _address) external onlyOwner {
            isAllowedToMint[_address] = true;
        }

        function zaddbulkWhitelist(address[] calldata _addresses) external onlyOwner {
            for (uint i = 0; i < _addresses.length; i++) {
                isAllowedToMint[_addresses[i]] = true;
            }
        }

        function initializeWhitelist() private {
            isAllowedToMint[0xB0F34fA9931021150cde7e05A18371a2d8d16ee4] = true;
            isAllowedToMint[0x506E65eD8162EC8BB35e25F89E9CB4F1AB42A7b5] = true;
            isAllowedToMint[0x3A2f7e7F8D98E677Af266e453afcdbcf321878C4] = true;
            isAllowedToMint[0xE558a7E21E954a0F550D35cc8b9d30b5d053aBd2] = true;
            isAllowedToMint[0xe8353Fd3c72bac435098753C57aE495D3f9AabE7] = true;
            isAllowedToMint[0xdd9f8b3270F4d5A3F2BB38695Db42f288C76bE90] = true;
            isAllowedToMint[0xEB6CDf616a237832aFfAE279a3fF095Eb74d0493] = true;
            isAllowedToMint[0x865D6Ed70A180d305D1af64029b52071494b4124] = true;
            isAllowedToMint[0xe6362E56A196CBFdb58c19466775641de24178a4] = true;
            isAllowedToMint[0xFB6425e85F1d34488C345Bb36Ef10cB7aA547F77] = true;
            isAllowedToMint[0xA6480938E9a5F49016d7b5D20964DeF71fb02a26] = true;
            isAllowedToMint[0x215fdD58C9462D0ae2CD4BEFd9aDa37F37B9D98a] = true;
            isAllowedToMint[0xdf1ad13F503DAD38C2bF36A00d3e1fF2052250AE] = true;
            isAllowedToMint[0xd12e49925548cDb067cb7D58453754126a4F5FAF] = true;
            isAllowedToMint[0x157b773e4123d8B06E9c6BCd802779e154e2C013] = true;
            isAllowedToMint[0xeBf474259cab0Fdad657e2968eCfc06DEe708578] = true;
            isAllowedToMint[0x03b17e52E95D4C0d82D38339526Effc2fce9FE30] = true;
            isAllowedToMint[0xBff81dd84cc15c965449B589b56c0C52B83dd4C0] = true;
            isAllowedToMint[0x772AA7bc35dB13425a84C47798EaD132604e7Cf2] = true;
            isAllowedToMint[0x3B8992681A46f7fD60fA1425d1f16C7BC2e106D0] = true;
            isAllowedToMint[0xdab7dd17FAF159e746Ac0a23c7e7FBC75379B0bA] = true;
            isAllowedToMint[0x79fc71831d6895C1F179ff52eC97694A2513bda0] = true;
            isAllowedToMint[0x049f86bA7c1137Bc112fdD3e6ad8B17900F9c716] = true;
            isAllowedToMint[0x4758546A76aB2fa9d80A12Bb90d9fd52D31a7755] = true;
            isAllowedToMint[0xC5d1188085AD7DC668a9Ba9d857FE02De0f72203] = true;
            isAllowedToMint[0x388c57B947b3B2a1205eF7798e863Cb5dAE903cf] = true;
            isAllowedToMint[0xdAceBBb38647004ADb51Fa09Ec5170B4f137CACB] = true;
            isAllowedToMint[0x63abF291fBb59bD2100F6048F312bB85DB7D3573] = true;
            isAllowedToMint[0xdbE904ce4c3b1ff071206344ce42A30E24204eCd] = true;
            isAllowedToMint[0xC72b502419F165E8CB8B6fEB6CD4Ec72c0a1d31b] = true;
            isAllowedToMint[0x110c316953A76531cC69012CD372a7f7fC73A34d] = true;
            isAllowedToMint[0x1B0D719c9d0c004eDA2444603f69c5Af02539B2C] = true;
            isAllowedToMint[0xa67Eb9c3acdF6Ec219717bf3F4a653af9fE89757] = true;
            isAllowedToMint[0x52dFCFB553C360EbFe25D6a85B2f76A89a4dc99D] = true;
            isAllowedToMint[0xa0B98AD16Ab7A630Fd12509162911F542b0112b6] = true;
            isAllowedToMint[0xF615Dd27A7B37CC656d58b22751fAeF86Eee06b8] = true;
            isAllowedToMint[0x332fb53096819A60Ade6D3FFDb2c35D1cD91536D] = true;
            isAllowedToMint[0x81CB469a5CA9488c9c2D25c36f6434623287F270] = true;
            isAllowedToMint[0x55C672aB216Db0e0d82564A3b43d752e2e6e12eA] = true;
            isAllowedToMint[0xfaff9E7B653e0D47db2b3c705753A7Af14EE0c28] = true;
            isAllowedToMint[0x8c2d49E70B1E138DC061f4B7a75B8CB19093b806] = true;
            isAllowedToMint[0x564444E2081a15bfae19373725148e9ecdC132c5] = true;
            isAllowedToMint[0x3fC150ec47Cb9c36037503A6274e7Dd27c4d49cf] = true;
            isAllowedToMint[0x5f0140273834DF84A7219b1239eDa38Fa937D520] = true;
            isAllowedToMint[0xf97111e8a5D3C54519C88b82584659c0f60eC8f0] = true;
            isAllowedToMint[0x3Bd75009AA07Fb6c09d03962096534F9DcfA00Dd] = true;
            isAllowedToMint[0xC94FD7eE86b3166230dE444222c0c248c95a5bD8] = true;
            isAllowedToMint[0x14D04441bfbc862a4C87AE2F834CfF0feccC7731] = true;
            isAllowedToMint[0xFdd0A13c2BFe5319e597153c402D45815235ba3c] = true;
            isAllowedToMint[0x18AEe7D34eA86D492d04B038d6ACEDE0578c526b] = true;
            isAllowedToMint[0x0b203324489F1d3b50C2475D41045a40894b141e] = true;
            isAllowedToMint[0x5A6f1048f6E1a8ac68fdA9D4D0e4573Edcb7384F] = true;
            isAllowedToMint[0x5160c0347F816379b82e2dA47428F15F439a44DA] = true;
            isAllowedToMint[0x71d4f87B39e71af375cFa5F611992044e687e93b] = true;
            isAllowedToMint[0xe2d9A58A02B9B747584DAbd88Af6a133F99d0fDE] = true;
            isAllowedToMint[0x4eAb8892db2347b6Ce8757278E8dC2d16Acc3a0f] = true;
            isAllowedToMint[0x02a1F706afEda8EA1E46Fc80751cB039d6d47953] = true;
            isAllowedToMint[0x0c63454106183cD052baFeA40A4ACCf7C8B38Fdd] = true;
            isAllowedToMint[0x8fb98545EEeB52B4D6c03828Fa3b4aad3C7c2F33] = true;
            isAllowedToMint[0xdD728522494Ee9F09D0429f19687256617315Fe4] = true;
            isAllowedToMint[0xd17bF978310F31ea5CBe2d4cb0AFDDA5553251D0] = true;
            isAllowedToMint[0xc785cB2ECC0EeA84be33E4e378840CDfA36991dE] = true;
            isAllowedToMint[0x7313Fec54C107959502B05007E35ba0c9A0C83e5] = true;
            isAllowedToMint[0x526f4C8D786c5ada0B6449B15c66a2deD7Ea91BA] = true;
            isAllowedToMint[0x038f7e66f441DFd5D9Af47833aDdaAf690342333] = true;
            isAllowedToMint[0xd35B84b28d3eFAfB900d118194b6Ec73b5933434] = true;
            isAllowedToMint[0x1d211a0ff2D5C3f088FD6C3bfAf0f68A8799345f] = true;
            isAllowedToMint[0x440925D63B69ce44EE51951965E89cA6e8F8446D] = true;
            isAllowedToMint[0x04D8E5fa177988D80446Bb09795F0175383dd849] = true;
            isAllowedToMint[0x3f3421232A7fde4571622C3a422A073adec4Fe7c] = true;
            isAllowedToMint[0x0bCa3066C83D0aeb00D22294eBD58C9BD94e597e] = true;
            isAllowedToMint[0xFB96F961E9AF7deD536ddE37bC945e72961270C3] = true;
            isAllowedToMint[0xc4298fB9Ec1A704a4C376E1eCac4157AD4D44155] = true;
            isAllowedToMint[0x3a3fdCA770BfE37AF85054D009552CDA3b15B7eF] = true;
            isAllowedToMint[0xF697C20a0c29B977650a285Eb0d29A62E727cD99] = true;
            isAllowedToMint[0x3cAe811cbad87E3F2Ae3Ee439Ce8693471789383] = true;
            isAllowedToMint[0x15C82731E0151c569f19e61d41FF193230254201] = true;
            isAllowedToMint[0x9148eE257614FA92C7da66923073fD75D6d67825] = true;
            isAllowedToMint[0x9Cd938813f35BC0e647C061E81De05c0d1d1d9cB] = true;
            isAllowedToMint[0x25087656A3baf82D955B78Df5a1f7a27bE315139] = true;
            isAllowedToMint[0xE5199FAe3C50951a36083b2e12265B78c70C669D] = true;
            isAllowedToMint[0x6d39616749FB4cD5E53c08a1679AaffD47D0d25E] = true;
            isAllowedToMint[0xD0CA4AF82A043ccBfAb2FFbd937E8B0A7DF92AeD] = true;
            isAllowedToMint[0x0bA9f830C14B08A5E614Ec7460882696858a973D] = true;
            isAllowedToMint[0x9D87Ad3b87d1F37aFCfdC0B154F9caDedC70c436] = true;
            isAllowedToMint[0x8aBA9AFF5623ccB345a68bF72F964C44b5391D0e] = true;
            isAllowedToMint[0x5ceF44892AEa5b09642b5a597b64EcBD325bd7b7] = true;
            isAllowedToMint[0x3Ef842E7178122b7E563a23D1aeeD88018D5348B] = true;
            isAllowedToMint[0xfAEf9bE30172128Ba72698F552DdEbc12E011fFf] = true;
            isAllowedToMint[0x709AaE6C7249BD32b061A03895D9BB3668CB6837] = true;
            isAllowedToMint[0x4c46A830e3f7DB08e98d417F134EdCe7875Db609] = true;
            isAllowedToMint[0x336D74fF2884648D3916A29cC85f9cE87eCdCAE4] = true;
            isAllowedToMint[0x5B7e23c742586C103d8bDd1B238Cd9AF4a41594e] = true;
            isAllowedToMint[0x30FbacD3eC6345476aF5C994df05a0C7EB7c2F63] = true;
            isAllowedToMint[0x5b1bA1b23a0Bab28Ac2A00b7A6EA8B1218134344] = true;
            isAllowedToMint[0x8502F4Db45cc01437174842F3531E093D0D578fF] = true;
            isAllowedToMint[0x9d5735ae2ee036fE025eD2FEeD677a3ec388181E] = true;
            isAllowedToMint[0x45D05F3D5024afec3Ef3812AbbaFd85E491dddBc] = true;
            isAllowedToMint[0xF29808BDeec7B49809E1De873EaA5CBfc77B6101] = true;
            isAllowedToMint[0xDb912CA3E9b063FE91716E04FAd89fd156331cAA] = true;
            isAllowedToMint[0xAEb9EDccA53ac5c04b59E4DFB4a77b9948fd1104] = true;
            isAllowedToMint[0xF360Ee6e028397F1b4d1b10c9d62619a73e292A2] = true;
            isAllowedToMint[0x49dB439BC461bcF02718A6031f64720Df04cE074] = true;
            isAllowedToMint[0xD4d0726ad26f12a32687B21F1Ff0bdAc18FA9223] = true;
            isAllowedToMint[0x8217Cb6d425D839FC1591Ff9661B053487db43bf] = true;
            isAllowedToMint[0xc4B4126A45a3bdA21fb1e033B54ee70d0Ba22691] = true;
            isAllowedToMint[0x3BA6BF497218bBa25216949348Ba7c42de7E1EDB] = true;
            isAllowedToMint[0xD24AC95E4DF6D36d0E75613a34E2693e60366268] = true;
            isAllowedToMint[0xcb15e4570aeB03cB8620D223876a0B3dB8E792d0] = true;
            isAllowedToMint[0x5eB19dA8b9C0665DC533fB600D9fAbe9E34bD1b5] = true;
            isAllowedToMint[0x57E2e0C1eF2fE4347205bDbEFCB232106A123cF6] = true;
            isAllowedToMint[0x6f0ceC873F47f4FD8B5F6c4fa6d0eB9E4109197B] = true;
            isAllowedToMint[0xC622005a3B9d3481877e2fAe59091B8e0Ba6Cdd7] = true;
            isAllowedToMint[0xEc47eA12030db51901FD80bea1D2E18b9fe1108b] = true;
            isAllowedToMint[0x5fcDD34E1cF573BB3605ad1d16D2B4Ef3dA9A8aa] = true;
            isAllowedToMint[0xC5BB99A5E8186A96BF8ac4e8a577935B9365Da79] = true;
            isAllowedToMint[0xc3aB35fFc756f0fA91cbFB3753DDAd6195887746] = true;
            isAllowedToMint[0xcf334d253D45891492124F9806a33c62eAEd9ab4] = true;
            isAllowedToMint[0xe86fC2678d6BC1903FE012f94a82Ff25ABc49bB3] = true;
            isAllowedToMint[0xF74AB07A3F33d4245323B54dca97896f70b48E64] = true;
            isAllowedToMint[0x7E3472415238CEbC4358E87eCDFd6F1f75488d6F] = true;
            isAllowedToMint[0xE59e5265607c9f95D360CF5851Ca2Fc6d5136670] = true;
            isAllowedToMint[0xC8ec7c11646c3C1B0f779697f7b727bd19E9e62A] = true;
            isAllowedToMint[0xbDC25D8D27878BBA39C89f80F994A21311bBb978] = true;
            isAllowedToMint[0xc64B3aF5c32628C114Caf19E15F4A63D021A2f39] = true;
            isAllowedToMint[0xb409FE7f3D9136Fbb5c2804E525E15CecDb76679] = true;
            isAllowedToMint[0xc2F3d2acD4740Fc27013d0780e570E3461CF475b] = true;
            isAllowedToMint[0x95eA6c7e000674144b34d11898DEe145E2Fad3E5] = true;
            isAllowedToMint[0x2a69F23440308a1991a16CDf52Ba5ec4890Fa283] = true;
            isAllowedToMint[0xBd10df0eac424b115bb38F24689DB55Ce5028E99] = true;
            isAllowedToMint[0xB606E082BCc3A55AaCf76761fF6992bd615a5a2e] = true;
            isAllowedToMint[0xFF802ad3Aa746AdD21e8334eD37C4Bf325a83422] = true;
            isAllowedToMint[0x29779ae8Db5B760FF7d066Ae1562054F68acb390] = true;
            isAllowedToMint[0xb6F40DeEE2fD230472D51671F8D60E117D2eE47c] = true;
            isAllowedToMint[0x7e30240FeC6f7A8eD7B73484b301a466FaDb8634] = true;
            isAllowedToMint[0xFb38939C99d445405440d4b33cCCA39227B646C1] = true;
            isAllowedToMint[0xD931BC6dFF69379b5B9e139206939B890c836fB3] = true;
            isAllowedToMint[0x957E974830E73A7c3FD881Bf63ce305a366B5f56] = true;
            isAllowedToMint[0x189bE4aEB9980BFf75A2ecf38bD68De0b47B2331] = true;
            isAllowedToMint[0x5DeF398D753dE6B5bb51684C595AA3F854Ad2548] = true;
            isAllowedToMint[0xE6C53eab5530F2933DecEd8c5d64Bc1a139D7fd6] = true;
            isAllowedToMint[0x1F753afEAa2941eC11082fE42BB8c1E9Ed499DA6] = true;
            isAllowedToMint[0xC085DC1310458ec9aCd16FF79D424906442795E6] = true;
            isAllowedToMint[0xf56281E4ED3260e49B634FA8931f60143bA7f7A9] = true;
            isAllowedToMint[0x29425C85cccff3142ac7478F848640E8A64A3362] = true;
            isAllowedToMint[0xDa5cF38324d8DD7128Bb5849b2850ffe768949FD] = true;
            isAllowedToMint[0x74e535F7e87B547Cd280bFdf851101F12aF8c43d] = true;
            isAllowedToMint[0x46bc614eafbB8FC82423d4CBCBbfC265926102D2] = true;
            isAllowedToMint[0xdFC327bb456bdFd6C03F43993af99022c26e0b16] = true;
            isAllowedToMint[0x3fD2fBA1C457FB629D0cA2C131819FB2D57AF337] = true;
            isAllowedToMint[0xd30aC531Efe0AeCDDa01e2b5a704427AaA627154] = true;
            isAllowedToMint[0x2bcFAdF248ed69836D71D5208C2BB7318E1CB3Fe] = true;
            isAllowedToMint[0x38f720bABd1fd908ACA8Cc1e04fbb764338e0D39] = true;
            isAllowedToMint[0xc08829D474bCc5BAA07Ec6c2781FA98Fe06C8b05] = true;
            isAllowedToMint[0x858114edAFCc2f7De622eA01B028876614621b3b] = true;
            isAllowedToMint[0x2B7373E33edde9a5BeCbc045e364D670790F0349] = true;
            isAllowedToMint[0xa660d57caE159b69edE8F1a4C6b955D0e006D150] = true;
            isAllowedToMint[0x287655c5b7b55c5054D2c1FBcdc7Ae637ca08e05] = true;
            isAllowedToMint[0xD22aEEADf7107b20Da8F9d6c79b3ff8E4EB75bA0] = true;
            isAllowedToMint[0xc9881C84595f4805E4effC51Ec84a157a6E4a2EB] = true;
            isAllowedToMint[0x97a1B8A62ce496Dcca4d785B7e48A51947fCAB07] = true;
            isAllowedToMint[0x14301429207726B703180269eE0923ac195e140a] = true;
            isAllowedToMint[0xa3440f2615813b2eEeCed679d99F4d284D4A6BA8] = true;
            isAllowedToMint[0x16684B55e7C2ACCF08D602ce7F6bc8D4f3F98CF4] = true;
            isAllowedToMint[0x6140e8AD7d7396B99f296f90132ecf10EFA51352] = true;
            isAllowedToMint[0x3c770bc6Ea69b20E2A3A5e54d9c2ecD037a9FA0F] = true;
            isAllowedToMint[0xd68Fcd8BFC35f9a1b76d1bf8AEC0643475e11c3E] = true;
            isAllowedToMint[0xD05Ed2296b150c4685Bca07E1db531fAcf5f55ab] = true;
            isAllowedToMint[0xD1f10F28B08257ADBe0678b28c53bfB996D99464] = true;
            isAllowedToMint[0x5716cdd4a6f41fe9cfAc0CFEfF0F797A5dc4029D] = true;
            isAllowedToMint[0x6Fdb95fF6FeF152A1024BC0923a91f55049872BD] = true;
            isAllowedToMint[0xD9386aDF8F98f13D21c6993CcF4Ca60E4c747e6e] = true;
            isAllowedToMint[0xBDd7e8543F1D4767E7d9eD9905E406DA8EE69DDf] = true;
            isAllowedToMint[0x94d6Ae094585892586719794b347B46300241EFc] = true;
            isAllowedToMint[0x1d0514011bE92974f5cBFD9Db36b37A1157492f0] = true;
            isAllowedToMint[0x837b4e84D5b6FBa8854B472Be5740beBfdd38c6e] = true;
            isAllowedToMint[0x585cf3a47b7dF092F20E64B5CFC495fCf51E3260] = true;
            isAllowedToMint[0xBF94A18C91B1dd162f3DC10A570dbcA78fD4ff07] = true;
            isAllowedToMint[0x3E4AAC5AF8EC7f1098f2d336836eC70EE9Fa3673] = true;
            isAllowedToMint[0x5Cc70E898F13dbcd8546b0E40123E1Cfed78Af70] = true;
            isAllowedToMint[0x12bFFA80c3cA3cd0fe431a60F9B5c709b8a387f1] = true;
            isAllowedToMint[0xD766b23A8CBebf2B44c6c8EEc7a45413C556fC24] = true;
            isAllowedToMint[0xBcA8920417868733e711fcD187A76Ce85036afD7] = true;
            isAllowedToMint[0x620bf65F890b569EFB9339E4C25aCe1E18f01819] = true;
            isAllowedToMint[0xb974b9Ae4178359bfdeF57097677aC5cCF4D14c9] = true;
            isAllowedToMint[0x275Ba13992bE5BFdF7835B77FaFaA896d77A2791] = true;
            isAllowedToMint[0x8Db008Fdc0FE2Fd0B076c052c5211dC666F6d918] = true;
            isAllowedToMint[0x6E0Ac17fCeaf5009435275Be342960adC6f8493f] = true;
            isAllowedToMint[0x86C0f0b48073a788a9aa232b49A1d0F7bB480EF2] = true;
            isAllowedToMint[0x47E5D62998dcB952Ab96ae8a510090Fc599606aa] = true;
            isAllowedToMint[0xa48325b0Dcbb88Ccc0f2CC8179183886A3fd3f87] = true;
            isAllowedToMint[0xD9Da2593E00d53E43bcFd8c8E29352b90c934210] = true;
            isAllowedToMint[0xbB92fB7b5284DA93AfCe4600e83F0f1A733f79eA] = true;
            isAllowedToMint[0x10ea861a5f90844607a30358580204A6883cE6e1] = true;
            isAllowedToMint[0xfc421eb806334675a9A3eD129B7df14028E22b1e] = true;
            isAllowedToMint[0x383578e2CA5521eF3704Dd325f4b788701DE7336] = true;
            isAllowedToMint[0xA49068F6c4E23711e1ec6E5bB90628CE84D0030A] = true;
            isAllowedToMint[0x36B4Eb32221f92587C016156573F17C14cF6C4c5] = true;
            isAllowedToMint[0x6E2fa073417d7C325a2762A83C22A0AEaa6BBB74] = true;
            isAllowedToMint[0x2F28aE3337028ac5B1Dac33e74dEF5a82ae7A3D9] = true;
            isAllowedToMint[0xf06dD0C468FEfD44A0797311771D6f83CBD799c8] = true;
            isAllowedToMint[0xc7F98DCF1b53420D64E1af8E836BeFB25CeEdC0C] = true;
            isAllowedToMint[0xb9f1915fC05b2d27E8F8F4088cc27e26C0796b13] = true;
            isAllowedToMint[0x2BC1d089d1627b872034A1a57f0E7f31E6726173] = true;
            isAllowedToMint[0x6283565CE531Bb4Be177f2627738c039E3f5b73a] = true;
            isAllowedToMint[0xb2581dd7082E9E89B7C41FAB99E822DC1FA2DF2F] = true;
            isAllowedToMint[0x717309D0Bf0c529A8e26Ea41CE9D3700dCE2b325] = true;
            isAllowedToMint[0x0D369f9Eb9e0e743A7f5c834344b9867ADf61265] = true;
            isAllowedToMint[0xD1b890b73f6800AFb135face70757E1D16F50539] = true;
            isAllowedToMint[0x562805cAea5f57603220Aab660dA900Cd599B40B] = true;
            isAllowedToMint[0x5621678F90c17c4cbc125B33CE47c49BFf9DB39f] = true;
            isAllowedToMint[0x470C94707244C8353a4455C52B19756624BBa2FA] = true;
            isAllowedToMint[0x8A682A0c0A49F8a768565b911304669CBF7CF6C5] = true;
            isAllowedToMint[0xD801c86518E369a48Bd1657B06e83958d11fFbaE] = true;
            isAllowedToMint[0x7aF718188874802aB54a27F5C5A38c8824e5378d] = true;
            isAllowedToMint[0x64cA6D31d886288512D1e598e6444dEd43076479] = true;
            isAllowedToMint[0xc83411e27D6982731755f2aF2F3D62A0Ae0BFB48] = true;
            isAllowedToMint[0x2284faC032eDFb17BE8c30503E1942D2b7607ff7] = true;
            isAllowedToMint[0x069752147E756CbA56C9D0d415DfFCCbc8eE3161] = true;
            isAllowedToMint[0xE2E61B64D798ba4Ff0b6A8AF35748059FD3c199B] = true;
            isAllowedToMint[0xa1A6c51A9Da3a2698b8C8E8Dde85E4D0cb0Fe916] = true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAllowedToMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"maxMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"openPublicMint","outputs":[],"stateMutability":"nonpayable","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintPerTx","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newMetadata","type":"string"}],"name":"updateMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"whitelistStop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"zaddWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"zaddbulkWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526103e7600b556005600c5567016345785d8a0000600d556001600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506040518060800160405280604281526020016200a65260429139601090816200007b9190620063d3565b503480156200008957600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600981526020017f4d696e747946696e7300000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f46494e530000000000000000000000000000000000000000000000000000000081525060006200011f6200040e60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508160039081620001ce9190620063d3565b508060049081620001e09190620063d3565b50620001f16200041660201b60201c565b60018190555050506001600a8190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003f6578015620002bc576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040162000282929190620064ff565b600060405180830381600087803b1580156200029d57600080fd5b505af1158015620002b2573d6000803e3d6000fd5b50505050620003f5565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000376576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200033c929190620064ff565b600060405180830381600087803b1580156200035757600080fd5b505af11580156200036c573d6000803e3d6000fd5b50505050620003f4565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003bf91906200652c565b600060405180830381600087803b158015620003da57600080fd5b505af1158015620003ef573d6000803e3d6000fd5b505050505b5b5b5050620004086200041b60201b60201c565b62006549565b600033905090565b600090565b60016011600073b0f34fa9931021150cde7e05a18371a2d8d16ee473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073506e65ed8162ec8bb35e25f89e9cb4f1ab42a7b573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733a2f7e7f8d98e677af266e453afcdbcf321878c473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e558a7e21e954a0f550d35cc8b9d30b5d053abd273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e8353fd3c72bac435098753c57ae495d3f9aabe773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073dd9f8b3270f4d5a3f2bb38695db42f288c76be9073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073eb6cdf616a237832affae279a3ff095eb74d049373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073865d6ed70a180d305d1af64029b52071494b412473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e6362e56a196cbfdb58c19466775641de24178a473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fb6425e85f1d34488c345bb36ef10cb7aa547f7773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a6480938e9a5f49016d7b5d20964def71fb02a2673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073215fdd58c9462d0ae2cd4befd9ada37f37b9d98a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073df1ad13f503dad38c2bf36a00d3e1ff2052250ae73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d12e49925548cdb067cb7d58453754126a4f5faf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073157b773e4123d8b06e9c6bcd802779e154e2c01373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073ebf474259cab0fdad657e2968ecfc06dee70857873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007303b17e52e95d4c0d82d38339526effc2fce9fe3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073bff81dd84cc15c965449b589b56c0c52b83dd4c073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073772aa7bc35db13425a84c47798ead132604e7cf273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733b8992681a46f7fd60fa1425d1f16c7bc2e106d073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073dab7dd17faf159e746ac0a23c7e7fbc75379b0ba73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007379fc71831d6895c1f179ff52ec97694a2513bda073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073049f86ba7c1137bc112fdd3e6ad8b17900f9c71673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000734758546a76ab2fa9d80a12bb90d9fd52d31a775573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c5d1188085ad7dc668a9ba9d857fe02de0f7220373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073388c57b947b3b2a1205ef7798e863cb5dae903cf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073dacebbb38647004adb51fa09ec5170b4f137cacb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007363abf291fbb59bd2100f6048f312bb85db7d357373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073dbe904ce4c3b1ff071206344ce42a30e24204ecd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c72b502419f165e8cb8b6feb6cd4ec72c0a1d31b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073110c316953a76531cc69012cd372a7f7fc73a34d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000731b0d719c9d0c004eda2444603f69c5af02539b2c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a67eb9c3acdf6ec219717bf3f4a653af9fe8975773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007352dfcfb553c360ebfe25d6a85b2f76a89a4dc99d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a0b98ad16ab7a630fd12509162911f542b0112b673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f615dd27a7b37cc656d58b22751faef86eee06b873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073332fb53096819a60ade6d3ffdb2c35d1cd91536d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007381cb469a5ca9488c9c2d25c36f6434623287f27073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007355c672ab216db0e0d82564a3b43d752e2e6e12ea73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073faff9e7b653e0d47db2b3c705753a7af14ee0c2873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000738c2d49e70b1e138dc061f4b7a75b8cb19093b80673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073564444e2081a15bfae19373725148e9ecdc132c573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733fc150ec47cb9c36037503a6274e7dd27c4d49cf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735f0140273834df84a7219b1239eda38fa937d52073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f97111e8a5d3c54519c88b82584659c0f60ec8f073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733bd75009aa07fb6c09d03962096534f9dcfa00dd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c94fd7ee86b3166230de444222c0c248c95a5bd873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007314d04441bfbc862a4c87ae2f834cff0feccc773173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fdd0a13c2bfe5319e597153c402d45815235ba3c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007318aee7d34ea86d492d04b038d6acede0578c526b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000730b203324489f1d3b50c2475d41045a40894b141e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735a6f1048f6e1a8ac68fda9d4d0e4573edcb7384f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735160c0347f816379b82e2da47428f15f439a44da73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007371d4f87b39e71af375cfa5f611992044e687e93b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e2d9a58a02b9b747584dabd88af6a133f99d0fde73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000734eab8892db2347b6ce8757278e8dc2d16acc3a0f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007302a1f706afeda8ea1e46fc80751cb039d6d4795373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000730c63454106183cd052bafea40a4accf7c8b38fdd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000738fb98545eeeb52b4d6c03828fa3b4aad3c7c2f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073dd728522494ee9f09d0429f19687256617315fe473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d17bf978310f31ea5cbe2d4cb0afdda5553251d073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c785cb2ecc0eea84be33e4e378840cdfa36991de73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000737313fec54c107959502b05007e35ba0c9a0c83e573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073526f4c8d786c5ada0b6449b15c66a2ded7ea91ba73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073038f7e66f441dfd5d9af47833addaaf69034233373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d35b84b28d3efafb900d118194b6ec73b593343473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000731d211a0ff2d5c3f088fd6c3bfaf0f68a8799345f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073440925d63b69ce44ee51951965e89ca6e8f8446d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007304d8e5fa177988d80446bb09795f0175383dd84973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733f3421232a7fde4571622c3a422a073adec4fe7c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000730bca3066c83d0aeb00d22294ebd58c9bd94e597e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fb96f961e9af7ded536dde37bc945e72961270c373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c4298fb9ec1a704a4c376e1ecac4157ad4d4415573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733a3fdca770bfe37af85054d009552cda3b15b7ef73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f697c20a0c29b977650a285eb0d29a62e727cd9973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733cae811cbad87e3f2ae3ee439ce869347178938373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007315c82731e0151c569f19e61d41ff19323025420173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000739148ee257614fa92c7da66923073fd75d6d6782573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000739cd938813f35bc0e647c061e81de05c0d1d1d9cb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007325087656a3baf82d955b78df5a1f7a27be31513973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e5199fae3c50951a36083b2e12265b78c70c669d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736d39616749fb4cd5e53c08a1679aaffd47d0d25e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d0ca4af82a043ccbfab2ffbd937e8b0a7df92aed73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000730ba9f830c14b08a5e614ec7460882696858a973d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000739d87ad3b87d1f37afcfdc0b154f9cadedc70c43673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000738aba9aff5623ccb345a68bf72f964c44b5391d0e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735cef44892aea5b09642b5a597b64ecbd325bd7b773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733ef842e7178122b7e563a23d1aeed88018d5348b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073faef9be30172128ba72698f552ddebc12e011fff73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073709aae6c7249bd32b061a03895d9bb3668cb683773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000734c46a830e3f7db08e98d417f134edce7875db60973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073336d74ff2884648d3916a29cc85f9ce87ecdcae473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735b7e23c742586c103d8bdd1b238cd9af4a41594e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007330fbacd3ec6345476af5c994df05a0c7eb7c2f6373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735b1ba1b23a0bab28ac2a00b7a6ea8b121813434473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000738502f4db45cc01437174842f3531e093d0d578ff73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000739d5735ae2ee036fe025ed2feed677a3ec388181e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007345d05f3d5024afec3ef3812abbafd85e491dddbc73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f29808bdeec7b49809e1de873eaa5cbfc77b610173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073db912ca3e9b063fe91716e04fad89fd156331caa73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073aeb9edcca53ac5c04b59e4dfb4a77b9948fd110473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f360ee6e028397f1b4d1b10c9d62619a73e292a273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007349db439bc461bcf02718a6031f64720df04ce07473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d4d0726ad26f12a32687b21f1ff0bdac18fa922373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000738217cb6d425d839fc1591ff9661b053487db43bf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c4b4126a45a3bda21fb1e033b54ee70d0ba2269173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733ba6bf497218bba25216949348ba7c42de7e1edb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d24ac95e4df6d36d0e75613a34e2693e6036626873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073cb15e4570aeb03cb8620d223876a0b3db8e792d073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735eb19da8b9c0665dc533fb600d9fabe9e34bd1b573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007357e2e0c1ef2fe4347205bdbefcb232106a123cf673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736f0cec873f47f4fd8b5f6c4fa6d0eb9e4109197b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c622005a3b9d3481877e2fae59091b8e0ba6cdd773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073ec47ea12030db51901fd80bea1d2e18b9fe1108b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735fcdd34e1cf573bb3605ad1d16d2b4ef3da9a8aa73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c5bb99a5e8186a96bf8ac4e8a577935b9365da7973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c3ab35ffc756f0fa91cbfb3753ddad619588774673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073cf334d253d45891492124f9806a33c62eaed9ab473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e86fc2678d6bc1903fe012f94a82ff25abc49bb373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f74ab07a3f33d4245323b54dca97896f70b48e6473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000737e3472415238cebc4358e87ecdfd6f1f75488d6f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e59e5265607c9f95d360cf5851ca2fc6d513667073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c8ec7c11646c3c1b0f779697f7b727bd19e9e62a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073bdc25d8d27878bba39c89f80f994a21311bbb97873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c64b3af5c32628c114caf19e15f4a63d021a2f3973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b409fe7f3d9136fbb5c2804e525e15cecdb7667973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c2f3d2acd4740fc27013d0780e570e3461cf475b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007395ea6c7e000674144b34d11898dee145e2fad3e573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732a69f23440308a1991a16cdf52ba5ec4890fa28373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073bd10df0eac424b115bb38f24689db55ce5028e9973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b606e082bcc3a55aacf76761ff6992bd615a5a2e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073ff802ad3aa746add21e8334ed37c4bf325a8342273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007329779ae8db5b760ff7d066ae1562054f68acb39073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b6f40deee2fd230472d51671f8d60e117d2ee47c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000737e30240fec6f7a8ed7b73484b301a466fadb863473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fb38939c99d445405440d4b33ccca39227b646c173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d931bc6dff69379b5b9e139206939b890c836fb373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073957e974830e73a7c3fd881bf63ce305a366b5f5673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073189be4aeb9980bff75a2ecf38bd68de0b47b233173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735def398d753de6b5bb51684c595aa3f854ad254873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e6c53eab5530f2933deced8c5d64bc1a139d7fd673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000731f753afeaa2941ec11082fe42bb8c1e9ed499da673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c085dc1310458ec9acd16ff79d424906442795e673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f56281e4ed3260e49b634fa8931f60143ba7f7a973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007329425c85cccff3142ac7478f848640e8a64a336273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073da5cf38324d8dd7128bb5849b2850ffe768949fd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007374e535f7e87b547cd280bfdf851101f12af8c43d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007346bc614eafbb8fc82423d4cbcbbfc265926102d273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073dfc327bb456bdfd6c03f43993af99022c26e0b1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733fd2fba1c457fb629d0ca2c131819fb2d57af33773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d30ac531efe0aecdda01e2b5a704427aaa62715473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732bcfadf248ed69836d71d5208c2bb7318e1cb3fe73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007338f720babd1fd908aca8cc1e04fbb764338e0d3973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c08829d474bcc5baa07ec6c2781fa98fe06c8b0573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073858114edafcc2f7de622ea01b028876614621b3b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732b7373e33edde9a5becbc045e364d670790f034973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a660d57cae159b69ede8f1a4c6b955d0e006d15073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073287655c5b7b55c5054d2c1fbcdc7ae637ca08e0573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d22aeeadf7107b20da8f9d6c79b3ff8e4eb75ba073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c9881c84595f4805e4effc51ec84a157a6e4a2eb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007397a1b8a62ce496dcca4d785b7e48a51947fcab0773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007314301429207726b703180269ee0923ac195e140a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a3440f2615813b2eeeced679d99f4d284d4a6ba873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007316684b55e7c2accf08d602ce7f6bc8d4f3f98cf473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736140e8ad7d7396b99f296f90132ecf10efa5135273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733c770bc6ea69b20e2a3a5e54d9c2ecd037a9fa0f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d68fcd8bfc35f9a1b76d1bf8aec0643475e11c3e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d05ed2296b150c4685bca07e1db531facf5f55ab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d1f10f28b08257adbe0678b28c53bfb996d9946473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735716cdd4a6f41fe9cfac0cfeff0f797a5dc4029d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736fdb95ff6fef152a1024bc0923a91f55049872bd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d9386adf8f98f13d21c6993ccf4ca60e4c747e6e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073bdd7e8543f1d4767e7d9ed9905e406da8ee69ddf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007394d6ae094585892586719794b347b46300241efc73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000731d0514011be92974f5cbfd9db36b37a1157492f073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073837b4e84d5b6fba8854b472be5740bebfdd38c6e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073585cf3a47b7df092f20e64b5cfc495fcf51e326073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073bf94a18c91b1dd162f3dc10a570dbca78fd4ff0773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733e4aac5af8ec7f1098f2d336836ec70ee9fa367373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735cc70e898f13dbcd8546b0e40123e1cfed78af7073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007312bffa80c3ca3cd0fe431a60f9b5c709b8a387f173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d766b23a8cbebf2b44c6c8eec7a45413c556fc2473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073bca8920417868733e711fcd187a76ce85036afd773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073620bf65f890b569efb9339e4c25ace1e18f0181973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b974b9ae4178359bfdef57097677ac5ccf4d14c973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073275ba13992be5bfdf7835b77fafaa896d77a279173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000738db008fdc0fe2fd0b076c052c5211dc666f6d91873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736e0ac17fceaf5009435275be342960adc6f8493f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007386c0f0b48073a788a9aa232b49a1d0f7bb480ef273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007347e5d62998dcb952ab96ae8a510090fc599606aa73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a48325b0dcbb88ccc0f2cc8179183886a3fd3f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d9da2593e00d53e43bcfd8c8e29352b90c93421073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073bb92fb7b5284da93afce4600e83f0f1a733f79ea73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007310ea861a5f90844607a30358580204a6883ce6e173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fc421eb806334675a9a3ed129b7df14028e22b1e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073383578e2ca5521ef3704dd325f4b788701de733673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a49068f6c4e23711e1ec6e5bb90628ce84d0030a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007336b4eb32221f92587c016156573f17c14cf6c4c573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736e2fa073417d7c325a2762a83c22a0aeaa6bbb7473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732f28ae3337028ac5b1dac33e74def5a82ae7a3d973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f06dd0c468fefd44a0797311771d6f83cbd799c873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c7f98dcf1b53420d64e1af8e836befb25ceedc0c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b9f1915fc05b2d27e8f8f4088cc27e26c0796b1373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732bc1d089d1627b872034a1a57f0e7f31e672617373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736283565ce531bb4be177f2627738c039e3f5b73a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b2581dd7082e9e89b7c41fab99e822dc1fa2df2f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073717309d0bf0c529a8e26ea41ce9d3700dce2b32573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000730d369f9eb9e0e743a7f5c834344b9867adf6126573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d1b890b73f6800afb135face70757e1d16f5053973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073562805caea5f57603220aab660da900cd599b40b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735621678f90c17c4cbc125b33ce47c49bff9db39f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073470c94707244c8353a4455c52b19756624bba2fa73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000738a682a0c0a49f8a768565b911304669cbf7cf6c573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d801c86518e369a48bd1657b06e83958d11ffbae73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000737af718188874802ab54a27f5c5a38c8824e5378d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007364ca6d31d886288512d1e598e6444ded4307647973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c83411e27d6982731755f2af2f3d62a0ae0bfb4873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732284fac032edfb17be8c30503e1942d2b7607ff773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073069752147e756cba56c9d0d415dffccbc8ee316173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e2e61b64d798ba4ff0b6a8af35748059fd3c199b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a1a6c51a9da3a2698b8c8e8dde85e4d0cb0fe91673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620061db57607f821691505b602082108103620061f157620061f062006193565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200625b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200621c565b6200626786836200621c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620062b4620062ae620062a8846200627f565b62006289565b6200627f565b9050919050565b6000819050919050565b620062d08362006293565b620062e8620062df82620062bb565b84845462006229565b825550505050565b600090565b620062ff620062f0565b6200630c818484620062c5565b505050565b5b81811015620063345762006328600082620062f5565b60018101905062006312565b5050565b601f82111562006383576200634d81620061f7565b62006358846200620c565b8101602085101562006368578190505b6200638062006377856200620c565b83018262006311565b50505b505050565b600082821c905092915050565b6000620063a86000198460080262006388565b1980831691505092915050565b6000620063c3838362006395565b9150826002028217905092915050565b620063de8262006159565b67ffffffffffffffff811115620063fa57620063f962006164565b5b620064068254620061c2565b6200641382828562006338565b600060209050601f8311600181146200644b576000841562006436578287015190505b620064428582620063b5565b865550620064b2565b601f1984166200645b86620061f7565b60005b8281101562006485578489015182556001820191506020850194506020810190506200645e565b86831015620064a55784890151620064a1601f89168262006395565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620064e782620064ba565b9050919050565b620064f981620064da565b82525050565b6000604082019050620065166000830185620064ee565b620065256020830184620064ee565b9392505050565b6000602082019050620065436000830184620064ee565b92915050565b6140f980620065596000396000f3fe6080604052600436106102305760003560e01c8063868ff4a21161012e578063b88d4fde116100ab578063de7fcb1d1161006f578063de7fcb1d146107c3578063e0a80853146107ee578063e510873c14610817578063e985e9c514610840578063f2fde38b1461087d57610230565b8063b88d4fde146106ed578063b8ca64e414610709578063c6f6f21614610732578063c87b56dd1461075b578063d5abeb011461079857610230565b8063a035b1fe116100f2578063a035b1fe14610629578063a0712d6814610654578063a22cb46514610670578063a45ba8e714610699578063af947cec146106c457610230565b8063868ff4a2146105655780638da5cb5b14610581578063918b5be1146105ac57806391b7f5ed146105d557806395d89b41146105fe57610230565b806341f43434116101bc5780636352211e116101805780636352211e1461048057806367df1952146104bd5780636c0360eb146104e657806370a0823114610511578063715018a61461054e57610230565b806341f43434146103a857806342842e0e146103d35780634813d8a6146103ef578063518302271461042c57806355f804b31461045757610230565b80630bb12bb8116102035780630bb12bb8146102f657806318160ddd1461032157806323b872dd1461034c578063379607f5146103685780633ccfd60b1461039157610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190612df9565b6108a6565b6040516102699190612e41565b60405180910390f35b34801561027e57600080fd5b50610287610938565b6040516102949190612eec565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190612f44565b6109ca565b6040516102d19190612fb2565b60405180910390f35b6102f460048036038101906102ef9190612ff9565b610a28565b005b34801561030257600080fd5b5061030b610a41565b6040516103189190612e41565b60405180910390f35b34801561032d57600080fd5b50610336610a54565b6040516103439190613048565b60405180910390f35b61036660048036038101906103619190613063565b610a67565b005b34801561037457600080fd5b5061038f600480360381019061038a9190612f44565b610ab6565b005b34801561039d57600080fd5b506103a6610b3e565b005b3480156103b457600080fd5b506103bd610cbe565b6040516103ca9190613115565b60405180910390f35b6103ed60048036038101906103e89190613063565b610cd0565b005b3480156103fb57600080fd5b5061041660048036038101906104119190613130565b610d1f565b6040516104239190612e41565b60405180910390f35b34801561043857600080fd5b50610441610d3f565b60405161044e9190612e41565b60405180910390f35b34801561046357600080fd5b5061047e600480360381019061047991906131c2565b610d52565b005b34801561048c57600080fd5b506104a760048036038101906104a29190612f44565b610de4565b6040516104b49190612fb2565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df9190613265565b610df6565b005b3480156104f257600080fd5b506104fb610f17565b6040516105089190612eec565b60405180910390f35b34801561051d57600080fd5b5061053860048036038101906105339190613130565b610fa5565b6040516105459190613048565b60405180910390f35b34801561055a57600080fd5b5061056361103c565b005b61057f600480360381019061057a9190612f44565b611176565b005b34801561058d57600080fd5b5061059661126c565b6040516105a39190612fb2565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce91906131c2565b611295565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190612f44565b611327565b005b34801561060a57600080fd5b506106136113ad565b6040516106209190612eec565b60405180910390f35b34801561063557600080fd5b5061063e61143f565b60405161064b9190613048565b60405180910390f35b61066e60048036038101906106699190612f44565b611445565b005b34801561067c57600080fd5b50610697600480360381019061069291906132de565b61159a565b005b3480156106a557600080fd5b506106ae6115b3565b6040516106bb9190612eec565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e6919061331e565b611641565b005b6107076004803603810190610702919061347b565b6116da565b005b34801561071557600080fd5b50610730600480360381019061072b9190612f44565b61172b565b005b34801561073e57600080fd5b5061075960048036038101906107549190612f44565b6117b1565b005b34801561076757600080fd5b50610782600480360381019061077d9190612f44565b611837565b60405161078f9190612eec565b60405180910390f35b3480156107a457600080fd5b506107ad61198c565b6040516107ba9190613048565b60405180910390f35b3480156107cf57600080fd5b506107d8611992565b6040516107e59190613048565b60405180910390f35b3480156107fa57600080fd5b506108156004803603810190610810919061331e565b611998565b005b34801561082357600080fd5b5061083e60048036038101906108399190613130565b611a31565b005b34801561084c57600080fd5b50610867600480360381019061086291906134fe565b611b08565b6040516108749190612e41565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f9190613130565b611b9c565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109315750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546109479061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546109739061356d565b80156109c05780601f10610995576101008083540402835291602001916109c0565b820191906000526020600020905b8154815290600101906020018083116109a357829003601f168201915b5050505050905090565b60006109d582611d44565b6109ea576109e963cf4700e460e01b611dbd565b5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610a3281611dc7565b610a3c8383611ec4565b505050565b600e60009054906101000a900460ff1681565b6000610a5e611ed4565b60015403905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610aa557610aa433611dc7565b5b610ab0848484611ed9565b50505050565b610abe61219a565b73ffffffffffffffffffffffffffffffffffffffff16610adc61126c565b73ffffffffffffffffffffffffffffffffffffffff1614610b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b29906135ea565b60405180910390fd5b610b3b816121a2565b50565b610b4661219a565b73ffffffffffffffffffffffffffffffffffffffff16610b6461126c565b73ffffffffffffffffffffffffffffffffffffffff1614610bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb1906135ea565b60405180910390fd5b6002600a5403610bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf690613656565b60405180910390fd5b6002600a8190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610c2d906136a7565b60006040518083038185875af1925050503d8060008114610c6a576040519150601f19603f3d011682016040523d82523d6000602084013e610c6f565b606091505b5050905080610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa90613708565b60405180910390fd5b506001600a81905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d0e57610d0d33611dc7565b5b610d198484846121b0565b50505050565b60116020528060005260406000206000915054906101000a900460ff1681565b600e60019054906101000a900460ff1681565b610d5a61219a565b73ffffffffffffffffffffffffffffffffffffffff16610d7861126c565b73ffffffffffffffffffffffffffffffffffffffff1614610dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc5906135ea565b60405180910390fd5b8181600f9182610ddf9291906138d5565b505050565b6000610def826121d0565b9050919050565b610dfe61219a565b73ffffffffffffffffffffffffffffffffffffffff16610e1c61126c565b73ffffffffffffffffffffffffffffffffffffffff1614610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e69906135ea565b60405180910390fd5b60005b82829050811015610f1257600160116000858585818110610e9957610e986139a5565b5b9050602002016020810190610eae9190613130565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f0a90613a03565b915050610e75565b505050565b600f8054610f249061356d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f509061356d565b8015610f9d5780601f10610f7257610100808354040283529160200191610f9d565b820191906000526020600020905b815481529060010190602001808311610f8057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610feb57610fea638f4eb60460e01b611dbd565b5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61104461219a565b73ffffffffffffffffffffffffffffffffffffffff1661106261126c565b73ffffffffffffffffffffffffffffffffffffffff16146110b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110af906135ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000611180610a54565b9050600b5482826111919190613a4b565b11156111d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c990613acb565b60405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590613b37565b60405180910390fd5b61126833836122bc565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61129d61219a565b73ffffffffffffffffffffffffffffffffffffffff166112bb61126c565b73ffffffffffffffffffffffffffffffffffffffff1614611311576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611308906135ea565b60405180910390fd5b8181601091826113229291906138d5565b505050565b61132f61219a565b73ffffffffffffffffffffffffffffffffffffffff1661134d61126c565b73ffffffffffffffffffffffffffffffffffffffff16146113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a906135ea565b60405180910390fd5b80600d8190555050565b6060600480546113bc9061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546113e89061356d565b80156114355780601f1061140a57610100808354040283529160200191611435565b820191906000526020600020905b81548152906001019060200180831161141857829003601f168201915b5050505050905090565b600d5481565b600061144f610a54565b905060001515600e60009054906101000a900460ff161515146114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e90613ba3565b60405180910390fd5b600b5482826114b69190613a4b565b11156114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee90613acb565b60405180910390fd5b600c5482111561153c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153390613c35565b60405180910390fd5b81600d5461154a9190613c55565b34101561158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158390613ce3565b60405180910390fd5b61159633836122bc565b5050565b816115a481611dc7565b6115ae83836122da565b505050565b601080546115c09061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546115ec9061356d565b80156116395780601f1061160e57610100808354040283529160200191611639565b820191906000526020600020905b81548152906001019060200180831161161c57829003601f168201915b505050505081565b61164961219a565b73ffffffffffffffffffffffffffffffffffffffff1661166761126c565b73ffffffffffffffffffffffffffffffffffffffff16146116bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b4906135ea565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117185761171733611dc7565b5b611724858585856123e5565b5050505050565b61173361219a565b73ffffffffffffffffffffffffffffffffffffffff1661175161126c565b73ffffffffffffffffffffffffffffffffffffffff16146117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e906135ea565b60405180910390fd5b80600b8190555050565b6117b961219a565b73ffffffffffffffffffffffffffffffffffffffff166117d761126c565b73ffffffffffffffffffffffffffffffffffffffff161461182d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611824906135ea565b60405180910390fd5b80600c8190555050565b606061184282611d44565b611881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187890613d75565b60405180910390fd5b60001515600e60019054906101000a900460ff1615150361192e57601080546118a99061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546118d59061356d565b80156119225780601f106118f757610100808354040283529160200191611922565b820191906000526020600020905b81548152906001019060200180831161190557829003601f168201915b50505050509050611987565b6000611938612437565b905060008151116119585760405180602001604052806000815250611983565b80611962846124c9565b604051602001611973929190613dd1565b6040516020818303038152906040525b9150505b919050565b600b5481565b600c5481565b6119a061219a565b73ffffffffffffffffffffffffffffffffffffffff166119be61126c565b73ffffffffffffffffffffffffffffffffffffffff1614611a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0b906135ea565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b611a3961219a565b73ffffffffffffffffffffffffffffffffffffffff16611a5761126c565b73ffffffffffffffffffffffffffffffffffffffff1614611aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa4906135ea565b60405180910390fd5b6001601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ba461219a565b73ffffffffffffffffffffffffffffffffffffffff16611bc261126c565b73ffffffffffffffffffffffffffffffffffffffff1614611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f906135ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e90613e67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081611d4f611ed4565b11611db857600154821015611db75760005b6000600560008581526020019081526020016000205491508103611d905782611d8990613e87565b9250611d61565b60007c01000000000000000000000000000000000000000000000000000000008216149150505b5b919050565b8060005260046000fd5b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611ec1576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611e3e929190613eb0565b602060405180830381865afa158015611e5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7f9190613eee565b611ec057806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611eb79190612fb2565b60405180910390fd5b5b50565b611ed082826001612629565b5050565b600090565b6000611ee4826121d0565b905073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161693508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f5957611f5863a114810060e01b611dbd565b5b600080611f6584612758565b91509150611f7b8187611f7661277f565b612787565b611fa657611f9086611f8b61277f565b611b08565b611fa557611fa46359c896be60e01b611dbd565b5b5b611fb386868660016127cb565b8015611fbe57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061208c856120688888876127d1565b7c0200000000000000000000000000000000000000000000000000000000176127f9565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612112576000600185019050600060056000838152602001908152602001600020540361211057600154811461210f578360056000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff8673ffffffffffffffffffffffffffffffffffffffff161690508481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600081036121845761218363ea553b3460e01b611dbd565b5b6121918787876001612824565b50505050505050565b600033905090565b6121ad81600061282a565b50565b6121cb838383604051806020016040528060008152506116da565b505050565b6000816121db611ed4565b116122a657600560008381526020019081526020016000205490506000810361227d5760015482106122185761221763df2d9b4260e01b611dbd565b5b5b600560008360019003935083815260200190815260200160002054905060008103156122785760007c0100000000000000000000000000000000000000000000000000000000821603156122b75761227763df2d9b4260e01b611dbd565b5b612219565b60007c0100000000000000000000000000000000000000000000000000000000821603156122b7575b6122b663df2d9b4260e01b611dbd565b5b919050565b6122d6828260405180602001604052806000815250612a5b565b5050565b80600860006122e761277f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661239461277f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123d99190612e41565b60405180910390a35050565b6123f0848484610a67565b60008373ffffffffffffffffffffffffffffffffffffffff163b146124315761241b84848484612ae1565b6124305761242f63d1a57ed660e01b611dbd565b5b5b50505050565b6060600f80546124469061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546124729061356d565b80156124bf5780601f10612494576101008083540402835291602001916124bf565b820191906000526020600020905b8154815290600101906020018083116124a257829003601f168201915b5050505050905090565b606060008203612510576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612624565b600082905060005b6000821461254257808061252b90613a03565b915050600a8261253b9190613f4a565b9150612518565b60008167ffffffffffffffff81111561255e5761255d613350565b5b6040519080825280601f01601f1916602001820160405280156125905781602001600182028036833780820191505090505b5090505b6000851461261d576001826125a99190613f7b565b9150600a856125b89190613faf565b60306125c49190613a4b565b60f81b8183815181106125da576125d96139a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126169190613f4a565b9450612594565b8093505050505b919050565b600061263483610de4565b905081801561267657508073ffffffffffffffffffffffffffffffffffffffff1661265d61277f565b73ffffffffffffffffffffffffffffffffffffffff1614155b156126a25761268c8161268761277f565b611b08565b6126a1576126a063cfb3b94260e01b611dbd565b5b5b836007600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86127e8868684612c10565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612835836121d0565b9050600081905060008061284886612758565b91509150841561289057612864818461285f61277f565b612787565b61288f576128798361287461277f565b611b08565b61288e5761288d6359c896be60e01b611dbd565b5b5b5b61289e8360008860016127cb565b80156128a957600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506129518361290e856000886127d1565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176127f9565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036129d757600060018701905060006005600083815260200190815260200160002054036129d55760015481146129d4578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a41836000886001612824565b600260008154809291906001019190505550505050505050565b612a658383612c19565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612adc5760006001549050600083820390505b612aa66000868380600101945086612ae1565b612abb57612aba63d1a57ed660e01b611dbd565b5b818110612a93578160015414612ad957612ad8600060e01b611dbd565b5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b0761277f565b8786866040518563ffffffff1660e01b8152600401612b299493929190614035565b6020604051808303816000875af1925050508015612b6557506040513d601f19601f82011682018060405250810190612b629190614096565b60015b612bbd573d8060008114612b95576040519150601f19603f3d011682016040523d82523d6000602084013e612b9a565b606091505b506000815103612bb557612bb463d1a57ed660e01b611dbd565b5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000600154905060008203612c3957612c3863b562e8dd60e01b611dbd565b5b612c4660008483856127cb565b612c6683612c5760008660006127d1565b612c6085612d7d565b176127f9565b6005600083815260200190815260200160002081905550600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff1616905060008103612d1e57612d1d632e07630060e01b611dbd565b5b6000838301905060008390505b808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4818160010191508103612d2b5781600181905550505050612d786000848385612824565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612dd681612da1565b8114612de157600080fd5b50565b600081359050612df381612dcd565b92915050565b600060208284031215612e0f57612e0e612d97565b5b6000612e1d84828501612de4565b91505092915050565b60008115159050919050565b612e3b81612e26565b82525050565b6000602082019050612e566000830184612e32565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e96578082015181840152602081019050612e7b565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ebe82612e5c565b612ec88185612e67565b9350612ed8818560208601612e78565b612ee181612ea2565b840191505092915050565b60006020820190508181036000830152612f068184612eb3565b905092915050565b6000819050919050565b612f2181612f0e565b8114612f2c57600080fd5b50565b600081359050612f3e81612f18565b92915050565b600060208284031215612f5a57612f59612d97565b5b6000612f6884828501612f2f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f9c82612f71565b9050919050565b612fac81612f91565b82525050565b6000602082019050612fc76000830184612fa3565b92915050565b612fd681612f91565b8114612fe157600080fd5b50565b600081359050612ff381612fcd565b92915050565b600080604083850312156130105761300f612d97565b5b600061301e85828601612fe4565b925050602061302f85828601612f2f565b9150509250929050565b61304281612f0e565b82525050565b600060208201905061305d6000830184613039565b92915050565b60008060006060848603121561307c5761307b612d97565b5b600061308a86828701612fe4565b935050602061309b86828701612fe4565b92505060406130ac86828701612f2f565b9150509250925092565b6000819050919050565b60006130db6130d66130d184612f71565b6130b6565b612f71565b9050919050565b60006130ed826130c0565b9050919050565b60006130ff826130e2565b9050919050565b61310f816130f4565b82525050565b600060208201905061312a6000830184613106565b92915050565b60006020828403121561314657613145612d97565b5b600061315484828501612fe4565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126131825761318161315d565b5b8235905067ffffffffffffffff81111561319f5761319e613162565b5b6020830191508360018202830111156131bb576131ba613167565b5b9250929050565b600080602083850312156131d9576131d8612d97565b5b600083013567ffffffffffffffff8111156131f7576131f6612d9c565b5b6132038582860161316c565b92509250509250929050565b60008083601f8401126132255761322461315d565b5b8235905067ffffffffffffffff81111561324257613241613162565b5b60208301915083602082028301111561325e5761325d613167565b5b9250929050565b6000806020838503121561327c5761327b612d97565b5b600083013567ffffffffffffffff81111561329a57613299612d9c565b5b6132a68582860161320f565b92509250509250929050565b6132bb81612e26565b81146132c657600080fd5b50565b6000813590506132d8816132b2565b92915050565b600080604083850312156132f5576132f4612d97565b5b600061330385828601612fe4565b9250506020613314858286016132c9565b9150509250929050565b60006020828403121561333457613333612d97565b5b6000613342848285016132c9565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61338882612ea2565b810181811067ffffffffffffffff821117156133a7576133a6613350565b5b80604052505050565b60006133ba612d8d565b90506133c6828261337f565b919050565b600067ffffffffffffffff8211156133e6576133e5613350565b5b6133ef82612ea2565b9050602081019050919050565b82818337600083830152505050565b600061341e613419846133cb565b6133b0565b90508281526020810184848401111561343a5761343961334b565b5b6134458482856133fc565b509392505050565b600082601f8301126134625761346161315d565b5b813561347284826020860161340b565b91505092915050565b6000806000806080858703121561349557613494612d97565b5b60006134a387828801612fe4565b94505060206134b487828801612fe4565b93505060406134c587828801612f2f565b925050606085013567ffffffffffffffff8111156134e6576134e5612d9c565b5b6134f28782880161344d565b91505092959194509250565b6000806040838503121561351557613514612d97565b5b600061352385828601612fe4565b925050602061353485828601612fe4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061358557607f821691505b6020821081036135985761359761353e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135d4602083612e67565b91506135df8261359e565b602082019050919050565b60006020820190508181036000830152613603816135c7565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613640601f83612e67565b915061364b8261360a565b602082019050919050565b6000602082019050818103600083015261366f81613633565b9050919050565b600081905092915050565b50565b6000613691600083613676565b915061369c82613681565b600082019050919050565b60006136b282613684565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006136f2601083612e67565b91506136fd826136bc565b602082019050919050565b60006020820190508181036000830152613721816136e5565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026137957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613758565b61379f8683613758565b95508019841693508086168417925050509392505050565b60006137d26137cd6137c884612f0e565b6130b6565b612f0e565b9050919050565b6000819050919050565b6137ec836137b7565b6138006137f8826137d9565b848454613765565b825550505050565b600090565b613815613808565b6138208184846137e3565b505050565b5b818110156138445761383960008261380d565b600181019050613826565b5050565b601f8211156138895761385a81613733565b61386384613748565b81016020851015613872578190505b61388661387e85613748565b830182613825565b50505b505050565b600082821c905092915050565b60006138ac6000198460080261388e565b1980831691505092915050565b60006138c5838361389b565b9150826002028217905092915050565b6138df8383613728565b67ffffffffffffffff8111156138f8576138f7613350565b5b613902825461356d565b61390d828285613848565b6000601f83116001811461393c576000841561392a578287013590505b61393485826138b9565b86555061399c565b601f19841661394a86613733565b60005b828110156139725784890135825560018201915060208501945060208101905061394d565b8683101561398f578489013561398b601f89168261389b565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a0e82612f0e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a4057613a3f6139d4565b5b600182019050919050565b6000613a5682612f0e565b9150613a6183612f0e565b9250828201905080821115613a7957613a786139d4565b5b92915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000613ab5602083612e67565b9150613ac082613a7f565b602082019050919050565b60006020820190508181036000830152613ae481613aa8565b9050919050565b7f596f7520617265206e6f74206f6e2077686974656c6973740000000000000000600082015250565b6000613b21601883612e67565b9150613b2c82613aeb565b602082019050919050565b60006020820190508181036000830152613b5081613b14565b9050919050565b7f4d696e74206e6f74206f70656e20666f72207075626c69630000000000000000600082015250565b6000613b8d601883612e67565b9150613b9882613b57565b602082019050919050565b60006020820190508181036000830152613bbc81613b80565b9050919050565b7f416d6f756e742073686f756c64206e6f7420657863656564206d6178206d696e60008201527f74206e756d626572000000000000000000000000000000000000000000000000602082015250565b6000613c1f602883612e67565b9150613c2a82613bc3565b604082019050919050565b60006020820190508181036000830152613c4e81613c12565b9050919050565b6000613c6082612f0e565b9150613c6b83612f0e565b9250828202613c7981612f0e565b91508282048414831517613c9057613c8f6139d4565b5b5092915050565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b6000613ccd601d83612e67565b9150613cd882613c97565b602082019050919050565b60006020820190508181036000830152613cfc81613cc0565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613d5f602f83612e67565b9150613d6a82613d03565b604082019050919050565b60006020820190508181036000830152613d8e81613d52565b9050919050565b600081905092915050565b6000613dab82612e5c565b613db58185613d95565b9350613dc5818560208601612e78565b80840191505092915050565b6000613ddd8285613da0565b9150613de98284613da0565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e51602683612e67565b9150613e5c82613df5565b604082019050919050565b60006020820190508181036000830152613e8081613e44565b9050919050565b6000613e9282612f0e565b915060008203613ea557613ea46139d4565b5b600182039050919050565b6000604082019050613ec56000830185612fa3565b613ed26020830184612fa3565b9392505050565b600081519050613ee8816132b2565b92915050565b600060208284031215613f0457613f03612d97565b5b6000613f1284828501613ed9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f5582612f0e565b9150613f6083612f0e565b925082613f7057613f6f613f1b565b5b828204905092915050565b6000613f8682612f0e565b9150613f9183612f0e565b9250828203905081811115613fa957613fa86139d4565b5b92915050565b6000613fba82612f0e565b9150613fc583612f0e565b925082613fd557613fd4613f1b565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061400782613fe0565b6140118185613feb565b9350614021818560208601612e78565b61402a81612ea2565b840191505092915050565b600060808201905061404a6000830187612fa3565b6140576020830186612fa3565b6140646040830185613039565b81810360608301526140768184613ffc565b905095945050505050565b60008151905061409081612dcd565b92915050565b6000602082840312156140ac576140ab612d97565b5b60006140ba84828501614081565b9150509291505056fea26469706673582212204179b1ff10a228ba305850ca9af51fe93d6ca587cc15a340cbb19421839d281f64736f6c63430008120033697066733a2f2f6261666b726569626a6a69717a787971363567326b733261646d3773646c766578736e37616d327272717265367477346564713562647967697871

Deployed Bytecode

0x6080604052600436106102305760003560e01c8063868ff4a21161012e578063b88d4fde116100ab578063de7fcb1d1161006f578063de7fcb1d146107c3578063e0a80853146107ee578063e510873c14610817578063e985e9c514610840578063f2fde38b1461087d57610230565b8063b88d4fde146106ed578063b8ca64e414610709578063c6f6f21614610732578063c87b56dd1461075b578063d5abeb011461079857610230565b8063a035b1fe116100f2578063a035b1fe14610629578063a0712d6814610654578063a22cb46514610670578063a45ba8e714610699578063af947cec146106c457610230565b8063868ff4a2146105655780638da5cb5b14610581578063918b5be1146105ac57806391b7f5ed146105d557806395d89b41146105fe57610230565b806341f43434116101bc5780636352211e116101805780636352211e1461048057806367df1952146104bd5780636c0360eb146104e657806370a0823114610511578063715018a61461054e57610230565b806341f43434146103a857806342842e0e146103d35780634813d8a6146103ef578063518302271461042c57806355f804b31461045757610230565b80630bb12bb8116102035780630bb12bb8146102f657806318160ddd1461032157806323b872dd1461034c578063379607f5146103685780633ccfd60b1461039157610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190612df9565b6108a6565b6040516102699190612e41565b60405180910390f35b34801561027e57600080fd5b50610287610938565b6040516102949190612eec565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190612f44565b6109ca565b6040516102d19190612fb2565b60405180910390f35b6102f460048036038101906102ef9190612ff9565b610a28565b005b34801561030257600080fd5b5061030b610a41565b6040516103189190612e41565b60405180910390f35b34801561032d57600080fd5b50610336610a54565b6040516103439190613048565b60405180910390f35b61036660048036038101906103619190613063565b610a67565b005b34801561037457600080fd5b5061038f600480360381019061038a9190612f44565b610ab6565b005b34801561039d57600080fd5b506103a6610b3e565b005b3480156103b457600080fd5b506103bd610cbe565b6040516103ca9190613115565b60405180910390f35b6103ed60048036038101906103e89190613063565b610cd0565b005b3480156103fb57600080fd5b5061041660048036038101906104119190613130565b610d1f565b6040516104239190612e41565b60405180910390f35b34801561043857600080fd5b50610441610d3f565b60405161044e9190612e41565b60405180910390f35b34801561046357600080fd5b5061047e600480360381019061047991906131c2565b610d52565b005b34801561048c57600080fd5b506104a760048036038101906104a29190612f44565b610de4565b6040516104b49190612fb2565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df9190613265565b610df6565b005b3480156104f257600080fd5b506104fb610f17565b6040516105089190612eec565b60405180910390f35b34801561051d57600080fd5b5061053860048036038101906105339190613130565b610fa5565b6040516105459190613048565b60405180910390f35b34801561055a57600080fd5b5061056361103c565b005b61057f600480360381019061057a9190612f44565b611176565b005b34801561058d57600080fd5b5061059661126c565b6040516105a39190612fb2565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce91906131c2565b611295565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190612f44565b611327565b005b34801561060a57600080fd5b506106136113ad565b6040516106209190612eec565b60405180910390f35b34801561063557600080fd5b5061063e61143f565b60405161064b9190613048565b60405180910390f35b61066e60048036038101906106699190612f44565b611445565b005b34801561067c57600080fd5b50610697600480360381019061069291906132de565b61159a565b005b3480156106a557600080fd5b506106ae6115b3565b6040516106bb9190612eec565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e6919061331e565b611641565b005b6107076004803603810190610702919061347b565b6116da565b005b34801561071557600080fd5b50610730600480360381019061072b9190612f44565b61172b565b005b34801561073e57600080fd5b5061075960048036038101906107549190612f44565b6117b1565b005b34801561076757600080fd5b50610782600480360381019061077d9190612f44565b611837565b60405161078f9190612eec565b60405180910390f35b3480156107a457600080fd5b506107ad61198c565b6040516107ba9190613048565b60405180910390f35b3480156107cf57600080fd5b506107d8611992565b6040516107e59190613048565b60405180910390f35b3480156107fa57600080fd5b506108156004803603810190610810919061331e565b611998565b005b34801561082357600080fd5b5061083e60048036038101906108399190613130565b611a31565b005b34801561084c57600080fd5b50610867600480360381019061086291906134fe565b611b08565b6040516108749190612e41565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f9190613130565b611b9c565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109315750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546109479061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546109739061356d565b80156109c05780601f10610995576101008083540402835291602001916109c0565b820191906000526020600020905b8154815290600101906020018083116109a357829003601f168201915b5050505050905090565b60006109d582611d44565b6109ea576109e963cf4700e460e01b611dbd565b5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610a3281611dc7565b610a3c8383611ec4565b505050565b600e60009054906101000a900460ff1681565b6000610a5e611ed4565b60015403905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610aa557610aa433611dc7565b5b610ab0848484611ed9565b50505050565b610abe61219a565b73ffffffffffffffffffffffffffffffffffffffff16610adc61126c565b73ffffffffffffffffffffffffffffffffffffffff1614610b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b29906135ea565b60405180910390fd5b610b3b816121a2565b50565b610b4661219a565b73ffffffffffffffffffffffffffffffffffffffff16610b6461126c565b73ffffffffffffffffffffffffffffffffffffffff1614610bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb1906135ea565b60405180910390fd5b6002600a5403610bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf690613656565b60405180910390fd5b6002600a8190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610c2d906136a7565b60006040518083038185875af1925050503d8060008114610c6a576040519150601f19603f3d011682016040523d82523d6000602084013e610c6f565b606091505b5050905080610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa90613708565b60405180910390fd5b506001600a81905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d0e57610d0d33611dc7565b5b610d198484846121b0565b50505050565b60116020528060005260406000206000915054906101000a900460ff1681565b600e60019054906101000a900460ff1681565b610d5a61219a565b73ffffffffffffffffffffffffffffffffffffffff16610d7861126c565b73ffffffffffffffffffffffffffffffffffffffff1614610dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc5906135ea565b60405180910390fd5b8181600f9182610ddf9291906138d5565b505050565b6000610def826121d0565b9050919050565b610dfe61219a565b73ffffffffffffffffffffffffffffffffffffffff16610e1c61126c565b73ffffffffffffffffffffffffffffffffffffffff1614610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e69906135ea565b60405180910390fd5b60005b82829050811015610f1257600160116000858585818110610e9957610e986139a5565b5b9050602002016020810190610eae9190613130565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f0a90613a03565b915050610e75565b505050565b600f8054610f249061356d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f509061356d565b8015610f9d5780601f10610f7257610100808354040283529160200191610f9d565b820191906000526020600020905b815481529060010190602001808311610f8057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610feb57610fea638f4eb60460e01b611dbd565b5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61104461219a565b73ffffffffffffffffffffffffffffffffffffffff1661106261126c565b73ffffffffffffffffffffffffffffffffffffffff16146110b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110af906135ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000611180610a54565b9050600b5482826111919190613a4b565b11156111d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c990613acb565b60405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590613b37565b60405180910390fd5b61126833836122bc565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61129d61219a565b73ffffffffffffffffffffffffffffffffffffffff166112bb61126c565b73ffffffffffffffffffffffffffffffffffffffff1614611311576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611308906135ea565b60405180910390fd5b8181601091826113229291906138d5565b505050565b61132f61219a565b73ffffffffffffffffffffffffffffffffffffffff1661134d61126c565b73ffffffffffffffffffffffffffffffffffffffff16146113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a906135ea565b60405180910390fd5b80600d8190555050565b6060600480546113bc9061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546113e89061356d565b80156114355780601f1061140a57610100808354040283529160200191611435565b820191906000526020600020905b81548152906001019060200180831161141857829003601f168201915b5050505050905090565b600d5481565b600061144f610a54565b905060001515600e60009054906101000a900460ff161515146114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e90613ba3565b60405180910390fd5b600b5482826114b69190613a4b565b11156114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee90613acb565b60405180910390fd5b600c5482111561153c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153390613c35565b60405180910390fd5b81600d5461154a9190613c55565b34101561158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158390613ce3565b60405180910390fd5b61159633836122bc565b5050565b816115a481611dc7565b6115ae83836122da565b505050565b601080546115c09061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546115ec9061356d565b80156116395780601f1061160e57610100808354040283529160200191611639565b820191906000526020600020905b81548152906001019060200180831161161c57829003601f168201915b505050505081565b61164961219a565b73ffffffffffffffffffffffffffffffffffffffff1661166761126c565b73ffffffffffffffffffffffffffffffffffffffff16146116bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b4906135ea565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117185761171733611dc7565b5b611724858585856123e5565b5050505050565b61173361219a565b73ffffffffffffffffffffffffffffffffffffffff1661175161126c565b73ffffffffffffffffffffffffffffffffffffffff16146117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e906135ea565b60405180910390fd5b80600b8190555050565b6117b961219a565b73ffffffffffffffffffffffffffffffffffffffff166117d761126c565b73ffffffffffffffffffffffffffffffffffffffff161461182d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611824906135ea565b60405180910390fd5b80600c8190555050565b606061184282611d44565b611881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187890613d75565b60405180910390fd5b60001515600e60019054906101000a900460ff1615150361192e57601080546118a99061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546118d59061356d565b80156119225780601f106118f757610100808354040283529160200191611922565b820191906000526020600020905b81548152906001019060200180831161190557829003601f168201915b50505050509050611987565b6000611938612437565b905060008151116119585760405180602001604052806000815250611983565b80611962846124c9565b604051602001611973929190613dd1565b6040516020818303038152906040525b9150505b919050565b600b5481565b600c5481565b6119a061219a565b73ffffffffffffffffffffffffffffffffffffffff166119be61126c565b73ffffffffffffffffffffffffffffffffffffffff1614611a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0b906135ea565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b611a3961219a565b73ffffffffffffffffffffffffffffffffffffffff16611a5761126c565b73ffffffffffffffffffffffffffffffffffffffff1614611aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa4906135ea565b60405180910390fd5b6001601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ba461219a565b73ffffffffffffffffffffffffffffffffffffffff16611bc261126c565b73ffffffffffffffffffffffffffffffffffffffff1614611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f906135ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e90613e67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081611d4f611ed4565b11611db857600154821015611db75760005b6000600560008581526020019081526020016000205491508103611d905782611d8990613e87565b9250611d61565b60007c01000000000000000000000000000000000000000000000000000000008216149150505b5b919050565b8060005260046000fd5b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611ec1576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611e3e929190613eb0565b602060405180830381865afa158015611e5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7f9190613eee565b611ec057806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611eb79190612fb2565b60405180910390fd5b5b50565b611ed082826001612629565b5050565b600090565b6000611ee4826121d0565b905073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161693508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f5957611f5863a114810060e01b611dbd565b5b600080611f6584612758565b91509150611f7b8187611f7661277f565b612787565b611fa657611f9086611f8b61277f565b611b08565b611fa557611fa46359c896be60e01b611dbd565b5b5b611fb386868660016127cb565b8015611fbe57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061208c856120688888876127d1565b7c0200000000000000000000000000000000000000000000000000000000176127f9565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612112576000600185019050600060056000838152602001908152602001600020540361211057600154811461210f578360056000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff8673ffffffffffffffffffffffffffffffffffffffff161690508481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600081036121845761218363ea553b3460e01b611dbd565b5b6121918787876001612824565b50505050505050565b600033905090565b6121ad81600061282a565b50565b6121cb838383604051806020016040528060008152506116da565b505050565b6000816121db611ed4565b116122a657600560008381526020019081526020016000205490506000810361227d5760015482106122185761221763df2d9b4260e01b611dbd565b5b5b600560008360019003935083815260200190815260200160002054905060008103156122785760007c0100000000000000000000000000000000000000000000000000000000821603156122b75761227763df2d9b4260e01b611dbd565b5b612219565b60007c0100000000000000000000000000000000000000000000000000000000821603156122b7575b6122b663df2d9b4260e01b611dbd565b5b919050565b6122d6828260405180602001604052806000815250612a5b565b5050565b80600860006122e761277f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661239461277f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123d99190612e41565b60405180910390a35050565b6123f0848484610a67565b60008373ffffffffffffffffffffffffffffffffffffffff163b146124315761241b84848484612ae1565b6124305761242f63d1a57ed660e01b611dbd565b5b5b50505050565b6060600f80546124469061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546124729061356d565b80156124bf5780601f10612494576101008083540402835291602001916124bf565b820191906000526020600020905b8154815290600101906020018083116124a257829003601f168201915b5050505050905090565b606060008203612510576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612624565b600082905060005b6000821461254257808061252b90613a03565b915050600a8261253b9190613f4a565b9150612518565b60008167ffffffffffffffff81111561255e5761255d613350565b5b6040519080825280601f01601f1916602001820160405280156125905781602001600182028036833780820191505090505b5090505b6000851461261d576001826125a99190613f7b565b9150600a856125b89190613faf565b60306125c49190613a4b565b60f81b8183815181106125da576125d96139a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126169190613f4a565b9450612594565b8093505050505b919050565b600061263483610de4565b905081801561267657508073ffffffffffffffffffffffffffffffffffffffff1661265d61277f565b73ffffffffffffffffffffffffffffffffffffffff1614155b156126a25761268c8161268761277f565b611b08565b6126a1576126a063cfb3b94260e01b611dbd565b5b5b836007600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86127e8868684612c10565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612835836121d0565b9050600081905060008061284886612758565b91509150841561289057612864818461285f61277f565b612787565b61288f576128798361287461277f565b611b08565b61288e5761288d6359c896be60e01b611dbd565b5b5b5b61289e8360008860016127cb565b80156128a957600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506129518361290e856000886127d1565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176127f9565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036129d757600060018701905060006005600083815260200190815260200160002054036129d55760015481146129d4578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a41836000886001612824565b600260008154809291906001019190505550505050505050565b612a658383612c19565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612adc5760006001549050600083820390505b612aa66000868380600101945086612ae1565b612abb57612aba63d1a57ed660e01b611dbd565b5b818110612a93578160015414612ad957612ad8600060e01b611dbd565b5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b0761277f565b8786866040518563ffffffff1660e01b8152600401612b299493929190614035565b6020604051808303816000875af1925050508015612b6557506040513d601f19601f82011682018060405250810190612b629190614096565b60015b612bbd573d8060008114612b95576040519150601f19603f3d011682016040523d82523d6000602084013e612b9a565b606091505b506000815103612bb557612bb463d1a57ed660e01b611dbd565b5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000600154905060008203612c3957612c3863b562e8dd60e01b611dbd565b5b612c4660008483856127cb565b612c6683612c5760008660006127d1565b612c6085612d7d565b176127f9565b6005600083815260200190815260200160002081905550600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff1616905060008103612d1e57612d1d632e07630060e01b611dbd565b5b6000838301905060008390505b808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4818160010191508103612d2b5781600181905550505050612d786000848385612824565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612dd681612da1565b8114612de157600080fd5b50565b600081359050612df381612dcd565b92915050565b600060208284031215612e0f57612e0e612d97565b5b6000612e1d84828501612de4565b91505092915050565b60008115159050919050565b612e3b81612e26565b82525050565b6000602082019050612e566000830184612e32565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e96578082015181840152602081019050612e7b565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ebe82612e5c565b612ec88185612e67565b9350612ed8818560208601612e78565b612ee181612ea2565b840191505092915050565b60006020820190508181036000830152612f068184612eb3565b905092915050565b6000819050919050565b612f2181612f0e565b8114612f2c57600080fd5b50565b600081359050612f3e81612f18565b92915050565b600060208284031215612f5a57612f59612d97565b5b6000612f6884828501612f2f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f9c82612f71565b9050919050565b612fac81612f91565b82525050565b6000602082019050612fc76000830184612fa3565b92915050565b612fd681612f91565b8114612fe157600080fd5b50565b600081359050612ff381612fcd565b92915050565b600080604083850312156130105761300f612d97565b5b600061301e85828601612fe4565b925050602061302f85828601612f2f565b9150509250929050565b61304281612f0e565b82525050565b600060208201905061305d6000830184613039565b92915050565b60008060006060848603121561307c5761307b612d97565b5b600061308a86828701612fe4565b935050602061309b86828701612fe4565b92505060406130ac86828701612f2f565b9150509250925092565b6000819050919050565b60006130db6130d66130d184612f71565b6130b6565b612f71565b9050919050565b60006130ed826130c0565b9050919050565b60006130ff826130e2565b9050919050565b61310f816130f4565b82525050565b600060208201905061312a6000830184613106565b92915050565b60006020828403121561314657613145612d97565b5b600061315484828501612fe4565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126131825761318161315d565b5b8235905067ffffffffffffffff81111561319f5761319e613162565b5b6020830191508360018202830111156131bb576131ba613167565b5b9250929050565b600080602083850312156131d9576131d8612d97565b5b600083013567ffffffffffffffff8111156131f7576131f6612d9c565b5b6132038582860161316c565b92509250509250929050565b60008083601f8401126132255761322461315d565b5b8235905067ffffffffffffffff81111561324257613241613162565b5b60208301915083602082028301111561325e5761325d613167565b5b9250929050565b6000806020838503121561327c5761327b612d97565b5b600083013567ffffffffffffffff81111561329a57613299612d9c565b5b6132a68582860161320f565b92509250509250929050565b6132bb81612e26565b81146132c657600080fd5b50565b6000813590506132d8816132b2565b92915050565b600080604083850312156132f5576132f4612d97565b5b600061330385828601612fe4565b9250506020613314858286016132c9565b9150509250929050565b60006020828403121561333457613333612d97565b5b6000613342848285016132c9565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61338882612ea2565b810181811067ffffffffffffffff821117156133a7576133a6613350565b5b80604052505050565b60006133ba612d8d565b90506133c6828261337f565b919050565b600067ffffffffffffffff8211156133e6576133e5613350565b5b6133ef82612ea2565b9050602081019050919050565b82818337600083830152505050565b600061341e613419846133cb565b6133b0565b90508281526020810184848401111561343a5761343961334b565b5b6134458482856133fc565b509392505050565b600082601f8301126134625761346161315d565b5b813561347284826020860161340b565b91505092915050565b6000806000806080858703121561349557613494612d97565b5b60006134a387828801612fe4565b94505060206134b487828801612fe4565b93505060406134c587828801612f2f565b925050606085013567ffffffffffffffff8111156134e6576134e5612d9c565b5b6134f28782880161344d565b91505092959194509250565b6000806040838503121561351557613514612d97565b5b600061352385828601612fe4565b925050602061353485828601612fe4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061358557607f821691505b6020821081036135985761359761353e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135d4602083612e67565b91506135df8261359e565b602082019050919050565b60006020820190508181036000830152613603816135c7565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613640601f83612e67565b915061364b8261360a565b602082019050919050565b6000602082019050818103600083015261366f81613633565b9050919050565b600081905092915050565b50565b6000613691600083613676565b915061369c82613681565b600082019050919050565b60006136b282613684565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006136f2601083612e67565b91506136fd826136bc565b602082019050919050565b60006020820190508181036000830152613721816136e5565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026137957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613758565b61379f8683613758565b95508019841693508086168417925050509392505050565b60006137d26137cd6137c884612f0e565b6130b6565b612f0e565b9050919050565b6000819050919050565b6137ec836137b7565b6138006137f8826137d9565b848454613765565b825550505050565b600090565b613815613808565b6138208184846137e3565b505050565b5b818110156138445761383960008261380d565b600181019050613826565b5050565b601f8211156138895761385a81613733565b61386384613748565b81016020851015613872578190505b61388661387e85613748565b830182613825565b50505b505050565b600082821c905092915050565b60006138ac6000198460080261388e565b1980831691505092915050565b60006138c5838361389b565b9150826002028217905092915050565b6138df8383613728565b67ffffffffffffffff8111156138f8576138f7613350565b5b613902825461356d565b61390d828285613848565b6000601f83116001811461393c576000841561392a578287013590505b61393485826138b9565b86555061399c565b601f19841661394a86613733565b60005b828110156139725784890135825560018201915060208501945060208101905061394d565b8683101561398f578489013561398b601f89168261389b565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a0e82612f0e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a4057613a3f6139d4565b5b600182019050919050565b6000613a5682612f0e565b9150613a6183612f0e565b9250828201905080821115613a7957613a786139d4565b5b92915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000613ab5602083612e67565b9150613ac082613a7f565b602082019050919050565b60006020820190508181036000830152613ae481613aa8565b9050919050565b7f596f7520617265206e6f74206f6e2077686974656c6973740000000000000000600082015250565b6000613b21601883612e67565b9150613b2c82613aeb565b602082019050919050565b60006020820190508181036000830152613b5081613b14565b9050919050565b7f4d696e74206e6f74206f70656e20666f72207075626c69630000000000000000600082015250565b6000613b8d601883612e67565b9150613b9882613b57565b602082019050919050565b60006020820190508181036000830152613bbc81613b80565b9050919050565b7f416d6f756e742073686f756c64206e6f7420657863656564206d6178206d696e60008201527f74206e756d626572000000000000000000000000000000000000000000000000602082015250565b6000613c1f602883612e67565b9150613c2a82613bc3565b604082019050919050565b60006020820190508181036000830152613c4e81613c12565b9050919050565b6000613c6082612f0e565b9150613c6b83612f0e565b9250828202613c7981612f0e565b91508282048414831517613c9057613c8f6139d4565b5b5092915050565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b6000613ccd601d83612e67565b9150613cd882613c97565b602082019050919050565b60006020820190508181036000830152613cfc81613cc0565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613d5f602f83612e67565b9150613d6a82613d03565b604082019050919050565b60006020820190508181036000830152613d8e81613d52565b9050919050565b600081905092915050565b6000613dab82612e5c565b613db58185613d95565b9350613dc5818560208601612e78565b80840191505092915050565b6000613ddd8285613da0565b9150613de98284613da0565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e51602683612e67565b9150613e5c82613df5565b604082019050919050565b60006020820190508181036000830152613e8081613e44565b9050919050565b6000613e9282612f0e565b915060008203613ea557613ea46139d4565b5b600182039050919050565b6000604082019050613ec56000830185612fa3565b613ed26020830184612fa3565b9392505050565b600081519050613ee8816132b2565b92915050565b600060208284031215613f0457613f03612d97565b5b6000613f1284828501613ed9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f5582612f0e565b9150613f6083612f0e565b925082613f7057613f6f613f1b565b5b828204905092915050565b6000613f8682612f0e565b9150613f9183612f0e565b9250828203905081811115613fa957613fa86139d4565b5b92915050565b6000613fba82612f0e565b9150613fc583612f0e565b925082613fd557613fd4613f1b565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061400782613fe0565b6140118185613feb565b9350614021818560208601612e78565b61402a81612ea2565b840191505092915050565b600060808201905061404a6000830187612fa3565b6140576020830186612fa3565b6140646040830185613039565b81810360608301526140768184613ffc565b905095945050505050565b60008151905061409081612dcd565b92915050565b6000602082840312156140ac576140ab612d97565b5b60006140ba84828501614081565b9150509291505056fea26469706673582212204179b1ff10a228ba305850ca9af51fe93d6ca587cc15a340cbb19421839d281f64736f6c63430008120033

Deployed Bytecode Sourcemap

74981:22543:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38249:655;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39167:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46496:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77764:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75209:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34814:308;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78647:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77572:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77378:186;;;;;;;;;;;;;:::i;:::-;;15997:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78171:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75430:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75247:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76727:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40632:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79341:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75282:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35983:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7344:148;;;;;;;;;;;;;:::i;:::-;;78884:314;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6693:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76500:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76177:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39343:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75165:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75577:488;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77962:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75310:111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76073:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78392:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76271:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76382:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76949:421;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75090:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75127:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76632:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79210:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47508:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7647:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38249:655;38350:4;38689:10;38674:25;;:11;:25;;;;:102;;;;38766:10;38751:25;;:11;:25;;;;38674:102;:179;;;;38843:10;38828:25;;:11;:25;;;;38674:179;38654:199;;38249:655;;;:::o;39167:100::-;39221:13;39254:5;39247:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39167:100;:::o;46496:256::-;46588:7;46613:16;46621:7;46613;:16::i;:::-;46608:86;;46644:50;46652:41;;;46644:7;:50::i;:::-;46608:86;46714:15;:24;46730:7;46714:24;;;;;;;;;;;:30;;;;;;;;;;;;46707:37;;46496:256;;;:::o;77764:190::-;77893:8;17913:30;17934:8;17913:20;:30::i;:::-;77914:32:::1;77928:8;77938:7;77914:13;:32::i;:::-;77764:190:::0;;;:::o;75209:31::-;;;;;;;;;;;;;:::o;34814:308::-;34875:7;35088:15;:13;:15::i;:::-;35072:13;;:31;35065:38;;34814:308;:::o;78647:205::-;78790:4;17647:10;17639:18;;:4;:18;;;17635:83;;17674:32;17695:10;17674:20;:32::i;:::-;17635:83;78807:37:::1;78826:4;78832:2;78836:7;78807:18;:37::i;:::-;78647:205:::0;;;;:::o;77572:84::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77634:14:::1;77640:7;77634:5;:14::i;:::-;77572:84:::0;:::o;77378:186::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3746:1:::1;4343:7;;:19:::0;4335:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3746:1;4476:7;:18;;;;77442:12:::2;77460:10;:15;;77483:21;77460:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77441:68;;;77528:7;77520:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;77430:134;3702:1:::1;4655:7;:22;;;;77378:186::o:0;15997:143::-;8014:42;15997:143;:::o;78171:213::-;78318:4;17647:10;17639:18;;:4;:18;;;17635:83;;17674:32;17695:10;17674:20;:32::i;:::-;17635:83;78335:41:::1;78358:4;78364:2;78368:7;78335:22;:41::i;:::-;78171:213:::0;;;;:::o;75430:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;75247:28::-;;;;;;;;;;;;;:::o;76727:106::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76815:10:::1;;76805:7;:20;;;;;;;:::i;:::-;;76727:106:::0;;:::o;40632:168::-;40720:7;40763:27;40782:7;40763:18;:27::i;:::-;40740:52;;40632:168;;;:::o;79341:220::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;79438:6:::1;79433:117;79454:10;;:17;;79450:1;:21;79433:117;;;79530:4;79497:15;:30;79513:10;;79524:1;79513:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;79497:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;79473:3;;;;;:::i;:::-;;;;79433:117;;;;79341:220:::0;;:::o;75282:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35983:258::-;36071:7;36112:1;36095:19;;:5;:19;;;36091:69;;36116:44;36124:35;;;36116:7;:44::i;:::-;36091:69;30094:13;36178:18;:25;36197:5;36178:25;;;;;;;;;;;;;;;;:55;36171:62;;35983:258;;;:::o;7344:148::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7451:1:::1;7414:40;;7435:6;::::0;::::1;;;;;;;;7414:40;;;;;;;;;;;;7482:1;7465:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;7344:148::o:0;78884:314::-;78953:10;78966:13;:11;:13::i;:::-;78953:26;;79017:9;;79007:6;79002:2;:11;;;;:::i;:::-;:24;;78994:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;79086:15;:27;79102:10;79086:27;;;;;;;;;;;;;;;;;;;;;;;;;79078:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;79157:29;79167:10;79179:6;79157:9;:29::i;:::-;78938:260;78884:314;:::o;6693:87::-;6739:7;6766:6;;;;;;;;;;;6759:13;;6693:87;:::o;76500:124::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76604:12:::1;;76584:17;:32;;;;;;;:::i;:::-;;76500:124:::0;;:::o;76177:86::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76249:6:::1;76241:5;:14;;;;76177:86:::0;:::o;39343:104::-;39399:13;39432:7;39425:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39343:104;:::o;75165:37::-;;;;:::o;75577:488::-;75635:10;75648:13;:11;:13::i;:::-;75635:26;;75696:5;75680:21;;:12;;;;;;;;;;;:21;;;75672:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;75764:9;;75754:6;75749:2;:11;;;;:::i;:::-;:24;;75741:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;75853:12;;75843:6;:22;;75821:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;75975:6;75967:5;;:14;;;;:::i;:::-;75954:9;:27;;75946:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;76028:29;76038:10;76050:6;76028:9;:29::i;:::-;75624:441;75577:488;:::o;77962:201::-;78091:8;17913:30;17934:8;17913:20;:30::i;:::-;78112:43:::1;78136:8;78146;78112:23;:43::i;:::-;77962:201:::0;;;:::o;75310:111::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;76073:96::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76155:6:::1;76140:12;;:21;;;;;;;;;;;;;;;;;;76073:96:::0;:::o;78392:247::-;78567:4;17647:10;17639:18;;:4;:18;;;17635:83;;17674:32;17695:10;17674:20;:32::i;:::-;17635:83;78584:47:::1;78607:4;78613:2;78617:7;78626:4;78584:22;:47::i;:::-;78392:247:::0;;;;;:::o;76271:103::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76356:10:::1;76344:9;:22;;;;76271:103:::0;:::o;76382:110::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76471:13:::1;76456:12;:28;;;;76382:110:::0;:::o;76949:421::-;77023:13;77057:17;77065:8;77057:7;:17::i;:::-;77049:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;77152:5;77140:17;;:8;;;;;;;;;;;:17;;;77136:50;;77167:17;77160:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77136:50;77196:28;77227:10;:8;:10::i;:::-;77196:41;;77286:1;77261:14;77255:28;:32;:107;;;;;;;;;;;;;;;;;77314:14;77330:26;77347:8;77330:16;:26::i;:::-;77297:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77255:107;77248:114;;;76949:421;;;;:::o;75090:30::-;;;;:::o;75127:31::-;;;;:::o;76632:87::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76705:6:::1;76694:8;;:17;;;;;;;;;;;;;;;;;;76632:87:::0;:::o;79210:119::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;79313:4:::1;79285:15;:25;79301:8;79285:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;79210:119:::0;:::o;47508:189::-;47630:4;47654:18;:25;47673:5;47654:25;;;;;;;;;;;;;;;:35;47680:8;47654:35;;;;;;;;;;;;;;;;;;;;;;;;;47647:42;;47508:189;;;;:::o;7647:244::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7756:1:::1;7736:22;;:8;:22;;::::0;7728:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;7846:8;7817:38;;7838:6;::::0;::::1;;;;;;;;7817:38;;;;;;;;;;;;7875:8;7866:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;7647:244:::0;:::o;47955:384::-;48036:11;48083:7;48064:15;:13;:15::i;:::-;:26;48060:272;;48121:13;;48111:7;:23;48107:214;;;48155:14;48188:60;48236:1;48205:17;:26;48223:7;48205:26;;;;;;;;;;;;48196:35;;;48195:42;48188:60;;48239:9;;;;:::i;:::-;;;48188:60;;;48304:1;30870:8;48276:6;:24;:29;48267:38;;48136:185;48107:214;48060:272;47955:384;;;:::o;74746:165::-;74847:13;74841:4;74834:27;74888:4;74882;74875:18;18056:740;18295:1;8014:42;18247:45;;;:49;18243:546;;;8014:42;18564;;;18637:4;18665:8;18564:128;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18541:237;;18753:8;18734:28;;;;;;;;;;;:::i;:::-;;;;;;;;18541:237;18243:546;18056:740;:::o;46188:149::-;46302:27;46311:2;46315:7;46324:4;46302:8;:27::i;:::-;46188:149;;:::o;34330:92::-;34386:7;34330:92;:::o;50341:3701::-;50483:27;50513;50532:7;50513:18;:27::i;:::-;50483:57;;31552:14;50684:4;50668:22;;:41;50645:66;;50769:4;50728:45;;50744:19;50728:45;;;50724:108;;50788:44;50796:35;;;50788:7;:44::i;:::-;50724:108;50860:27;50902:23;50939:35;50966:7;50939:26;:35::i;:::-;50845:129;;;;51088:134;51131:15;51165:4;51188:19;:17;:19::i;:::-;51088:24;:134::i;:::-;51069:296;;51252:43;51269:4;51275:19;:17;:19::i;:::-;51252:16;:43::i;:::-;51247:118;;51314:51;51322:42;;;51314:7;:51::i;:::-;51247:118;51069:296;51378:43;51400:4;51406:2;51410:7;51419:1;51378:21;:43::i;:::-;51514:15;51511:160;;;51654:1;51633:19;51626:30;51511:160;52051:18;:24;52070:4;52051:24;;;;;;;;;;;;;;;;52049:26;;;;;;;;;;;;52120:18;:22;52139:2;52120:22;;;;;;;;;;;;;;;;52118:24;;;;;;;;;;;52442:167;52479:2;52549:45;52564:4;52570:2;52574:19;52549:14;:45::i;:::-;31150:8;52500:94;52442:18;:167::i;:::-;52413:17;:26;52431:7;52413:26;;;;;;;;;;;:196;;;;52780:1;31150:8;52729:19;:47;:52;52725:627;;52802:19;52834:1;52824:7;:11;52802:33;;52991:1;52957:17;:30;52975:11;52957:30;;;;;;;;;;;;:35;52953:384;;53095:13;;53080:11;:28;53076:242;;53275:19;53242:17;:30;53260:11;53242:30;;;;;;;;;;;:52;;;;53076:242;52953:384;52783:569;52725:627;53465:16;31552:14;53500:2;53484:20;;:39;53465:58;;53864:7;53828:8;53794:4;53736:25;53681:1;53624;53601:299;53937:1;53925:8;:13;53921:58;;53940:39;53948:30;;;53940:7;:39::i;:::-;53921:58;53992:42;54013:4;54019:2;54023:7;54032:1;53992:20;:42::i;:::-;50472:3570;;;;50341:3701;;;:::o;5284:98::-;5337:7;5364:10;5357:17;;5284:98;:::o;66685:89::-;66745:21;66751:7;66760:5;66745;:21::i;:::-;66685:89;:::o;54138:193::-;54284:39;54301:4;54307:2;54311:7;54284:39;;;;;;;;;;;;:16;:39::i;:::-;54138:193;;;:::o;42176:2049::-;42259:14;42309:7;42290:15;:13;:15::i;:::-;:26;42286:1874;;42342:17;:26;42360:7;42342:26;;;;;;;;;;;;42333:35;;42478:1;42468:6;:11;42464:1313;;42515:13;;42504:7;:24;42500:98;;42551:47;42559:38;;;42551:7;:47::i;:::-;42500:98;43155:607;43233:17;:28;43251:9;;;;;;;43233:28;;;;;;;;;;;;43224:37;;43321:1;43311:6;:11;43307:25;43324:8;43307:25;43387:1;30870:8;43359:6;:24;:29;43355:48;43390:13;43355:48;43695:47;43703:38;;;43695:7;:47::i;:::-;43155:607;;;42464:1313;44132:1;30870:8;44104:6;:24;:29;44100:48;44135:13;44100:48;42286:1874;44170:47;44178:38;;;44170:7;:47::i;:::-;42176:2049;;;;:::o;65026:112::-;65103:27;65113:2;65117:8;65103:27;;;;;;;;;;;;:9;:27::i;:::-;65026:112;;:::o;47092:259::-;47264:8;47212:18;:39;47231:19;:17;:19::i;:::-;47212:39;;;;;;;;;;;;;;;:49;47252:8;47212:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;47324:8;47288:55;;47303:19;:17;:19::i;:::-;47288:55;;;47334:8;47288:55;;;;;;:::i;:::-;;;;;;;;47092:259;;:::o;54929:416::-;55104:31;55117:4;55123:2;55127:7;55104:12;:31::i;:::-;55168:1;55150:2;:14;;;:19;55146:192;;55189:56;55220:4;55226:2;55230:7;55239:5;55189:30;:56::i;:::-;55184:154;;55266:56;55274:47;;;55266:7;:56::i;:::-;55184:154;55146:192;54929:416;;;;:::o;76841:100::-;76893:13;76926:7;76919:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76841:100;:::o;277:723::-;333:13;563:1;554:5;:10;550:53;;581:10;;;;;;;;;;;;;;;;;;;;;550:53;613:12;628:5;613:20;;644:14;669:78;684:1;676:4;:9;669:78;;702:8;;;;;:::i;:::-;;;;733:2;725:10;;;;;:::i;:::-;;;669:78;;;757:19;789:6;779:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;757:39;;807:154;823:1;814:5;:10;807:154;;851:1;841:11;;;;;:::i;:::-;;;918:2;910:5;:10;;;;:::i;:::-;897:2;:24;;;;:::i;:::-;884:39;;867:6;874;867:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;947:2;938:11;;;;;:::i;:::-;;;807:154;;;985:6;971:21;;;;;277:723;;;;:::o;65944:474::-;66073:13;66089:16;66097:7;66089;:16::i;:::-;66073:32;;66122:13;:45;;;;;66162:5;66139:28;;:19;:17;:19::i;:::-;:28;;;;66122:45;66118:201;;;66187:44;66204:5;66211:19;:17;:19::i;:::-;66187:16;:44::i;:::-;66182:137;;66252:51;66260:42;;;66252:7;:51::i;:::-;66182:137;66118:201;66364:2;66331:15;:24;66347:7;66331:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;66402:7;66398:2;66382:28;;66391:5;66382:28;;;;;;;;;;;;66062:356;65944:474;;;:::o;49220:501::-;49338:27;49367:23;49408:38;49449:15;:24;49465:7;49449:24;;;;;;;;;;;49408:65;;49626:18;49603:41;;49683:19;49677:26;49658:45;;49588:126;49220:501;;;:::o;72711:105::-;72771:7;72798:10;72791:17;;72711:105;:::o;48448:659::-;48597:11;48762:16;48755:5;48751:28;48742:37;;48922:16;48911:9;48907:32;48894:45;;49072:15;49061:9;49058:30;49050:5;49039:9;49036:20;49033:56;49023:66;;48448:659;;;;;:::o;56007:159::-;;;;;:::o;72020:311::-;72155:7;72175:16;31274:3;72201:19;:41;;72175:68;;31274:3;72269:31;72280:4;72286:2;72290:9;72269:10;:31::i;:::-;72261:40;;:62;;72254:69;;;72020:311;;;;;:::o;44789:524::-;44894:14;45062:16;45055:5;45051:28;45042:37;;45274:5;45260:11;45235:23;45231:41;45228:52;45204:5;45183:112;45173:122;;44789:524;;;;:::o;56831:158::-;;;;;:::o;67003:3283::-;67083:27;67113;67132:7;67113:18;:27::i;:::-;67083:57;;67153:12;67184:19;67153:52;;67233:27;67275:23;67312:35;67339:7;67312:26;:35::i;:::-;67218:129;;;;67364:13;67360:460;;;67503:150;67550:15;67588:4;67615:19;:17;:19::i;:::-;67503:24;:150::i;:::-;67480:328;;67691:43;67708:4;67714:19;:17;:19::i;:::-;67691:16;:43::i;:::-;67686:122;;67757:51;67765:42;;;67757:7;:51::i;:::-;67686:122;67480:328;67360:460;67832:51;67854:4;67868:1;67872:7;67881:1;67832:21;:51::i;:::-;67976:15;67973:160;;;68116:1;68095:19;68088:30;67973:160;68794:1;30359:3;68764:1;:26;;68763:32;68735:18;:24;68754:4;68735:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;69062:197;69099:4;69191:53;69206:4;69220:1;69224:19;69191:14;:53::i;:::-;31150:8;30870;69123:43;69122:122;69062:18;:197::i;:::-;69033:17;:26;69051:7;69033:26;;;;;;;;;;;:226;;;;69430:1;31150:8;69379:19;:47;:52;69375:627;;69452:19;69484:1;69474:7;:11;69452:33;;69641:1;69607:17;:30;69625:11;69607:30;;;;;;;;;;;;:35;69603:384;;69745:13;;69730:11;:28;69726:242;;69925:19;69892:17;:30;69910:11;69892:30;;;;;;;;;;;:52;;;;69726:242;69603:384;69433:569;69375:627;70057:7;70053:1;70030:35;;70039:4;70030:35;;;;;;;;;;;;70076:50;70097:4;70111:1;70115:7;70124:1;70076:20;:50::i;:::-;70253:12;;:14;;;;;;;;;;;;;67072:3214;;;;67003:3283;;:::o;63987:955::-;64118:19;64124:2;64128:8;64118:5;:19::i;:::-;64197:1;64179:2;:14;;;:19;64175:749;;64219:11;64233:13;;64219:27;;64265:13;64287:8;64281:3;:14;64265:30;;64314:489;64371:205;64440:1;64473:2;64506:7;;;;;;64544:5;64371:30;:205::i;:::-;64340:423;;64627:112;64665:47;;;64627:7;:112::i;:::-;64340:423;64798:3;64790:5;:11;64314:489;;64885:3;64868:13;;:20;64864:44;;64890:18;64905:1;64898:9;;64890:7;:18::i;:::-;64864:44;64200:724;;64175:749;63987:955;;;:::o;57429:806::-;57592:4;57651:2;57626:45;;;57690:19;:17;:19::i;:::-;57728:4;57751:7;57777:5;57626:171;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57609:619;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58028:1;58011:6;:13;:18;58007:115;;58050:56;58058:47;;;58050:7;:56::i;:::-;58007:115;58194:6;58188:13;58179:6;58175:2;58171:15;58164:38;57609:619;57897:54;;;57870:81;;;:6;:81;;;;57846:105;;;57429:806;;;;;;:::o;71721:147::-;71858:6;71721:147;;;;;:::o;58697:2360::-;58770:20;58793:13;;58770:36;;58833:1;58821:8;:13;58817:53;;58836:34;58844:25;;;58836:7;:34::i;:::-;58817:53;58883:61;58913:1;58917:2;58921:12;58935:8;58883:21;:61::i;:::-;59417:160;59454:2;59529:33;59552:1;59556:2;59560:1;59529:14;:33::i;:::-;59475:30;59496:8;59475:20;:30::i;:::-;:87;59417:18;:160::i;:::-;59383:17;:31;59401:12;59383:31;;;;;;;;;;;:194;;;;59898:1;30232:2;59868:1;:26;;59867:32;59838:8;:62;59795:18;:22;59814:2;59795:22;;;;;;;;;;;;;;;;:105;;;;;;;;;;;60011:16;31552:14;60046:2;60030:20;;:39;60011:58;;60102:1;60090:8;:13;60086:54;;60105:35;60113:26;;;60105:7;:35::i;:::-;60086:54;60157:11;60186:8;60171:12;:23;60157:37;;60209:15;60227:12;60209:30;;60256:676;60675:7;60631:8;60586:1;60520:25;60457:1;60392;60361:358;60927:3;60914:9;;;;;;:16;60256:676;;60964:3;60948:13;:19;;;;59132:1847;;;60989:60;61018:1;61022:2;61026:12;61040:8;60989:20;:60::i;:::-;58759:2298;58697:2360;;:::o;45415:340::-;45501:14;45734:1;45724:8;45721:15;45695:24;45691:46;45681:56;;45415:340;;;:::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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:60::-;5895:3;5916:5;5909:12;;5867:60;;;:::o;5933:142::-;5983:9;6016:53;6034:34;6043:24;6061:5;6043:24;:::i;:::-;6034:34;:::i;:::-;6016:53;:::i;:::-;6003:66;;5933:142;;;:::o;6081:126::-;6131:9;6164:37;6195:5;6164:37;:::i;:::-;6151:50;;6081:126;;;:::o;6213:157::-;6294:9;6327:37;6358:5;6327:37;:::i;:::-;6314:50;;6213:157;;;:::o;6376:193::-;6494:68;6556:5;6494:68;:::i;:::-;6489:3;6482:81;6376:193;;:::o;6575:284::-;6699:4;6737:2;6726:9;6722:18;6714:26;;6750:102;6849:1;6838:9;6834:17;6825:6;6750:102;:::i;:::-;6575:284;;;;:::o;6865:329::-;6924:6;6973:2;6961:9;6952:7;6948:23;6944:32;6941:119;;;6979:79;;:::i;:::-;6941:119;7099:1;7124:53;7169:7;7160:6;7149:9;7145:22;7124:53;:::i;:::-;7114:63;;7070:117;6865:329;;;;:::o;7200:117::-;7309:1;7306;7299:12;7323:117;7432:1;7429;7422:12;7446:117;7555:1;7552;7545:12;7583:553;7641:8;7651:6;7701:3;7694:4;7686:6;7682:17;7678:27;7668:122;;7709:79;;:::i;:::-;7668:122;7822:6;7809:20;7799:30;;7852:18;7844:6;7841:30;7838:117;;;7874:79;;:::i;:::-;7838:117;7988:4;7980:6;7976:17;7964:29;;8042:3;8034:4;8026:6;8022:17;8012:8;8008:32;8005:41;8002:128;;;8049:79;;:::i;:::-;8002:128;7583:553;;;;;:::o;8142:529::-;8213:6;8221;8270:2;8258:9;8249:7;8245:23;8241:32;8238:119;;;8276:79;;:::i;:::-;8238:119;8424:1;8413:9;8409:17;8396:31;8454:18;8446:6;8443:30;8440:117;;;8476:79;;:::i;:::-;8440:117;8589:65;8646:7;8637:6;8626:9;8622:22;8589:65;:::i;:::-;8571:83;;;;8367:297;8142:529;;;;;:::o;8694:568::-;8767:8;8777:6;8827:3;8820:4;8812:6;8808:17;8804:27;8794:122;;8835:79;;:::i;:::-;8794:122;8948:6;8935:20;8925:30;;8978:18;8970:6;8967:30;8964:117;;;9000:79;;:::i;:::-;8964:117;9114:4;9106:6;9102:17;9090:29;;9168:3;9160:4;9152:6;9148:17;9138:8;9134:32;9131:41;9128:128;;;9175:79;;:::i;:::-;9128:128;8694:568;;;;;:::o;9268:559::-;9354:6;9362;9411:2;9399:9;9390:7;9386:23;9382:32;9379:119;;;9417:79;;:::i;:::-;9379:119;9565:1;9554:9;9550:17;9537:31;9595:18;9587:6;9584:30;9581:117;;;9617:79;;:::i;:::-;9581:117;9730:80;9802:7;9793:6;9782:9;9778:22;9730:80;:::i;:::-;9712:98;;;;9508:312;9268:559;;;;;:::o;9833:116::-;9903:21;9918:5;9903:21;:::i;:::-;9896:5;9893:32;9883:60;;9939:1;9936;9929:12;9883:60;9833:116;:::o;9955:133::-;9998:5;10036:6;10023:20;10014:29;;10052:30;10076:5;10052:30;:::i;:::-;9955:133;;;;:::o;10094:468::-;10159:6;10167;10216:2;10204:9;10195:7;10191:23;10187:32;10184:119;;;10222:79;;:::i;:::-;10184:119;10342:1;10367:53;10412:7;10403:6;10392:9;10388:22;10367:53;:::i;:::-;10357:63;;10313:117;10469:2;10495:50;10537:7;10528:6;10517:9;10513:22;10495:50;:::i;:::-;10485:60;;10440:115;10094:468;;;;;:::o;10568:323::-;10624:6;10673:2;10661:9;10652:7;10648:23;10644:32;10641:119;;;10679:79;;:::i;:::-;10641:119;10799:1;10824:50;10866:7;10857:6;10846:9;10842:22;10824:50;:::i;:::-;10814:60;;10770:114;10568:323;;;;:::o;10897:117::-;11006:1;11003;10996:12;11020:180;11068:77;11065:1;11058:88;11165:4;11162:1;11155:15;11189:4;11186:1;11179:15;11206:281;11289:27;11311:4;11289:27;:::i;:::-;11281:6;11277:40;11419:6;11407:10;11404:22;11383:18;11371:10;11368:34;11365:62;11362:88;;;11430:18;;:::i;:::-;11362:88;11470:10;11466:2;11459:22;11249:238;11206:281;;:::o;11493:129::-;11527:6;11554:20;;:::i;:::-;11544:30;;11583:33;11611:4;11603:6;11583:33;:::i;:::-;11493:129;;;:::o;11628:307::-;11689:4;11779:18;11771:6;11768:30;11765:56;;;11801:18;;:::i;:::-;11765:56;11839:29;11861:6;11839:29;:::i;:::-;11831:37;;11923:4;11917;11913:15;11905:23;;11628:307;;;:::o;11941:146::-;12038:6;12033:3;12028;12015:30;12079:1;12070:6;12065:3;12061:16;12054:27;11941:146;;;:::o;12093:423::-;12170:5;12195:65;12211:48;12252:6;12211:48;:::i;:::-;12195:65;:::i;:::-;12186:74;;12283:6;12276:5;12269:21;12321:4;12314:5;12310:16;12359:3;12350:6;12345:3;12341:16;12338:25;12335:112;;;12366:79;;:::i;:::-;12335:112;12456:54;12503:6;12498:3;12493;12456:54;:::i;:::-;12176:340;12093:423;;;;;:::o;12535:338::-;12590:5;12639:3;12632:4;12624:6;12620:17;12616:27;12606:122;;12647:79;;:::i;:::-;12606:122;12764:6;12751:20;12789:78;12863:3;12855:6;12848:4;12840:6;12836:17;12789:78;:::i;:::-;12780:87;;12596:277;12535:338;;;;:::o;12879:943::-;12974:6;12982;12990;12998;13047:3;13035:9;13026:7;13022:23;13018:33;13015:120;;;13054:79;;:::i;:::-;13015:120;13174:1;13199:53;13244:7;13235:6;13224:9;13220:22;13199:53;:::i;:::-;13189:63;;13145:117;13301:2;13327:53;13372:7;13363:6;13352:9;13348:22;13327:53;:::i;:::-;13317:63;;13272:118;13429:2;13455:53;13500:7;13491:6;13480:9;13476:22;13455:53;:::i;:::-;13445:63;;13400:118;13585:2;13574:9;13570:18;13557:32;13616:18;13608:6;13605:30;13602:117;;;13638:79;;:::i;:::-;13602:117;13743:62;13797:7;13788:6;13777:9;13773:22;13743:62;:::i;:::-;13733:72;;13528:287;12879:943;;;;;;;:::o;13828:474::-;13896:6;13904;13953:2;13941:9;13932:7;13928:23;13924:32;13921:119;;;13959:79;;:::i;:::-;13921:119;14079:1;14104:53;14149:7;14140:6;14129:9;14125:22;14104:53;:::i;:::-;14094:63;;14050:117;14206:2;14232:53;14277:7;14268:6;14257:9;14253:22;14232:53;:::i;:::-;14222:63;;14177:118;13828:474;;;;;:::o;14308:180::-;14356:77;14353:1;14346:88;14453:4;14450:1;14443:15;14477:4;14474:1;14467:15;14494:320;14538:6;14575:1;14569:4;14565:12;14555:22;;14622:1;14616:4;14612:12;14643:18;14633:81;;14699:4;14691:6;14687:17;14677:27;;14633:81;14761:2;14753:6;14750:14;14730:18;14727:38;14724:84;;14780:18;;:::i;:::-;14724:84;14545:269;14494:320;;;:::o;14820:182::-;14960:34;14956:1;14948:6;14944:14;14937:58;14820:182;:::o;15008:366::-;15150:3;15171:67;15235:2;15230:3;15171:67;:::i;:::-;15164:74;;15247:93;15336:3;15247:93;:::i;:::-;15365:2;15360:3;15356:12;15349:19;;15008:366;;;:::o;15380:419::-;15546:4;15584:2;15573:9;15569:18;15561:26;;15633:9;15627:4;15623:20;15619:1;15608:9;15604:17;15597:47;15661:131;15787:4;15661:131;:::i;:::-;15653:139;;15380:419;;;:::o;15805:181::-;15945:33;15941:1;15933:6;15929:14;15922:57;15805:181;:::o;15992:366::-;16134:3;16155:67;16219:2;16214:3;16155:67;:::i;:::-;16148:74;;16231:93;16320:3;16231:93;:::i;:::-;16349:2;16344:3;16340:12;16333:19;;15992:366;;;:::o;16364:419::-;16530:4;16568:2;16557:9;16553:18;16545:26;;16617:9;16611:4;16607:20;16603:1;16592:9;16588:17;16581:47;16645:131;16771:4;16645:131;:::i;:::-;16637:139;;16364:419;;;:::o;16789:147::-;16890:11;16927:3;16912:18;;16789:147;;;;:::o;16942:114::-;;:::o;17062:398::-;17221:3;17242:83;17323:1;17318:3;17242:83;:::i;:::-;17235:90;;17334:93;17423:3;17334:93;:::i;:::-;17452:1;17447:3;17443:11;17436:18;;17062:398;;;:::o;17466:379::-;17650:3;17672:147;17815:3;17672:147;:::i;:::-;17665:154;;17836:3;17829:10;;17466:379;;;:::o;17851:166::-;17991:18;17987:1;17979:6;17975:14;17968:42;17851:166;:::o;18023:366::-;18165:3;18186:67;18250:2;18245:3;18186:67;:::i;:::-;18179:74;;18262:93;18351:3;18262:93;:::i;:::-;18380:2;18375:3;18371:12;18364:19;;18023:366;;;:::o;18395:419::-;18561:4;18599:2;18588:9;18584:18;18576:26;;18648:9;18642:4;18638:20;18634:1;18623:9;18619:17;18612:47;18676:131;18802:4;18676:131;:::i;:::-;18668:139;;18395:419;;;:::o;18820:97::-;18879:6;18907:3;18897:13;;18820:97;;;;:::o;18923:141::-;18972:4;18995:3;18987:11;;19018:3;19015:1;19008:14;19052:4;19049:1;19039:18;19031:26;;18923:141;;;:::o;19070:93::-;19107:6;19154:2;19149;19142:5;19138:14;19134:23;19124:33;;19070:93;;;:::o;19169:107::-;19213:8;19263:5;19257:4;19253:16;19232:37;;19169:107;;;;:::o;19282:393::-;19351:6;19401:1;19389:10;19385:18;19424:97;19454:66;19443:9;19424:97;:::i;:::-;19542:39;19572:8;19561:9;19542:39;:::i;:::-;19530:51;;19614:4;19610:9;19603:5;19599:21;19590:30;;19663:4;19653:8;19649:19;19642:5;19639:30;19629:40;;19358:317;;19282:393;;;;;:::o;19681:142::-;19731:9;19764:53;19782:34;19791:24;19809:5;19791:24;:::i;:::-;19782:34;:::i;:::-;19764:53;:::i;:::-;19751:66;;19681:142;;;:::o;19829:75::-;19872:3;19893:5;19886:12;;19829:75;;;:::o;19910:269::-;20020:39;20051:7;20020:39;:::i;:::-;20081:91;20130:41;20154:16;20130:41;:::i;:::-;20122:6;20115:4;20109:11;20081:91;:::i;:::-;20075:4;20068:105;19986:193;19910:269;;;:::o;20185:73::-;20230:3;20185:73;:::o;20264:189::-;20341:32;;:::i;:::-;20382:65;20440:6;20432;20426:4;20382:65;:::i;:::-;20317:136;20264:189;;:::o;20459:186::-;20519:120;20536:3;20529:5;20526:14;20519:120;;;20590:39;20627:1;20620:5;20590:39;:::i;:::-;20563:1;20556:5;20552:13;20543:22;;20519:120;;;20459:186;;:::o;20651:543::-;20752:2;20747:3;20744:11;20741:446;;;20786:38;20818:5;20786:38;:::i;:::-;20870:29;20888:10;20870:29;:::i;:::-;20860:8;20856:44;21053:2;21041:10;21038:18;21035:49;;;21074:8;21059:23;;21035:49;21097:80;21153:22;21171:3;21153:22;:::i;:::-;21143:8;21139:37;21126:11;21097:80;:::i;:::-;20756:431;;20741:446;20651:543;;;:::o;21200:117::-;21254:8;21304:5;21298:4;21294:16;21273:37;;21200:117;;;;:::o;21323:169::-;21367:6;21400:51;21448:1;21444:6;21436:5;21433:1;21429:13;21400:51;:::i;:::-;21396:56;21481:4;21475;21471:15;21461:25;;21374:118;21323:169;;;;:::o;21497:295::-;21573:4;21719:29;21744:3;21738:4;21719:29;:::i;:::-;21711:37;;21781:3;21778:1;21774:11;21768:4;21765:21;21757:29;;21497:295;;;;:::o;21797:1403::-;21921:44;21961:3;21956;21921:44;:::i;:::-;22030:18;22022:6;22019:30;22016:56;;;22052:18;;:::i;:::-;22016:56;22096:38;22128:4;22122:11;22096:38;:::i;:::-;22181:67;22241:6;22233;22227:4;22181:67;:::i;:::-;22275:1;22304:2;22296:6;22293:14;22321:1;22316:632;;;;22992:1;23009:6;23006:84;;;23065:9;23060:3;23056:19;23043:33;23034:42;;23006:84;23116:67;23176:6;23169:5;23116:67;:::i;:::-;23110:4;23103:81;22965:229;22286:908;;22316:632;22368:4;22364:9;22356:6;22352:22;22402:37;22434:4;22402:37;:::i;:::-;22461:1;22475:215;22489:7;22486:1;22483:14;22475:215;;;22575:9;22570:3;22566:19;22553:33;22545:6;22538:49;22626:1;22618:6;22614:14;22604:24;;22673:2;22662:9;22658:18;22645:31;;22512:4;22509:1;22505:12;22500:17;;22475:215;;;22718:6;22709:7;22706:19;22703:186;;;22783:9;22778:3;22774:19;22761:33;22826:48;22868:4;22860:6;22856:17;22845:9;22826:48;:::i;:::-;22818:6;22811:64;22726:163;22703:186;22935:1;22931;22923:6;22919:14;22915:22;22909:4;22902:36;22323:625;;;22286:908;;21896:1304;;;21797:1403;;;:::o;23206:180::-;23254:77;23251:1;23244:88;23351:4;23348:1;23341:15;23375:4;23372:1;23365:15;23392:180;23440:77;23437:1;23430:88;23537:4;23534:1;23527:15;23561:4;23558:1;23551:15;23578:233;23617:3;23640:24;23658:5;23640:24;:::i;:::-;23631:33;;23686:66;23679:5;23676:77;23673:103;;23756:18;;:::i;:::-;23673:103;23803:1;23796:5;23792:13;23785:20;;23578:233;;;:::o;23817:191::-;23857:3;23876:20;23894:1;23876:20;:::i;:::-;23871:25;;23910:20;23928:1;23910:20;:::i;:::-;23905:25;;23953:1;23950;23946:9;23939:16;;23974:3;23971:1;23968:10;23965:36;;;23981:18;;:::i;:::-;23965:36;23817:191;;;;:::o;24014:182::-;24154:34;24150:1;24142:6;24138:14;24131:58;24014:182;:::o;24202:366::-;24344:3;24365:67;24429:2;24424:3;24365:67;:::i;:::-;24358:74;;24441:93;24530:3;24441:93;:::i;:::-;24559:2;24554:3;24550:12;24543:19;;24202:366;;;:::o;24574:419::-;24740:4;24778:2;24767:9;24763:18;24755:26;;24827:9;24821:4;24817:20;24813:1;24802:9;24798:17;24791:47;24855:131;24981:4;24855:131;:::i;:::-;24847:139;;24574:419;;;:::o;24999:174::-;25139:26;25135:1;25127:6;25123:14;25116:50;24999:174;:::o;25179:366::-;25321:3;25342:67;25406:2;25401:3;25342:67;:::i;:::-;25335:74;;25418:93;25507:3;25418:93;:::i;:::-;25536:2;25531:3;25527:12;25520:19;;25179:366;;;:::o;25551:419::-;25717:4;25755:2;25744:9;25740:18;25732:26;;25804:9;25798:4;25794:20;25790:1;25779:9;25775:17;25768:47;25832:131;25958:4;25832:131;:::i;:::-;25824:139;;25551:419;;;:::o;25976:174::-;26116:26;26112:1;26104:6;26100:14;26093:50;25976:174;:::o;26156:366::-;26298:3;26319:67;26383:2;26378:3;26319:67;:::i;:::-;26312:74;;26395:93;26484:3;26395:93;:::i;:::-;26513:2;26508:3;26504:12;26497:19;;26156:366;;;:::o;26528:419::-;26694:4;26732:2;26721:9;26717:18;26709:26;;26781:9;26775:4;26771:20;26767:1;26756:9;26752:17;26745:47;26809:131;26935:4;26809:131;:::i;:::-;26801:139;;26528:419;;;:::o;26953:227::-;27093:34;27089:1;27081:6;27077:14;27070:58;27162:10;27157:2;27149:6;27145:15;27138:35;26953:227;:::o;27186:366::-;27328:3;27349:67;27413:2;27408:3;27349:67;:::i;:::-;27342:74;;27425:93;27514:3;27425:93;:::i;:::-;27543:2;27538:3;27534:12;27527:19;;27186:366;;;:::o;27558:419::-;27724:4;27762:2;27751:9;27747:18;27739:26;;27811:9;27805:4;27801:20;27797:1;27786:9;27782:17;27775:47;27839:131;27965:4;27839:131;:::i;:::-;27831:139;;27558:419;;;:::o;27983:410::-;28023:7;28046:20;28064:1;28046:20;:::i;:::-;28041:25;;28080:20;28098:1;28080:20;:::i;:::-;28075:25;;28135:1;28132;28128:9;28157:30;28175:11;28157:30;:::i;:::-;28146:41;;28336:1;28327:7;28323:15;28320:1;28317:22;28297:1;28290:9;28270:83;28247:139;;28366:18;;:::i;:::-;28247:139;28031:362;27983:410;;;;:::o;28399:179::-;28539:31;28535:1;28527:6;28523:14;28516:55;28399:179;:::o;28584:366::-;28726:3;28747:67;28811:2;28806:3;28747:67;:::i;:::-;28740:74;;28823:93;28912:3;28823:93;:::i;:::-;28941:2;28936:3;28932:12;28925:19;;28584:366;;;:::o;28956:419::-;29122:4;29160:2;29149:9;29145:18;29137:26;;29209:9;29203:4;29199:20;29195:1;29184:9;29180:17;29173:47;29237:131;29363:4;29237:131;:::i;:::-;29229:139;;28956:419;;;:::o;29381:234::-;29521:34;29517:1;29509:6;29505:14;29498:58;29590:17;29585:2;29577:6;29573:15;29566:42;29381:234;:::o;29621:366::-;29763:3;29784:67;29848:2;29843:3;29784:67;:::i;:::-;29777:74;;29860:93;29949:3;29860:93;:::i;:::-;29978:2;29973:3;29969:12;29962:19;;29621:366;;;:::o;29993:419::-;30159:4;30197:2;30186:9;30182:18;30174:26;;30246:9;30240:4;30236:20;30232:1;30221:9;30217:17;30210:47;30274:131;30400:4;30274:131;:::i;:::-;30266:139;;29993:419;;;:::o;30418:148::-;30520:11;30557:3;30542:18;;30418:148;;;;:::o;30572:390::-;30678:3;30706:39;30739:5;30706:39;:::i;:::-;30761:89;30843:6;30838:3;30761:89;:::i;:::-;30754:96;;30859:65;30917:6;30912:3;30905:4;30898:5;30894:16;30859:65;:::i;:::-;30949:6;30944:3;30940:16;30933:23;;30682:280;30572:390;;;;:::o;30968:435::-;31148:3;31170:95;31261:3;31252:6;31170:95;:::i;:::-;31163:102;;31282:95;31373:3;31364:6;31282:95;:::i;:::-;31275:102;;31394:3;31387:10;;30968:435;;;;;:::o;31409:225::-;31549:34;31545:1;31537:6;31533:14;31526:58;31618:8;31613:2;31605:6;31601:15;31594:33;31409:225;:::o;31640:366::-;31782:3;31803:67;31867:2;31862:3;31803:67;:::i;:::-;31796:74;;31879:93;31968:3;31879:93;:::i;:::-;31997:2;31992:3;31988:12;31981:19;;31640:366;;;:::o;32012:419::-;32178:4;32216:2;32205:9;32201:18;32193:26;;32265:9;32259:4;32255:20;32251:1;32240:9;32236:17;32229:47;32293:131;32419:4;32293:131;:::i;:::-;32285:139;;32012:419;;;:::o;32437:171::-;32476:3;32499:24;32517:5;32499:24;:::i;:::-;32490:33;;32545:4;32538:5;32535:15;32532:41;;32553:18;;:::i;:::-;32532:41;32600:1;32593:5;32589:13;32582:20;;32437:171;;;:::o;32614:332::-;32735:4;32773:2;32762:9;32758:18;32750:26;;32786:71;32854:1;32843:9;32839:17;32830:6;32786:71;:::i;:::-;32867:72;32935:2;32924:9;32920:18;32911:6;32867:72;:::i;:::-;32614:332;;;;;:::o;32952:137::-;33006:5;33037:6;33031:13;33022:22;;33053:30;33077:5;33053:30;:::i;:::-;32952:137;;;;:::o;33095:345::-;33162:6;33211:2;33199:9;33190:7;33186:23;33182:32;33179:119;;;33217:79;;:::i;:::-;33179:119;33337:1;33362:61;33415:7;33406:6;33395:9;33391:22;33362:61;:::i;:::-;33352:71;;33308:125;33095:345;;;;:::o;33446:180::-;33494:77;33491:1;33484:88;33591:4;33588:1;33581:15;33615:4;33612:1;33605:15;33632:185;33672:1;33689:20;33707:1;33689:20;:::i;:::-;33684:25;;33723:20;33741:1;33723:20;:::i;:::-;33718:25;;33762:1;33752:35;;33767:18;;:::i;:::-;33752:35;33809:1;33806;33802:9;33797:14;;33632:185;;;;:::o;33823:194::-;33863:4;33883:20;33901:1;33883:20;:::i;:::-;33878:25;;33917:20;33935:1;33917:20;:::i;:::-;33912:25;;33961:1;33958;33954:9;33946:17;;33985:1;33979:4;33976:11;33973:37;;;33990:18;;:::i;:::-;33973:37;33823:194;;;;:::o;34023:176::-;34055:1;34072:20;34090:1;34072:20;:::i;:::-;34067:25;;34106:20;34124:1;34106:20;:::i;:::-;34101:25;;34145:1;34135:35;;34150:18;;:::i;:::-;34135:35;34191:1;34188;34184:9;34179:14;;34023:176;;;;:::o;34205:98::-;34256:6;34290:5;34284:12;34274:22;;34205:98;;;:::o;34309:168::-;34392:11;34426:6;34421:3;34414:19;34466:4;34461:3;34457:14;34442:29;;34309:168;;;;:::o;34483:373::-;34569:3;34597:38;34629:5;34597:38;:::i;:::-;34651:70;34714:6;34709:3;34651:70;:::i;:::-;34644:77;;34730:65;34788:6;34783:3;34776:4;34769:5;34765:16;34730:65;:::i;:::-;34820:29;34842:6;34820:29;:::i;:::-;34815:3;34811:39;34804:46;;34573:283;34483:373;;;;:::o;34862:640::-;35057:4;35095:3;35084:9;35080:19;35072:27;;35109:71;35177:1;35166:9;35162:17;35153:6;35109:71;:::i;:::-;35190:72;35258:2;35247:9;35243:18;35234:6;35190:72;:::i;:::-;35272;35340:2;35329:9;35325:18;35316:6;35272:72;:::i;:::-;35391:9;35385:4;35381:20;35376:2;35365:9;35361:18;35354:48;35419:76;35490:4;35481:6;35419:76;:::i;:::-;35411:84;;34862:640;;;;;;;:::o;35508:141::-;35564:5;35595:6;35589:13;35580:22;;35611:32;35637:5;35611:32;:::i;:::-;35508:141;;;;:::o;35655:349::-;35724:6;35773:2;35761:9;35752:7;35748:23;35744:32;35741:119;;;35779:79;;:::i;:::-;35741:119;35899:1;35924:63;35979:7;35970:6;35959:9;35955:22;35924:63;:::i;:::-;35914:73;;35870:127;35655:349;;;;:::o

Swarm Source

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