ETH Price: $3,895.48 (-0.64%)

Token

Sukipets (Suki)
 

Overview

Max Total Supply

487 Suki

Holders

56

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
loveangel.eth
Balance
7 Suki
0xd547226aac3878ab4b4c6f7063af810d439b0c3d
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Sukipets

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

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

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

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

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

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

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

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

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

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

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

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

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

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

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

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

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

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

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

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

// File: suki-pets.sol

//SPDX-License-Identifier: MIT  
pragma solidity ^0.8.11;  



  
contract Sukipets is ERC721A, Ownable{  
    using Strings for uint;

    mapping(address=>uint256) public maxCanMint;
    mapping(address=>uint256) public numberMinted;
    string private _baseURIextended = "ipfs://QmU4G6otJ7FYasnykeqsDGeLhWSvvuUPHmdfJ4DsygcaX6/";
    string private beforeRevealUri = "ipfs://Qmbmt585oeuuzVRfUAq52KZs2RQQsBrzQqFkmCDBisYFCV";
    bool revealed = false;
    bool paused = true;

    constructor() ERC721A("Sukipets", "Suki") {
        maxCanMint[0xCDB3C2C1C0f4f8AB403bDF4C396F5A9e4B4F2DBa] = 125;
        maxCanMint[0x858F7b8Afe8bAC89b527C35C31259013AEce9e89] = 100;
        maxCanMint[0xE72EB31b59F85b19499A0F3b3260011894FA0d65] = 90;
        maxCanMint[0x5511cE8264Dff56eDBC0DC1714f0e5Be0DAE635F] = 79;
        maxCanMint[0x9059B7c20390161aF7A8fD2aAc21f1b9ac7b22BE] = 77;
        maxCanMint[0x48F51Ef910aa37E5e1Ba417d285fd09C60cE477E] = 74;
        maxCanMint[0xf5B9Deb10215a6F6D268EFCA2509E5Be7a25De2B] = 74;
        maxCanMint[0x74aC45c146bcAA47A227C87a32860eb8aC3e57C4] = 66;
        maxCanMint[0x57524EfC73e194e4F19DC1606FB7a3E1Dbf719B3] = 66;
        maxCanMint[0xB5696E4057B9BA76616cEcB5A537eAcA7B3CDf54] = 54;
        maxCanMint[0x3685f876710d70c47AEBFe558e92f71745a0A868] = 51;
        maxCanMint[0xbd2F02451E6B79556E4E3ef43a7F386BBDBba920] = 50;
        maxCanMint[0xdc2D12cDEFe1b3B9060692a5d47015d219286077] = 50;
        maxCanMint[0xbAaBA861464F25f52c2eE10CC3AC024F4f77812a] = 48;
        maxCanMint[0xbC05cC5C18a71EB09d46ba76f58B368223eFfB87] = 46;
        maxCanMint[0x4a9C0C0C98Aa321a5A2f225aaB93D56b064fF65f] = 44;
        maxCanMint[0xF2c06f90FB58844C09220e01E3116A2293Df6960] = 43;
        maxCanMint[0x89f42ccb1B90103A4b886Cc8ee01979492808079] = 43;
        maxCanMint[0x6AD244466777fB941917deAb621e922B1fEAdD85] = 42;
        maxCanMint[0x46e449a3f88D0E35b4520bC36e8DFDA195c896B0] = 40;
        maxCanMint[0x803ba0999D81111cfbCe278Dc6473F3B5EBB0b33] = 40;
        maxCanMint[0x50F27CdB650879A41fb07038bF2B818845c20e17] = 40;
        maxCanMint[0xA05aFa2FEc1CbF8d81b087Ab869C3E18d31B91F5] = 37;
        maxCanMint[0x644c38c61499E5856d42c975c048E4DC298957f9] = 36;
        maxCanMint[0xA5f09C6f40Aa9b8f7AD70d64c42e20df1aD1F0F4] = 35;
        maxCanMint[0xf03b5F229A14B53094D9566642Fb5e2e7273586d] = 35;
        maxCanMint[0xd5B6513eF79398924A444E0e60679Ae7B24A8850] = 35;
        maxCanMint[0xF8F3c1dbc6575874B2C0BcaeA553b05d2600cFe6] = 34;
        maxCanMint[0x80e52d1211c635F25dD9A43d2F04eB9e5d722209] = 32;
        maxCanMint[0x56879cc88fa3895C082C22035dB1386DcAc53bba] = 31;
        maxCanMint[0x683C3ac15e4E024E1509505B9a8F3f7B1A1cFf1e] = 30;
        maxCanMint[0xF24A733aA13f3a49069ccF86d52E7798aB4cc069] = 30;
        maxCanMint[0x9f68273597Bf21F3106972547af2F0b6B57542a7] = 29;
        maxCanMint[0x9fdAF0bD765561FBD609ea28Ea67A39054CB28bB] = 27;
        maxCanMint[0xA3C277b8f35881CBdb017E52bcC376B3ce8F21dA] = 27;
        maxCanMint[0x401CC1B6620e30ade449BB8f593a0d0799FbAC93] = 27;
        maxCanMint[0xd64e10DC8b85F21EA73E09a491d0D6782a476ebf] = 26;
        maxCanMint[0x64493b8a91B74dAC11254bee50E482F3090708E1] = 26;
        maxCanMint[0x126438c3A64DA4eF5a8dde07366270367310f855] = 26;
        maxCanMint[0x6299aED920679C4a680Fb53A0E63B8f878208878] = 25;
        maxCanMint[0xc7b438Bf83ad6f69BD8409bE5faF5C2dbde624e3] = 25;
        maxCanMint[0xDC9cF37de275199d863f7253eAa1063406282302] = 25;
        maxCanMint[0x6a167aBE38959433aaaA984B3d50761aC60ee875] = 25;
        maxCanMint[0xB6218ED3763b5f0e65AaC362259aDB0c73F33570] = 25;
        maxCanMint[0xEab7CD40143bDF4B1bF360E6717914Ca022b8ea6] = 24;
        maxCanMint[0xf2E9db3c5D06015833Df31eD3C37172a2B34EE7F] = 24;
        maxCanMint[0xC665A60F22dDa926B920DEB8FFAC0EF9D8a17460] = 23;
        maxCanMint[0x38bf30d3F1528BBD2BB8A242E9a0F4405affb8d0] = 22;
        maxCanMint[0x5Cb51D06d8da391Cc359ba996Bd10Ced0f7cf249] = 22;
        maxCanMint[0x772326885AB95f131031Ffb8560E4D97778A2488] = 22;
        maxCanMint[0xa750818e28ff0f8cd50182eEC34E316dF8fF792c] = 22;
        maxCanMint[0x17fBa501Df40e83605D01fBEF7f68174537E361A] = 22;
        maxCanMint[0xDF12161AfaF4367F130bBd7aEb50abFfCE612619] = 22;
        maxCanMint[0xDf71cb01E0eFaa639459Cf191f98463BE4B4a438] = 21;
        maxCanMint[0xdBfd836c989E1FE9586cB0D1BFB35E7849Be23a5] = 21;
        maxCanMint[0xf00bae4D8266000aA5C012baa693D8C12E4edF08] = 21;
        maxCanMint[0x2604fb7B2c561D6a277a0EC8c2308A26CEe18272] = 20;
        maxCanMint[0x0338CE5020c447f7e668DC2ef778025CE398266B] = 20;
        maxCanMint[0xEB3648865b1471996e5F65Ae845F9Eb9226B9a02] = 20;
        maxCanMint[0xa6134EB7381978804646088Df4BB42c5232D82Da] = 20;
        maxCanMint[0x7419aCdbC0F58E8bC449bc180736cD41153e2A4A] = 20;
        maxCanMint[0xe8B102C80969012f49cDdfeB834211517b33F0e2] = 19;
        maxCanMint[0xe0dC2949fdbe146acb64f32F814a9d6f49DD7e72] = 19;
        maxCanMint[0x9A58B8934Cb846431D6f7E8EdF91Eb0a1A31126a] = 19;
        maxCanMint[0x42F3f76Ba5202D7A4C48fD428B5613c657689BCC] = 18;
        maxCanMint[0x0846931641992A70d393771b5D9A1AB8ad5b2F28] = 18;
        maxCanMint[0x3546BD99767246C358ff1497f1580C8365b25AC8] = 18;
        maxCanMint[0x754C807eb8F31B277814976f08245D5052cBEADd] = 18;
        maxCanMint[0x1D88ED266B159e02504f5ACA17755B0394E375DD] = 17;
        maxCanMint[0xE19153EC0Dd84f092a1E81Ff7DA27F7d014E7EcF] = 17;
        maxCanMint[0x1565e23aBE9C15C714B662B77C87ED9a61ee19D2] = 17;
        maxCanMint[0x202AC9a140c49fffc51AcD4c65272A339fb9Ef02] = 17;
        maxCanMint[0x00D29fBc981d05edBA69BC0909E391a132271357] = 17;
        maxCanMint[0x6b4331048c411795a89D54484E3653107D58a64E] = 17;
        maxCanMint[0xAe73A7a38C6c04E2cC9EC3c416F48185ecD26F7B] = 17;
        maxCanMint[0x8b338b8380755D416d892a0d7793BEf75f6105ea] = 16;
        maxCanMint[0x97DD415191b68B589d47271D2ab1bc389Db33Aa0] = 16;
        maxCanMint[0x5AB5844Dd55Ab73212D1527e4CF72FEA884e39DD] = 16;
        maxCanMint[0x2218cd12c0402e3fd3693148DE476B299f658675] = 16;
        maxCanMint[0x49b9cA9214559E8819fa7889BB2AdC28330d5133] = 16;
        maxCanMint[0x6cef15E37392F13d0873dc18497CA8087C681e01] = 15;
        maxCanMint[0x7Ed716a3c0a634fa033CAD0e53BC5fDBc838e23B] = 15;
        maxCanMint[0x87ffC50E4E55dF07dD4437bE29931CBd9e2AA345] = 15;
        maxCanMint[0x92b7a519317acA2895455A179E5742Ec2BE06a48] = 15;
        maxCanMint[0x59e2337D163A7E7694f868b6e503400119E11e54] = 15;
        maxCanMint[0xD13397383D0B65531F4B1F545e20CBA18f063Ee3] = 15;
        maxCanMint[0x8dF99c988C718DC83D1AeF1bF60f21B00046b7dB] = 15;
        maxCanMint[0x9c07606F19575780a208402731Bc7C8169D7ad50] = 14;
        maxCanMint[0xE37fcAA787701C471c7841b0651060a7441a5d04] = 14;
        maxCanMint[0xc2B330e15b59ADC48097d6345cfd1b7444741664] = 14;
        maxCanMint[0xC383ed33ae4DEc3181806db17eFC22C5CF853f02] = 14;
        maxCanMint[0xc4DaD120712A92117Cc65D46514BE8B49ED846a1] = 14;
        maxCanMint[0xe68d37fC77aC92C709643783426D45E96e4e437a] = 14;
        maxCanMint[0x728B3DE78C3bD3e9c970524cA6aae1f8D6A61996] = 14;
        maxCanMint[0x12C012D2bF99dE146c6C7465b81647Abc56C9110] = 14;
        maxCanMint[0x121EE2b015888a6d0D4a925ea41C0CAf78C8D54a] = 13;
        maxCanMint[0x0e8CF84cb1eB4D7aE149014437b12c54f782c148] = 13;
        maxCanMint[0x4A4a10Bf794619c0b8361Be60EF60C8E50397796] = 12;
        maxCanMint[0xe4bBCbFf51e61D0D95FcC5016609aC8354B177C4] = 12;
        maxCanMint[0xb8454b3E34EabFaB14B1119cc657aE2CaAa12f06] = 12;
        maxCanMint[0xA99062EB6933A449C1C7F2adE4cc356E50a38C93] = 12;
        maxCanMint[0xf983557eC70fbf1A4B1e247AF7Bf10247E9B69c4] = 12;
        maxCanMint[0x1bAb11011E459C452edaFc962CB0113301535A3D] = 12;
        maxCanMint[0x777bef8D44c5EfE02F3C0a705EC3bff613C82a9C] = 12;
        maxCanMint[0xF0B1235f8BeEEe6b6DA7Fd065cc0E8Abc8b5c170] = 12;
        maxCanMint[0xf8B3b8432aB49Fe071F386f0917981994d7a164D] = 12;
        maxCanMint[0x2aA139151910B409896994A97Ce4aE9e9641b1E2] = 12;
        maxCanMint[0x77D0F704fC514d82c3a712D348Cf3889ab02307B] = 11;
        maxCanMint[0xD7272f37e384B594e885237aa29013cB49295e14] = 11;
        maxCanMint[0x4f7d8d1310ea5C238A98c525F080A6eDf6Ff8c6a] = 11;
        maxCanMint[0x1e8eBAA6D9BF90ca2800F97C95aFEDd6A64C91e2] = 11;
        maxCanMint[0x1c64a937Eb94C8dAAAa1F721B2208661e52657Cc] = 11;
        maxCanMint[0x22892d4D59b28C530d58932504B666388c125566] = 11;
        maxCanMint[0x3E4D97C22571C5Ff22f0DAaBDa2d3835E67738EB] = 11;
        maxCanMint[0x3abA81c64364dE5ed0bc8dCB78Ed1538C33B0FDF] = 11;
        maxCanMint[0x04028198E451f64212c33CA22cB3b1FbA6272459] = 11;
        maxCanMint[0x5FF840DB03FCb71e9AFe70CD5966610E21c2d634] = 11;
        maxCanMint[0x75331eBbE0B00b97cAb532384F13c9B479F074eC] = 11;
        maxCanMint[0x8AA7f50D61338d9c26601b0c8936b771c365D0E5] = 11;
        maxCanMint[0x50F808e2876c025A2322883EB084C58528cF930D] = 11;
        maxCanMint[0x2927a6Ba73aD0A156D5260F0f85bBbDe0625daaF] = 11;
        maxCanMint[0x0A9931aB317d8398e7316F7889f6CA39de328699] = 11;
        maxCanMint[0x5B97106fa5D8686a447B3bC6A98Fd0fbA35Dd314] = 11;
        maxCanMint[0x6AE73a69536bf213D70625312624b880A3f1efAF] = 11;
        maxCanMint[0x535fbDca6B64121e393cA0F90037C209269380bd] = 10;
        maxCanMint[0xf54611A627aFA7c00a58569932554372dD3F4b3B] = 10;
        maxCanMint[0xd555b5555855F08504F57AbFBC6410D26C995bEe] = 10;
        maxCanMint[0x16F5617073952DaAbC5Aad5A75000dd29B48Ca60] = 10;
        maxCanMint[0x19607BfF45627bE7979d154aF503122c6C3fd6e1] = 10;
        maxCanMint[0xD01235368C40a11D80dee1D7F809F2e00247a0Bc] = 10;
        maxCanMint[0x7ac2C842a100963C34E6D05e9ace9f3e367eD140] = 10;
        maxCanMint[0x71331f76038117f177446DFF68139Cd068b3d5cE] = 10;
        maxCanMint[0xc5F59709974262c4AFacc5386287820bDBC7eB3A] = 10;
        maxCanMint[0x273d140F7A2199d59603a6b03A08369a473C5E88] = 10;
        maxCanMint[0x43c7C3943A181774FD1791742EF6b42d671E30c3] = 10;
        maxCanMint[0xb71B13b85D2c094B0FDeC64ab891b5BF5f110a8e] = 10;
        maxCanMint[0xe916Ad4CE7A5558e84d2924D13Cee50299c02446] = 10;
        maxCanMint[0xaF62994A7a1E5C4A4B88Ca3550F0637afeC0877f] = 10;
        maxCanMint[0x0Ff1302cD9B14f71ACF639C484600a60Dd27Dd0F] = 10;
        maxCanMint[0x5FD2C02689d138547B7b1b9E7d9A309d5A03edCd] = 10;
        maxCanMint[0x0bc7815F29EdE74742d7377821506f705Cf0D809] = 10;
        maxCanMint[0x8bea67D814FFB834Dcd2Fe4b1b1f35C70bcda420] = 10;
        maxCanMint[0x5Eb67a3b141f3036899EE77822A41277166c540e] = 10;
        maxCanMint[0xdbCc6698d4686EE3fba49c2245072460594efE6E] = 10;
        maxCanMint[0x26D7B4fe67f4601643304b5023b3CAF3A72E8504] = 10;
        maxCanMint[0x2F1390eC03A03e57a1406BDef57c9cF487f62B78] = 9;
        maxCanMint[0x102A618b36C32b338C03526255DCF2A39eB1897f] = 9;
        maxCanMint[0x7056443b73BD19E5F20E1ABE733FaDd602A13BDD] = 9;
        maxCanMint[0xF7ABE060EA1E437383665ea6702e0C48722931F5] = 9;
        maxCanMint[0xd4Eaa41Ce286518E3fbC0f09fd613347fC4C6C20] = 9;
        maxCanMint[0x96f844BeED7d89d22c760f000066CE8f76b23301] = 9;
        maxCanMint[0x711281C1b26AaEd86E40e4cAaf76c1962B45E161] = 9;
        maxCanMint[0xC373a84E54efb5c64dd8ba4f3Aed914926137bfC] = 9;
        maxCanMint[0x58c32253E3633608bdd19BC6A062A90FB063AE77] = 9;
        maxCanMint[0x0D174e0AEde78eeACa12420493C27d8f68151D15] = 9;
        maxCanMint[0x12093977A68A38e0452f7ab6e6871479F01a975a] = 9;
        maxCanMint[0x758e83c114E36a28CA1f31C4d2ADB5Ec7c04C578] = 9;
        maxCanMint[0x766a6923A62d062fa6Da59f91d9b669A85bc7B15] = 9;
        maxCanMint[0xAF1CC56A81AE3Db157b73Db4dBCd20907DB5793f] = 9;
        maxCanMint[0xFd4848aCDC68b55C9352c59722EaC9292668f7cf] = 9;
        maxCanMint[0xD9b42f222263C31e57d90A77217759EE6701B204] = 9;
        maxCanMint[0xbF119e78c70BDc031C87993CCC3C8423f00D4B5d] = 8;
        maxCanMint[0xB5E14DCf2520d154606254094f32C8D32D509115] = 8;
        maxCanMint[0x5BE8f739C8Ea94D99b44ab0B1421889c8b99b2E1] = 8;
        maxCanMint[0x2Ec7b0b01d7c72a31F3834FE4f208C4D04d1CDAC] = 8;
        maxCanMint[0xD00d3f8Fe21226E74dB52419ff67Cd3FfC009078] = 8;
        maxCanMint[0xaC66ACa609591d6a4a97432EB2E838E533D3BB33] = 8;
        maxCanMint[0x7dD2C9f1CcE194AEc1dC6fA3548a8E6dAFc5F4B2] = 8;
        maxCanMint[0x2BDF1a698d39A4358e2C162dEacc038FAdb8A9d5] = 8;
        maxCanMint[0x71DF5D0FDB96883F9B47f0A433445bDf64609440] = 8;
        maxCanMint[0x4Ede472ac52fA969c502c6f4344A16a99196d9bC] = 8;
        maxCanMint[0xd6D7Ea4833f22edBED3DbD3d71Adf3cdD8E36a01] = 8;
        maxCanMint[0x091e2f9422A22a09E478455Fd59bE8CB6ee56463] = 8;
        maxCanMint[0xB99aF14667098ee10d4379c933e14d3d034a79Bc] = 8;
        maxCanMint[0xB3343E623d7a6860881ed9b178Ecb22796812396] = 8;
        maxCanMint[0xe10772c3c2e8879b13d5d2886eF8e9f9B95b83Aa] = 7;
        maxCanMint[0x34cC62A979B2F4A3D757a6527aD6835C6284B6B9] = 7;
        maxCanMint[0xd4Db6d8Ef756141DE0D838808Ddb8fFCd847D7ff] = 7;
        maxCanMint[0xFaA39BB9Ec02DA01292C957F486A38Df9bA7093f] = 7;
        maxCanMint[0xB4C6cA259B15E7Bcc3d3c5c7D364A2c4EfD42Cf0] = 7;
        maxCanMint[0x3BFA05f792851A693a7B95bAf6c1DC59C8fE42aC] = 7;
        maxCanMint[0x2b5bF359827D89A1aF72444241357cEE6EBAD2cf] = 7;
        maxCanMint[0x92e0049C4Cdd67512bdA9ba4dce55b554ACF44fF] = 7;
        maxCanMint[0x9C512f927E1eCDd8851Dc846da79e0668B5B58b3] = 7;
        maxCanMint[0xe5217a66F5D92F444593f53892f7dc9527f1731D] = 7;
        maxCanMint[0xf576DAE6F10ea36a4dFaDE275Aa576560E3b4b4A] = 7;
        maxCanMint[0xd547226AaC3878aB4b4C6f7063af810d439B0C3D] = 7;
        maxCanMint[0xB41738fDf7efEaA0b70Cf322916C6491746B785b] = 7;
        maxCanMint[0x3595A1508CB1180E8e7F50008Db1109F5293eFC5] = 7;
        maxCanMint[0x049043E57A8a9FC11d95f620aD2ef6c359F52BB6] = 7;
        maxCanMint[0x7B8c81492592357D57221299d4794751d619CA2A] = 7;
        maxCanMint[0xB58007c1990a0ae29f0D34543714BAf168149F82] = 7;
        maxCanMint[0x1D9cdcBC9C414FABD0d0b50f69d4385877Ac7279] = 7;
        maxCanMint[0xC8Ed3c2d1509FCf3A3C97c68De3DBa66381d337C] = 7;
        maxCanMint[0xd6F6E99c4905c6e8A751Bb0aFeEFA8Dcc56a30dC] = 7;
        maxCanMint[0xeA884574a7B1ce52D0Fdc2f4Ac4862183D3Feaf4] = 6;
        maxCanMint[0x77AF9774Afccc8feE8105f4ECD1f96ba9a878A40] = 6;
        maxCanMint[0xD335E1B1EDb5b92DF2D1C1112D1bE08f34d912bD] = 6;
        maxCanMint[0xD874f397202b032e2611cf999ff737Da419233E9] = 6;
        maxCanMint[0x9A0944626Acae8708265DbB2177CE89004d3A593] = 6;
        maxCanMint[0xc59292b1caf144F2877a88b120B4E71e48385569] = 6;
        maxCanMint[0xeCf14386BF1F271AEcb5407e777D41e8a16933b7] = 6;
        maxCanMint[0x0e447fb04462372D905fF8ffAe3A075eE7B2bDC6] = 6;
        maxCanMint[0x716BAE0a89A5635d9233B6E99e4a20c48959f5F9] = 6;
        maxCanMint[0xA522048F3084d25cDDb5b7BbA83374272322Eb61] = 6;
        maxCanMint[0xA98D2867de6b1dFf44Fe4b355DEa098E81d06aEb] = 6;
        maxCanMint[0x13d73e760833f68647Db4a94602F61895c0B5e92] = 6;
        maxCanMint[0xf29155745c8Ee222d4F7d6A2a7a50c1901F27de2] = 6;
        maxCanMint[0x650D62F4F149c0F8578bfDc5fDC04C4d0BE8B5cE] = 6;
        maxCanMint[0x920d838e76A6B5cB6355e8d8f2A9aC2655FdAAFf] = 6;
        maxCanMint[0xeb6Bc3940C9fe8D7A90BAeB168F64F2FeCD9A5cE] = 6;
        maxCanMint[0x847c1B4F34E93D2ae81B9D099c3E52F53d9aBEa2] = 6;
        maxCanMint[0x679AC673368119aC02daca310E8fC6A08E8ddf81] = 6;
        maxCanMint[0x518944Eb64B16A66A78ae5E6298cA8e321417fdC] = 6;
        maxCanMint[0xECC74B40a057eFf408bC9eb3fA90226EF69Df200] = 6;
        maxCanMint[0x8e2Ed01aF1a58cDe920204aBc5E27fC42c628646] = 6;
        maxCanMint[0x42Dca0244DCA7872B3096c91b98CaAB45e1aCFB6] = 6;
        maxCanMint[0x879253B5Cc2B13bb976e075F0571F85454A315f6] = 6;
        maxCanMint[0xc0B498FFed0B32Cb1458688c40f22342f82b8089] = 6;
        maxCanMint[0xE02A25580b96BE0B9986181Fd0b4CF2b9FD75Ec2] = 5;
        maxCanMint[0x7Cf3d9Ca9136F95C60c7428D5b23D18549c57DC4] = 5;
        maxCanMint[0x67e5cF1fD5e5e1944731800C789CA1B17af81873] = 5;
        maxCanMint[0x5804f53931f3E690459f3A4AA654B794EecF15CD] = 5;
        maxCanMint[0x6E83f03becEfaC2623564EE8F9983Ff76D67A556] = 5;
        maxCanMint[0x7155B42aE4Fe9D3db9fb0d8448759e5F87FfE6D9] = 5;
        maxCanMint[0x3EDEB829dDC8763B3C1e77223E71b7370FD1B8C2] = 5;
        maxCanMint[0x012E168ACb9fdc90a4ED9fd6cA2834D9bF5b579e] = 5;
        maxCanMint[0x2ED5ab4D78053B9cAe07fFD772c445265a280225] = 5;
        maxCanMint[0xC4ca31a2c3974EB1FDe8694529c65aDF654ce665] = 5;
        maxCanMint[0xAC32Ea503C5e3E03d7E079d7fba99A168Fd69B6B] = 5;
        maxCanMint[0xB219b6c4b4C4ccEfD7066871aB20486a283aC27e] = 5;
        maxCanMint[0xB61D414164Ed30F49Bd612Fd827D399aB39739D8] = 5;
        maxCanMint[0xb719C471a5A9228Ad9459D2caEc9eABC71c2B42B] = 5;
        maxCanMint[0x7C2f06ab61a94fe9760cC8d9ad35A33c0472CB8E] = 5;
        maxCanMint[0x247BCDaaeE715428a0a8b02B79a641C051F3A111] = 5;
        maxCanMint[0x255Be6D417D25d553414fb9608EF6303af9EB771] = 5;
        maxCanMint[0xb5FCF39eB16F0F4886753d2bfa6A74145a938c6C] = 5;
        maxCanMint[0xaa584127b91100DdE6b52228C28848A7B1D059c9] = 5;
        maxCanMint[0x34756D8400f2426851dc46D6ab38F0Df004CE1E7] = 5;
        maxCanMint[0x27DB134012676a0542c667c610920e269AFE89B9] = 5;
        maxCanMint[0x317AABc1A970390b88EA43147D1B104391e5Afb5] = 5;
        maxCanMint[0x1C7B647AddBf316a882cb84a2a099d99eFf8cf9e] = 5;
        maxCanMint[0x00110599200B90b8A7ea20e1d50d2d0c6bEB00e3] = 5;
        maxCanMint[0xc0Ff4140D577077554c5B2fFFA334896a47BD0B8] = 5;
        maxCanMint[0xE527CE94580057c75468E22f470ad6A31d93607E] = 5;
        maxCanMint[0x1CE9d62Ac3DD1b897d582cDa4075793ee8D0bfD3] = 5;
        maxCanMint[0x35F0899275E52406A6f5F0c8854347Ff334D02EA] = 5;
        maxCanMint[0xEc6FbB231D6d80DC18C9ae3BB64CfE0548eE7Ec6] = 5;
        maxCanMint[0xB349607b1eB483D7BAE309B3ddC1fAc2897dc37b] = 5;
        maxCanMint[0xCF4cA3Cf56923A1D70BB90a6EAeC3eeFe6E39ECC] = 5;
        maxCanMint[0x963Cad32ea383670F81a1e78806A8Cf727c31670] = 5;
        maxCanMint[0x9b173f8c1f1942de6fa0055A4e91d72c0d770826] = 5;
        maxCanMint[0xb3792F424f8A8c65B8fF8430ec6859fB1187c0c1] = 5;
        maxCanMint[0x5b17d1AEe4A5a9b0b86e6DD727955Bd56ff0AaB4] = 5;
        maxCanMint[0x73E4a2B60Cf48E8BaF2B777E175a5B1E4D0C2d8f] = 5;
        maxCanMint[0x989019429a17fe4d7b6593566f459e4C1AF90dbb] = 5;
        maxCanMint[0x7e345A2A7C6AB50eeBa694b4a5f98898ecA59bCC] = 5;
        maxCanMint[0x541dE0606257132E4cA0E34439FCB6675ce2857b] = 5;
        maxCanMint[0xFc1953FFBdc5F89b9231E8aF9D304eb011F09E1C] = 5;
        maxCanMint[0xC851c83E912e704D6C7d8b3863b506fFe56B0711] = 5;
        maxCanMint[0xdD15553673126d386f9E735d0cc56a96E59Cc095] = 4;
        maxCanMint[0xe1e2E153e785118Fa7b50e93e6b8cf887F025Bc7] = 4;
        maxCanMint[0x4dAdAFcad7131ED274bc99FC8EB916520a19dA3f] = 4;
        maxCanMint[0x002947f3aDD48ED81d3575Bc4e1E9F50744eF856] = 4;
        maxCanMint[0x0Dd70E248a98C9ceBF1431048f593Eb1CcA3EF43] = 4;
        maxCanMint[0x7F2466ae8bADee7Dc0109Edd0b6Dde08C432236c] = 4;
        maxCanMint[0x7d043B98F65d1F0eF30BDD15DA9149B869162e78] = 4;
        maxCanMint[0x66C4051052a318099a6aAdc65C32B9e0b6026B51] = 4;
        maxCanMint[0x6041f881358C71D64bc9253c9ba0391DF69F7d98] = 4;
        maxCanMint[0x61194c3494A607d30f1c272Fa5E95C14934D0c50] = 4;
        maxCanMint[0x34383A9f83C86Eceb3748fb89fd9be2805c8B02c] = 4;
        maxCanMint[0x013598ea3fd28608C23ebac199c5B4218e2adE3A] = 4;
        maxCanMint[0x23af11044229183E0181c0D47CD2151529C85998] = 4;
        maxCanMint[0x10662025145B7EAc2E41C4033828Ee044d0Ccf91] = 4;
        maxCanMint[0x209E86C762487978B7221DB46cBb7BcAC7088fC9] = 4;
        maxCanMint[0x35eC46646c5ae18d0A8ED57b67FD5bbBA4C5a9d4] = 4;
        maxCanMint[0x3c7Eab613cc0d396D464E9A8a36C39807d878F03] = 4;
        maxCanMint[0xD218d90B76a0bDc9A599f4C4F65FBA7a2140Baf8] = 4;
        maxCanMint[0xd210A01936a901c79254De8fC693f743E5757F8F] = 4;
        maxCanMint[0xDC6bCD40Bb59b65ee136437E52cf808F5614e03A] = 4;
        maxCanMint[0xc229d7D3dD662A1b107E29AA84bb0C8Ff609CF3A] = 4;
        maxCanMint[0xf87aB2a5e1a187169E9f2ce379196Ef0bdEfa726] = 4;
        maxCanMint[0x7BBC6F3CdCCFcf03CB062856E751b8950DAd812b] = 4;
        maxCanMint[0x6252F1aEeD803422cf152f1720c437389047Cf86] = 4;
        maxCanMint[0x369615Bc57975B06C418f42d3FDA3754A385B97b] = 4;
        maxCanMint[0x47Eeb072A8DAE3aB80b1E6123a44eCc80d2c49fF] = 4;
        maxCanMint[0xbf23B32f95694920c663c40416899e284aEa1284] = 4;
        maxCanMint[0x03f0e94Eb076174130D571FB46f5209eE7300Bc5] = 4;
        maxCanMint[0x4f764a08c66251e13bdd85B4Bb0652B739736328] = 4;
        maxCanMint[0x585020d9C6b56874B78979F29d84E082D34f0B2a] = 4;
        maxCanMint[0x6beEF2B2fE00FDDCa12A8CDA2D4B00435b0ba3b6] = 4;
        maxCanMint[0xBDe27a773b61863Ecae638647dA3489f1d6EA17E] = 4;
        maxCanMint[0xafD1e0562c91A933f4B40154045cEe71939E95eA] = 4;
        maxCanMint[0xB1Ec54030e383b9cE0cDAA988ba52364bFCe9c3C] = 4;
        maxCanMint[0xFcaE89f3319C760d4F481A522aa717AF81e93E77] = 4;
        maxCanMint[0xfF7efba11A8888d6974997d4a8940Bf83cd7a580] = 4;
        maxCanMint[0x247806e6de35d25E92803b67e8406EfFfAfE0804] = 4;
        maxCanMint[0x1Dbf0011d6094c7AFD594CF1699bb988302Cb77a] = 4;
        maxCanMint[0x04367Ecb39bB77ba7A61E31D91D7820324c3760E] = 4;
        maxCanMint[0x3204D904f61C3502050cAB4fDd241f0B6295cD8B] = 4;
        maxCanMint[0x25a940bC0cDF97B7A5ba9C76b6b048153f8EE247] = 4;
        maxCanMint[0x645C93A65946FF26331037a021c22851C8dA19Ac] = 4;
        maxCanMint[0x5C5bc3619FE3458E21887e1017Ba9EF6Ec5DeCE8] = 4;
        maxCanMint[0x689717c0B1Ab0f188235CfA487CeD32fEEbF9698] = 4;
        maxCanMint[0xaE416E324029AcB10367349234c13EDf44b0ddFD] = 4;
        maxCanMint[0x2cae0Ac9a7A7048516868AAd672C49AB632B38c8] = 4;
        maxCanMint[0x63F0a3660170A5c9cd4CA7b28B82f0011FFB37C4] = 4;
        maxCanMint[0xb6721C54Fc4BfC7bFA197CFFAbA58D6a70EA2F4B] = 4;
        maxCanMint[0xa719Fd2A38984d40902933Eb0290251787c37110] = 4;
        maxCanMint[0x2421eC23Ac1eE9141E431b2D6Cf3f7de6208D51a] = 4;
        maxCanMint[0x06fD7f49CA5bC7929A92B1C7B4639f049b413820] = 4;
        maxCanMint[0x131CFa6b38a8022A0d569bCe6247EEbc7DD6a65E] = 4;
        maxCanMint[0x89681c69de56e5867EB1cB0b444DF5690297a242] = 4;
        maxCanMint[0x568D19F28D550127577f3C371fC22A5514054968] = 4;
        maxCanMint[0x316808F098BF728570edB18e894A2e27c92F945F] = 4;
        maxCanMint[0x377e3fe216220c77FaE3fe2ec016b19c89253260] = 4;
        maxCanMint[0x3912d7eA8140e16dAc355892653F3512C3cf3749] = 4;
        maxCanMint[0x39317B24ca5bf020a6df2C332aD683A8A434c81A] = 4;
        maxCanMint[0xBCef707cc941c5F8D253fFc9899E7dc7cABE913C] = 4;
        maxCanMint[0xB8639881C532Cb9457F5b068E9CCfA3771399EFF] = 4;
        maxCanMint[0x996dE8e846D8BAe8751bB90e86a143C7a086e6D5] = 4;
        maxCanMint[0xE8A849B299aDED97C21bE9f93c20fa39783172b7] = 4;
        maxCanMint[0xee06Bd8B2A7630363BBB8AC4B90Bb3E7d2652a34] = 4;
        maxCanMint[0x93a692FE5477902C3cf5F6997c1cf59a3712cED4] = 3;
        maxCanMint[0xA5b17eF8bFbB9A1E9C55A5C21C52F50a9d9fEe6a] = 3;
        maxCanMint[0xA7D7Ac8Fe7e8693B5599C69cC7d4F6226677845B] = 3;
        maxCanMint[0xa8153eA1DcE111099C19C123DDC0E698D003FC47] = 3;
        maxCanMint[0xB98DffE8F3c069dC265Bd18A0ae9f6A7F6F678Ab] = 3;
        maxCanMint[0xC1E549320f048D8149d5B0cB9Cb268dA59f1F2aD] = 3;
        maxCanMint[0xCba19876EE8225CC54A1b5B3DcC660b40d2dcd66] = 3;
        maxCanMint[0xCCD97de4446ac858F1E772C4b98D9fC920A5Cc2c] = 3;
        maxCanMint[0xd10F2fCF380Cd0fE6628Ed0842e4Cc8a1F168117] = 3;
        maxCanMint[0x30B507aAA56EdEa94d9Bf08dc3A1885DB5E093aF] = 3;
        maxCanMint[0x28Dca5fF7Ac78BAB442C04Bc8fBbF9c768B125c9] = 3;
        maxCanMint[0x358EfDff791021c8a343FDf373872041229c27C1] = 3;
        maxCanMint[0x6EEf09B526d883F98762a7005FABD2c800DfCA44] = 3;
        maxCanMint[0x71D319eF3eE40b24E22f87898b9D261b77A423Bc] = 3;
        maxCanMint[0x87FCFE1B0EAE956b4c0A23E627D6FC9443C3B111] = 3;
        maxCanMint[0x8B40b81f83FEc3dd68A0dE41bE39BE2d5A52C04d] = 3;
        maxCanMint[0x8E05bD9fA3059eC69C15bc1a6F4D94f0Ac26ce00] = 3;
        maxCanMint[0x5Bca4075dFC8065235cF75C6b15B410e62845Fec] = 3;
        maxCanMint[0x58BDAacE5EA0Fa11f0Fb1c3cAEA5E3ceB1218dE5] = 3;
        maxCanMint[0x6d8431dFB4742157c660cE1070AF507aAFCF5A9B] = 3;
        maxCanMint[0x137d9174D3bd00F2153DcC0Fe7AF712d3876a71E] = 3;
        maxCanMint[0x1de2980970f80A2A957E6FBD7362F9EE7Dad2f9F] = 3;
        maxCanMint[0x3d223432095B6634d1779d43be9e6e0716124449] = 3;
        maxCanMint[0x477e0d5C6323fE7106E9fa39a5089baEcf5b0a93] = 3;
        maxCanMint[0xEEDA4E9a5Ca757e3a2dd9aB5d91E99C4a1FF0423] = 3;
        maxCanMint[0xB4E70352F1571a2CEED9cec00283b55cF52bD909] = 3;
        maxCanMint[0xaFbc3F98EEDB5f9A25a4AB2232d1346612efE77C] = 3;
        maxCanMint[0x9308c261Dc19178a8b81C07b80CaaDe0fF057f6e] = 3;
        maxCanMint[0x658da7a6d1e87E40846A3028E91dd615d1f39ef7] = 3;
        maxCanMint[0x56543717d994D09D5862AB9c6f99bCe964AE664a] = 3;
        maxCanMint[0x5bee4dF518Fe0F7606A2bA6336da33f7fD1E9273] = 3;
        maxCanMint[0x4ae8f6a32b956D3C1d18252c976aD4FB140f7A69] = 3;
        maxCanMint[0x8909DF3271e675cF648764Cd268c6C247334C884] = 3;
        maxCanMint[0x3B3Fc1f418Bef741a954403e5c6cCe50df4349E9] = 3;
        maxCanMint[0x8DBB0c0886D8a1c0C058094c7f9B83214584f93b] = 3;
        maxCanMint[0xA57876de5E9a0C58751b51f704cF2dB517788a6d] = 3;
        maxCanMint[0x96A38D33aB85ee3ea487de6d378D68C17CCe8989] = 3;
        maxCanMint[0x96F0239435B909D012D88fc8Cb4471786384bf67] = 3;
        maxCanMint[0x97A7F66Cc4f800dfB282d2eb0CD073b1E7B4aaa0] = 3;
        maxCanMint[0xA433d9C5915F197B3E24d42028b8C61345315C4e] = 3;
        maxCanMint[0xdA6787e118D0EeA60279eE36c4eec1ae3eeaCBe6] = 3;
        maxCanMint[0xbAABe3388e299336294a447bA56Ab880948A86F5] = 3;
        maxCanMint[0xee8a9d3A7D2aeF744262A895f8e2A6F74a91CEcc] = 3;
        maxCanMint[0x5E69D2Ed4Ea69d60E44Ff6AD676CF86841862c03] = 3;
        maxCanMint[0x6628B486a3E25772A8748e8fc8DebD0cc7564Ae3] = 3;
        maxCanMint[0x324A2EF0781bd84e4a367f142C324C16aC8914da] = 3;
        maxCanMint[0x2A03BE1ce58d21A2eCB3B3bc143b98057622ABE0] = 3;
        maxCanMint[0x46F655abF896301b72eb27B76F5e063899b9067C] = 3;
        maxCanMint[0x01A27d462cD43D86e8123f47CdFE6228DaD6D845] = 3;
        maxCanMint[0xb597B202294Dd5a4A616FCc2F178588BFc6D2c16] = 3;
        maxCanMint[0xA80974441DB857456F3205b9f1ca17436Fb7128F] = 3;
        maxCanMint[0xd52EBce9adc24A47ECbfBeABC8eF042590411C73] = 3;
        maxCanMint[0xDAE6cA75bB2aFD213E5887513D8b1789122EaAea] = 3;
        maxCanMint[0x7695Ea5De20f829Eb3161B6D5299D94Cb68F0E11] = 3;
        maxCanMint[0x8988609E3cd4bf52a0469a68DeBD21A53C1e027e] = 3;
        maxCanMint[0x8CC544C72Eec90Aa78f1ccD97258b435E4cd4c9D] = 3;
        maxCanMint[0x61aCd9FB7faE3C8026B868cbD4E00c2bD22908b4] = 3;
        maxCanMint[0x10E28f6c91184d75FD2773dCD00959cB6C08AB31] = 3;
        maxCanMint[0x3635B3d38B971ED37b17E6E1Ac685Af87bc8d930] = 3;
        maxCanMint[0x382Cc2a8c06364b0b14f8ce8904e7A358F830B9F] = 3;
        maxCanMint[0xc6eeA54B97f5754501Ca4f07fd5AB5482Ca3247A] = 3;
        maxCanMint[0xA06e3ecA46df7e71238ebD04fA627BFFC7d3EbDe] = 3;
        maxCanMint[0xA16E2A2A5Fd19F6C6347F3a5A7ac0187d6da2348] = 3;
        maxCanMint[0xd78fbdC173966E19031e8ce8358979cC0eE402Da] = 3;
        maxCanMint[0xE72eEEe16e51ccbEc900C7e1064120c75eFB88fE] = 3;
        maxCanMint[0x4D30A57E2B1Ed93baC382a3D89d28C95E8937B77] = 3;
        maxCanMint[0x39A2634D55C6dad47d8431E9DB0fcF70058dFEa2] = 3;
        maxCanMint[0x42Db77c4eE2260DDF31ecc9670Ed38bc8D61A811] = 3;
        maxCanMint[0x43cF525d63987D17052d9891587BCfB9592c3eE2] = 3;
        maxCanMint[0x456c8f06e6Dd3FCe8C8896F30535033a3F1Df35c] = 3;
        maxCanMint[0x133FC918b3A27fA314c45a08eC7EB794EF0283FC] = 3;
        maxCanMint[0x578b076f33C021ca8EC8873BE00c734559A99057] = 3;
        maxCanMint[0x70b1bCB7244fEDCaEa2C36dc939dA3a6f86aF793] = 3;
        maxCanMint[0x85A144Ceb815Aa88C7d770599AEF329B0d217148] = 3;
        maxCanMint[0xac18BAD4072a8dd2F5F6ac3dcA06d0f4BEC43e6B] = 3;
        maxCanMint[0xaEDa87F3F3d68337Ed3cf32D98DBbc94c380eBBC] = 3;
        maxCanMint[0xc1692cD69493436b01cddcbE5FeDbC911746A7C1] = 3;
        maxCanMint[0xbD3E3caEE39ED59A119cFe7360747Ca02C77D22D] = 3;
        maxCanMint[0xC708C777D0Eb401F50dC2Cbf8c2ACc4B0B2817a7] = 3;
        maxCanMint[0xe6354edB3D71A675210eAf9e007f37b82A04DDf6] = 3;
        maxCanMint[0xD89B835e9064D5f623F720bA368232D3C0a42886] = 3;
        maxCanMint[0xc27FD9D5113dE19EA89D0265Be9FD93F35f052c8] = 3;
        maxCanMint[0xa86Fd35dbB69502075CA2E265E534147999D265d] = 3;
        maxCanMint[0xb0002A56ce9Ca0881887DDA33c5EB3e18Ed4bb84] = 3;
        maxCanMint[0x96eCa8bCCdA5092898B7E664a45cDfC099F3BD3a] = 3;
        maxCanMint[0x93b3FAF1cfFF1C75c5456010287e30e6B00b57fE] = 3;
        maxCanMint[0x9078F31071946b1fBf8004bd86faeECbdA018fe6] = 3;
        maxCanMint[0x007c2249F1E2905106B555E28e3F6198cCE75EC6] = 3;
        maxCanMint[0x134F240827Dd4B047942589998a163A2A1002F1a] = 3;
        maxCanMint[0x433e23480F440Ef14f37c2b134133F3556C09e87] = 3;
        maxCanMint[0x57d4B4BA387f815467029851D9f1F751cedEec1A] = 3;
        maxCanMint[0x6acD98b7f9D818699ACEb70f5E87fe148CCbb988] = 3;
        maxCanMint[0x73e5f3c6Eb53C1Af075A4856449D5dcA59ABA999] = 3;
        maxCanMint[0x5e1127BE6dab460330E97E0DbB4912aCcf6Ea178] = 3;
        maxCanMint[0x5E3CDeF0c80dc57196243B693e971242513Ff6Cc] = 3;
        maxCanMint[0x6e3f8E093Fe749398aac60515686fC4FC4baC514] = 3;
        maxCanMint[0x79296381BD8690482376fe355E0F68dCa8BB6B4e] = 3;
        maxCanMint[0xA3B75D9023Bf8f78E674C7151091BD2eBe4c747C] = 3;
        maxCanMint[0x1057B6adB95680C811c256A393F5C523d94fd6a6] = 3;
        maxCanMint[0x14C9709c1a7615DaE2011e3F9a768b6B5f121fA7] = 3;
        maxCanMint[0x0D297417E7Db958CFBdc9c2c852Abe2F1f54E5eb] = 3;
        maxCanMint[0x419CD705b540eC01dAF54f10C98c3a643583D700] = 3;
        maxCanMint[0x448E9EdC342A54Ce9dbb6361c2A7cCa4dE7Cb9F7] = 3;
        maxCanMint[0xE0e76a34C17635ebFF5D80B1e387Fcdd4EEab863] = 3;
        maxCanMint[0xb699Dd31905Aad5d38718389367F28830CFFB330] = 3;
        maxCanMint[0xC1923cAe3b5ff75c87A1CEfA8E80e2985E1232A8] = 2;
        maxCanMint[0xCbaeEb4aD27791953368d3B2f6e24c4301dD366d] = 2;
        maxCanMint[0xdbEFee517025559E7898d3a48f18221C32D3Fcf5] = 2;
        maxCanMint[0xfB843f8c4992EfDb6b42349C35f025ca55742D33] = 2;
        maxCanMint[0x44d29dCDe217aD801a9a49C95976520a7547BE1B] = 2;
        maxCanMint[0x226F3Cad6Ca7998CcdC65CcF95B23Df250E4Cc86] = 2;
        maxCanMint[0x39F8f85134E2743fe7357E14Bd3f5307c250923D] = 2;
        maxCanMint[0x3a9e5E90B35C13F271b4FC1DBdf3BecF7b37Ec69] = 2;
        maxCanMint[0x568b680E3F28F449E2Ac159ecFeb6EC5DBa2f02A] = 2;
        maxCanMint[0x0800833a3706db6fBbD846d5d1b9370a79Af8097] = 2;
        maxCanMint[0x1CE77A2A2AE92BcC60AD460B37B0D0a6dc9e706B] = 2;
        maxCanMint[0xA530B243a20Cb49317288EA530Dc8A03b0C0Ed63] = 2;
        maxCanMint[0xAc99D7FaACeCC0062d8CD37140E1f399c06e6674] = 2;
        maxCanMint[0xA2Eae178F372220FF6C6D8CACD63EfE4e4b44525] = 2;
        maxCanMint[0xa18e03994fb5527fF3926b7F788ab8Ae4c79D326] = 2;
        maxCanMint[0x93e029D33955c190B775e08E6bc302096e035f2E] = 2;
        maxCanMint[0x7739ac07DE3720aA04fDfAaba7d4843aa63d1D86] = 2;
        maxCanMint[0x6a7ea8945D0Cdb9b53030F63b4b26263e4478C8f] = 2;
        maxCanMint[0x60a4f65DA916F1D23970F460B5ee05Ef84e76f55] = 2;
        maxCanMint[0x646eF0b780dbDbaEA2d8a44B39AbCD0DC44B8363] = 2;
        maxCanMint[0x59365f3C86b49245cb0F7Ed4E525439e8E09f089] = 2;
        maxCanMint[0x51ec49e33394A49D74aC61EbDc8fd9E531335BaC] = 2;
        maxCanMint[0x419e1753D481AD83A79831B3CD1e4206971cCa48] = 2;
        maxCanMint[0x41F3cbBaA1EDA77EccE61E3f6814a843f77CD1eD] = 2;
        maxCanMint[0x46fa1F938df87F459AC67F52b0fC55b44126Be66] = 2;
        maxCanMint[0x1592221ff5c0397a563d58D7F3E6c95dd444b2CD] = 2;
        maxCanMint[0x25fF1A45954F35A257a1198e7cdeA128A3Ed692E] = 2;
        maxCanMint[0x2036DE0a1E6a12ee5eB00F91A66A4AfCb5b2f287] = 2;
        maxCanMint[0x3d2CE2E1bDcDd6FD1115867047F7fdd3DA06357D] = 2;
        maxCanMint[0x33E6EEE1a7E91904e3C131f433846Ecc6D2505b6] = 2;
        maxCanMint[0x26268e120b2D916e74605654EEe7D3b0788f255A] = 2;
        maxCanMint[0x2733CAEc18289DF88827287A72CE6CAF0F785522] = 2;
        maxCanMint[0x9363113e33E67cB2B50ac57Ed52166BEF07d853B] = 2;
        maxCanMint[0x9920e37E71d75ADAB923678A453cdb7C994F1490] = 2;
        maxCanMint[0xb1dcF33B6c81e79f76e2473fAbd35cD944bF192a] = 2;
        maxCanMint[0xB34F47362C951CDFa3CBEb124BEc9b57fEADa5A0] = 2;
        maxCanMint[0xB6C567A0a1B88293e803f2db1BC9bCd77487C2bF] = 2;
        maxCanMint[0xBC0a8358507Fd406Fa97ec82aeB6fA057e9603e9] = 2;
        maxCanMint[0xc668023964daA7dED2cbdC4Cf0FD8D2588fBe2d7] = 2;
        maxCanMint[0xc48d912C6596a0138e058323fD9929209A66Cfd8] = 2;
        maxCanMint[0xe59F680b3Da35C0aeaF5eeE6fbd89CaB0E0E8377] = 2;
        maxCanMint[0xfE505FDC65030dD93F44c5bAE1B0F36a55b50291] = 2;
        maxCanMint[0xc57ac1820F7C7370455dDdefa8E1B23D971d4091] = 2;
        maxCanMint[0xFA0359AB83269Aeb4D5c071d1211EAC0E86f591A] = 2;
        maxCanMint[0xFe2576De850Fb3E48EE63ccac691a6DcFB8C6Bca] = 2;
        maxCanMint[0xF7955Beaf279AC339a10C13e23F7bfd015aDe0be] = 2;
        maxCanMint[0xed278A7a1A191EF365C1FA55373A8aF6638F5A02] = 2;
        maxCanMint[0xAf749CA22395604E4D064c35e2cAA27bA96B1B55] = 2;
        maxCanMint[0x84874AA02dB3BFFf23E9C6BFAd0B6cFc198231Be] = 2;
        maxCanMint[0x9C781fD91dd7F14053a39963F6a7dAB0FB22d133] = 2;
        maxCanMint[0x7eF61cAcD0C785eAcDFe17649d1c5BcBA676a858] = 2;
        maxCanMint[0x7F3D1132983122F90bB82207C0F877C992E443Af] = 2;
        maxCanMint[0x808a9125290A16F8d736160109e0a5D7575fBdEa] = 2;
        maxCanMint[0x8fedfc5B02c134aE5fB7D607f43f1C33e3D28566] = 2;
        maxCanMint[0x90F44e29bB9C3d378c1E1cC0e72a0Cf0CAa518E1] = 2;
        maxCanMint[0x01Fe13639b3C0B9127412b6f8210e4753ac1Da37] = 2;
        maxCanMint[0x1Cf8B7c59560C7142085a8Da527A79871872544A] = 2;
        maxCanMint[0x231CBfF45BE54f0f5bb931a378e58b89452b12f0] = 2;
        maxCanMint[0x2af5Ec633726D4f14C88030e5C39590162C947Ed] = 2;
        maxCanMint[0x36190836708D3326C4b55a4aB24D694305c8571d] = 2;
        maxCanMint[0x465D06aA6b0dcd4f2d9a38d14B20A042B92EFbc0] = 2;
        maxCanMint[0x4e1ce0B96fC37f81F5508c6608687AF4F78f23b2] = 2;
        maxCanMint[0x6882185EF840a543643d9CDb8f41d1C6B0bdeAB7] = 2;
        maxCanMint[0xe6519b4726aA433ED7a748125e3445876bc34100] = 2;
        maxCanMint[0xab68e2CA50CB56e82fdb9ad31414eF35Ec07dF72] = 2;
        maxCanMint[0x98cE912ea90388950BaB6779DD104Db6F2d540eD] = 2;
        maxCanMint[0x9e5Be83C1fEf4584Ff0fEA476623305eBfAb5986] = 2;
        maxCanMint[0xA3d95B59dc61fe47412f408a219a22A61dfbB21b] = 2;
        maxCanMint[0xC74b209fe38EcED29105C802FfB4BA280895546A] = 2;
        maxCanMint[0xDf4AcE29970D2F2Aa44De82f708755d27F5234c0] = 2;
        maxCanMint[0xE09165D4CB9B92c24De770A3d1aF363570A402fe] = 2;
        maxCanMint[0x223716C5aa5fd892c0dAff1f24D4531272E8B12d] = 2;
        maxCanMint[0x3C7406F59035671DdB9B1bfA81D735D065beA88c] = 2;
        maxCanMint[0x43E47385f6b3f8BDBe02C210bf5C74B6c34Ff441] = 2;
        maxCanMint[0x1D40FC9456A1E6F13f69615FEe1cbcBe604B9167] = 2;
        maxCanMint[0x13e2d56Ca035257Fb75a27b7e49a78ED03D213e9] = 2;
        maxCanMint[0x0D70FCB6DdB62fB08C6FC13D7B83DA1DD232926C] = 2;
        maxCanMint[0x6bC5bCA2C80F481AF8E0029b53382a096f21DC41] = 2;
        maxCanMint[0x5e7Ddc75ddBA78301F35e4C98B6c1F1684a6FB8E] = 2;
        maxCanMint[0x69a94bd1252A3845D79ED7a56d674BbF2A79443e] = 2;
        maxCanMint[0x50668e0f859FD1C97efcE964fcafb70eF6206DbB] = 2;
        maxCanMint[0x48248E89c1AbAE32bCBcff54564FD4Cb6a979723] = 2;
        maxCanMint[0x580fFb0D49fbF9B7D9c5b8e9B982899D0268457E] = 2;
        maxCanMint[0x8Da94F299c7626e59F28e020b5747f9eD67627DF] = 2;
        maxCanMint[0x7caA9f43822e288782e3e8797C8A16774C689b3D] = 2;
        maxCanMint[0xC4B64403e00D1CfDB76E67378aFc6698f59F3D63] = 2;
        maxCanMint[0xF1b211973F515061234acFa6D978426498647463] = 2;
        maxCanMint[0xd5e0978654caDe8fC01983899df720Cca7a1cBB0] = 2;
        maxCanMint[0xd93CaC570ebF525B4F1f725606dC8BC4d81ABA63] = 2;
        maxCanMint[0xacdB2444BB641cf42BA4bf09243Cbb61D876c084] = 2;
        maxCanMint[0xfE598c8DBEA6d78Dd06AE537B8171695d075106E] = 2;
        maxCanMint[0x03bDDc8CB7c81828A8BB762473b49ef207B3Cd7e] = 2;
        maxCanMint[0x1e31De516b8db1836b500F190587B14Fe8C5c8C6] = 2;
        maxCanMint[0x3aF7f85584184F63b533e547E255AE7265EE6A90] = 2;
        maxCanMint[0x5e624A7Ad13b5c01d547B1A95A386D1f6147Bf56] = 2;
        maxCanMint[0x6aC029Ae2e792a56354C544347F38d68db618492] = 2;
        maxCanMint[0x732848ae73FCCf9ED2709242BF54008fD00b0088] = 2;
        maxCanMint[0x6d762732a886705B2813f6763D4ffc0d810183E2] = 2;
        maxCanMint[0x6D7C9F86d84F9535D68968B4464197BB1Af2B9e4] = 2;
        maxCanMint[0x76d81893313b4B4701637606da284e4Fb724D3e0] = 2;
        maxCanMint[0x979842ADf40Cea8Ee62B23A1964DcFc6443276C8] = 2;
        maxCanMint[0x95722D15041F50fE9135962cC87042B4d6DaB382] = 2;
        maxCanMint[0x9663992a9eC4f9bd98F409D69bAe3909B5430C75] = 2;
        maxCanMint[0x86377eA2423f6Af0eB35CF9453fD0E5581AB0A56] = 2;
        maxCanMint[0x997197d6EdfD538086a6475f5466c4096276D3ae] = 2;
        maxCanMint[0xCEe5a0A7fff203E7dbaEF110221359aFc3A0CFd6] = 2;
        maxCanMint[0xeCa48e391E4eA76CD52328C73A549BE86Ce99f8D] = 2;
        maxCanMint[0xF0B68255D0b548426c038ECE7c1e236ecdCD04E7] = 2;
        maxCanMint[0xF60ff2c493248CDc1DD5F61FB7A4F0F210D46E26] = 2;
        maxCanMint[0xfaEF7f132595C54C026F718a0A343AEE73cff71D] = 2;
        maxCanMint[0xd692a8b22ADEE210234a7fb00510E300411a8B93] = 2;
        maxCanMint[0xdFA413375306E2169AdCBbE8551f69739328E6dd] = 2;
        maxCanMint[0xE216E8Ab691Bda159d0f2A559a36CD102d8fd9D4] = 2;
        maxCanMint[0xe5e096Ff9413971C6B2377E7811AF53E82CA4d70] = 2;
        maxCanMint[0xA3551E31972557912D69197Cf224fE9b167A4db6] = 2;
        maxCanMint[0x9cD096C8aBe256DeDC71d7f50f90F2f7daD77dd6] = 2;
        maxCanMint[0x3Ccf39F671729ed82eC47c66FB35aAaB9133C0Ba] = 2;
        maxCanMint[0x3d9cb1c56C0CC3Ea3107ec7fF6055Bd348D1FcFa] = 2;
        maxCanMint[0x40EbF8a762801D1706D9D16A8abFEc4c452d15e5] = 2;
        maxCanMint[0x2d2340b5a45d33dC052F158cAa8D6C764DB29D52] = 2;
        maxCanMint[0x0E9161626Cbc5Ea98f2A06C69e2bF100FE41a907] = 2;
        maxCanMint[0x2C5d877d7Fa03538C4d1B8BF337B6237b290dc7c] = 2;
        maxCanMint[0x007DbeD1B4a125c45DF88F3FFa350ff70c94DD9f] = 2;
        maxCanMint[0x021d5ABEA6EFbcD5dBa2C8Ae9237471448Ea0856] = 2;
        maxCanMint[0x83Bff380D2c59F88F3132542fb23B40AfCf361d7] = 2;
        maxCanMint[0x88eC581a0F36CD37f22c618EaF2DfbBBc1B5a365] = 2;
        maxCanMint[0x71e22168B702bcFF528b8974Cd4B723250B67609] = 2;
        maxCanMint[0x749def3Fb9dAE4825e7C8B360D5466480BC3BA2b] = 2;
        maxCanMint[0x767A58ba5b0E404f5bEFBde4d7f00926df568FE4] = 2;
        maxCanMint[0x554e0B456a38885501D519299ef0D0ba9715d0b1] = 2;
        maxCanMint[0xa6CB7cfd3d4fC39deC50745d7b5D37B121C701e2] = 2;
        maxCanMint[0xa1f80A85cad8ef802e5341b3D7792CBFCFb501D4] = 2;
        maxCanMint[0xb199c4c3F96F71f86190A385aae89696bc0107cD] = 2;
        maxCanMint[0xcDDCbD9C2665A71CD4cf5d1FaC0740Bf7643F260] = 2;
        maxCanMint[0xc348f4B6dBf1B156D802810DB2f6d59F36c837BF] = 2;
        maxCanMint[0xFC739BCE80D13F7a374b7aFDdBAd1c8991453051] = 2;
        maxCanMint[0xF9e0A4bb28f2CC7775Bb91dFAcAD0DEaef6605D4] = 2;
        maxCanMint[0xea79b1f6EA30a2DccB7C066Da6204fBf4131BD2C] = 2;
        maxCanMint[0xF0bF1C59ee9b78A2Ce5763165e1B6B24Cb35fD8A] = 2;
        maxCanMint[0xf229617126be90b7Ab4AE9fE5967C54ED7111144] = 2;
        maxCanMint[0xf4c40bF7070Fdcf64Ecf020bCb583738A6cC3bcD] = 2;
        maxCanMint[0xF50131d7d2B5239Fe1e934658fE3f6131532A437] = 2;
        maxCanMint[0x4444da3cFa07C77A8977DA1275723A8b5dEB14c8] = 2;
        maxCanMint[0x4167B32BB11907f400D510Bf590aAc413C9195a0] = 2;
        maxCanMint[0x331f9e988d9Eb82e7962c8c8f4b965B65863C618] = 2;
        maxCanMint[0x2A8F38956eb0C63A5F2E51333aBcFEF8d8ed1b4B] = 2;
        maxCanMint[0x129C957B1453E4Eca1Af2BF34492C0fe67298BE9] = 2;
        maxCanMint[0x6dA5dddbdE91D9a3e917B09943813177d768240c] = 2;
        maxCanMint[0x7822F20Ce0afe078118c7aE284c577b5a155FF9a] = 2;
        maxCanMint[0x9044aB3AACBB8609eF3Af11924b2c7378aDD772e] = 2;
        maxCanMint[0x862CFA785AfC31CB182EB6f01B0fe6e649ba0657] = 2;
        maxCanMint[0x8da324F75C882F561a5d44BBD0B1BaE26ED17a79] = 2;
        maxCanMint[0x7d38Cfba886BC11828d5c6A5ECdd49550E8a57a0] = 2;
        maxCanMint[0x7d5026aEA0E7478fA869af375a4ede8a5a35CBeE] = 2;
        maxCanMint[0x8f1450C06e273BB11fC76227fB3Bd79943b29E95] = 2;
        maxCanMint[0x90ac9C725aA7479015Cb1d2aD128BCAfe457E42b] = 2;
        maxCanMint[0x90C8E3A8482D9ac808ec0E9870bDd3772A13F2aC] = 2;
        maxCanMint[0x4e258cC6180E73A69Bb0Ce18621c8901AEd3B792] = 2;
    }

    

    function setBaseURI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

     function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }
  
    function mint(uint256 quantity) external payable {  
        require(quantity <= maxCanMint[msg.sender], "Not allowed mint that quantity");
        require(numberMinted[msg.sender] <= quantity, "Exceeds current mint allowance");
        require(paused == false, "Minting is currently paused");
        numberMinted[msg.sender] += quantity;
        _safeMint(msg.sender, quantity);  
       
       }  
       
    function reveal() external onlyOwner() {
           revealed = true;
    }
           
    function pause() external onlyOwner() {
      paused = true;
      
    }
    
    function unpause() external onlyOwner() {
      paused = false;
     }
  
  
  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        if(revealed == true){
             return bytes(baseURI).length > 0 ? string( abi.encodePacked(baseURI, Strings.toString(tokenId), ".json")) : "";
        }else{
            return bytes(baseURI).length > 0 ? beforeRevealUri : "";
        }
    }



}

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":[],"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxCanMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e0604052603660808181529062006cb960a039600b9062000022908262005478565b5060405180606001604052806035815260200162006c8460359139600c906200004c908262005478565b50600d805461ffff19166101001790553480156200006957600080fd5b506040518060400160405280600881526020016753756b697065747360c01b8152506040518060400160405280600481526020016353756b6960e01b8152508160029081620000b9919062005478565b506003620000c8828262005478565b50506000805550620000da3362005381565b60096020818152607d7f9d67faba09d04a698b86d92af4d47c735dc81677c5a8c3ad034a44d552019c6c5560647f644ca12be10c6bfd0bfce8d81f2a0d64fb2d1f800282f896e7c17e78f014303a55605a7f6467a7a6524a68cf812859938db5f60a75f66f9498313ed4ab021865539ad83355604f7f9a91e2d044692e6b00a6f815a49946ea0c694eb4469ad95cb5a9ed72e0b6b58955604d7f4f19ebe1afbbedc15825cc02c6e796e467c2056561ac3546ae7353f79a3ad92855604a7fe87214b0ddbb60908c7e63d0db80a5c714a8e444f8f29f25ff8edec8087f72478190557f93a585c26070e2d4c50e6a676af43e9ab4925058e359d56cd2832dc1189af84c5560427f5f231168dd648e588489fc840285f2cf22a0b1b7d8e26673e8fc6a30ece943c38190557ffcaff9551f98303911ddff578f3670d92871acd75e7b7702f771e8a0121a2d045560367faa3a181e6f2dfb92b053c31d0fa68cd4efec0eb6dc1a3d3f5243c7c9818f0e2a5560337f9ed6c93ae652166a0178120720364ab1c8383be80ce71efad6325d19878e06e85560327fad16c765cb94550bbc432ed5058f3ede4de66ca1eb77f73e23687d36239dbd058190557feb7dd7e4dae56db4fcbedeee1f8e8209319461027ecf494527d70ce015e9a6445560307fd52f57a21bd805cc6db21edeb391a7a42b0c12051a3c090c5dd39b5bec9d05c255602e7f0b3cbaf9ab12c97e80885747f2dcce430291f3303651c4b8b5bbe0a30aec5dd555602c7f7aefb4c7c8512dc44fd8eabf91161e1b35e2c49faf1eb0563cb633e4c9f1f27355602b7f64d3e89ab958d7c1483ec73d0d180f1de94e86c7cb445321de85b453a06df6068190557fd19a85798cbc449bc09092a9987dec0ccb54565003aa9146c451f38101a4350055602a7fe97f794c8e6b52e7031be3a90b88e72491ff9ec28aef9306c6652fee0d3634215560287f1e360462a42c4bad0894feb6d1c61ef5566301589c01c27200266d2db73baa638190557f859944bcc270d998b5993d2fd20179ce2deac7312cfa1105e1f24ffef5b4b1798190557f0101d2b111ab8d5a088295ecf50f40483f1a226201a1aa87adef09540a7ba14e5560257f0ecffb350290bc082169a2a010a49c231c6736fc3ab1e019119ec9a9e0115e2a5560247fe84859baa8a29b8e43f49a8f96dbf36459bac8b019d41754d8cea46704840abd5560237f1a77c4350a08fcef73f1da6d1601b5956c7b9d0a7c45670752dafb8b24d42c5a8190557f66950be542e81726d7d1358080429a7ee5d0a5c3288d0c96632d3ad1a7f0ce148190557fe34966b47d348ba9dd2e4039d3dd54ac484a9c127522e8e43aceaa746290baac5560227fc59475aaad25047961ffd5a092f0a2d3280629b5c352d95b2aa4051edd512040557f8e9ddc42df499a435c5ee151681ff09688f2c053a05d53c7015bfc4419eb96e255601f7fcabc59caae2efc8271674e9efca9d2aaed9c226409e8e720f2739b6fb04267d755601e7f726ac4bda2893f0c582c297026004410434fad66939f7e22dceeeef4bbfcec7a8190557f0730d53efac7deeee77895eaa7641b463c5d7267c01698c00427eb6075194ed455601d7f0dee17e754dea56c202e5ad4c3a501187f61886a4037a4fa88a8fb278e2c9d2455601b7f8299ee051b1693e8c685ae5ab387eac811b0aed525af0d77e1b04fa2f393e60f8190557f514d9a91a69c01161ee3ea6fa0c3f160b61894c65e394ec4219bd8b42a33848a8190557f1b29cef524759661795f67129bb02f9947abed5c43356f946b1f0c7a8f66eaa155601a7f3631e9ee8cf37e7ee8194da169369707fbeeb5ff499c0e5e4ab14a18266a0e068190557f8566b0453ab1861c3f697ffa15676efea6ea4ff10ac8b3084fb33967c0b00bd68190557f3388a6bd761786db69df81a20da30103e9716b8cc91a50f83fb76c48515378205560197f695127edfcea2a4986081d7e871b3a919854f75c104598815711a04fbde9bc0e8190557f664603a3c7948cddcb056149c452f9945fc818b054c759fd0a6650f7050a1a918190557fa0d5dda25d5aea653bc8c652419d28c4dd0e38c16dd00a1d7b2a61f4b9131b4c8190557f8e0c8388f02a929a214b2f1531709ec17677f4e3662b0debdbbd3f5cb3e995f48190557f0e84259761d93ed6aeab0eb3e4fed65414125f7a93c1211f937ba2587503c45d5560187f167aad44d01f8a08038ee80cd990ebb6f668496d38220b7d7aa640f076db16888190557f8a4afc874d0ca2228de8cd4cc2750469223bfa7d622a8034f19a5ec2ff3ee17a5560177f4d2fb471afb1feb166f4c122b09b9d035357e7eb3b7945f8befbf0289b0377875560167fe09da0bea1e4e407fb36ea374c999f8257d2311f7dd49a04a81116d4e5e96cc08190557f35685c48bd3a0c7760d8f8a4d544ad6014154576f0b4c4a12a2012dd650ec4008190557f551abd98de0a7a14a67c883c0d28248f3073bf0b8569d8d177a14e3b08d83bf68190557f3d6476dccf57b03967d98aed8fff4f3d36d17af5628fdb1fa5b3e06efc87ebed8190557ff89ccf460324fd86bf00c018e23154b69199a12a57539d975972251321fd2af68190557fbec84897e36310646465f6eefd4560ace426b6cf94c532ed96c8f6237b90a7a55560157fd15334d1fba5d777930272f2818af4e4e4bff53967a54371fc21b31a3f96d4598190557faeca1892f75e30497d1342c359676ca7d087c961b8536e1c2587fc9d2fd5b7df8190557f454f3af64702230c486060f34a0de5df56c54e24a642b482338f800d8e15407c5560147fed80ab1be3c465e71f7fb21650af081e74cac38a8db1cd2ac5591a671184b2b58190557f3793b950490b7c7971cf1abf3e8c1c58daff5a4f5e4db6285346040d784242828190557f681583be8db1bee9dccdfb493638efeab19b8995459b0c2cf118ff5a3b8d57ff8190557f7b193b3fa8f09283e5047337872b304d24858acabaade873aee7acc07430d3218190557f72e3c4888fe5f9d237e8c7f1f27ab9562b8bdc8d5ff92edf9da52b74fcfcdd2d5560137fc43b2865fe5a99b440d4f877604ca3ca5b86d82887c989b3c45801ad1ebb1ddd8190557fae7ac539b6ef9fe7819ae08948b6bc8bb9297b92dffb6f84bc27f6f611c303338190557f6bc7425f5b00270b174fe2c251de95fc86638710bff2b2dd284595d33c642e225560127f0a7f68d2a5a862c3a03c9046c394024a194ffb3e91cf27e211673d43f0abbe238190557f874ff765ca30757f75df16f58477d1acbc4fccce116ae68b456481cc0daedf958190557f27e40ba3bef500fd82f8bd1a91dd1c3b111258513eab463aa4c4230df3c1a92c8190557ff8c271dbbad05e79f03d8c28a7a61f35f2befaa99bacc42478ba77efe7b561685560117f3cd9306683a8152cf972ff89c4dfcb88f41e53a0554b67d51a2a3015a0f323918190557f52e67d424ce713d23fefbe0f82098f8cf4f0403a37efb3d737e1f94254678a888190557f6722a71d35e52e7632272cb8307e6e53a5c3132a14c1738692d52b05f3cb7d618190557f840ccddba9e3521cd701d1cddbd6a7f7c9fa3b54fe2eeaa45c0dd1c30e94b06a8190557f5a9d9a0b6b5b87f41fdb5074bd158232f6073c24daf36de1ca07a0aa286ef3508190557f8f9dfd8951a1be45a32805fcc999d4abce214b687f113aab3fc7a2f7aadf39d18190557f9365332b62caacbc809069f5f83e38c469b4d0142a46a3e635422f55ffa27f8f5560107fd406dd9e1c76b1a0716ed45510eeabd83411937e8d63b7829c18cd701e1ec9bc8190557f66ab43c0171596e61ed0b46914482d957aa6f84dc889e8418ea9dd01b6bb76288190557f60bf8caef640e542e458f9923f5bb840ce28b8082e1835ed07cde2be2039ba6b8190557f19618504a6df7f6d1499d375d2fc5fc54054a14260281e8fa9f8d3707fa3310c8190557fac214e230c2f069274eb29a965c1c62c7b8c23649c3a9b958426106b08758b9155600f7f9e71fcabaad9b3031195b7759df5bd77923de7c002d571bb6d3be360f893b88e8190557f15685c2fe6d9d048a508bf2f774cacc6519f033dbd6cc2ae45db0b6d6df2ad8f8190557fa52a34497f896d8f5d858a9e920a53d3883cdd4af1894708d236617bca62889f8190557f654e33bed0c4c933914b38fd2b7c8da1ae00c100cf747fc8e7758471008c9fed8190557f8662b03b46e980e1df5ac3ed758af4307b3bf8331f85f8944cba0566cb99adf68190557f2d22ec20480abccd92638f3fa756b09272ae273b14cce93894d8a8f704871b898190557fb8bc2ecd1d6fb5e1394198e768c0919befc3ac0bc00ec675afd1139f22706ae355600e7f4e08f825ad8c709283b70fa5866148c6666771fc180a3f90fb2695ae28456d0f8190557f54ed01fafac25950692f3565b58e2b66c776f23f542c49a4c1d37007aada77b98190557fc07b47e1327371ee57881efaf4a7880005843827861b95e33525ffaa8077f2b88190557f480db5f77fb60d3fdad5371bffb43618e3c8fc64e81c3691be8d750a0142612d8190557f2ce89e8d8026e3b8c96652c574bbf3a478a9b030eeed32fb1505cb1e1b10f0f98190557f3c312be8dcf3d9e30d9e193d8743c131029956f2ddc16a6babd05751922d689b8190557f2db06d953c1eb42bd8388889f87dadedf8abb812e94584c70a7aefd6546f27d98190557f1a247b95d7e6db3b21629439bfcb7168ad248f21cb1031a2dbf2af29f42b111655600d7f5b152b2267d1ecfeb6051ce4022afca70084afec6dd4c7b8e184e5a38d87cdf88190557f5ed9bf7e610226282a19ff7fae307a00f873d7bf4bfffd504288ee87fc41d78255600c7fbea4e058b92558bfa11488c67727c2518b3c3a13c667a9d79dec28f131cf17048190557f33515034da3e0db0f27f7e3a246849961f2f8829775ad64a5698646c38b1c2a68190557fb38cf49508fe0520f3cfd45f88bde0393f26729ebdc379614f9d1d53eda8e8198190557f46139c283a6ca6c375ea0f10954f9047891d91594e9eb15a5b3d77ba56deb02c8190557f7e2f9cedd3a0641ac5f7eb91413c837466b01baa2168d6a3e9ec36235ea05ef98190557f5ec84202fbc1af51ad4b97e55075662077f5aee1f02ffd48d267587447a9a84b8190557fbb0be932ad00de1bcbe921fe52e0df2a97a55195274b0aa5cafd39f28eb97c0d8190557f1e0a578936ab9fd7309fd3562bdfecba61532abc68a758dd636824a11f9a59a88190557fe3c121cb014048a793572105e3f1d6b499e039e9784f588cfdfeb6eed61255b98190557f9e59d3a9ec8379d8c65bda00b65ea3f8d314d54d03e13cfab67adebe0e9bd14255600b7fca99b04a9c7ae85d7b4842840d4319e0e4b59b1d3f0f22eb46bd8b69f0aaa6e08190557f792e96b79a58b7913f545ca02d5dab9347aa9cccd60b31d160bfdf02ec40c1ee8190557fdc0387a07f23bdfb4ce045aac2990d9981150d5c1952f0d7419a2359e202e2808190557fbe6204e7b1e119a2c9d89d15b151673fbc798d3042298cc56208e0353828276c8190557f5ad8856f148991b5a2a3d48ac1c2ed6de095648c4b98c5dfdaea8e93ccab0bf68190557f27c717a6d7677339dabff2adb273497636c066483750e784bac7b196f1f8b8e98190557f32841735b454a13a6e3deefeb4361384f473b131aa57cb0823e0bb62bffa9d4a8190557fd789fe5366f01fd81a5a4dc5034e92dc22a8b3ec17091303acf8fb96f0d46a1a8190557fc491413563d2626ef685e3d984506d8dd5cb8a3af5ec112c140189fe04dedb998190557fc68bd8ff006c30c5549ddb3c533cea367fc7e3e315406c94fc09a5bfdfba6c9a8190557f2d35197a314c3129a61f5f046a19e389e9be0e4d144dc58b3a49fc09a63418f28190557f5e1e89ef38957d93425426601406108a3ce0e73032aed9835d8cd6bcd1fdde7c8190557fdc6c58c741ffa889f20c5eed0bf18189542c74c5af450689334ba8abbd857fbf8190557f8b0f689b584b70a9bea7c0f74cd44eae74a8a3cae899c77847313d389fbf3f3e8190557f138409832529fbc4fb54b1162f55de74a0606a34f28ebfdfdcf8a8e10927c49c8190557f2eff1b2f3599f1d93dee9e0429e7d06d6bb3e01cc27c73579223de40f82538948190557fa959da4df444d7f496ad47e674ab4e850116bf2b57ac51f8c11ea4dd4c6345da55600a7ff1cee89f25ddb08b7f39c01e94ae4e93c911b6f4c4e854e2448e6e12d498340a8190557fa865578fded75bd07eed8539e679c61a37b858e48a5e4b2fd85bbe36317952308190557f0f70a497cb275fedaf2105c000aaa967b438b3b971090d248b83d34e7c28a4228190557f15d40e6a16d5d6a89349ecae15f3d6315349e4f20a8f69bf273a71da57bf25e98190557fe7c524bd5ebcf070915d27d07f55b17c2e6b0afd8c93a48a6a3cbca83a1a16078190557ff6b4e6631e2a550113561e9185dcf1d88ca36c062204c4f645a089d1de34cdbb8190557f3f11c4a5a6e102b87a8d25d2328091b7de455080eebf4c348fdee0a20a745cfd8190557fca8c834d577ede84faf4fcc1d9e5f61e84f3adb2888bb7d1f644c9571f8cd7d48190557fd5aa8b8bca3b5147a92e25130212b9d4dd79fb800b95bd640d1a02222e629f518190557f079bf04a0bee305b9729a7ddfaeba640a322968be6c8ad524f74f8d701a829568190557f5fb8a1149198a7bec39011c6e66edc90546eb45f5042159ed9989322f95a399e8190557f3a557d5167fa866b3ac8e307d2819399dc79229a4ae7b5e00f4b0c497856489f8190557f3e923a438ce653f90ab8d5db13709ae719c50f14a28a32a9d4ad0a452c413a558190557f9369486c9dc974481342b0876526556d5ed04db926bb2be9e379055a27aab35e8190557f9fc8c0bb6f4800def4feb35f838ff4180a49d27987eb8947ba138d2ef511806c8190557f7d871ef687d83bb1395b93bf4cc69c92112597bac9b9212c7ba280c44a88d36a8190557fe464b8f62259fcc316f04e5c4ebe5591ea7abe748b7f91ba955980339f8135568190557fd35c6e5e24d48ad2a4b267e5be0593333dd49edcca055ed935bfcafd3ac8f0888190557f08a7240ec5898b858701840e0db96f0547dc7206d3f57face84dfebd395b78388190557fc25c72127f48d08dd02660bf8f3432a5170828ae6a1155fb804f504ea694b8dc8190557fa77266af9a0354e2d4dca22e4dc5ecb4bdc25b7fe5aa39a46abaa49bc30b49e0557fc7688de955a5894aa1600c1c922ceb3fa99158fbad38c8dd69bf3a21a3460a688190557f3807195d5b8b6cd6806bc6b88b0db807c581896883214585b1896982a5a82c288190557f2c41e43673f6346e745eef78fa8b54c81c09b0683f212e3ba00bb2aea5d8a3a08190557fd84ddeb71dd7e7e7e77a0354f55bd5f290c57c3b10824704113261f95f9616218190557ff659f36e600633e37bf9b5ba4bc0ec33bdc73854481d9583929588050f92a6e98190557f4f46692f12fcc40ccb5ae8f0333f6eacf815a1030d3c3f40e64d544a75901e118190557f01f49ba141d3daf2050ae107346b4c0190c17c4f8a3bfda840b328620fe5c5388190557f903aaff4f9c8b9063764c41168640a26da1761abc8bc2b9a347fac994389fa278190557fb8306e60be527f55864d6e20d1d3fcfa942fbc78ed6afaa9c4f2372fd4417ccb8190557fba00f11cb30bd49d83508d8d60081d83d41330072da8a052d641387341b38e318190557fb48c30493e0bebbdbc44c7809b6d76956e0150ac9d41aa451c457b868aebfab88190557fcd34ef840329c30ba52f482abe0fbc2249f581ba9b93fbc32a7cbe5747c618178190557f2649b7992a4f9f68db8e77ee280e4edb73a2061bcdc8e42c67a5060d115b6a308190557fac8b9935e04307685492c4e959ade70fdbc92dde31e579d3d67d516b30d0cfc88190557f389b92282b1f80122071cbd39dfcb51663245b7b0a8f335e8d7b4edd947a9ca38190557f550c67cf4f94e7a54901236a82728b518d0fd78c86a739d4a1ebc1261df660095560087f41383a8b7fc5ff6bf36f70fcc130907543b1f53d5e1504fa8eaa9683bffd45328190557f99870c59fd39233b32a891cbc3ca8bf3bb9fcbf4b43f97b7258135785883640a8190557fa97a537ef8399b9fbe87d77fcbb11e1dec6c7ef93ca153d35428f35e923e8d7b8190557f5f3c4a029309ac66f75ecbf08fc11645b7a8efd7fd7b279d853daf1b2b39b8918190557f6d263f6b3b64761a66c04145ea6717f9fe600c01d8129e8336aed0b6c2966e378190557f5033adee0e8c366ddeff945fd0f33025517188f359f7ebf32c739c733018f6828190557fc27234a7baa24f4337acdbdd530b19ea906178bd8b61caf008fc0e5c6d8655c68190557f7abbb65bcc0373db36ef03e1221d0d5342d4c833c94ce26a552571ee29c24b028190557f92caf3756b72d0759ebaf77795328a327bef78932671c2976c8a7d530229fcd38190557f377511a802358471a81f5495b4cf07a4a2140a77b12f81bf707d90dd091ed6c68190557f8337229eec2aab5d5cf2cd8d12133960d432d09c2558d1f32af2cda330e926568190557ffc3ce3f6bc17089914204bba5361c1bd63ec18e03728adb03b00239d8481cae58190557f07e4edb165d882bc5f6842d90b103934c1f2b41fb99bd25055a39e9af65f031a8190557f0bced2455ffa38fd2fc6d6ca30f286f9248bf93a29ebc73d4735a9e4202388d85560077fc6911a5f94ac971dee17cbd79398e125e051a4769e800ddeaa0e3638b6639eda8190557f500ef90a760e555e5459a47417c565c3fd0887377ffdb7d2b708cfed4d3c6ad38190557f1955ee70fb4924b1cc56e70c6d0a341616dfa786daa0ee7b8d147109a4740e328190557f8a76c021a0b5c3eb091c5ff40bb3fbfaf32c5bfcda8ca53d440dbb2774875c728190557faef27c256295d6f9d2f484c2afcca5af53cd38cfc9388f950f7ad23abcd036d38190557f01bd684607cdb43e9fd69b34abf5fb5f1b4c99b7df9a0009f5fc48e337eb15cd8190557fb259cd68a424ba86b4220a106506a279127faf20994f1cf5daf80045d8b816ca8190557fb72df1c9ee4e987ebe4709ff5ec12cb8614cecf2ac0137c42a056fd68c4eaca28190557f1ff691dadb23fb1dcfb5a9e3fc57cf444ba660fecf4ac78db1c301f621b266798190557faa4266e60babab8deaf0d3aca332795e1c761b1b16abee7f015c517fc10aa4d78190557f0204f70313818bdec0b84c8ff98e81542343ced9c628fb59f54408a8433c92888190557f2d2218c63f30a4f18480f02cd053882262fcb159dd7bdf31cb5a961e517bb5ff8190557f1bb565033ff6cc6a15c4c43a5bc535d10d66e70f36755744a8e4187109f6cd978190557f0231249462a228e50767994add676016c49adcfc982e92c0ccc53346ae06a49c8190557f822e6197b41f4ce7aa22972b0065f05000ff33dee4a2b4cd91d2ec65fd6b0e668190557f689166a4e45c33dd60f5f3de5d3339e26683a09b5c64e30cceb411340fab209c8190557f1a42809878d73230e1dcee95c76ca23bde5ccdac36d2fe0b17e5bd7ed26205598190557fd456ddedc00f7f86f84eac027894ff1bd933fd72aa9d61079b936ac7a36e37518190557fae06fb9b186b4a13f869ab28dfbcf3b3e139e7a013286d84456f59e71e6dd7818190557ff0502776d85c1cced80b8b0abd5c258148573708ebe56d5fa4b3184002455dd55560067fee9aee5349941b81e95c8ffaeef8a8d82a35860e3f04245f96666cd70ced91798190557f7cdb7a45c79727341d19cb157a303bedbbbd2fe6289676f134bf5aa636689eb68190557f7675796071bcb7e45de74790b5a709a1f2f734e651b641249393fe98a8bb916d8190557f8e3b63731c47d29428475e95a6fbb8972d3c4ddcf44d2568b50f65e49555cb588190557f087aeed4ace5e6d3a884ee1bb0664ea5e0347de6f5db32a3f83b91b338cc52708190557ff1f4738873cec9faa113c3e35523ef2763c151acf2ec1fae8d1d44f9c7fcdf978190557fef9a9cd721dce0121ddec52a73b5e1266007ee11dc5fd0dddbb797040799bff68190557fcc22255887c4b3fce6523048f9483d310968cb66a36892c5e7c796b3a7e29e678190557f708a2c3f26edfdc1ab4ee3dc097157f4f51fa086a9f948fc3b9ed6c24c40cd298190557fd2921d189f5faf8be30529febac8a96476ef5ad3113ffb00a14f3921462105268190557f3ff267cc038b989db4c8075304d24ed06f84e5afd4b6d3d0a58e156f883935cd8190557fa5acafe1040be19acde979021e69fcccaa1d69ea20a501b6adae038459b2f0a08190557f93f0b9df51315bd4c94e91200360f53715035f7a850ba977b3aa9e62c7fe45318190557f69679dca9317e2d8e7e4c88194e87c24d952f9eeeffe88c5abadbc2538aede798190557fcb812695b27eba690d711e89c366b2419487c6a6ed1edc57e65c807b03090c588190557fadacb700efaba3446e004cd1c3bee3341bb1a5da90f1d77953a06eeb8a34c0d48190557f234f5945fadda8ec9a921153c3c969930f1fd6e850294c2a9f452f61efe944778190557fa37245058c7556cc79e17601ba5171e8d97ae0f4396c30889dbf990089e4ab0e8190557fd130c38428fe233aa457ccf434edb57b3ae1dbde0bd2cdca4c1e92dd88b34a208190557f5287065ee9ac6ec3246081dfae047121ff26816e3a2f4a3b13a957633e6460bf8190557f8dad2ebd308905ab09ab99d07d37e1c34f7e44223378827884576d33858ff68e8190557f1a5c30c086418e2b405e813c0af5b3e9cbc98d5977fa05ee843c00f0dbc016c78190557fe6860e6f39788407ae962b7d88c9ba68a1413e0df5130bb1014a6c9d7082617f8190557f8d28e5e60d0931f9607ade62feabfe1428abc12bcf63d57acea0cbff6a2e61625560057f966b4a3c8f7efc6ebe93af2e10f00f1b1cd685be6ef24300cbf7ba895af8a9a68190557f0102fe2f9193e564eb58174d0a4c7d96592c099453418c8729be4862cab88a7e8190557f6bf915239f01c5ea337d50547aa3a769bd5d07d86c391f8b712c1f2881dbf36a8190557f14dc569019258d404ca4a449b9a11b451574d35ccde6b8fd7fac21e9f4c982de8190557f1bf34ecd37991727b3f07a61f24adb59f43905f83257f070426f4adce5cad9e58190557fadacb5a7cbe70678b6bed91744fc1979ccd13d1cd972af4cadc6315caefa38158190557f92d69a7d3fe85d8eff13a7cf75a76106d216718d7869cc1098cd635f86ef3dd88190557fcdf4526631bcf6b514c7b47d144ebd8a06f5ffde6aa5c57c986fc881b3c795c78190557fe79d1737bd597010e41e1b9bed4890ad0034fd83d7be9744eac8c846bf5bc7cd8190557f1d91757dfafc1e3040ebc69476d4845d678bfac6ccbf89441cd4beec68cd0bf98190557f79b04cf0c5fd15a01e25b5eed53ef0b88e6b86a9832357a3f2a9f882499bac958190557fe0aa4f118a6e41231b95c96ed8e42f48334ebee77af758d5927ade46f6b966388190557f33d631f6ba611bd7290c821d66a9c9d48e3b1eed813548864691c685a3a1f5798190557f8ba45641f3f665c0385829cbc95894a81f00643a195d5fc432c368a71d4ac3288190557f7f55fa9ea34f0959950ee460ae9880c33155a867fdcc57774ff61d94b4a9d5318190557f9a2a83fe431106c16cab41e1bb976d3e6a29a0f739907705c7305e874d1e71eb8190557ff925404f3cf79b7d2e4a1fe429bb349199c4536866c8ad01aecf0340012f60d38190557f9a0d1db625081c18da9882aad07e533deaed0487692dfcb83082ce0663f8a3cd8190557fb87eaef99c584e1d84efbfd093241c2945f67104cc7af7781fd86233e828db048190557fa9614265f524f87b2f59fc5c3f42022be090e1fa517329eddc76777170c3c2908190557fea8bd4e997af27cac504c00fafe24e7068872202ff74ff6c7032bc364afb3ac58190557fcdddaf97842e5109b6ab515be2479b7df0098c36618e80888f2896c71e912d418190557fb09c7c466dc54bf50912f44aa73ee13a23273d6c043dd0687b2cdc46f84105538190557f2da70e11b9c93c62080c159784795ee6c79fd0cb7eaf50d8ebb0a0494c330b518190557f50da3854c724e404fe46790ad06f0eb7c561f8a6184368ab818e15bc2da477df8190557f6c114c88ecc9fdca477cc334e4c6df422e0adbf68abd9ef949f2319cf974d3008190557f653e7c14dd6fbf2703eb1712fccfaff65eeea60f645fd053a6fe5a1b6381b2168190557f76c8e96c3289599bcc5a5ac66f26c5d2ef49c4965ba492e64de81bec0909c0e08190557ff6bc3351b348b13dbaf981cb068c14bf25af89f41fa912c518d1ed4b3c01be0b8190557fe00079227719a014fae8e750155ad9198059ea35dd02c205aa4702911eb018bc8190557f8e3c37bb9f17da4f87f0a0b2065cd80c0d5d86824b86788b93fdd1611b9bfaee8190557f8b320cd45a2c541dbde307c8852f3490bdb1de95250a48e8b97b68e9916b29328190557f5bf767a7de363f43f89e048319b18c27b433ae9da2c3bfcbf498696c0272e98e8190557f71ae3292e99c4850a24bdea78dc43af734fbd1b1eee71cfaebf513e2fa6d7ed08190557f4137e5d89331a8224f11a0ac52cc044433bf7db104e7075a586a7cc13fefdc518190557ffa8cb7b1c3e20d748b0dcb69e03ba1fcbe9048ed7bafafc60cc605f6ab0fd6d78190557f6503085bf1c8a66dd1e2a26c5e942af0dc531bf3bd480915cb30cb794277f1488190557f87020e1ef17099365ba253083134123db03122bded9c6b3e5567bf3f1665743d8190557f65aef281356d4588720c3db344acdd5291d3b63ff96abedc4432956076bf05028190557fa18b08f8b89b7deec0028a2c0b63a2dad559d2f7694e2d621170d3e087dca79e8190557f7335836931e6ac341715588572409bb1c998590d745d9c76ad01e6264d56ee7c5560047f3949e4ad09dd54c74a49a1d93798c5ea09d251a0468d6d7800fbc995834e9ead8190557f3c4940bbc4e81675da91e16574812f9b3b5009540ae9f8f1580a338b75c890178190557fa7b9cbde4dd399839dec9d32c7654b540ad51a21ab396d2742c169bc53474faa8190557f449264c82f48ae7c533f3e358a79e9c622c9b58eb9e9045dfb68cfee80fcc25d8190557f8737b1b2ac8cd06ad4ebb866a29b554f5b98afe0310c73bebeb64807eb4c62c98190557fd4fb3b26a93dacb763b633a8cb63c26cfbc320dfcca3d31cefe9b719b4bedba98190557f423ed9faa2e3249816c82cb46471a6a926c91c10417f9ed36a8fec0cc564e5588190557f881d1786d8b0e3b98db276d9cf6a0e9ebdab23e9c4cacb99e258607c10a1df6e8190557f7373058b053cbe5fcadd7754b949c6fa6087e25b222862a1aca70e90d78974b28190557fc07a6adf52e06de81e3718ee283f42472280d6ace247825f27181508172e1acf8190557f055459e88d65f65621d2e5698a3726e22093cd76f0ac095eb9f00690193aea318190557f64efd0a8d4a84173edac3469c49f8603affca0eb3946578a77c293ddc7344ce98190557ffc87e8a68b7cbf18300832b486dd5e2130809f998252f21c35e0ca53cead7b368190557f3f7b0cdcb6cde7c1d88ac94739251cb257413ac319660f01003dc83a5a48ccf78190557f70eb356e0b469493ad58779e4187b2d99095c9e5469ade4ea1460cdb58189b328190557f05496cd02deef5b55b5530a7cad8c61c43895084dc38fc54c85c4cba8fafa9668190557f8a0931fd62a439989d29cc15d219f62b7d2c354fdebf1e75ae7da8200f7525cd8190557ff172048d605435b6d6f788de5257b3fe6507cab013a932a49a2403f9d40d2d5d8190557f4b1676661619ef2a3243e3835e00257cad81a456282b11bd92af85d5126e22608190557f12b06718b48d4b3b9bc093bfe9c239924662bab2e0be219415a5911bdae89f828190557fb28b3d90ee0e82ea2f93ed1f43068999b8f96c985941f386b353c660313b5db18190557f969105d52a6cfe649674aa26ee6b828a43a049ccd1ed79dfd3afe14c03139b878190557f1bf1428a9d1a08c2e94928aaa82fc15afc8b117e31cfc526ea93bcb1dc4dd18d8190557f2f410515f6ce48b8fd963e03af72119764fd87156dd00c01f975b877511e6f0f8190557f5923bf5c0c38450cbd5e1219e7c273b6c681233984ed9090392c5244a78815148190557f103c54add14d5e262e71a8a8279654dda4f56480e2ab4e8d019de5c812c5ff498190557fd5cebfdcdecaac4db2ae96e7fe9082cb4f54085877f4dbd3d888a8fa67d57e7a8190557f2bbaf0c5ee80aedad55ad00eb28c850968759bbad84d919270121d7206b2a09e8190557f47f01d7637c3845a146cf3316a61af18c24768eab24a80d2676af5c800b175318190557f58557af0c7750f10274395e405d66e0e3fa34d5ec9e248d2f0dcee02099a59dd8190557f6675a68fbbdd558b532c271bdf824308c1b2ac29773b6252eabc958f28e248de8190557fd565f11952dd4212abcdb71cf1e18171c98358da9c968df0b7deed11db640eed8190557f68e50072a46fc420b38199fc94424a5dca82e6886717ec7556ebee07df4b6a518190557fc950f60b06bc4fe552e8acbcc8e7f1920032fa5817de07c1b658a6ae23058a478190557ff0179787c8a0366f9e57ff32de7a69b319c5689cb5dc713f9ee826e346f7e5f18190557fdd271d8d502bb5d8399edec554e94b3cb75c33666c239584306953b98f8b9daf8190557f0e7683acbe501a6f8bf0935be8dcba1b42b1c5985150480e953fd27f1e32c92c8190557fda709d6db41e8aae6be646d61a47571f36f0d9c2ffdf50a034f6116c80f96cd58190557f84e556296d3676e5f2d0a858d69c48abbaaf182fd85975b8b2da0131ff92a8018190557f12df058890f04f14355458eacc626ff09766fa48c014d2545507010bf42bc5198190557fe2578d9c6f2787b11aeb684f6cb28318a6e08d036bda1bc2916c7a4dc4ebc9828190557ff3c8282368811dc1cd6a1e0144f4df548e473842b90a76eb7c010fe08eb3a29e8190557fe817ea218c8dc258f28706cbac0300f2641da60c4ecd35219238dbe12964f1348190557f8983813fbd143b35df4fcb3c2680aa808296d736e4da86227db163d5ce9133a88190557fd38195d30e4be4fbcc774129a05d3c9c985c337bdde28f92e2c8b46327a131548190557f7e84f74c6a3cbfb71accbdc9b8808314e65e76e2ae1167af1b88227a1c8216638190557f951a96209ec5cb9621b9040c312f5ef5e1e4c8fd87f42995503a5713cd2535e38190557f71b5ab5a1b51df3cad80c08bd61b1d300b2494d795c7962be14a36e99e8bc0758190557fefde582cc93ac89c6c956536ad8e8f183fb6cda03f88c4ff5851217ee0db5cd78190557fe3c249112ab1b21204b6ddace241e803b9b1ee503b2566f60c8a29b873c184e58190557f0944847f8846afac49feec465558e5dccac5fbe3ebdddd907021c273928a0efa8190557fafdf6ea0d0edbf84137477ead701572960bf038ce7684704d834dcf9731c47f28190557f7ff7946edc0fe815bde9296c3a0be4ef707d5fd3ad6c022386b8b159d8a7f4738190557f24fd16fb2cb52174f92dc53ffad9da46086c8aadbbc13c2a34947410aa910ca28190557f7d361da641aab8f3b4c9fc5dbe5aa142e2595713f6c66910a42cd6c3a28e26828190557f57e8a691bd1d88ce09479489e83193823f5aa7e7d174e91035d01466ce29cade8190557f5bc0459f80c2d6598ae63f5a563d2fa5c6e378c7e56c73835e0ba61b11bdd8a98190557f20f0e10832fcf30e6631022fad15170cf96599407f6de77a5eb5e875853e218c8190557fa8e187d3ed6dfe0bf56dcd35026629d697d2166d70b00825a5c1be5edd070e998190557fe3037a4e0459f0ab4722e8f0954f3003ed7ebc5705d651a26e49837f81e0359d8190557fd3658ab589db247727398df0b3f820b55c5b3b960885c65c0d2cdac555cd0f3d8190557fc96522df219ccd2b06639c3d06102e2b35b4560842574220c0cb1a8d937dd5268190557f17226e9c0ea6ee697b407c14098854205f299b287d52c2e4ce5fde7f2fa07be75560037fb5f290d03a78981ca9db79b58e34c653b08da4f839f20376cb412da887f7ff7f8190557f65b9d6008a24b94635ed703d1b67422b216729fb7e3080880ed77fe9ac22131a8190557f04379d81f2b304fe5b8867c87df610a9cfca7cb16e4e47af6c9c060839f9a0038190557fb7d806b9948d05130b9582b1241ed967075e737ca7cc7943ee2f9c7d57ee27dc8190557fef17b9b3c46164226dd315a137be77441f56e2cc2d4d20a6495a832bb734d83f8190557fc9c0865300e8859a02d87248bcd6e240330540bb176ae46be39de481e0e2d8228190557fa9ae49c163a82bb2d64fe7dfbbc1550d8c9fa9ad74773e15f811d7ad0131ff2e8190557f579bf4ebed42c2ea2cac040078779bb200c4daa8c414b3f8b1bbb653c4e45e0e8190557fa96ee29935839babf1bb11d7e2920e6df246c39c0608b482aa2e554a1c44666d8190557fb60fe3297d0a36a8ef13a1f079b8c107a6f3103c55d958d7bf7f77250c35ff498190557f5fc515c7a8d01d10fbf3300082a96c2a64530ef4534d916b7912d478319141968190557f2aa36f1815d16ffbf7474537ffe730027981e103b28a79735d8983fe5641425b8190557f38c0a859bc561630964482f77a00f956e32c41c4029066e1e80c44dd0459b52d8190557f413c64a14fa4e66c2d50ba8606f308a33ed12defd9f7a9a69d602c4dcb14829e8190557f6a5664bba8b0cbc3ae78c6c9b4fe7c26cd0a6adc0409969601973780bba51f388190557f21cb72b7a3355a7976da90c00d3f54c7ce310c638154d610457b20a11be67f3b8190557f17778000d785dbb03347bf450cd51b7d4c1f5ea02965dad93a81ba69934af4298190557f7ec1f47aaa57d09966f4a627633c90df3febbc2da8d2e71ecf27d432caa2d5638190557f6551387c8dc5148ed438669f9aca6e6fac3d953c1329604a67f390a2116c43f68190557f4aec159f43b11129c8667a4a91d1149ba5f8c4a314a4e771883445795dc8f5d18190557fdf38e504fd82058cd839057f180874a89393026e9d891bfa40033416c53f25c78190557fec4d846b014d547b34b601105e793fd9124ea9a7e10d4c95585150bfd89e33628190557f8f12ee691fe78a9600cd1d7da4b0af73690e6ed9a1730552bb39dfabc7ddf96e8190557f55bbfca0758f81798b8b0ad34f125ff76ef0f3d31ff9d7b1e2c43dc3b0847d5c8190557faf5f2ad2f30cb3b7b8eba1f8da51c60ee474e44e3be4248a06a392639ce7f48a8190557f6aea6b12eb84ccfb3b5fcf29120e502b7abffdf29a444b55be5168e8d0db87508190557f545e996c47d8e4ad46885dbf66ac151c12dbd36e9a9cef0164a98ef4c179b7b98190557f8e7c3da8ea22d7ad21c455d1251b3cd5af540426347d5801c1ff6b502e8660588190557f2e774b09cb81ce3e019f3351007a10f88e31ef3556dcb7fe23f0e13d1f69cc2d8190557f1c335f77e8f128e6d8a36f92669bec59b7748578aa510be4779455ebe50c5fcb8190557f8fcd38ed9f532d5d1a1cbcb92008e1b34e51d4837dc0b49944ac3ef3223001978190557f58a5dfd0e8fc6acf466e4e5f660349dc2c8c775f62429ca72868fd729e25f6d88190557f467f3fa7f49b93fc9dc0eae639c4d2a4ee53f5dfdf72de53c6c9cccd1aa3cf248190557fb7e144be1c13f86345a26c400344cc31a2877744401a415e2e03380d5c94c41b8190557fcf6ec8cba5d033cb135d18ba32f57f403c510461673a5833ad4e66a690194e278190557f1de3dbd196ccb835e19fbfc4540fdb78535b3379321bd93a6749eb2048ecc84b8190557f3b4d364a6118b70621f26462f8d0e5e03a481fe2d6e2d7ce754649a8689431c38190557f01bf7e9d4adb008c4b64d424a4e10f03aceb8b47fcb20eee803aa394ed8bbb1c8190557f201ed6eb3a99fc5451af07a8bc1a19cb8c20db60f002b1caf906148a618184db8190557fbda8dbf62747506b3659b816fcd97f6ccdad8cd508a79b446996006922195fc68190557f11158c6a20e321fe0b53384a43f539ee44682566034e4d4b858008ebbe255a448190557fd2a8deb88353c9683872579fa114805009d8b3604f23ce3db3faa34bc7863b928190557f2a99c7612d54ef8d56f7a6330c393fa0577e593c52f6f3a718d396d43691ed778190557f16d7914bf343d2f9a951a849be184bf6298e3b103a848bc23ba4b07c2af1d91d8190557f5fd82087a4cc0f3cc8d19679c6a79d9357f44d1b8be376f31360e44f32f02d428190557f8d5c536ca94eb6a873479dbcf2b3e5707194e5e0f22a9518ee57f11e33c1d8308190557f9a88700becce31a8c1671bf4da335db7dcd8f4fd719a138b5002c34597653d298190557fb81d4b701484a9082a2bcff5ad81e42ac769b330698195dffd830205b7f5c7e68190557f6cd4a1d846d5adc2abf9c992afa04f4fcb3a11779183333ef393da9bb6fea67a8190557fbb88c75a54cbbfa0004df170128627660a06e4bd52fe7d2480243191fe0dfeec8190557f74aef148c7289c72f7a9c9482f7e448beac5b3482a3cdc17ca2f71fe8e7c35148190557f7a6e880d3492fd6a9a770872466d18dd86101e517324855d0f464abb83c605848190557ff3fa187fef84b6d292254f2bc139272cef83ee176fa4ff13b5776d26d1189eea8190557f702e12ea188b08c0a1f83dc78ddc39799c8703d68146b7c00cb1381cf64adfe08190557f10790b55fcc2cebbdd05395005e11feef3a7f3bc66d7e5d8f8c90a9d8f75b35a8190557f7700e59896f7d84484bab439ac27dfc5ff76a0e35fb6e8b1449460b5d7f6a81a8190557fc6ade620c2ecd7d3b78181c4ba572a85d487bbc5691200e217fae1ca9a355a718190557ff9ba582042245daa59aef0413f5007473a1343947785293db0c55f5199ef53748190557f4a0d1c350fc4723f63a5fbfe285342a886963c16cc08ce5eb02f9f80de5da1e78190557f325a4f626ad3bde37d10c09bb8f3722207b036174136d544388ba427854e82938190557f7d2695c50ff90de0a2b2545ba852078b35bdb1563c3d386758dfda410ae1c4b58190557f1ae962592e042bb38bb496d5c52773cce30254dca0f2532251943ee19a59bcc08190557fab682f04bdabe2a3d1c619e522a4f4ab7a730513936a8d1047a2efa091c72b328190557f803382c372f87b3daebae9220f1bb0ec87522432a350c0a45ce90715f7501a518190557ff4dfc08e4984f1406585b7635a53bacd91f40232605a98c33f06136cf070f64a8190557f4299829699d7b907f91a4f282e7749f4a4f58dd44302febba4462c4eb4cea5988190557f153a8291ef1bbf328bb74198d53f76e449443e39acf2b8f5a749affd1318344c8190557fe0e474a8076329594c6d42c97476090b663a95dec1d41558552cd42091e41a378190557f4965806388d46bf5bde1e7d09f2ef89a9ec23eebc7c508ed5cbc232dfc7a24978190557ff016a63c63563f2fb76603ca710d380fcf43de38d313e1670db4eb131fb53a8a8190557f5bf8fabed7e2f16139204c1cf0b32083ecc9a3427d2429e816b3705d7669f2698190557f1df42ec517679923244517dc9fba9d0dc8fe693fa84b5bae2e3b0c419e0f1d598190557f394b97f0f4cfc2f5eec13c2bb8f2f749c13e7a53e30d18bf476aead9ad02119a8190557f66145dfb61b0dee6e739dd179036eacdc185ef5c14d565f60c6442f22c2733088190557f4a7b189770c6bf4f548ca384f8e90523ce9a777b4f32f67b9db645fd145050f28190557f36c2208936ad431f9f72803a46ebac043aa81e5e8f1a178e650f668ff6063e4a8190557f1f517537e1d1393dd69c9172705b09ca3b066ed008e9f1dd0381375e8bed557c8190557f4a3a2f7caf2c5e237b148e1c257a938bf013a5aaedc25f0910eaf744916bf00b8190557fd691e28c8d30578fe4c34ec3540860759d839839f8dd3f8a910c610024f2c2f18190557f0e15582f95052a14ed0d70f50558e60774cf5f271a7c3ee7518c83ac2f9e84ed8190557f5453819b29879f7ff79f0e6c88c21e6f5c2b5dcec838389df7d4fcd86e6b9a7e8190557f9fbba7ecdbc5de3b883d6545e5f985a528680b11a5f330911825ef6a80e04eaa8190557f19ce093d7e6f0208b1f6982653f3acc59e403d0f73131d159a5abb2b681886818190557f995bb8bb9c7157aea564ef8ac74b2a687628535ccb74255b252ad6f43734294a8190557fe1334d1b3f1b0e2bbc62655cc0cbba5f73df56439206563704a6a2c329f016788190557fb57e0dbe6e8da91a8719109a2122f54ad66fd077745c3affc16ef248c8a342c78190557fb165030c823f82e9823e06247871bde0c83c80c1920636d2a4370da17e592cf58190557f2f3b3c5370e312544174cf6f1dab136a99ecc21d74eb265924054461be37537e8190557f77818063de61ee8c7c1a42706d18115afdf1d644344e50a43a52a16be7815eef8190557fb3d95eeb87562dc675e86dc8c1143785490bfcd39787c37d40cf0da41b18f7288190557f5f850b72d7050060ecd4eb5f089d991414a6f8ecba170288e98244991af39f0d8190557fd9e1d9ebfd4a0572bfbddd15639260d0b80bf89835eda9dacb58fb810d9ef49b8190557ff1d130b724b0f2d92f1bb8f9bb2f9c4ee638b71a434ca8b2f535cd5ac3f5a3b48190557f8f85244d23d63f45ef2145df396c5e02d87d2ccfb77fc1c528737a3ed1f3a7058190557f490fa2b69630ea3778be05559bcde660749c51ff76b385fcff7519996f8a766a8190557f78463256c197f69e5f32589831116f80e4cb402674a0a08ec2d4ad218b77ae2f8190557fe01722c96d246ff9c8f5ecc22a31b266c038f12d6e3c6c458162713da604caa58190557f337027ce0fc76e5186119cc6bb810affda8e4cdff3feb753143ff53c8cbea4ae8190557f330428ae728be9d36b394431fb63184c52faa9f519cd39204e8174854a1338178190557f590265985853851fb52cee634303f456ff62c4529200bf48be4ece60d9aad34c8190557f63fd95c7362103393c124ce01be4bfd0ba64a18df911ff4d919eab98d12339318190557f4bc52662301c16a5079c225ca194e5f22317c801e1661f23bc6369f9a6e13d5d8190557fcc3e14aa72ef312e93a10da63a247b9e601eba7ff4cfe8d9e7eff6f1e1dd83cc8190557f8753994474cb74b611f1f5b0f7f9badb272101ed0630dc5dcef18e02f03050388190557fe10f48feddd3d85291f979fc86827f569a108cccc326283b4733888ef85a02975560027fc27a0d425ea29a439bafd605725cbc4d365c781568b10ff88dd39d87e739b5b98190557f80f63761d99572c9c949ba2089e2a6aa20e355b567a6496469308de402af1c9f8190557f8025ea23820bdcd699720201edd121af952403786eaa303773c98e9fe2256cf38190557f2dc2029933fdf433715986f70a71413be033d046c56f7a3131775e19238de4318190557ff5094992eb1f1b545d510e21ea6dabaab72db8cf9397d1f0a331875252c7cc148190557f4455b39f94a0f3f36b210cd38e9f6cca8862913ce6573b7cca7346210a74f78c8190557339f8f85134e2743fe7357e14bd3f5307c250923d6000527faa42aa3cd8da47a7f7211235ebee99e5586cb22f12749bd553a2a3cf6f2e73018190557f6836dafeb0de2512062b3f54c2f529d97a30c45b96fdb7c35062ff01016305ff8190557ff250bbcd4b6d6c2faa994a8ccd0774a400f4705dcd014574dba5aaee6eff643e8190557fe41c45980617147f6c30cf95adf9891ecc63d38060be9c3bec675502a8584afb8190557fa85180451f9c2c680b468e435b5c31c9319ccfad053c21d211d9bb7b988fb8b38190557fdd41fd56ccf625c9fca54194e7b68c2ba5787c4f1239b1c3a35ad7a78e94d6d48190557f1be63e628e245dad076ce703f00403df064ebfb1816c233a96eeb6e84a5107fe8190557fa560de9ebe105b21498a031903fbc50017deb7c4131b9b95a63d38e8e5b3ee898190557f5d2c956f993d58924fae99fc92aa11fe6790fe269861702514c9d49a807ca8e28190557f51eec8edd45a75a3e1d8b68cd7e4b396f1b51195cd4c574f0d06ffd2dab44cc48190557f261e66c7e1a378df83c65fa433b462f82fc02864fc8756ceb662500822ba906e8190557fa80662eb02f389c287ab3e47bb9b58183834eb6e7dc8fff597b348f77bca500d8190557fe1d4a728dd0c1ca6a230eedc773a203560b8a314d3968f2cf4bddfef13acc0e68190557fc91924337b944d3248a414402096f73a962b5aa5267d9a1a0ac159f4887332638190557f284082be9d90692d7266312af9d601088a5f898ceb2c064b12264b2834b84f618190557ff90d6a65523234197ecfa743986e8abb7dc1347d85b3412ee26b5752192089998190557f3ae880ce57dd06a8bd08971c0b6087ecf30a7796b15799cddab9ce17fc18140e8190557f0a49e7d9f44167d70a2fabd8a94f9a1203d7ceb1099b55c30ff092f2ad248e958190557ffbecd9e29a8a71abf8adcaf68fd1b9fa9dbcd31b51ab7720e55f19b470d120f68190557f8f34823f87b2510287d965d0ccddc4408c1c7cffe020c91fb7c47ea59ae556658190557f25bf4606e4d480a5749f74d2485349066aa2b2937ed3ae7b655e9f6ca198844c8190557f496a539def9d05f31f2b15c1bc9439fa05493ae7810f59c1b55d75d584d6a8cf8190557f1a9966a2e71e4cdcc37c76a310c484f6615886a1467e60c0ea21a3cc6bc2c0d08190557f3fb772b1953b5fc84fd6cb074f188fa680ca92d435777f19ef2e49558078a9978190557f396241bca8ee057c0b52b6179b520e4c23fe7954bb7e4cec6eedece11441dfda8190557fdf0998abbaa5ae336fc5725debd17503d326ffec716c5420c09877c5b8a6783c8190557f21010320f9e000a72b5b1a35fdee6b4de2b5b24031b101d5d25e85998a0db2608190557fc60eea5c3dc82171069469f52c0c707422540d9e7747f0aa1beabbf5492546658190557fc34f34d60d1f93490d9f22d4fa3d60525ace885ee51f272904263a75d5896d7d8190557fa96b9a4ec35e7e64c63efe55fb83236c7d5cbb660707eb61b344268b1000058c8190557f08a8bbfb73c2baadec516bf22612bea82afe35234c08c216b45457dedeffe3d48190557fcd2335201f3a5ba75868c646de422b40656e7d7e67840d85ee762d7f4af80ce58190557fd7f93eef1b2471cb8b9f06dcce553da2948af470639836d15beeef0c6a998bf78190557f0d45e8e60bfde42d67c98801329fb61f881a8c5243c1cb09563f93a3fa00de218190557f594f5ba7e899912a3c91cd8bdf656fb3ea562578dced19f65698bf229ae310fe8190557f53bfb4589901a9800dd55571f861b058a567491e5e64a1d72d713f11b9fcb4c48190557f09382c6b03803de488764dda60cef86cdc15c4a87e3d61ee6e729661a4be923e8190557ffd1826328ad935f6eaa7fda634d4ddc1bb62d0ff52c9eb649ae465c653d17a208190557f555737c66eab1d130b45cc606a7e121b59e9d02df943342fffddd650e7dda0908190557f43307988929df8542058f29e9b7bae9a691f98140ee565b6b0d91af0f2c016428190557fb86f91eddbfba5a2b9f1bf956ee07cbf47cc5a7e7babe6b6f3a152221919e6748190557f649788deebd575d63cde527b603420159f6cbe30c3c7dad17e46b5c2e3d952758190557f426b0429d98af2bbb8527e105e0a876cd41c206553d5a9371be414fd37851aad8190557f4c6608ea2559e168b017aa8953f7038026f2140500ad481ed4444677ea781a948190557f877051c270930e52f6227c9eb04b8668aaf6795e6f3d6850b41ca20d4adf14108190557f9389547c5e4383310ecaa664721940b7cdc74cd4a96d30d16e4ca3cb6fd32f428190557ff8d3c2f74ee710a40c19697689b605301d44175e46c017dab581d30e564d788d8190557f059946252bebcf5395fae96c4889ca2b53eedca24e44fbbcdc9ce84ddb8875988190557f9d0d731873ca2577e685a717e22dd713110f4f6d133f14f4243896936981a9c98190557fb0e9ad9aad2714ef8000842c308757cf8f269cd70e0dcb823e75e711e6b144848190557fbbc89bb34e35daef3a3c56b383731f5bf8c51e4e65a054f582cc1ac883a4e6358190557f59e1e9ff88ccd404042c433d40bccc495da2ebcc7d1590b1b0fa9b87a5e8e3008190557f9b41e750998ba43fe821cefe393f0b6260aa7ba2f6a1ac9c777042fc0b00db418190557f6b5273fcecda3791f0e8181b6a9581d0005445da3cb2f3a1e2c2d8e5835b4f918190557f2341735a6551bf77ac0071c8fe3504831346b335f95c1fa8287abe61d04c06008190557f8839149ff15a745eebc2cf89d5bd3c2a830580c34492c69ede5e15160995a1208190557f16740b0fd0a162604886d4541710e60de4a7496050d5cffacffae88fb75f2d918190557f9cca6f9fb2189cf08c42e586f65071a571d0429733732591d0d8b23a345d78bd8190557f676ee7224dbb2d50cc858aa793a65d135fba689e35f5bc9fb0b27345e02711f48190557f8684d70928b667a4179056a9f07c75265cf672e1cc0767bb61484f381d2b06628190557fc4371ee1f63341f3c79f782c888bb607467daa46a1540eea8991cc1ecd5e963b8190557f2c0d08b58a418397ec566da6849902e9ca57e74492317bce56797de5fa1984518190557f0a2a95f18b30378592325313412e6a6a7a9892a27166ecb680145ae9a12743248190557f0fd72b815a702db1f611cfbc07cb53ce410c10809c68161b84d99dd0dba53a5d8190557fe1f96112607bba1c40a418bf5145de27121faa9ebe536265bd8eefc70d8dd24f8190557fb20c138e7487e369f3b753967a68c6fc0466f269653cc8946899784d51c217f38190557f383ae5e1b0452a19c83b12786cfae415163cf3f2daa1ef030f9b03080193db368190557fb83fd611109566928ec8cc6992d12e86a551f4dcfa8c79843d106419b7b7c0c38190557fd34a0a0201e002fc717a0cd5c720c7a68076a06fe55c200791fad363ddbe9ad18190557f32e0b914a6fa3baf6d52ce3d08dee470f43a4e8d59b45f8fe6aa5b3f7151e84c8190557fc3a8856c4fe515dc74eff403100be54af681c97fe529a6b57ea87a3808df2c1e8190557f0d318fde80d74ae2045e5d516931e877e9523cb9668d7d0b6d85dacb8e9b0ed18190557f1ccb8826ae6ae2c661124ab7b6421fb5fe435c35a0f2fe298cc1678921e451618190557f1e8fffad6efd8ffc8748308868f7fa298b7b287dcd420e2fc9a1db84da845b2c8190557f4530e3eb4e9897f996e791f1889d37b6f9db465acd5f1ecff92f25c16a241fdf8190557fb828c2ef0d6df68a28f5332d29327397d1af01286fd8fb33140c222794c89b3c8190557f29730e33de8589c67e9ea9ca111577ea3a7dda4b2f73220ecd08fa5b9089a9d48190557fbd2fc0e9a195157bcc5e616c60a4c587fa00dbb97449e9812d4c2381d2b8fbbd8190557fec640bb708f24a24ebf6bdb882d444247ca8d531a6260a11597be69590a418788190557f58b597cbac6d5ae7cdccadaa449839a69d16740fbe68770516406c9a616d77798190557fbd9564e5e902ab93dbf054529fbeff5ee626e3bd63748894a831844b369de11d8190557f769479956afcd2055ab447f4695a4ec457af7e90bf4abb59dc61a54afc18a26b8190557f188e6a933b8ec52ce1de54780cf9e71a83c9745324a7f67f8b79f79f6a49f2a28190557f9c2376600230ff81c7911ba0a9e5696382ec047562ca3cae6a6ca6c5a596a7128190557f9292d6c96a303f59b6df5bd30cff6c730fbc2f6a5c4f5fb7d1270263ae1176398190557f5b1cd697db3bc95c08648288191f364e291b8beee491b1f23ea81acc3059da828190557f4be7278c25317a9f1dbaac012eaba552ffc3e42ed2a8a1fc09da57e4bd500104819055733af7f85584184f63b533e547e255ae7265ee6a906000526040600090812091909155600960205260027fd05fb767c1c7c9a9a9f7c4d5810eec084d855b69eea03b968611a59f4385da9e8190557ff364b870838a7d65fd17baab3881324fe8dea67db1712f460cacecc8291dc4008190557f8a45bbbd2397c1032e26082a8eb39ea5aec8cf926f114a737524f0aff161dcca8190557f0e30f8d530f1ae6825c63b0cede9262098e1e27e68e705815d1bae1307f51f938190557f46d90af8a4cdb7b0a9a1384592dfaab464b26319d477bca364435d1cdfc2016d8190557f54ad29891ef7772c723b90131996196c91e4f61a451ff4aea20f3bede377b0308190557f688fe3c8dddd85b44547772f477a9aa4e7598d1926f164411380dc9bb8c7dd798190557f80982b97ac767be8021d6f91706026312db4e01e6e5bf1cc2c1bc8f1561a7af78190557ff13e5b622e66b6fc752fc624ed414c836870baa8ab8331874d611a86d02876a38190557fcd298a41be8669448732e71ad0516141dbe30870693d583677de736724564e3c8190557fa20f29ccd091f859d2a91ba09a77e4d896ae4c9453002ee85b5ac5a13aa3cf618190557f7342af6678f3d4057701cf82e6cb88cc790cd7948220bd55628f26e91d4336288190557f55ec78eda9e0a53775ccfc59aae968ecfbdb45075207597a58a2c65a87a462b28190557f8325314dfd084143717dd76a87bbe8cfb806708cd90c774711545eaf9621fd278190557f4e97487f0646243d225c629eabb08c4fc5450ca04ab11df387dd7dab4e6a9be48190557f4b6699b6981dd43dd8578f7f06319ec72ce8ef0ec72c9e39a6d11ad504b27e8e8190557f7f2369f520c95d39d47bff3cfe0aa701a198552b34a1c0deb16ec5eb263738fb8190557f492ef6ffedae55124993dab3dd638035e88e46b6c75ef29e9b263626c5d3c8c68190557f3ecdaf9afcfebd0af01b9829317435b27a771a187e2f7c06516ea0fced5d21378190557fd88a027a3cb2a339403583e03d161b528d7570f584e43dd7a6899fb7d0f9bb308190557fe542343d9eb26d3f1722e3a31fce80cc59837171a20b423ac226832fd1e9c9d48190557f6eab41d62a22b94e1fa1f07f12f342535d5b30620bf156c12bc439dcc523fcf18190557f7dbe528c04e5386718b7f54cbda957094e5cb2b13da382d3ad6c86a925f09da18190557fb3391c81f4e44e9ca5fa6d69a2f8905d14ce9b44f6b04fe5285ff4438ba145dc8190557f109e7ba9be12918f71da9a181de212ef5b1f6ef191cd6fa9fec00f449740aeb08190557fb713e111f95876ffef9f441e9fb0dbb40bb3aca14d164d5d1a12bc7949e65b7f8190557f796324f4c625f51850adaff9b1a0dbcd3d25197c68e6a1e03a3f7e187ef07c448190557f83e92ea8bc9a160e0d412960095da445b16e0d280c7dc22a81584d93e7655c388190557fcb3184dc8b40d3b9c7a68f2f0a42b6336486cd92d168cd5eb1698894ee2e67908190557f0706ccba44b13fb57c57879b986b0995fdf1c93f4e5aed82c83ca95df0d971cc8190557f6df6ddb749af6bfd3a052d1d8d90d0b744a9cb1159cf61a6da39454fe0e911df8190557f4f2de68024352ee9322e86ccac9208b994886b1a40f6235a5c7e8c1ca2e15cf08190557fab459a2194ee6d8e9828f8f60bc7f88b17c3ec5b27c97da45369d9e371aecede8190557f92728e06fea4f3aa1c0e3acb04f4dee4c7603dfcb7c0bcb4dc1a86394161efe08190557feb148a2fe41593f432dfd7340bcea4b1be6d607a4785ff4b1f060eeaa2a0ae9a8190557f9332a619cb6cb3edf5832bf1f5956e7315c17f9e45cf7b4752ce9177efb0be9b8190557f1d27b8b35d3b84b163e65ca61a91c5ade2cfc2adcb4ae90e2d0832509e5bc2388190557fb62e3558ce651199bf4adbb27a407d201a0a9f3320eb0ab7c5ff7379f34daf1f8190557fe66843263c21021b23e97e7af4ac886f2d6a5a8591217c9c8deda80ae14213018190557fbbf48c12ffcef11ac112967fb516c1001a2ef9251788d336a3378ef4fa31bce18190557f26d02fb74b91e3e92236154e90c52031837d2eefb7ba3173e99b4eb50b77dfb28190557f5ca27b06d1ffbb6f46c080e6a033c21e0dc04b5e79cb507d18c3482b2589195d8190557f4a923431cad378b662835d10b0659ef1fdf5fbea38f091cfa08f93527b08f6f88190557fedb261d0e629973cb37a7a424a909e2e994f4e08f61153601128b6762f7d2bb58190557fa50d6a179aa1d28dce88135936ca7c6df4e41158be88015ebaea27b77fd903248190557f650145b4b8a6a6ff8ba8746844727b1af5134d7db2b3dbf497e898f232c6b0158190557fa2917bfc65f5174f40152f8c951bbf2000033e2d0871dbc894e3917c4420ff948190557f9a4c5789c572190b4cceefec2e7503112cc5720b53d25460bc66c804e950262c8190557fe2213f7674ac84e5645692fd47ad95f19de100c5b0876c1d9758b86984e9c4cc8190557f98a3cbc885f294016d0462ab69b245779ccc407baf7745f75b28f3f6c9eec6a18190557fce588941f7f02c080f55dda78f07028d2725e9c85ff5e3a9f01297f3766619948190557fbfa3b7b9d4f7bff0027382370bcd9cff9b9b6072b934839f8d53fd80678ac0fd8190557f6869e634e76d29ab949acbc4fffa2a998f4923558d5eb2f951f19b8247a22f808190557fdd40d6e82ff416c2115fbcf348544e49b1c4bb56cc9960c29fdc075a5266c9538190557fd55524f1732f35264316a4e304b8c080abfd12a343443afc2b8b31915beeae518190557f6a640fac144e08e8e4f97757fc93a8e527448ef4820e3a9f42bdaeec5d8b79088190557f5be58e85a74f9a2f7d1c55ea9a88ad8511b942960b6a1979ec49fd813d7897da8190557fb68a29056c9a819e9414740771b757c6cdceefb1fb9cc1012e3daf4de2089d708190557fb738e279fed653daf03dcadf48d2c156aa0bfcdbbaba2cda8ce29fd7e9c9b4898190557f1199a96aef3f6784d14929639a923b2b165a19b42c08a45901692af8cf15bf738190557f421545f3075195392f9366a8229f8f7f4f6e721d5fc43863034dd1791840ebf48190557f40bc6f38fcdab6ffd0f90d626ede89ecc37af6f8b8fd9383bcf14aba992ee1dc8190557f50156cddf37f0bc11ec4201cc8a2efc37bb48e3e0c446162120ca4eb34b1368f819055734e258cc6180e73a69bb0ce18621c8901aed3b7929091527fd97823025eb732edcf6cdcd1c780aa58457f7e21c5738e22aecc825d8c40efa95562005544565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620053fe57607f821691505b6020821081036200541f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200547357600081815260208120601f850160051c810160208610156200544e5750805b601f850160051c820191505b818110156200546f578281556001016200545a565b5050505b505050565b81516001600160401b03811115620054945762005494620053d3565b620054ac81620054a58454620053e9565b8462005425565b602080601f831160018114620054e45760008415620054cb5750858301515b600019600386901b1c1916600185901b1785556200546f565b600085815260208120601f198616915b828110156200551557888601518255948401946001909101908401620054f4565b5085821015620055345787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61173080620055546000396000f3fe60806040526004361061014b5760003560e01c80638456cb59116100b6578063a475b5dd1161006f578063a475b5dd1461036f578063b88d4fde14610384578063c87b56dd14610397578063dc33e681146103b7578063e985e9c5146103e4578063f2fde38b1461040457600080fd5b80638456cb59146102c75780638aaeba6a146102dc5780638da5cb5b1461030957806395d89b4114610327578063a0712d681461033c578063a22cb4651461034f57600080fd5b80633f4ba83a116101085780633f4ba83a1461022a57806342842e0e1461023f57806355f804b3146102525780636352211e1461027257806370a0823114610292578063715018a6146102b257600080fd5b806301ffc9a71461015057806306fdde0314610185578063081812fc146101a7578063095ea7b3146101df57806318160ddd146101f457806323b872dd14610217575b600080fd5b34801561015c57600080fd5b5061017061016b366004611188565b610424565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b5061019a610476565b60405161017c91906111f5565b3480156101b357600080fd5b506101c76101c2366004611208565b610508565b6040516001600160a01b03909116815260200161017c565b6101f26101ed36600461123d565b61054c565b005b34801561020057600080fd5b50600154600054035b60405190815260200161017c565b6101f2610225366004611267565b6105ec565b34801561023657600080fd5b506101f2610785565b6101f261024d366004611267565b61079a565b34801561025e57600080fd5b506101f261026d36600461132f565b6107ba565b34801561027e57600080fd5b506101c761028d366004611208565b6107d2565b34801561029e57600080fd5b506102096102ad366004611378565b6107dd565b3480156102be57600080fd5b506101f261082c565b3480156102d357600080fd5b506101f2610840565b3480156102e857600080fd5b506102096102f7366004611378565b60096020526000908152604090205481565b34801561031557600080fd5b506008546001600160a01b03166101c7565b34801561033357600080fd5b5061019a610859565b6101f261034a366004611208565b610868565b34801561035b57600080fd5b506101f261036a366004611393565b6109b5565b34801561037b57600080fd5b506101f2610a21565b6101f26103923660046113cf565b610a38565b3480156103a357600080fd5b5061019a6103b2366004611208565b610a82565b3480156103c357600080fd5b506102096103d2366004611378565b600a6020526000908152604090205481565b3480156103f057600080fd5b506101706103ff36600461144b565b610c13565b34801561041057600080fd5b506101f261041f366004611378565b610c41565b60006301ffc9a760e01b6001600160e01b03198316148061045557506380ac58cd60e01b6001600160e01b03198316145b806104705750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546104859061147e565b80601f01602080910402602001604051908101604052809291908181526020018280546104b19061147e565b80156104fe5780601f106104d3576101008083540402835291602001916104fe565b820191906000526020600020905b8154815290600101906020018083116104e157829003601f168201915b5050505050905090565b600061051382610cb7565b610530576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610557826107d2565b9050336001600160a01b03821614610590576105738133610c13565b610590576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006105f782610cde565b9050836001600160a01b0316816001600160a01b03161461062a5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176106775761065a8633610c13565b61067757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661069e57604051633a954ecd60e21b815260040160405180910390fd5b80156106a957600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b8416900361073b576001840160008181526004602052604081205490036107395760005481146107395760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b61078d610d45565b600d805461ff0019169055565b6107b583838360405180602001604052806000815250610a38565b505050565b6107c2610d45565b600b6107ce82826114f8565b5050565b600061047082610cde565b60006001600160a01b038216610806576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b610834610d45565b61083e6000610d9f565b565b610848610d45565b600d805461ff001916610100179055565b6060600380546104859061147e565b336000908152600960205260409020548111156108cc5760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420616c6c6f776564206d696e742074686174207175616e74697479000060448201526064015b60405180910390fd5b336000908152600a602052604090205481101561092b5760405162461bcd60e51b815260206004820152601e60248201527f457863656564732063757272656e74206d696e7420616c6c6f77616e6365000060448201526064016108c3565b600d54610100900460ff16156109835760405162461bcd60e51b815260206004820152601b60248201527f4d696e74696e672069732063757272656e746c7920706175736564000000000060448201526064016108c3565b336000908152600a6020526040812080548392906109a29084906115ce565b909155506109b290503382610df1565b50565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610a29610d45565b600d805460ff19166001179055565b610a438484846105ec565b6001600160a01b0383163b15610a7c57610a5f84848484610e0b565b610a7c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610a8d82610cb7565b610af15760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108c3565b6000610afb610ef7565b600d5490915060ff161515600103610b5d576000815111610b2b5760405180602001604052806000815250610b56565b80610b3584610f06565b604051602001610b469291906115e1565b6040516020818303038152906040525b9392505050565b6000815111610b7b5760405180602001604052806000815250610b56565b600c8054610b889061147e565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb49061147e565b8015610c015780601f10610bd657610100808354040283529160200191610c01565b820191906000526020600020905b815481529060010190602001808311610be457829003601f168201915b50505050509392505050565b50919050565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b610c49610d45565b6001600160a01b038116610cae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108c3565b6109b281610d9f565b6000805482108015610470575050600090815260046020526040902054600160e01b161590565b600081600054811015610d2c5760008181526004602052604081205490600160e01b82169003610d2a575b80600003610b56575060001901600081815260046020526040902054610d09565b505b604051636f96cda160e11b815260040160405180910390fd5b6008546001600160a01b0316331461083e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c3565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6107ce828260405180602001604052806000815250611007565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290610e40903390899088908890600401611620565b6020604051808303816000875af1925050508015610e7b575060408051601f3d908101601f19168201909252610e789181019061165d565b60015b610ed9573d808015610ea9576040519150601f19603f3d011682016040523d82523d6000602084013e610eae565b606091505b508051600003610ed1576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600b80546104859061147e565b606081600003610f2d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610f575780610f418161167a565b9150610f509050600a836116a9565b9150610f31565b60008167ffffffffffffffff811115610f7257610f726112a3565b6040519080825280601f01601f191660200182016040528015610f9c576020820181803683370190505b5090505b8415610eef57610fb16001836116bd565b9150610fbe600a866116d0565b610fc99060306115ce565b60f81b818381518110610fde57610fde6116e4565b60200101906001600160f81b031916908160001a905350611000600a866116a9565b9450610fa0565b6110118383611074565b6001600160a01b0383163b156107b5576000548281035b61103b6000868380600101945086610e0b565b611058576040516368d2bf6b60e11b815260040160405180910390fd5b81811061102857816000541461106d57600080fd5b5050505050565b60008054908290036110995760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461114857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611110565b508160000361116957604051622e076360e81b815260040160405180910390fd5b60005550505050565b6001600160e01b0319811681146109b257600080fd5b60006020828403121561119a57600080fd5b8135610b5681611172565b60005b838110156111c05781810151838201526020016111a8565b50506000910152565b600081518084526111e18160208601602086016111a5565b601f01601f19169290920160200192915050565b602081526000610b5660208301846111c9565b60006020828403121561121a57600080fd5b5035919050565b80356001600160a01b038116811461123857600080fd5b919050565b6000806040838503121561125057600080fd5b61125983611221565b946020939093013593505050565b60008060006060848603121561127c57600080fd5b61128584611221565b925061129360208501611221565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156112d4576112d46112a3565b604051601f8501601f19908116603f011681019082821181831017156112fc576112fc6112a3565b8160405280935085815286868601111561131557600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561134157600080fd5b813567ffffffffffffffff81111561135857600080fd5b8201601f8101841361136957600080fd5b610eef848235602084016112b9565b60006020828403121561138a57600080fd5b610b5682611221565b600080604083850312156113a657600080fd5b6113af83611221565b9150602083013580151581146113c457600080fd5b809150509250929050565b600080600080608085870312156113e557600080fd5b6113ee85611221565b93506113fc60208601611221565b925060408501359150606085013567ffffffffffffffff81111561141f57600080fd5b8501601f8101871361143057600080fd5b61143f878235602084016112b9565b91505092959194509250565b6000806040838503121561145e57600080fd5b61146783611221565b915061147560208401611221565b90509250929050565b600181811c9082168061149257607f821691505b602082108103610c0d57634e487b7160e01b600052602260045260246000fd5b601f8211156107b557600081815260208120601f850160051c810160208610156114d95750805b601f850160051c820191505b8181101561077d578281556001016114e5565b815167ffffffffffffffff811115611512576115126112a3565b61152681611520845461147e565b846114b2565b602080601f83116001811461155b57600084156115435750858301515b600019600386901b1c1916600185901b17855561077d565b600085815260208120601f198616915b8281101561158a5788860151825594840194600190910190840161156b565b50858210156115a85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b80820180821115610470576104706115b8565b600083516115f38184602088016111a5565b8351908301906116078183602088016111a5565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611653908301846111c9565b9695505050505050565b60006020828403121561166f57600080fd5b8151610b5681611172565b60006001820161168c5761168c6115b8565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826116b8576116b8611693565b500490565b81810381811115610470576104706115b8565b6000826116df576116df611693565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220a786d895ee715b6240724837efb87a2c38c0d9f8ff3177432b0df0aca09bdfb264736f6c63430008110033697066733a2f2f516d626d743538356f6575757a56526655417135324b5a73325251517342727a5171466b6d434442697359464356697066733a2f2f516d553447366f744a37465961736e796b6571734447654c6857537676755550486d64664a3444737967636158362f

Deployed Bytecode

0x60806040526004361061014b5760003560e01c80638456cb59116100b6578063a475b5dd1161006f578063a475b5dd1461036f578063b88d4fde14610384578063c87b56dd14610397578063dc33e681146103b7578063e985e9c5146103e4578063f2fde38b1461040457600080fd5b80638456cb59146102c75780638aaeba6a146102dc5780638da5cb5b1461030957806395d89b4114610327578063a0712d681461033c578063a22cb4651461034f57600080fd5b80633f4ba83a116101085780633f4ba83a1461022a57806342842e0e1461023f57806355f804b3146102525780636352211e1461027257806370a0823114610292578063715018a6146102b257600080fd5b806301ffc9a71461015057806306fdde0314610185578063081812fc146101a7578063095ea7b3146101df57806318160ddd146101f457806323b872dd14610217575b600080fd5b34801561015c57600080fd5b5061017061016b366004611188565b610424565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b5061019a610476565b60405161017c91906111f5565b3480156101b357600080fd5b506101c76101c2366004611208565b610508565b6040516001600160a01b03909116815260200161017c565b6101f26101ed36600461123d565b61054c565b005b34801561020057600080fd5b50600154600054035b60405190815260200161017c565b6101f2610225366004611267565b6105ec565b34801561023657600080fd5b506101f2610785565b6101f261024d366004611267565b61079a565b34801561025e57600080fd5b506101f261026d36600461132f565b6107ba565b34801561027e57600080fd5b506101c761028d366004611208565b6107d2565b34801561029e57600080fd5b506102096102ad366004611378565b6107dd565b3480156102be57600080fd5b506101f261082c565b3480156102d357600080fd5b506101f2610840565b3480156102e857600080fd5b506102096102f7366004611378565b60096020526000908152604090205481565b34801561031557600080fd5b506008546001600160a01b03166101c7565b34801561033357600080fd5b5061019a610859565b6101f261034a366004611208565b610868565b34801561035b57600080fd5b506101f261036a366004611393565b6109b5565b34801561037b57600080fd5b506101f2610a21565b6101f26103923660046113cf565b610a38565b3480156103a357600080fd5b5061019a6103b2366004611208565b610a82565b3480156103c357600080fd5b506102096103d2366004611378565b600a6020526000908152604090205481565b3480156103f057600080fd5b506101706103ff36600461144b565b610c13565b34801561041057600080fd5b506101f261041f366004611378565b610c41565b60006301ffc9a760e01b6001600160e01b03198316148061045557506380ac58cd60e01b6001600160e01b03198316145b806104705750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546104859061147e565b80601f01602080910402602001604051908101604052809291908181526020018280546104b19061147e565b80156104fe5780601f106104d3576101008083540402835291602001916104fe565b820191906000526020600020905b8154815290600101906020018083116104e157829003601f168201915b5050505050905090565b600061051382610cb7565b610530576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610557826107d2565b9050336001600160a01b03821614610590576105738133610c13565b610590576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006105f782610cde565b9050836001600160a01b0316816001600160a01b03161461062a5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176106775761065a8633610c13565b61067757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661069e57604051633a954ecd60e21b815260040160405180910390fd5b80156106a957600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b8416900361073b576001840160008181526004602052604081205490036107395760005481146107395760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b61078d610d45565b600d805461ff0019169055565b6107b583838360405180602001604052806000815250610a38565b505050565b6107c2610d45565b600b6107ce82826114f8565b5050565b600061047082610cde565b60006001600160a01b038216610806576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b610834610d45565b61083e6000610d9f565b565b610848610d45565b600d805461ff001916610100179055565b6060600380546104859061147e565b336000908152600960205260409020548111156108cc5760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420616c6c6f776564206d696e742074686174207175616e74697479000060448201526064015b60405180910390fd5b336000908152600a602052604090205481101561092b5760405162461bcd60e51b815260206004820152601e60248201527f457863656564732063757272656e74206d696e7420616c6c6f77616e6365000060448201526064016108c3565b600d54610100900460ff16156109835760405162461bcd60e51b815260206004820152601b60248201527f4d696e74696e672069732063757272656e746c7920706175736564000000000060448201526064016108c3565b336000908152600a6020526040812080548392906109a29084906115ce565b909155506109b290503382610df1565b50565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610a29610d45565b600d805460ff19166001179055565b610a438484846105ec565b6001600160a01b0383163b15610a7c57610a5f84848484610e0b565b610a7c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610a8d82610cb7565b610af15760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108c3565b6000610afb610ef7565b600d5490915060ff161515600103610b5d576000815111610b2b5760405180602001604052806000815250610b56565b80610b3584610f06565b604051602001610b469291906115e1565b6040516020818303038152906040525b9392505050565b6000815111610b7b5760405180602001604052806000815250610b56565b600c8054610b889061147e565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb49061147e565b8015610c015780601f10610bd657610100808354040283529160200191610c01565b820191906000526020600020905b815481529060010190602001808311610be457829003601f168201915b50505050509392505050565b50919050565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b610c49610d45565b6001600160a01b038116610cae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108c3565b6109b281610d9f565b6000805482108015610470575050600090815260046020526040902054600160e01b161590565b600081600054811015610d2c5760008181526004602052604081205490600160e01b82169003610d2a575b80600003610b56575060001901600081815260046020526040902054610d09565b505b604051636f96cda160e11b815260040160405180910390fd5b6008546001600160a01b0316331461083e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c3565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6107ce828260405180602001604052806000815250611007565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290610e40903390899088908890600401611620565b6020604051808303816000875af1925050508015610e7b575060408051601f3d908101601f19168201909252610e789181019061165d565b60015b610ed9573d808015610ea9576040519150601f19603f3d011682016040523d82523d6000602084013e610eae565b606091505b508051600003610ed1576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600b80546104859061147e565b606081600003610f2d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610f575780610f418161167a565b9150610f509050600a836116a9565b9150610f31565b60008167ffffffffffffffff811115610f7257610f726112a3565b6040519080825280601f01601f191660200182016040528015610f9c576020820181803683370190505b5090505b8415610eef57610fb16001836116bd565b9150610fbe600a866116d0565b610fc99060306115ce565b60f81b818381518110610fde57610fde6116e4565b60200101906001600160f81b031916908160001a905350611000600a866116a9565b9450610fa0565b6110118383611074565b6001600160a01b0383163b156107b5576000548281035b61103b6000868380600101945086610e0b565b611058576040516368d2bf6b60e11b815260040160405180910390fd5b81811061102857816000541461106d57600080fd5b5050505050565b60008054908290036110995760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461114857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611110565b508160000361116957604051622e076360e81b815260040160405180910390fd5b60005550505050565b6001600160e01b0319811681146109b257600080fd5b60006020828403121561119a57600080fd5b8135610b5681611172565b60005b838110156111c05781810151838201526020016111a8565b50506000910152565b600081518084526111e18160208601602086016111a5565b601f01601f19169290920160200192915050565b602081526000610b5660208301846111c9565b60006020828403121561121a57600080fd5b5035919050565b80356001600160a01b038116811461123857600080fd5b919050565b6000806040838503121561125057600080fd5b61125983611221565b946020939093013593505050565b60008060006060848603121561127c57600080fd5b61128584611221565b925061129360208501611221565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156112d4576112d46112a3565b604051601f8501601f19908116603f011681019082821181831017156112fc576112fc6112a3565b8160405280935085815286868601111561131557600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561134157600080fd5b813567ffffffffffffffff81111561135857600080fd5b8201601f8101841361136957600080fd5b610eef848235602084016112b9565b60006020828403121561138a57600080fd5b610b5682611221565b600080604083850312156113a657600080fd5b6113af83611221565b9150602083013580151581146113c457600080fd5b809150509250929050565b600080600080608085870312156113e557600080fd5b6113ee85611221565b93506113fc60208601611221565b925060408501359150606085013567ffffffffffffffff81111561141f57600080fd5b8501601f8101871361143057600080fd5b61143f878235602084016112b9565b91505092959194509250565b6000806040838503121561145e57600080fd5b61146783611221565b915061147560208401611221565b90509250929050565b600181811c9082168061149257607f821691505b602082108103610c0d57634e487b7160e01b600052602260045260246000fd5b601f8211156107b557600081815260208120601f850160051c810160208610156114d95750805b601f850160051c820191505b8181101561077d578281556001016114e5565b815167ffffffffffffffff811115611512576115126112a3565b61152681611520845461147e565b846114b2565b602080601f83116001811461155b57600084156115435750858301515b600019600386901b1c1916600185901b17855561077d565b600085815260208120601f198616915b8281101561158a5788860151825594840194600190910190840161156b565b50858210156115a85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b80820180821115610470576104706115b8565b600083516115f38184602088016111a5565b8351908301906116078183602088016111a5565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611653908301846111c9565b9695505050505050565b60006020828403121561166f57600080fd5b8151610b5681611172565b60006001820161168c5761168c6115b8565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826116b8576116b8611693565b500490565b81810381811115610470576104706115b8565b6000826116df576116df611693565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220a786d895ee715b6240724837efb87a2c38c0d9f8ff3177432b0df0aca09bdfb264736f6c63430008110033

Deployed Bytecode Sourcemap

57623:42503:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24494:639;;;;;;;;;;-1:-1:-1;24494:639:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;24494:639:0;;;;;;;;25396:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31887:218::-;;;;;;;;;;-1:-1:-1;31887:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;31887:218:0;1533:203:1;31320:408:0;;;;;;:::i;:::-;;:::i;:::-;;21147:323;;;;;;;;;;-1:-1:-1;21421:12:0;;21208:7;21405:13;:28;21147:323;;;2324:25:1;;;2312:2;2297:18;21147:323:0;2178:177:1;35526:2825:0;;;;;;:::i;:::-;;:::i;99549:72::-;;;;;;;;;;;;;:::i;38447:193::-;;;;;;:::i;:::-;;:::i;98696:111::-;;;;;;;;;;-1:-1:-1;98696:111:0;;;;;:::i;:::-;;:::i;26789:152::-;;;;;;;;;;-1:-1:-1;26789:152:0;;;;;:::i;:::-;;:::i;22331:233::-;;;;;;;;;;-1:-1:-1;22331:233:0;;;;;:::i;:::-;;:::i;5273:103::-;;;;;;;;;;;;;:::i;99461:76::-;;;;;;;;;;;;;:::i;57700:43::-;;;;;;;;;;-1:-1:-1;57700:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;4625:87;;;;;;;;;;-1:-1:-1;4698:6:0;;-1:-1:-1;;;;;4698:6:0;4625:87;;25572:104;;;;;;;;;;;;;:::i;98943:406::-;;;;;;:::i;:::-;;:::i;32445:234::-;;;;;;;;;;-1:-1:-1;32445:234:0;;;;;:::i;:::-;;:::i;99366:76::-;;;;;;;;;;;;;:::i;39238:407::-;;;;;;:::i;:::-;;:::i;99633:484::-;;;;;;;;;;-1:-1:-1;99633:484:0;;;;;:::i;:::-;;:::i;57750:45::-;;;;;;;;;;-1:-1:-1;57750:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;32836:164;;;;;;;;;;-1:-1:-1;32836:164:0;;;;;:::i;:::-;;:::i;5531:201::-;;;;;;;;;;-1:-1:-1;5531:201:0;;;;;:::i;:::-;;:::i;24494:639::-;24579:4;-1:-1:-1;;;;;;;;;24903:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;24980:25:0;;;24903:102;:179;;;-1:-1:-1;;;;;;;;;;25057:25:0;;;24903:179;24883:199;24494:639;-1:-1:-1;;24494:639:0:o;25396:100::-;25450:13;25483:5;25476:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25396:100;:::o;31887:218::-;31963:7;31988:16;31996:7;31988;:16::i;:::-;31983:64;;32013:34;;-1:-1:-1;;;32013:34:0;;;;;;;;;;;31983:64;-1:-1:-1;32067:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;32067:30:0;;31887:218::o;31320:408::-;31409:13;31425:16;31433:7;31425;:16::i;:::-;31409:32;-1:-1:-1;55653:10:0;-1:-1:-1;;;;;31458:28:0;;;31454:175;;31506:44;31523:5;55653:10;32836:164;:::i;31506:44::-;31501:128;;31578:35;;-1:-1:-1;;;31578:35:0;;;;;;;;;;;31501:128;31641:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;31641:35:0;-1:-1:-1;;;;;31641:35:0;;;;;;;;;31692:28;;31641:24;;31692:28;;;;;;;31398:330;31320:408;;:::o;35526:2825::-;35668:27;35698;35717:7;35698:18;:27::i;:::-;35668:57;;35783:4;-1:-1:-1;;;;;35742:45:0;35758:19;-1:-1:-1;;;;;35742:45:0;;35738:86;;35796:28;;-1:-1:-1;;;35796:28:0;;;;;;;;;;;35738:86;35838:27;34634:24;;;:15;:24;;;;;34862:26;;55653:10;34259:30;;;-1:-1:-1;;;;;33952:28:0;;34237:20;;;34234:56;36024:180;;36117:43;36134:4;55653:10;32836:164;:::i;36117:43::-;36112:92;;36169:35;;-1:-1:-1;;;36169:35:0;;;;;;;;;;;36112:92;-1:-1:-1;;;;;36221:16:0;;36217:52;;36246:23;;-1:-1:-1;;;36246:23:0;;;;;;;;;;;36217:52;36418:15;36415:160;;;36558:1;36537:19;36530:30;36415:160;-1:-1:-1;;;;;36955:24:0;;;;;;;:18;:24;;;;;;36953:26;;-1:-1:-1;;36953:26:0;;;37024:22;;;;;;;;;37022:24;;-1:-1:-1;37022:24:0;;;30178:11;30153:23;30149:41;30136:63;-1:-1:-1;;;30136:63:0;37317:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;37612:47:0;;:52;;37608:627;;37717:1;37707:11;;37685:19;37840:30;;;:17;:30;;;;;;:35;;37836:384;;37978:13;;37963:11;:28;37959:242;;38125:30;;;;:17;:30;;;;;:52;;;37959:242;37666:569;37608:627;38282:7;38278:2;-1:-1:-1;;;;;38263:27:0;38272:4;-1:-1:-1;;;;;38263:27:0;;;;;;;;;;;38301:42;35657:2694;;;35526:2825;;;:::o;99549:72::-;4511:13;:11;:13::i;:::-;99598:6:::1;:14:::0;;-1:-1:-1;;99598:14:0::1;::::0;;99549:72::o;38447:193::-;38593:39;38610:4;38616:2;38620:7;38593:39;;;;;;;;;;;;:16;:39::i;:::-;38447:193;;;:::o;98696:111::-;4511:13;:11;:13::i;:::-;98772:16:::1;:27;98791:8:::0;98772:16;:27:::1;:::i;:::-;;98696:111:::0;:::o;26789:152::-;26861:7;26904:27;26923:7;26904:18;:27::i;22331:233::-;22403:7;-1:-1:-1;;;;;22427:19:0;;22423:60;;22455:28;;-1:-1:-1;;;22455:28:0;;;;;;;;;;;22423:60;-1:-1:-1;;;;;;22501:25:0;;;;;:18;:25;;;;;;16490:13;22501:55;;22331:233::o;5273:103::-;4511:13;:11;:13::i;:::-;5338:30:::1;5365:1;5338:18;:30::i;:::-;5273:103::o:0;99461:76::-;4511:13;:11;:13::i;:::-;99508:6:::1;:13:::0;;-1:-1:-1;;99508:13:0::1;;;::::0;;99461:76::o;25572:104::-;25628:13;25661:7;25654:14;;;;;:::i;98943:406::-;99036:10;99025:22;;;;:10;:22;;;;;;99013:34;;;99005:77;;;;-1:-1:-1;;;99005:77:0;;8189:2:1;99005:77:0;;;8171:21:1;8228:2;8208:18;;;8201:30;8267:32;8247:18;;;8240:60;8317:18;;99005:77:0;;;;;;;;;99114:10;99101:24;;;;:12;:24;;;;;;:36;-1:-1:-1;99101:36:0;99093:79;;;;-1:-1:-1;;;99093:79:0;;8548:2:1;99093:79:0;;;8530:21:1;8587:2;8567:18;;;8560:30;8626:32;8606:18;;;8599:60;8676:18;;99093:79:0;8346:354:1;99093:79:0;99191:6;;;;;;;:15;99183:55;;;;-1:-1:-1;;;99183:55:0;;8907:2:1;99183:55:0;;;8889:21:1;8946:2;8926:18;;;8919:30;8985:29;8965:18;;;8958:57;9032:18;;99183:55:0;8705:351:1;99183:55:0;99262:10;99249:24;;;;:12;:24;;;;;:36;;99277:8;;99249:24;:36;;99277:8;;99249:36;:::i;:::-;;;;-1:-1:-1;99296:31:0;;-1:-1:-1;99306:10:0;99318:8;99296:9;:31::i;:::-;98943:406;:::o;32445:234::-;55653:10;32540:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;32540:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;32540:60:0;;;;;;;;;;32616:55;;540:41:1;;;32540:49:0;;55653:10;32616:55;;513:18:1;32616:55:0;;;;;;;32445:234;;:::o;99366:76::-;4511:13;:11;:13::i;:::-;99419:8:::1;:15:::0;;-1:-1:-1;;99419:15:0::1;99430:4;99419:15;::::0;;99366:76::o;39238:407::-;39413:31;39426:4;39432:2;39436:7;39413:12;:31::i;:::-;-1:-1:-1;;;;;39459:14:0;;;:19;39455:183;;39498:56;39529:4;39535:2;39539:7;39548:5;39498:30;:56::i;:::-;39493:145;;39582:40;;-1:-1:-1;;;39582:40:0;;;;;;;;;;;39493:145;39238:407;;;;:::o;99633:484::-;99706:13;99740:16;99748:7;99740;:16::i;:::-;99732:76;;;;-1:-1:-1;;;99732:76:0;;9525:2:1;99732:76:0;;;9507:21:1;9564:2;9544:18;;;9537:30;9603:34;9583:18;;;9576:62;-1:-1:-1;;;9654:18:1;;;9647:45;9709:19;;99732:76:0;9323:411:1;99732:76:0;99821:21;99845:10;:8;:10::i;:::-;99869:8;;99821:34;;-1:-1:-1;99869:8:0;;:16;;:8;:16;99866:244;;99933:1;99915:7;99909:21;:25;:103;;;;;;;;;;;;;;;;;99962:7;99971:25;99988:7;99971:16;:25::i;:::-;99945:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;99909:103;99902:110;99633:484;-1:-1:-1;;;99633:484:0:o;99866:244::-;100074:1;100056:7;100050:21;:25;:48;;;;;;;;;;;;;;;;;100078:15;100050:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100043:55;99633:484;-1:-1:-1;;;99633:484:0:o;99866:244::-;99721:396;99633:484;;;:::o;32836:164::-;-1:-1:-1;;;;;32957:25:0;;;32933:4;32957:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32836:164::o;5531:201::-;4511:13;:11;:13::i;:::-;-1:-1:-1;;;;;5620:22:0;::::1;5612:73;;;::::0;-1:-1:-1;;;5612:73:0;;10609:2:1;5612:73:0::1;::::0;::::1;10591:21:1::0;10648:2;10628:18;;;10621:30;10687:34;10667:18;;;10660:62;-1:-1:-1;;;10738:18:1;;;10731:36;10784:19;;5612:73:0::1;10407:402:1::0;5612:73:0::1;5696:28;5715:8;5696:18;:28::i;33258:282::-:0;33323:4;33413:13;;33403:7;:23;33360:153;;;;-1:-1:-1;;33464:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;33464:44:0;:49;;33258:282::o;27944:1275::-;28011:7;28046;28148:13;;28141:4;:20;28137:1015;;;28186:14;28203:23;;;:17;:23;;;;;;;-1:-1:-1;;;28292:24:0;;:29;;28288:845;;28957:113;28964:6;28974:1;28964:11;28957:113;;-1:-1:-1;;;29035:6:0;29017:25;;;;:17;:25;;;;;;28957:113;;28288:845;28163:989;28137:1015;29180:31;;-1:-1:-1;;;29180:31:0;;;;;;;;;;;4790:132;4698:6;;-1:-1:-1;;;;;4698:6:0;55653:10;4854:23;4846:68;;;;-1:-1:-1;;;4846:68:0;;11016:2:1;4846:68:0;;;10998:21:1;;;11035:18;;;11028:30;11094:34;11074:18;;;11067:62;11146:18;;4846:68:0;10814:356:1;5892:191:0;5985:6;;;-1:-1:-1;;;;;6002:17:0;;;-1:-1:-1;;;;;;6002:17:0;;;;;;;6035:40;;5985:6;;;6002:17;5985:6;;6035:40;;5966:16;;6035:40;5955:128;5892:191;:::o;49398:112::-;49475:27;49485:2;49489:8;49475:27;;;;;;;;;;;;:9;:27::i;41729:716::-;41913:88;;-1:-1:-1;;;41913:88:0;;41892:4;;-1:-1:-1;;;;;41913:45:0;;;;;:88;;55653:10;;41980:4;;41986:7;;41995:5;;41913:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41913:88:0;;;;;;;;-1:-1:-1;;41913:88:0;;;;;;;;;;;;:::i;:::-;;;41909:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42196:6;:13;42213:1;42196:18;42192:235;;42242:40;;-1:-1:-1;;;42242:40:0;;;;;;;;;;;42192:235;42385:6;42379:13;42370:6;42366:2;42362:15;42355:38;41909:529;-1:-1:-1;;;;;;42072:64:0;-1:-1:-1;;;42072:64:0;;-1:-1:-1;41909:529:0;41729:716;;;;;;:::o;98816:117::-;98876:13;98909:16;98902:23;;;;;:::i;430:723::-;486:13;707:5;716:1;707:10;703:53;;-1:-1:-1;;734:10:0;;;;;;;;;;;;-1:-1:-1;;;734:10:0;;;;;430:723::o;703:53::-;781:5;766:12;822:78;829:9;;822:78;;855:8;;;;:::i;:::-;;-1:-1:-1;878:10:0;;-1:-1:-1;886:2:0;878:10;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;932:17:0;;910:39;;960:154;967:10;;960:154;;994:11;1004:1;994:11;;:::i;:::-;;-1:-1:-1;1063:10:0;1071:2;1063:5;:10;:::i;:::-;1050:24;;:2;:24;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1020:56:0;;;;;;;;-1:-1:-1;1091:11:0;1100:2;1091:11;;:::i;:::-;;;960:154;;48625:689;48756:19;48762:2;48766:8;48756:5;:19::i;:::-;-1:-1:-1;;;;;48817:14:0;;;:19;48813:483;;48857:11;48871:13;48919:14;;;48952:233;48983:62;49022:1;49026:2;49030:7;;;;;;49039:5;48983:30;:62::i;:::-;48978:167;;49081:40;;-1:-1:-1;;;49081:40:0;;;;;;;;;;;48978:167;49180:3;49172:5;:11;48952:233;;49267:3;49250:13;;:20;49246:34;;49272:8;;;49246:34;48838:458;;48625:689;;;:::o;42907:2966::-;42980:20;43003:13;;;43031;;;43027:44;;43053:18;;-1:-1:-1;;;43053:18:0;;;;;;;;;;;43027:44;-1:-1:-1;;;;;43559:22:0;;;;;;:18;:22;;;;16628:2;43559:22;;;:71;;43597:32;43585:45;;43559:71;;;43873:31;;;:17;:31;;;;;-1:-1:-1;30609:15:0;;30583:24;30579:46;30178:11;30153:23;30149:41;30146:52;30136:63;;43873:173;;44108:23;;;;43873:31;;43559:22;;44873:25;43559:22;;44726:335;45387:1;45373:12;45369:20;45327:346;45428:3;45419:7;45416:16;45327:346;;45646:7;45636:8;45633:1;45606:25;45603:1;45600;45595:59;45481:1;45468:15;45327:346;;;45331:77;45706:8;45718:1;45706:13;45702:45;;45728:19;;-1:-1:-1;;;45728:19:0;;;;;;;;;;;45702:45;45764:13;:19;-1:-1:-1;38447:193:0;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:328::-;2437:6;2445;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2545:29;2564:9;2545:29;:::i;:::-;2535:39;;2593:38;2627:2;2616:9;2612:18;2593:38;:::i;:::-;2583:48;;2678:2;2667:9;2663:18;2650:32;2640:42;;2360:328;;;;;:::o;2693:127::-;2754:10;2749:3;2745:20;2742:1;2735:31;2785:4;2782:1;2775:15;2809:4;2806:1;2799:15;2825:632;2890:5;2920:18;2961:2;2953:6;2950:14;2947:40;;;2967:18;;:::i;:::-;3042:2;3036:9;3010:2;3096:15;;-1:-1:-1;;3092:24:1;;;3118:2;3088:33;3084:42;3072:55;;;3142:18;;;3162:22;;;3139:46;3136:72;;;3188:18;;:::i;:::-;3228:10;3224:2;3217:22;3257:6;3248:15;;3287:6;3279;3272:22;3327:3;3318:6;3313:3;3309:16;3306:25;3303:45;;;3344:1;3341;3334:12;3303:45;3394:6;3389:3;3382:4;3374:6;3370:17;3357:44;3449:1;3442:4;3433:6;3425;3421:19;3417:30;3410:41;;;;2825:632;;;;;:::o;3462:451::-;3531:6;3584:2;3572:9;3563:7;3559:23;3555:32;3552:52;;;3600:1;3597;3590:12;3552:52;3640:9;3627:23;3673:18;3665:6;3662:30;3659:50;;;3705:1;3702;3695:12;3659:50;3728:22;;3781:4;3773:13;;3769:27;-1:-1:-1;3759:55:1;;3810:1;3807;3800:12;3759:55;3833:74;3899:7;3894:2;3881:16;3876:2;3872;3868:11;3833:74;:::i;3918:186::-;3977:6;4030:2;4018:9;4009:7;4005:23;4001:32;3998:52;;;4046:1;4043;4036:12;3998:52;4069:29;4088:9;4069:29;:::i;4109:347::-;4174:6;4182;4235:2;4223:9;4214:7;4210:23;4206:32;4203:52;;;4251:1;4248;4241:12;4203:52;4274:29;4293:9;4274:29;:::i;:::-;4264:39;;4353:2;4342:9;4338:18;4325:32;4400:5;4393:13;4386:21;4379:5;4376:32;4366:60;;4422:1;4419;4412:12;4366:60;4445:5;4435:15;;;4109:347;;;;;:::o;4461:667::-;4556:6;4564;4572;4580;4633:3;4621:9;4612:7;4608:23;4604:33;4601:53;;;4650:1;4647;4640:12;4601:53;4673:29;4692:9;4673:29;:::i;:::-;4663:39;;4721:38;4755:2;4744:9;4740:18;4721:38;:::i;:::-;4711:48;;4806:2;4795:9;4791:18;4778:32;4768:42;;4861:2;4850:9;4846:18;4833:32;4888:18;4880:6;4877:30;4874:50;;;4920:1;4917;4910:12;4874:50;4943:22;;4996:4;4988:13;;4984:27;-1:-1:-1;4974:55:1;;5025:1;5022;5015:12;4974:55;5048:74;5114:7;5109:2;5096:16;5091:2;5087;5083:11;5048:74;:::i;:::-;5038:84;;;4461:667;;;;;;;:::o;5133:260::-;5201:6;5209;5262:2;5250:9;5241:7;5237:23;5233:32;5230:52;;;5278:1;5275;5268:12;5230:52;5301:29;5320:9;5301:29;:::i;:::-;5291:39;;5349:38;5383:2;5372:9;5368:18;5349:38;:::i;:::-;5339:48;;5133:260;;;;;:::o;5398:380::-;5477:1;5473:12;;;;5520;;;5541:61;;5595:4;5587:6;5583:17;5573:27;;5541:61;5648:2;5640:6;5637:14;5617:18;5614:38;5611:161;;5694:10;5689:3;5685:20;5682:1;5675:31;5729:4;5726:1;5719:15;5757:4;5754:1;5747:15;5909:545;6011:2;6006:3;6003:11;6000:448;;;6047:1;6072:5;6068:2;6061:17;6117:4;6113:2;6103:19;6187:2;6175:10;6171:19;6168:1;6164:27;6158:4;6154:38;6223:4;6211:10;6208:20;6205:47;;;-1:-1:-1;6246:4:1;6205:47;6301:2;6296:3;6292:12;6289:1;6285:20;6279:4;6275:31;6265:41;;6356:82;6374:2;6367:5;6364:13;6356:82;;;6419:17;;;6400:1;6389:13;6356:82;;6630:1352;6756:3;6750:10;6783:18;6775:6;6772:30;6769:56;;;6805:18;;:::i;:::-;6834:97;6924:6;6884:38;6916:4;6910:11;6884:38;:::i;:::-;6878:4;6834:97;:::i;:::-;6986:4;;7050:2;7039:14;;7067:1;7062:663;;;;7769:1;7786:6;7783:89;;;-1:-1:-1;7838:19:1;;;7832:26;7783:89;-1:-1:-1;;6587:1:1;6583:11;;;6579:24;6575:29;6565:40;6611:1;6607:11;;;6562:57;7885:81;;7032:944;;7062:663;5856:1;5849:14;;;5893:4;5880:18;;-1:-1:-1;;7098:20:1;;;7216:236;7230:7;7227:1;7224:14;7216:236;;;7319:19;;;7313:26;7298:42;;7411:27;;;;7379:1;7367:14;;;;7246:19;;7216:236;;;7220:3;7480:6;7471:7;7468:19;7465:201;;;7541:19;;;7535:26;-1:-1:-1;;7624:1:1;7620:14;;;7636:3;7616:24;7612:37;7608:42;7593:58;7578:74;;7465:201;-1:-1:-1;;;;;7712:1:1;7696:14;;;7692:22;7679:36;;-1:-1:-1;6630:1352:1:o;9061:127::-;9122:10;9117:3;9113:20;9110:1;9103:31;9153:4;9150:1;9143:15;9177:4;9174:1;9167:15;9193:125;9258:9;;;9279:10;;;9276:36;;;9292:18;;:::i;9739:663::-;10019:3;10057:6;10051:13;10073:66;10132:6;10127:3;10120:4;10112:6;10108:17;10073:66;:::i;:::-;10202:13;;10161:16;;;;10224:70;10202:13;10161:16;10271:4;10259:17;;10224:70;:::i;:::-;-1:-1:-1;;;10316:20:1;;10345:22;;;10394:1;10383:13;;9739:663;-1:-1:-1;;;;9739:663:1:o;11175:489::-;-1:-1:-1;;;;;11444:15:1;;;11426:34;;11496:15;;11491:2;11476:18;;11469:43;11543:2;11528:18;;11521:34;;;11591:3;11586:2;11571:18;;11564:31;;;11369:4;;11612:46;;11638:19;;11630:6;11612:46;:::i;:::-;11604:54;11175:489;-1:-1:-1;;;;;;11175:489:1:o;11669:249::-;11738:6;11791:2;11779:9;11770:7;11766:23;11762:32;11759:52;;;11807:1;11804;11797:12;11759:52;11839:9;11833:16;11858:30;11882:5;11858:30;:::i;11923:135::-;11962:3;11983:17;;;11980:43;;12003:18;;:::i;:::-;-1:-1:-1;12050:1:1;12039:13;;11923:135::o;12063:127::-;12124:10;12119:3;12115:20;12112:1;12105:31;12155:4;12152:1;12145:15;12179:4;12176:1;12169:15;12195:120;12235:1;12261;12251:35;;12266:18;;:::i;:::-;-1:-1:-1;12300:9:1;;12195:120::o;12320:128::-;12387:9;;;12408:11;;;12405:37;;;12422:18;;:::i;12453:112::-;12485:1;12511;12501:35;;12516:18;;:::i;:::-;-1:-1:-1;12550:9:1;;12453:112::o;12570:127::-;12631:10;12626:3;12622:20;12619:1;12612:31;12662:4;12659:1;12652:15;12686:4;12683:1;12676:15

Swarm Source

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