ETH Price: $3,485.95 (+1.96%)
Gas: 12 Gwei

Token

Cocktails (COCKTAIL)
 

Overview

Max Total Supply

6,969 COCKTAIL

Holders

660

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
mdrfkr.eth
Balance
71 COCKTAIL
0x60314c86b99a2a108e5097fc2688aa1e3c30be30
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:
Cocktails

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-31
*/

/**
 *Submitted for verification at Etherscan.io on 2022-02-21
*/

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @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
    ) external;

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @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);
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// 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/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

    /**
     * @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, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @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 (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

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


// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 1;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // 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 ownershipOf implementation for details.
  mapping(uint256 => TokenOwnership) private _ownerships;

  // Mapping owner address to address data
  mapping(address => AddressData) private _addressData;

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

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

  /**
   * @dev
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

  /**
   * @dev See {IERC721Enumerable-totalSupply}.
   */
  function totalSupply() public view override returns (uint256) {
    return currentIndex;
  }

  /**
   * @dev See {IERC721Enumerable-tokenByIndex}.
   */
  function tokenByIndex(uint256 index) public view override returns (uint256) {
    require(index < totalSupply(), "ERC721A: global index out of bounds");
    return index;
  }

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

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

  /**
   * @dev See {IERC721-balanceOf}.
   */
  function balanceOf(address owner) public view override returns (uint256) {
    require(owner != address(0), "ERC721A: balance query for the zero address");
    return uint256(_addressData[owner].balance);
  }

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }

    revert("ERC721A: unable to determine the owner of token");
  }

  /**
   * @dev See {IERC721-ownerOf}.
   */
  function ownerOf(uint256 tokenId) public view override returns (address) {
    return ownershipOf(tokenId).addr;
  }

  /**
   * @dev See {IERC721Metadata-name}.
   */
  function name() public view virtual override returns (string memory) {
    return _name;
  }

  /**
   * @dev See {IERC721Metadata-symbol}.
   */
  function symbol() public view virtual override returns (string memory) {
    return _symbol;
  }

  /**
   * @dev See {IERC721Metadata-tokenURI}.
   */
  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

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

  /**
   * @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, can be overriden in child contracts.
   */
  function _baseURI() internal view virtual returns (string memory) {
    return "";
  }

  /**
   * @dev See {IERC721-approve}.
   */
  function approve(address to, uint256 tokenId) public override {
    address owner = ERC721A.ownerOf(tokenId);
    require(to != owner, "ERC721A: approval to current owner");

    require(
      _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
      "ERC721A: approve caller is not owner nor approved for all"
    );

    _approve(to, tokenId, owner);
  }

  /**
   * @dev See {IERC721-getApproved}.
   */
  function getApproved(uint256 tokenId) public view override returns (address) {
    require(_exists(tokenId), "ERC721A: approved query for nonexistent token");

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721A: approve to caller");

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

  /**
   * @dev See {IERC721-isApprovedForAll}.
   */
  function isApprovedForAll(address owner, address operator)
    public
    view
    virtual
    override
    returns (bool)
  {
    return _operatorApprovals[owner][operator];
  }

  /**
   * @dev See {IERC721-transferFrom}.
   */
  function transferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public override {
    _transfer(from, to, tokenId);
  }

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public override {
    safeTransferFrom(from, to, tokenId, "");
  }

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: transfer to non ERC721Receiver implementer"
    );
  }

  /**
   * @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 (`_mint`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

  function _safeMint(address to, uint256 quantity) internal {
    _safeMint(to, quantity, "");
  }

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

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

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `tokenId` token must be owned by `from`.
   *
   * Emits a {Transfer} event.
   */
  function _transfer(
    address from,
    address to,
    uint256 tokenId
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721A: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

    // Clear approvals from the previous owner
    _approve(address(0), tokenId, prevOwnership.addr);

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

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

  /**
   * @dev Approve `to` to operate on `tokenId`
   *
   * Emits a {Approval} event.
   */
  function _approve(
    address to,
    uint256 tokenId,
    address owner
  ) private {
    _tokenApprovals[tokenId] = to;
    emit Approval(owner, to, tokenId);
  }

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

  /**
   * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
   * The call is not executed if the target address is not a contract.
   *
   * @param from address representing the previous owner of the given token ID
   * @param to target address that will receive the tokens
   * @param tokenId uint256 ID of the token to be transferred
   * @param _data bytes optional data to send along with the call
   * @return bool whether the call correctly returned the expected magic value
   */
  function _checkOnERC721Received(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) private returns (bool) {
    if (to.isContract()) {
      try
        IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
      returns (bytes4 retval) {
        return retval == IERC721Receiver(to).onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721A: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * 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`.
   */
  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.
   *
   * 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` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}

/*
 *  Claim reserved NFTs 
 *  Created by entertainm.io
 */

pragma solidity ^0.8.0;

abstract contract CocktailClaimer {
    
    mapping( address => uint256 ) public stakerReserveLog;
    
    constructor() {
        setStakerAccess();
    }
    
    function setStakerAccess() internal {
      stakerReserveLog[ address(0x05a7a6234699399f0151D151D541E2c78B539683)  ] = 303;
      stakerReserveLog[ address(0x61481241bfB332757F02AF23FdC4655B555Bf9B2)  ] = 276;
      stakerReserveLog[ address(0xee6443d4eaeC0F72C721F7a714576DcF957fd67F)  ] = 210;
      stakerReserveLog[ address(0x642b339dff1B16efc62cC6c4EEC570307630E7ff)  ] = 145;
      stakerReserveLog[ address(0xc67452f4a50667f752cF41F5477488f8f5aA6B67)  ] = 100;
      stakerReserveLog[ address(0xa651b9E7d79d98cB07910Edd3e7952ebbD961f63)  ] = 92;
      stakerReserveLog[ address(0x4cBD07e1b723eC2334c5c33dFC92DA94cbF8994C)  ] = 88;
      stakerReserveLog[ address(0x8537BeFc73f2a8e3f8dB3a2314105A9F78528897)  ] = 85;
      stakerReserveLog[ address(0xfC6FcCD05A4e82C787888D9597C29527bf7310EF)  ] = 84;
      stakerReserveLog[ address(0x962Fb10CBE3E16757bFDef1863e277255a42D633)  ] = 80;
      stakerReserveLog[ address(0x3A6e48a9715AaDe7BC6b69aF435114721F9f6FE4)  ] = 78;
      stakerReserveLog[ address(0x61E1c9393CF4315638357BeCc8c75e5104EC2f01)  ] = 76;
      stakerReserveLog[ address(0x962Fb10CBE3E16757bFDef1863e277255a42D633)  ] = 73;
      stakerReserveLog[ address(0x8a305afD6521624dbd733FE41BD8Dd0Bb1eccB78)  ] = 73;
      stakerReserveLog[ address(0xF17f3Aa92518bAAA22C6cEC81744Dbb52321A4dD)  ] = 71;
      stakerReserveLog[ address(0xa8cAe97E267C10Ec56acfd9b808A284df3C4b00C)  ] = 70;
      stakerReserveLog[ address(0xd14543Be408f93559dc3017747797A5Ed251f825)  ] = 70;
      stakerReserveLog[ address(0x60314c86B99a2a108E5097fc2688AA1E3c30Be30)  ] = 68;
      stakerReserveLog[ address(0xBC54d698C48f8Da2531cC68F9Ca38aD27a1BDA4E)  ] = 68;
      stakerReserveLog[ address(0xAD4F5c944c49675cf275d8C674d9696b68B5D66D)  ] = 67;
      stakerReserveLog[ address(0x5874D43f23CafDebe7c9D913607dED8208Ed0AfA)  ] = 65;
      stakerReserveLog[ address(0xFCBE0C7c07fff72a3DCBfE69fe177515D6b5d926)  ] = 65;
      stakerReserveLog[ address(0x67eb29ED8C67C98575dD9cd49FdcE25B1218a5EE)  ] = 61;
      stakerReserveLog[ address(0x71F494b08dF932C87252B1129C24B45A5E77A9c6)  ] = 61;
      stakerReserveLog[ address(0xCA779fb29e1168321312a22CC0099BF910081F8f)  ] = 60;
      stakerReserveLog[ address(0x91F9068A506AcD5fD93399484f7D505733e65ba5)  ] = 60;
      stakerReserveLog[ address(0xc4795879b02091EDC192642A463d76A49D8CB4a6)  ] = 59;
      stakerReserveLog[ address(0xCcC596132a67c67915493BCCC9edE57fBcf64944)  ] = 56;
      stakerReserveLog[ address(0x1cf6f1A13084c8FBb750049Ed85C1FB2026792CE)  ] = 55;
      stakerReserveLog[ address(0x4505D32D3A6E42C3c9634FFa6E9a1925eD006b6d)  ] = 54;
      stakerReserveLog[ address(0x5791Aa30053389A755eB4D3D2b6Fbf4B3eBa927B)  ] = 54;
      stakerReserveLog[ address(0xA5f8756147A4ebFB40Bd32f4c789534B9Fc1E017)  ] = 53;
      stakerReserveLog[ address(0x1AC0475be8cBd5c6E547Eb5e71cDB223223a4b70)  ] = 52;
      stakerReserveLog[ address(0x0e279033eA931f98908cc52E1ABFCa60118CAeBA)  ] = 51;
      stakerReserveLog[ address(0x0c187Bc2DCcc26eD234a05e42801FA4E864Cf225)  ] = 50;
      stakerReserveLog[ address(0x86059d01E0C19e4fFb60b640D70C8bDF70082517)  ] = 49;
      stakerReserveLog[ address(0x67360FbbF936d0a16A718D136cA23e3F4910C15A)  ] = 48;
      stakerReserveLog[ address(0x1325c1F1310b8B44E450d22aa2cc72f9C6A02884)  ] = 48;
      stakerReserveLog[ address(0x02943c31E8ec7F64135D5635C54f60b377fe9c27)  ] = 47;
      stakerReserveLog[ address(0xB222147D7b97552FF3D3E8B2136f2Ccff98414A2)  ] = 46;
      stakerReserveLog[ address(0xBCCf45dE0226D4f7f102aF139E392392785a2243)  ] = 45;
      stakerReserveLog[ address(0x6744AC367Ba5F3bf3e9Fc32FB6fa0d721A1EA98a)  ] = 44;
      stakerReserveLog[ address(0x9D06117F640737B55140FF6Fa7d157748F70c946)  ] = 44;
      stakerReserveLog[ address(0x057eCa916B7207320b1916514dA3316f36546C85)  ] = 44;
      stakerReserveLog[ address(0xf71eA5dB26888f1f38E7DE3375030f32861c0803)  ] = 43;
      stakerReserveLog[ address(0x144757a24B61Cee2e593ADe64DA776759D786d73)  ] = 40;
      stakerReserveLog[ address(0xD5E35b78258118035E9A1767Fc3b0E07D2CE1234)  ] = 40;
      stakerReserveLog[ address(0x75b7328C016b840Af82Bf3fF01Daf0CDAFCec2fD)  ] = 39;
      stakerReserveLog[ address(0x4b31e16736B7c856224bffFBD0470d15F349779e)  ] = 38;
      stakerReserveLog[ address(0x05EF5F4e81Ec078F685f8e033580D3F93fF1609C)  ] = 38;
      stakerReserveLog[ address(0x8f85BDCbAD363bD67Bed3C1704B22f72e6679Eac)  ] = 38;
      stakerReserveLog[ address(0x72fa4Dba92817737FEA04430a5c5fB2D01467583)  ] = 37;
      stakerReserveLog[ address(0x618c74F416EcbC2215FC77bA4A70Da792FB5EDAF)  ] = 36;
      stakerReserveLog[ address(0x69D739E7BB3a52Fa381A9b1378a89C6A2959DfDb)  ] = 35;
      stakerReserveLog[ address(0x083578AcDA99E03B2E716676366577269943C980)  ] = 34;
      stakerReserveLog[ address(0x00aC4FBcABea927b5A56D1ef7Aa943d7e16Cd02C)  ] = 34;
      stakerReserveLog[ address(0xB6d69aa58B9eBAF211De055a3E4482c2a7074551)  ] = 34;
      stakerReserveLog[ address(0xAe3046078cd009072E131cC15564dAD94cBe985D)  ] = 34;
      stakerReserveLog[ address(0x8085840f492D93AA262059a99182952386cd5E91)  ] = 34;
      stakerReserveLog[ address(0xA678aAbf920B8B115d50b4FA72b6c6Fe692a5719)  ] = 33;
      stakerReserveLog[ address(0x1eAbb754B4a537DE37290435DAB29a2b36B2e55a)  ] = 33;
      stakerReserveLog[ address(0xC7086014ABeB5C730CC75D92F7439544039ad424)  ] = 32;
      stakerReserveLog[ address(0x9AF4b2Af4075dAb09b70A5195252EE356B2D31C0)  ] = 32;
      stakerReserveLog[ address(0x8e2a0c5A5CefBF95a04072ff5953b7F45810C2A9)  ] = 32;
      stakerReserveLog[ address(0x9683778152EddEE1636BAf20794d511461baeEd8)  ] = 31;
      stakerReserveLog[ address(0x2393930f99940f03994fEAc50704FF6F7eE521de)  ] = 31;
      stakerReserveLog[ address(0xb501F77A64Ebc732860c8f064665800C318b4847)  ] = 31;
      stakerReserveLog[ address(0xb5C00d898D3B2E776487c7E88F5b78592343309e)  ] = 31;
      stakerReserveLog[ address(0x2cEa922beDd4796265DDA912DEb2B5f61032F55F)  ] = 30;
      stakerReserveLog[ address(0xAB674D86bF1943C060cF0C3D8103A09F5299599C)  ] = 30;
      stakerReserveLog[ address(0x97EDF63009f01C259943595E65275C0A74eC9Efa)  ] = 30;
      stakerReserveLog[ address(0x860b661966De597b4154743DB5A09186fC81b565)  ] = 30;
      stakerReserveLog[ address(0x2309a6CCC10694F9811BB97e290Bb5B6675333Ce)  ] = 30;
      stakerReserveLog[ address(0x956978542459c88Da3B6573E9C6c159f67c0F955)  ] = 30;
      stakerReserveLog[ address(0x651741aD4945bE1B8fEC753168DA613FC2060c01)  ] = 29;
      stakerReserveLog[ address(0xDdA1C76e1805ACa2ed609Aec485FB43C54737075)  ] = 29;
      stakerReserveLog[ address(0x5528680C692adbfe993E4587567e69F7Ac65B12C)  ] = 29;
      stakerReserveLog[ address(0x84F1F7Ec4a5503d2A113C026d02Fc5F1EB9c899D)  ] = 29;
      stakerReserveLog[ address(0x41317e7cA1b415e3BEDA6e98346fa23e01d8D0B1)  ] = 29;
      stakerReserveLog[ address(0x27805aB336a56433397bABAFc3253d52Be8a7762)  ] = 28;
      stakerReserveLog[ address(0x6A329d74b030d0c4DD1669EAFeAeeCC534803E40)  ] = 28;
      stakerReserveLog[ address(0x01c7bc82925521e971C75eb50fE5E2b97f11F872)  ] = 28;
      stakerReserveLog[ address(0xB8cC38a0CDD8297dA6186E589aDf4D3EB41deA12)  ] = 28;
      stakerReserveLog[ address(0x62A090cb090379B6a8620BFa42577ECa1de5Aa13)  ] = 28;
      stakerReserveLog[ address(0xCf96368b5Bcf8656cE22C4df496102D9E71d279f)  ] = 28;
      stakerReserveLog[ address(0x2CE55667462e85B5D7A7a28BFaF5772199DcB666)  ] = 28;
      stakerReserveLog[ address(0xbc8944cA268E51cDB7726Ed3baB7d87C78796aAf)  ] = 27;
      stakerReserveLog[ address(0xDd8463c7e803d6A5E8711010cFfAfd977B54f744)  ] = 27;
      stakerReserveLog[ address(0xDAe527C4b4B466404055ae5BAA783454F7c5b59A)  ] = 27;
      stakerReserveLog[ address(0x892e1b672A437a89b1fDc6e310d96E8BFB16cdEf)  ] = 27;
      stakerReserveLog[ address(0x3ED9300270419eB20035fd3A18F9B3aba4A0ae23)  ] = 26;
      stakerReserveLog[ address(0x8D322ff8Dc31A44C682855979165f20b972112DB)  ] = 26;
      stakerReserveLog[ address(0x18C55b22FA947A9663438032048f9bcEc3c92e9A)  ] = 25;
      stakerReserveLog[ address(0x2cB66B548E687442E0ae603AEB1f7bCACc2A6F1f)  ] = 25;
      stakerReserveLog[ address(0xEd76E6b7E643A4476033c75Cb1f1fAeAe4cA12D9)  ] = 25;
      stakerReserveLog[ address(0xea4680339ad21382cd28ABbB274CfAC3df3E54a6)  ] = 25;
      stakerReserveLog[ address(0x4f7Cca651a6452941f617C5A461C5A55700330D7)  ] = 25;
      stakerReserveLog[ address(0xB1A30ecA11563e0F484E65cc4BbefC7715F1CE25)  ] = 25;
      stakerReserveLog[ address(0x91a693B30F5C1f04713a7228FC0676Db212dBc3F)  ] = 25;
      stakerReserveLog[ address(0x68AfA499A37878C73c2C51456a315C098B74Bd83)  ] = 24;
      stakerReserveLog[ address(0xd1c2c1eB4e3469F35769d7fb354fBD531b6e9c91)  ] = 24;
      stakerReserveLog[ address(0x4F83724a0Ec3F66e6cAc92b43916442Cf54f586d)  ] = 24;
      stakerReserveLog[ address(0x7E7c1A3541d2ff134f755ca58512B703906f2785)  ] = 24;
      stakerReserveLog[ address(0xa965dF87B467f25D7BbFA66f222bcBA299BDa3a8)  ] = 24;
      stakerReserveLog[ address(0xb2767629602Cf390168d4FFa52d283E894B01222)  ] = 24;
      stakerReserveLog[ address(0xD0BB6e64e1C6dEbADD41298E0fF39676630F03a8)  ] = 24;
      stakerReserveLog[ address(0x9C980F6069C241a5EbBE0A232F285Cce34131eF9)  ] = 24;
      stakerReserveLog[ address(0x850AF43e6728f225867aF041bc2a1E13437eC3d3)  ] = 24;
      stakerReserveLog[ address(0x207e2d5eA39cB9E38d1DD9Ba251707f1084694D8)  ] = 24;
      stakerReserveLog[ address(0xEa6f0dFd94b87Ba819310e7A430167474D0C7c6b)  ] = 24;
      stakerReserveLog[ address(0xaAA397b4Dce9AE40Aea19fD8695aC104f3bcA614)  ] = 23;
      stakerReserveLog[ address(0x64744bdF0312BAfaF82B1Fa142A1Bd72606F9Ea0)  ] = 23;
      stakerReserveLog[ address(0xf83A6d15eC451225A6B5a683BC2f85bf4dc35d13)  ] = 22;
      stakerReserveLog[ address(0x92b449114420c1b3F10324491727De57809f9Cc8)  ] = 22;
      stakerReserveLog[ address(0x104DEa01de4A993797444CC2c4619D48E76E0446)  ] = 22;
      stakerReserveLog[ address(0xcd00A56D065982ff5339A98C9f1f34f0A515A329)  ] = 22;
      stakerReserveLog[ address(0x816F81C3fA8368CDB1EaaD755ca50c62fdA9b60D)  ] = 22;
      stakerReserveLog[ address(0xb531320805C5BED1D46AEaDcF4F008FDF172DBDa)  ] = 22;
      stakerReserveLog[ address(0x00D4da27deDce60F859471D8f595fDB4aE861557)  ] = 22;
      stakerReserveLog[ address(0xb4dDF0235C74f7AF2E48f659607f6EA2F8616A5b)  ] = 21;
      stakerReserveLog[ address(0x12D7A3Fe8378E5aFce12581FfFa87d75855EB656)  ] = 21;
      stakerReserveLog[ address(0x4494d7FB34930cC147131d405bB21027Aded12f4)  ] = 21;
      stakerReserveLog[ address(0x3625645f0ceE90204F7c373aA55c1Ae262891693)  ] = 21;
      stakerReserveLog[ address(0x7754fCeA38769a9f3c3F99540d070240CA43351a)  ] = 21;
      stakerReserveLog[ address(0xE210Fa629e53721f46c9B28fE13dA66bf8a1fEFf)  ] = 21;
      stakerReserveLog[ address(0x1762DB6963c5F02EEDe0c3234d1d65B08595D032)  ] = 21;
      stakerReserveLog[ address(0x73f2Ab5dc5F47F9231149fCC24b3cBbC487D1AFb)  ] = 21;
      stakerReserveLog[ address(0x2445d9b342b8AD807d49334a0aaA928B07ba4aD4)  ] = 21;
      stakerReserveLog[ address(0x4476ab2c11b74576aa3abfAb19dde0aaDcFCA238)  ] = 21;
      stakerReserveLog[ address(0x459EE9ef16151a2946187c3139BE084D1dBA8d08)  ] = 21;
      stakerReserveLog[ address(0xf0EFedb980345dF4FC1175432B6C968efB221F80)  ] = 21;
      stakerReserveLog[ address(0x525baf5Fe2B580f8E867e45F3BC3556d6E9842E4)  ] = 21;
      stakerReserveLog[ address(0xACe9620B9Af1C0bb3ABC45E630CDEEbF2de4E023)  ] = 21;
      stakerReserveLog[ address(0xE421E19c69FFaEbE5f1548fDBa81D4b4Ad98688e)  ] = 21;
      stakerReserveLog[ address(0xa02E16777707446d626fDF1Fb17d9a9318F3EccA)  ] = 20;
      stakerReserveLog[ address(0xbB4aDec274c273818bA9473712F231a966A7F74A)  ] = 20;
      stakerReserveLog[ address(0xa73557ea8892d52E445A8c973B8a097a21189B96)  ] = 20;
      stakerReserveLog[ address(0x819fF8A68dc7440c63C5aDb810034380F3635E18)  ] = 20;
      stakerReserveLog[ address(0x4a9b4cea73531Ebbe64922639683574104e72E4E)  ] = 20;
      stakerReserveLog[ address(0x087CBAdf474d6248Ade1B06e3cC938cB34510F94)  ] = 20;
      stakerReserveLog[ address(0x00e68122d283cc3837E221cE7B2e08C1231BC269)  ] = 20;
      stakerReserveLog[ address(0xDA8D38d78589EDcf3F306ca122e1646aF913660D)  ] = 20;
      stakerReserveLog[ address(0x8fCF586D3B6fC5Bff8D2c612D56f18c2A0B992D4)  ] = 20;
      stakerReserveLog[ address(0x84F4EF52aC791aE14eE5935e4aa0427E271B347E)  ] = 20;
      stakerReserveLog[ address(0x9E6f98de1Bc2e28663492057552C5323C93A0996)  ] = 20;
      stakerReserveLog[ address(0x2455ca300C8EdfC9c96fb1FaB620621E19145233)  ] = 20;
      stakerReserveLog[ address(0xE6D860d6B04A00D55AEda46fB402a3d9A2Bce20c)  ] = 20;
      stakerReserveLog[ address(0x0c187Bc2DCcc26eD234a05e42801FA4E864Cf225)  ] = 19;
      stakerReserveLog[ address(0x086D87e70CEe08b5D33134c4445933AC9c13AC8a)  ] = 18;
      stakerReserveLog[ address(0x8EeC49C06322ad8181ca3bbAb3899507977Bb9D8)  ] = 18;
      stakerReserveLog[ address(0xD4BCE9c082e315b8E3D0A79bFB5c6daA36e9531B)  ] = 18;
      stakerReserveLog[ address(0x8D10af78548099A5b2Cf4f2ddE02CF14f6f8c2CE)  ] = 18;
      stakerReserveLog[ address(0x1Ee6FCa6b9BD318f13927a50c160C9B1ec6D7933)  ] = 18;
      stakerReserveLog[ address(0x623C04dd784cd3a937AB8511BbB165C872223A32)  ] = 18;
      stakerReserveLog[ address(0x885ADC65E090D56716fc897f4e2c505e0E620caB)  ] = 18;
      stakerReserveLog[ address(0x1a25D2e22289d4d49a98b9e5b4ed7383B106F746)  ] = 17;
      stakerReserveLog[ address(0x870Bf9b18227aa0d28C0f21689A21931aA4FE3DE)  ] = 17;
      stakerReserveLog[ address(0x9EC02aAE4653bd59aC2cE64A135c22Ade5c1856A)  ] = 17;
      stakerReserveLog[ address(0xE5E456AB0361e6Aba3325f84101F704adD175216)  ] = 17;
      stakerReserveLog[ address(0x3329dD0622d5ecA89a69e9C9D4854461136ef15b)  ] = 17;
      stakerReserveLog[ address(0xe62622CEC75cf038ff1246fB54fA88e5fA7a8D1e)  ] = 17;
      stakerReserveLog[ address(0x0783FD17d11589b59Ef7837803Bfb046c025C5Af)  ] = 16;
      stakerReserveLog[ address(0xA6f18cd918AE7b37e34aA59efC42849c1C973B9F)  ] = 16;
      stakerReserveLog[ address(0x9A55930661d1D8c594193f1CB3556c790c064781)  ] = 16;
      stakerReserveLog[ address(0x64fC6C7CAd57482844f239D9910336a03E6Ce831)  ] = 16;
      stakerReserveLog[ address(0xdbd690D439f47DFb5e76aCaDE43bAe4b9872cc70)  ] = 16;
      stakerReserveLog[ address(0x06A687b25900E4Fecb97b0212aD5590eD0467722)  ] = 16;
      stakerReserveLog[ address(0x36bD90e9785C8cffc576e70F946dEdb063Ffb418)  ] = 16;
      stakerReserveLog[ address(0xe269b26E1162B459410dC258945707720BB2b961)  ] = 16;
      stakerReserveLog[ address(0xb8E19Ee65163783CC335d158563fE867948e8005)  ] = 15;
      stakerReserveLog[ address(0xB3D5441c756dB13E3999551bd8191aB8C528e5fF)  ] = 15;
      stakerReserveLog[ address(0xf66ff43d0CF416F97eF2EACb190bC99Dc4436391)  ] = 15;
      stakerReserveLog[ address(0x0a1AA3d5C4dcae7F9b3E9F3b59EA36E4F8Fcf4f4)  ] = 15;
      stakerReserveLog[ address(0x706F652335bBE76Aae4f94bB68Fc2D8A53eF41E4)  ] = 15;
      stakerReserveLog[ address(0x6f04cc236BBdAbD0fd7A6DE77F47dc6843581151)  ] = 15;
      stakerReserveLog[ address(0x5e44357be9c3b4CeAbb30bD0E0A336608eCa0a3b)  ] = 14;
      stakerReserveLog[ address(0x59b8130B9b1Aa6313776649B17326AA668f7b7a6)  ] = 14;
      stakerReserveLog[ address(0x1180a73095e514Ac230538220828FD3C8b7a9909)  ] = 14;
      stakerReserveLog[ address(0x03F21d18402F65cEe60c9604f1C55ad6A2bf064e)  ] = 14;
      stakerReserveLog[ address(0xF86B48F340c88Af60eE0248E2e6Fd47358b62ED3)  ] = 14;
      stakerReserveLog[ address(0x91Bc36DB6925fD051A02e4dcB6804A736741e456)  ] = 13;
      stakerReserveLog[ address(0xeEcB0bA3Fb18C1Dd05228942E4b53E64E05C032B)  ] = 13;
      stakerReserveLog[ address(0x0F64B91bbb3cb3F32090a1aEC6C1B7de6381ff5a)  ] = 13;
      stakerReserveLog[ address(0xaF8B39955b7fa6497990A438b42BE5BD69D51816)  ] = 13;
      stakerReserveLog[ address(0xB18150275285BeCfcBb717f65B10Df2d211D5a02)  ] = 13;
      stakerReserveLog[ address(0x8E4544c1f65B02c8193fD6E24c127907BCfDfB8a)  ] = 13;
      stakerReserveLog[ address(0xC3EDF9a3aDB11B96Ded85E4B322D65dB127759dD)  ] = 13;
      stakerReserveLog[ address(0xcD1d1CCA481b0518639C8C6d3705A46d7a44d8FC)  ] = 13;
      stakerReserveLog[ address(0xBC058EcC77D40dB30a5AF8E1Ddc6bFA64bda195E)  ] = 12;
      stakerReserveLog[ address(0xc0234756810Da1FcE0551140C662586196f1869D)  ] = 12;
      stakerReserveLog[ address(0x18cF068bCf46fCcf4e3A3C96DC38291E03806908)  ] = 12;
      stakerReserveLog[ address(0xf43e716984D54C3D33Ee96fBB1b8F101d6c22C1C)  ] = 12;
      stakerReserveLog[ address(0xBeEA0c453B6400E56bE8394a3cAA7834b5881bb2)  ] = 12;
      stakerReserveLog[ address(0x4Fb7d58c887A7196b41B131bB1b5b50ebAc574cE)  ] = 12;
      stakerReserveLog[ address(0xb466716FE072B5D893dA56307B9063440CEd633A)  ] = 12;
      stakerReserveLog[ address(0xbA3E7a9E411feEd3CDa09aB4a8eDD3314E6b83Dd)  ] = 12;
      stakerReserveLog[ address(0xDA42629D5D0BdD2255560304043c78E7D736bc76)  ] = 12;
      stakerReserveLog[ address(0xcC6acBA2dF17134D18C94eaDa2B3399FDbfFC490)  ] = 12;
      stakerReserveLog[ address(0x5B8B6f909Eb67bCae679593E91d5bE3f14E9c5f3)  ] = 12;
      stakerReserveLog[ address(0x63C1f24400F053ff148c1476EE7d087AB108Dac3)  ] = 12;
      stakerReserveLog[ address(0xAE5559b20e871Dce1521bc2d3586E4E313BeDF34)  ] = 12;
      stakerReserveLog[ address(0x2B355cfaCd1F6453FeCe399f6399140Bc71ca437)  ] = 12;
      stakerReserveLog[ address(0x070fB67FBb8d73050C83088851e3862FfaBc15Cb)  ] = 12;
      stakerReserveLog[ address(0xbF1a53e1f37A886C68557ED827889D3AA7ED2589)  ] = 12;
      stakerReserveLog[ address(0x9f0046f1408268F302410c58bb399cd7a6865E2F)  ] = 12;
      stakerReserveLog[ address(0x7399e85324B71818D246d22fa090537Bff84e896)  ] = 11;
      stakerReserveLog[ address(0x00AfF2d72e92db35e3dB58fFCA62B3FC72B97422)  ] = 11;
      stakerReserveLog[ address(0x748C189a2321f9EeC6aa4f42e989c3Fae769bAb3)  ] = 11;
      stakerReserveLog[ address(0xAECDf6A9b599C7159803379e5F69FdCE5Fc49c2c)  ] = 11;
      stakerReserveLog[ address(0x90Ad1c591e114977cdBF2A718BC7C3D322981020)  ] = 11;
      stakerReserveLog[ address(0x4B0aeFb0cC74D521E4487084d1C9B88e35f9C80c)  ] = 11;
      stakerReserveLog[ address(0xa52d3dE9c8b0b21462F2C3A7a730C278ceC9eafC)  ] = 10;
      stakerReserveLog[ address(0xdBee763Cd99A5c443Af1971973f63f393B0bAc54)  ] = 10;
      stakerReserveLog[ address(0x1f8125672be2255C8541DeE989dbC16D3EA9304e)  ] = 10;
      stakerReserveLog[ address(0x918b84c61d5Fe6C0E57fbf6499216649Ed5C4AC1)  ] = 10;
      stakerReserveLog[ address(0x05265c4695e895177365d9AdCc291eD8ee6cfFbE)  ] = 10;
      stakerReserveLog[ address(0xc849a2a35145D609C46145F3a50e02913eD8990B)  ] = 10;
      stakerReserveLog[ address(0x86Aa372b6Dc962563D3c5eAB9c5457AE9bC56AC1)  ] = 10;
      stakerReserveLog[ address(0x69e69571d0d07EdBEde6c43849e8d877573eE6bf)  ] = 10;
      stakerReserveLog[ address(0xBD4222550deC41F66aF8B311D748dBF7c1e95768)  ] = 9;
      stakerReserveLog[ address(0x374D6392fCa56f3A96Fe6f9464d1A06B71379805)  ] = 9;
      stakerReserveLog[ address(0x3d3b44e1b9372Ff786aF1f160793AC580B2b22ae)  ] = 9;
      stakerReserveLog[ address(0x92fb6b5BC7f49b02E1d44c78FC5e671893F0E531)  ] = 9;
      stakerReserveLog[ address(0xc07fC1EA22B212AC109F951CebAAc119ccBC8413)  ] = 9;
      stakerReserveLog[ address(0xBbd5454fbA0D4269a70890A29D8A4816f439d737)  ] = 9;
      stakerReserveLog[ address(0xca31F049c9Cd8c0bc2B47FAc67aF658D6DA52a73)  ] = 9;
      stakerReserveLog[ address(0x5B4190c4376208BbCa4a27bB391425249469904E)  ] = 9;
      stakerReserveLog[ address(0xf10B2795F94dD6fE1EE70EC7c01cF071c4aDB524)  ] = 9;
      stakerReserveLog[ address(0x03bD7E336698a490EA51A4ECf2D4c06cC6ea3856)  ] = 9;
      stakerReserveLog[ address(0x483921291bBF0b5a32ECc20f698419AE55fB2eBc)  ] = 9;
      stakerReserveLog[ address(0x3d1a11dAAC4922F136d045aD85F2cAcC604A31C9)  ] = 9;
      stakerReserveLog[ address(0xeE4B71C36d17b1c70E438F8204907C5e068229cc)  ] = 8;
      stakerReserveLog[ address(0x9D47C98EB709603Aa82514F96b6EfA7939F2eDc1)  ] = 8;
      stakerReserveLog[ address(0x9886B7321D711754F9301300d4834ED839485462)  ] = 8;
      stakerReserveLog[ address(0xB7dB6634fFbF3af457d88c72f609433297cB1487)  ] = 8;
      stakerReserveLog[ address(0x1982d5A43bDcDf9C8F04a04Cf3665Fb03596Da80)  ] = 8;
      stakerReserveLog[ address(0xc52DDB928cEd386F3Fe8924CccCD71745ba11Ac9)  ] = 8;
      stakerReserveLog[ address(0xCb942dC11C304AB8F623417e26F4458c2a727fA7)  ] = 8;
      stakerReserveLog[ address(0xBd1A1fb692242676D7814dbB31a5Ee8c75EA656b)  ] = 8;
      stakerReserveLog[ address(0xfB1B0097517A29f9fDb7De750735cBC554E7791D)  ] = 8;
      stakerReserveLog[ address(0xDF8465e364C5Ba32bDB44D83B302Bd163622A263)  ] = 8;
      stakerReserveLog[ address(0xb00eC779b29C368953781B54cB231D202f388fbB)  ] = 8;
      stakerReserveLog[ address(0xc8467e8e6CF6380d99c644D3C9e183a537E90DC1)  ] = 8;
      stakerReserveLog[ address(0x140f7985c6BcC3A4c526394bd310cbc008BE4b1b)  ] = 8;
      stakerReserveLog[ address(0x5B5938604F7Ca00809f253cF6a2CFCB6Ab3F5992)  ] = 8;
      stakerReserveLog[ address(0xa7e9154dcE8c8aa1F395E17DD1F8b146aB799E4E)  ] = 8;
      stakerReserveLog[ address(0xB51E9b77d4973c4Dc3659A8d4E2fAD97F3723c73)  ] = 8;
      stakerReserveLog[ address(0x158f76b84E75B32ff3f80E026d47B3411c126250)  ] = 8;
      stakerReserveLog[ address(0x74C07Af588761e355Cc5319af150903B8333D1A4)  ] = 8;
      stakerReserveLog[ address(0x3a9C13AC4fB665cAB94A9555FF6Cc3ab4bbEDF5B)  ] = 8;
      stakerReserveLog[ address(0x1F61d37984288d815992b078B86f0f4610F79d0B)  ] = 8;
      stakerReserveLog[ address(0xcA059495aEB6a2ca3ab5Da0c6aeBa3F5944861F5)  ] = 8;
      stakerReserveLog[ address(0x49699e3eecdd72208B8B1D78CE3407F994d9f699)  ] = 7;
      stakerReserveLog[ address(0x303D80F0A4D997Fb48906772bfc6C5c0919a9319)  ] = 7;
      stakerReserveLog[ address(0x3a32affF419bC3a41c68Ddf793917CEdc6FF9Ad4)  ] = 7;
      stakerReserveLog[ address(0xF3998fd8f25Fe2Dcb53817746d3f51f78C7E35C1)  ] = 7;
      stakerReserveLog[ address(0x8925F18736637FcEac3Ed0e6D5871DF6809C5E94)  ] = 7;
      stakerReserveLog[ address(0x1499C87F66F369d5691Fe3ce807577c6f10DF992)  ] = 7;
      stakerReserveLog[ address(0xfa8ddaf49B3CB17B34F4Ab25299262fcbff5b6F5)  ] = 7;
      stakerReserveLog[ address(0xbE8050F2317417b9F9023D39776cC9dF74696131)  ] = 7;
      stakerReserveLog[ address(0xEE4925E025638cCF539c0292401d80071f7Efa24)  ] = 7;
      stakerReserveLog[ address(0x70353c3d40eA238423feBa3b7CB4be3F7406B6aE)  ] = 7;
      stakerReserveLog[ address(0xdaf749ba6328404285c7D86ccf8B01D5c1A24876)  ] = 7;
      stakerReserveLog[ address(0x838df7E0AC4EfCF27cB1C1Dd0EA18CB6cE366468)  ] = 7;
      stakerReserveLog[ address(0xC375AF9666078099A4CA193B3252Cc19F2af464B)  ] = 7;
      stakerReserveLog[ address(0xf8a6D7D51DFa46737D9010CED261155490c40Ed0)  ] = 6;
      stakerReserveLog[ address(0x8a285fa9529656864630095927335120208d3756)  ] = 6;
      stakerReserveLog[ address(0x7D55C7Dd860B2fBDa37ecAC08d7A2238CB6C03D3)  ] = 6;
      stakerReserveLog[ address(0xdDd1918AC0D873eb02feD2ac24251da75d983Fed)  ] = 6;
      stakerReserveLog[ address(0xBFF1e5D812C83C9392F45038270632CffC1Bc565)  ] = 6;
      stakerReserveLog[ address(0xb8255a69C09988D6d79083EebF538508743E7e80)  ] = 6;
      stakerReserveLog[ address(0x46d1A8BbF5bfFD0b804a83c13a719208fE2EE30c)  ] = 6;
      stakerReserveLog[ address(0x71D01033f8ffb379935C0d0e8474f45E6f92A972)  ] = 6;
      stakerReserveLog[ address(0x614F7863b421BDcDd62b5F504033957E80410555)  ] = 6;
      stakerReserveLog[ address(0x5a05cf16532d44732d11570C62c7983002795112)  ] = 6;
      stakerReserveLog[ address(0x8Cb88124230179014Ca7631b2dA5cA3bda5AbA00)  ] = 6;
      stakerReserveLog[ address(0x9DBE0cB89Fc07be11829475cEefBa667210b5797)  ] = 6;
      stakerReserveLog[ address(0x076462f6ac9cDC6995583b02f3AfE656E175580B)  ] = 6;
      stakerReserveLog[ address(0x6868B90BA68E48b3571928A7727201B9efE1D374)  ] = 6;
      stakerReserveLog[ address(0xe0B37eB3b7999642DeaD977CAD65A8b7C7e62073)  ] = 6;
      stakerReserveLog[ address(0x1D4C48320d293da6f416bb7ea444f3f638eBF464)  ] = 6;
      stakerReserveLog[ address(0xdDf6A1c1136C2B42481ad085d818F5BAbfD84849)  ] = 6;
      stakerReserveLog[ address(0x160b4A6Df57598C7e4e1B24371fA8E7EDa9244cd)  ] = 6;
      stakerReserveLog[ address(0x033b53EF4Ba5225160B78cF6CD7Ab08C8d5DBDa6)  ] = 6;
      stakerReserveLog[ address(0x53D93958403620EF1B9798f80369577aE809E1F3)  ] = 5;
      stakerReserveLog[ address(0x3cF9b27Fb14E83bf6b837C9981C961D377bB5d56)  ] = 5;
      stakerReserveLog[ address(0xC7622c949295BcBF40C4e6Ebd6F20db7Deb6746f)  ] = 5;
      stakerReserveLog[ address(0x33f065E9112D661f24C582F72688b02710795c6c)  ] = 5;
      stakerReserveLog[ address(0x43AEf37A726B41195BBe53428eF0E672aBAbba6B)  ] = 5;
      stakerReserveLog[ address(0x82c4D6Ab092A226d2e4f7c917990E0389390A3e8)  ] = 5;
      stakerReserveLog[ address(0x24855A2B42456BAdb4a628955c89388578Afb4A3)  ] = 5;
      stakerReserveLog[ address(0xAE3FA8178136D753Aae723a4dB62c9505e6477eb)  ] = 5;
      stakerReserveLog[ address(0x8b413FA207fcB8716d3E5F3b0a8880884a9fa1a7)  ] = 5;
      stakerReserveLog[ address(0xf60E43108D347Fe3B2191d76915741eacA6871B1)  ] = 5;
      stakerReserveLog[ address(0xf6fb5914115523ee81098047876F223E00Fc4Cdc)  ] = 5;
      stakerReserveLog[ address(0x2deE87d48f2ff96c284bF48f825D3f0333d89421)  ] = 5;
      stakerReserveLog[ address(0x32B461A21A88a65C29d5F88E27F986a14720E31c)  ] = 5;
      stakerReserveLog[ address(0xbB9Cba66efdb4831CA8139d76E8EB73c32C61848)  ] = 5;
      stakerReserveLog[ address(0xd4Cf55516c6b0A8e345195cdf58Acd6b83a2371F)  ] = 5;
      stakerReserveLog[ address(0x7d31bcFC94dc75823B2d08406D6a0f5aCa443989)  ] = 5;
      stakerReserveLog[ address(0x7444615a969c485A665Cd230A3d2083F38000781)  ] = 5;
      stakerReserveLog[ address(0x5ECbFfF5d7105C4bE407718BA3beEe78208b5581)  ] = 5;
      stakerReserveLog[ address(0x353c3ED77276D7c51c2AE0dE974557FdB7645CB2)  ] = 5;
      stakerReserveLog[ address(0x3722A8bBA8AeEcAcb5ef45208822bf935FBADb75)  ] = 5;
      stakerReserveLog[ address(0x0BFE9d38AE7ebB9213C4799bB82d70358F190aB6)  ] = 5;
      stakerReserveLog[ address(0x1A8EB494c2CEB2241C1572e663ff23211dEDf8Fc)  ] = 5;
      stakerReserveLog[ address(0x4C886776E556AAF3b59d3dcb4D0C8ade80C2Cb99)  ] = 5;
      stakerReserveLog[ address(0xa6aE8542F21108a84Eb065352d721e12D513F649)  ] = 5;
      stakerReserveLog[ address(0x7Fc7BfC4b36EbA867B60b62b9BB8aEacF3822062)  ] = 5;
      stakerReserveLog[ address(0xD781B34cbcE3c73f815D4a3b887c045E97BC2537)  ] = 5;
      stakerReserveLog[ address(0x32F0D391d7a2dA65E3995aF2D95192A0D07EC5ee)  ] = 5;
      stakerReserveLog[ address(0x174D444dc751433d238AD20975f01957a2C48741)  ] = 4;
      stakerReserveLog[ address(0xba75a436Eb388D6066E7859bd306669228d286F2)  ] = 4;
      stakerReserveLog[ address(0x621Ef8816661e837113b9975Fc82eA0086E8c8a4)  ] = 4;
      stakerReserveLog[ address(0x26E939aA71aea569a5df4FFCD89D618e47CaAe9F)  ] = 4;
      stakerReserveLog[ address(0x6891818d6D2fd16BAd34b49b10898EEdeefdE815)  ] = 4;
      stakerReserveLog[ address(0xd075D6339a075BdB4C5c9387abB2309e995851A6)  ] = 4;
      stakerReserveLog[ address(0x49945c2505D1330E071d49EF0c1bC724fddB650D)  ] = 4;
      stakerReserveLog[ address(0x38c86E5482BAC05Ff58A6F8EC6762E2a0DDb6Ef5)  ] = 4;
      stakerReserveLog[ address(0xD75a9fEb0dE749d2fb4C50EAc1Dc9ab561c6baa5)  ] = 4;
      stakerReserveLog[ address(0xCC1cE6B57a8DEbb3aB7cE6C1174A4EfFddf06b82)  ] = 4;
      stakerReserveLog[ address(0x048f8800D392fB97d34F813A6AC0E0F0F1ACf4FB)  ] = 4;
      stakerReserveLog[ address(0x645c829E92159CF1783744060cf86d26D9C38f5a)  ] = 4;
      stakerReserveLog[ address(0x5D6891b4451812dc670df87A63417e3d8273AE0E)  ] = 4;
      stakerReserveLog[ address(0xeAFf5514f3afaA6C398974E42F636f261ea9F617)  ] = 4;
      stakerReserveLog[ address(0xcDD38E23C7c59b5e5Ab9778c1552bE8bB3A00eab)  ] = 4;
      stakerReserveLog[ address(0xdad836760e9eeBD3d71E2Be2B5293cc360086346)  ] = 4;
      stakerReserveLog[ address(0x9Fc3c8BefB44DAAA07A66f05d3E0236B921b640A)  ] = 4;
      stakerReserveLog[ address(0xbAF45f436ae220747e449278A752017cC4708A6b)  ] = 4;
      stakerReserveLog[ address(0xC58BD7961088bC22Bb26232b7973973322E272f5)  ] = 4;
      stakerReserveLog[ address(0x7c7ec2Ef96e05582a0Bc999ba1613b2C235EfC20)  ] = 4;
      stakerReserveLog[ address(0xB040a24428A4BaB1F7DE05F017da8260d66625E2)  ] = 4;
      stakerReserveLog[ address(0x234Eb49594Be19ECc691F1E934fa27CD452ba8f1)  ] = 4;
      stakerReserveLog[ address(0x6e1eDe3BC2b7e16a48EB32b52D8De2925D907751)  ] = 4;
      stakerReserveLog[ address(0xA6D9107E7C6394141806217Dc207EbF3813b7443)  ] = 4;
      stakerReserveLog[ address(0x9Ae78e799b17F0ED3Af4C5aFCBA2cCbF5af4e905)  ] = 4;
      stakerReserveLog[ address(0xB9ACD89942Fbb70BEf9a8047858dFd3A8293c1eF)  ] = 4;
      stakerReserveLog[ address(0x81CE0B8dc0627355D75B9768304F1e7A09E125de)  ] = 4;
      stakerReserveLog[ address(0xa60b72668418Fb0d9928aE46cB79dbeb43e7C11E)  ] = 4;
      stakerReserveLog[ address(0x6E5a09e4C23A289e267aDD0207AC2F7f055147C0)  ] = 4;
      stakerReserveLog[ address(0x14861fc9b5C09A8E4c0551d122B1b6e0a662Ba30)  ] = 4;
      stakerReserveLog[ address(0x6b442eBAD72f3f400EC3C9b4Bb860E0913590456)  ] = 4;
      stakerReserveLog[ address(0xFfb8C9ec9951B1d22AE0676A8965de43412CeB7d)  ] = 4;
      stakerReserveLog[ address(0xf1db31022Ce06524E4fD36693dA2D485840b1543)  ] = 4;
      stakerReserveLog[ address(0xCf32E148528E51A62C8AA7959704D34075b2CC53)  ] = 4;
      stakerReserveLog[ address(0x55D2Fdaaa9c7358b0dE7f5c029577adF7d73702f)  ] = 4;
      stakerReserveLog[ address(0x118815Ec2Ef909dff5b9432B1f5C0f109c66176D)  ] = 4;
      stakerReserveLog[ address(0x190B11439a55Fc772E566EBa1A6D07D5b85a63D0)  ] = 4;
      stakerReserveLog[ address(0xF8DdE82f0875fCAe2F71b9c2B8e94f8f68a765C1)  ] = 4;
      stakerReserveLog[ address(0xB6354dC70143f869A1Ed0Bc7ad4B65d83d67284F)  ] = 4;
      stakerReserveLog[ address(0xC77320D1B3B4237fE0DD934Ec969483FEAeA45eD)  ] = 4;
      stakerReserveLog[ address(0x6A9af06aCC9fea0d75382FdaD8DbBaa41BbFa62d)  ] = 4;
      stakerReserveLog[ address(0x23a8F8fBA69cAad4De27feBfa883EfEa7c564bc6)  ] = 4;
      stakerReserveLog[ address(0xF69bC34B73DA823e18A6960975fB865a29B218A1)  ] = 4;
      stakerReserveLog[ address(0x064d875e4F384b5B1204F8Af98737C6f90da34e8)  ] = 4;
      stakerReserveLog[ address(0xFBd7bf4bf3EE2032848d21d6c6140C2400EC8553)  ] = 3;
      stakerReserveLog[ address(0xacc40f85dB13B527C7319e2913733C17631B39b7)  ] = 3;
      stakerReserveLog[ address(0xE1e09b606c35c61026aDF7FA7Bb33Fe6E6194064)  ] = 3;
      stakerReserveLog[ address(0x4F5B280f83B6e0453eE725cD45252110f3EaA762)  ] = 3;
      stakerReserveLog[ address(0x0Db9355ECAe0c997B45955697b4D591E2953e0b1)  ] = 3;
      stakerReserveLog[ address(0x0f8c9b0Bb3fa32f89B18E89C0B75548A81832b79)  ] = 3;
      stakerReserveLog[ address(0xeF214340E0EefD7D9ccC0FD6449fF03b04c4f305)  ] = 3;
      stakerReserveLog[ address(0xaBd5E7f0551F389b052c70d3efcbD7027E774996)  ] = 3;
      stakerReserveLog[ address(0x84a31330851D7450114F9De4673F8dCA7486d4E3)  ] = 3;
      stakerReserveLog[ address(0x448ceDfE28Ad81DC803034D98203097B4EE61E3c)  ] = 3;
      stakerReserveLog[ address(0x5b6c57D0C7959f20E900f1e71a1D691a6EC0E978)  ] = 3;
      stakerReserveLog[ address(0xd4c4dd385b97CD1d4823458BC69B579fC89a59F9)  ] = 3;
      stakerReserveLog[ address(0xC0AF213DDBB9Eb3D35912024FFE972B6640A4263)  ] = 3;
      stakerReserveLog[ address(0xc9bd8D37302bFa4CDDB8afad3a03cd187f3F2318)  ] = 3;
      stakerReserveLog[ address(0xc744Cf8f58DB2D7dEC3e9251008dE7f449E87b8c)  ] = 3;
      stakerReserveLog[ address(0xEac7705Fd1a2c1F401c129e18AfF65E4f6b4e073)  ] = 3;
      stakerReserveLog[ address(0x9fdD1691133603aC39f01654C1f5A17b8D9F7D40)  ] = 3;
      stakerReserveLog[ address(0xb5475DB885A6d3714edFf8d5ea3bE13bAd3a7319)  ] = 3;
      stakerReserveLog[ address(0x3A877A566fb0cE052e07C1B2A6bC7158FA1C23b4)  ] = 2;
      stakerReserveLog[ address(0x16Ada50F49aa18258AAB2243f0ED88676b8FAf0a)  ] = 2;
      stakerReserveLog[ address(0x07544F73A6f2c195D879d41d6237d163239aDc98)  ] = 2;
      stakerReserveLog[ address(0x45A50017FbC8D22160B36aF631aC214D580BAC59)  ] = 2;
      stakerReserveLog[ address(0x34AEbd219E365fd86497cd47290B72e702D30A82)  ] = 2;
      stakerReserveLog[ address(0xbb49FFc7344f2aBa266Abc329985014F1e3d6d1C)  ] = 2;
      stakerReserveLog[ address(0x7D86bE945E7f2524d59158f04c1B536855429068)  ] = 2;
      stakerReserveLog[ address(0x0bCb948037C91a3E98E830d91d18C682f380cc50)  ] = 2;
      stakerReserveLog[ address(0x26f3052A3Efd44754BB3061C675943CBB2B690f0)  ] = 2;
      stakerReserveLog[ address(0x12d676Db9C781ADFD1CB440ae328a538c32Da373)  ] = 2;
      stakerReserveLog[ address(0x2ECbEc5e4c300F88A957A1193bdFE6173baa39db)  ] = 2;
      stakerReserveLog[ address(0x6D45f8B052b77fF5Ba1461552a932C39E82330BA)  ] = 2;
      stakerReserveLog[ address(0x2AE0368b9c636955C93896091BF876D69665dCE4)  ] = 2;
      stakerReserveLog[ address(0xEe2982F69756867448b5A03558BE786388bf97ED)  ] = 2;
      stakerReserveLog[ address(0x3fc6C08e329954CE19384c6a70fB578791bCcC7E)  ] = 2;
      stakerReserveLog[ address(0x71626C8187912DE8376E86BB92bD572172b49eEe)  ] = 2;
      stakerReserveLog[ address(0x730CdB1402De8b7cc79067D80C375aaFd2c27591)  ] = 2;
      stakerReserveLog[ address(0x05740Bc573E9c6Bd423ac65D85D53FCb51A60DA2)  ] = 2;
      stakerReserveLog[ address(0xCe4A367116CceC25B50347387C9003305F660a61)  ] = 1;
      stakerReserveLog[ address(0x4CDe3b62417E91eED9D3f4B0eC4356Be0D734ba3)  ] = 1;
      stakerReserveLog[ address(0x5eF25c9e0E0c17257f437087A1fc629c1151c5e9)  ] = 1;
      stakerReserveLog[ address(0xa9BFef8ccfd99Eb9eC0581727843562cCD6dea04)  ] = 1;
      stakerReserveLog[ address(0xB4D9B517bdEE3D55d49aBac0D751B651954d402F)  ] = 1;
      stakerReserveLog[ address(0xcBDc0Fe85E092EEFcD292f2aeC41892CBB323EDE)  ] = 1;
      stakerReserveLog[ address(0x1AB74Bd73E80FC3368300d7EBD0f6E88ed02EfFC)  ] = 1;
      stakerReserveLog[ address(0xaF446267b0aa14258Ae8789D2dC5aEf9E9088A4b)  ] = 1;
      stakerReserveLog[ address(0xa4b6b09F63827b1823E381244e6C92E7aB41DDc5)  ] = 1;
      stakerReserveLog[ address(0x487B8E5A6b162367C9E46E9040248360C0ea6166)  ] = 1;
      stakerReserveLog[ address(0x5fdD6566c2a603925E0e077C9c342DDE7c06BF00)  ] = 1;
      stakerReserveLog[ address(0x6E47a768206673169eC07544544e37749DFA8B0D)  ] = 1;
      stakerReserveLog[ address(0x3A97B4a3F3960beDcCf3bae177612e36caBafDBa)  ] = 1;
      stakerReserveLog[ address(0xAb717EBa54aFdd7AC48BBAbE7C8223a48E9D4284)  ] = 1;
      stakerReserveLog[ address(0xDc0BD0523Ba5dE706A259EceAa597e03C7B28371)  ] = 1;
      stakerReserveLog[ address(0x2F754C908A3031348189b10a4C05C59A6F7e9077)  ] = 1;
      stakerReserveLog[ address(0x404F583833d0a05156FF6003da652B6031eBCB55)  ] = 1;
      stakerReserveLog[ address(0x63AAC522d1a29d1a4F58268b823Cad36BA764102)  ] = 1;
      stakerReserveLog[ address(0xFB5091128491B61C3298Fd18B4Cd9Be6212D78Dd)  ] = 1;
      stakerReserveLog[ address(0x4A06e76EeE09820df9ED94EA76C4c8DE06fc2818)  ] = 1;
      stakerReserveLog[ address(0x895980246D1854fE1340741a5CA0d823aFA9A98e)  ] = 1;
    }
}


pragma solidity ^0.8.0;

contract Cocktails is ERC721A, Ownable, CocktailClaimer {

    uint public MAX_TOKENS = 6969;
    string private _baseURIextended;
    bool public publicSaleIsActive = false;
    bool public stakerSaleIsActive = false;
    uint256 public basePrice;
    bool public barIsOpen;

    uint256 public cooldown = 86400;

    mapping ( uint256 => uint256 ) public mBarCooldown;
    mapping ( address => bool ) public claims;
    
    event LogCocktailDrink(address clubber, uint256 cocktailId, uint256 pricePaid);
    
    constructor() ERC721A("Cocktails", "COCKTAIL", 350, 6969) {
    }

    function cocktailClaim() public {
        require(claims[msg.sender] == false, "Address already claimed.");
        if (publicSaleIsActive) {
            if (stakerReserveLog[msg.sender] == 0) {
              require(totalSupply() + 1 <= MAX_TOKENS, "Mint exceeds the max supply of the collection.");
              claims[msg.sender] = true;
              _safeMint(msg.sender, 1);
            } else {
              require(totalSupply() + stakerReserveLog[msg.sender] <= MAX_TOKENS, "Mint exceeds the max supply of the collection.");
              claims[msg.sender] = true;
              _safeMint(msg.sender, stakerReserveLog[msg.sender]);
            }
        } else {
            require(stakerSaleIsActive, "Staker claim must be active to mint NFTs");
            require(totalSupply() + stakerReserveLog[msg.sender] <= MAX_TOKENS, "Mint exceeds the max supply of the collection.");
            require(stakerReserveLog[msg.sender] > 0, "Address has not enough cocktail tickets");
            claims[msg.sender] = true;
            _safeMint(msg.sender, stakerReserveLog[msg.sender]);
        }
    }

    function drinkCocktail(uint256 cocktailId) public payable {
        require(barIsOpen == true, "Bar is closed.");
        require(mBarCooldown[cocktailId] <= block.timestamp - cooldown, "Cooldown on cocktail active");
        require(ownerOf(cocktailId) != msg.sender, "Drinker can't use his own cocktail.");
        require(basePrice <= msg.value, "Eth value is wrong.");
        mBarCooldown[cocktailId] = block.timestamp;
        payable(ownerOf(cocktailId)).transfer(msg.value / 2);
        emit LogCocktailDrink(msg.sender, cocktailId, msg.value);
    }

    function airdropNft(address userAddress, uint numberOfTokens) public onlyOwner {
        require(totalSupply() + numberOfTokens <= MAX_TOKENS);
         _safeMint(userAddress, numberOfTokens);
    }

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

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

    function flipPublicMintState() public onlyOwner {
        publicSaleIsActive = !publicSaleIsActive;
    }

    function flipStakerSaleState() public onlyOwner {
        stakerSaleIsActive = !stakerSaleIsActive;
    }

    function changeCooldown(uint256 newCooldown) public onlyOwner {
        cooldown = newCooldown;
    }

    function getHolderTokens(address _owner) public view virtual returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);
        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    function changeBasePrice(uint256 newRarityPrice) public onlyOwner {
        basePrice = newRarityPrice;
    }

    function flipBarIsOpen() public onlyOwner {
        barIsOpen = !barIsOpen;
    }

    function withdraw() public onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"address","name":"clubber","type":"address"},{"indexed":false,"internalType":"uint256","name":"cocktailId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pricePaid","type":"uint256"}],"name":"LogCocktailDrink","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"airdropNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"barIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"basePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRarityPrice","type":"uint256"}],"name":"changeBasePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCooldown","type":"uint256"}],"name":"changeCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claims","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cocktailClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cocktailId","type":"uint256"}],"name":"drinkCocktail","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"flipBarIsOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPublicMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipStakerSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getHolderTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mBarCooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","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":"publicSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakerReserveLog","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakerSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405260016000908155600755611b39600a55600c805461ffff1916905562015180600f553480156200003357600080fd5b5060405180604001604052806009815260200168436f636b7461696c7360b81b8152506040518060400160405280600881526020016710d3d0d2d510525360c21b81525061015e611b3960008111620000a95760405162461bcd60e51b8152600401620000a09062003c31565b60405180910390fd5b60008211620000cc5760405162461bcd60e51b8152600401620000a09062003bea565b8351620000e190600190602087019062003b44565b508251620000f790600290602086019062003b44565b5060a091909152608052506200011890506200011262000128565b6200012c565b620001226200017e565b62003cbc565b3390565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6009602081815261012f7fb1abc688041df53f271d914ef316cdb3a80118b80f7127c7107d79ccd0a64b5a556101147f33228efb4a27252d7f8ff586ae4f58cd0a9a1fa272b062512f7ff11bcb038ce85560d27f7cc4d34a3f7ac5881e6a67de4fbc3da6c76603758f361e07b39cfb4d76e7954f5560917faddb8f4289252cc97c26329245787003b78baf0edb1adfabaf77621a780fe7375560647f2611116ebf65ae7b7132ecf3e51389cbdbfd940152b90022b5094cfdd199771355605c7f4ecb291b65f3f3ef659a46c6440e9e37c6eca3bd36e881ef308ce51f32e296fb5560587fb71a6c232ba302b96ee2eee18b06a53fe498124983995e9cb97b182144a390c55560557fb3a5b7c7de798e03bd64ae1eb97d332527b1a20824615705d07cac537e38fbef5560547fab623b0f0e2de1e5120fd1ac98d76eabc4e4ffa3c12d437fe43196a28b86c54355604e7f9c0256add085e867167e01d04c7fa2cf27332c111942a418d361277ae439295555604c7f3876e24ed3531353cec8362c9abd19b848a2ee35af82469f8c6d429af67309fe5560497fe0c3a48dcbe2850b9eb28cee6bccc3de09f10f4a00765d17336d9c54e1b867648190557f9cdeb82eed9654665d137ba9eb041b37045608ca4dc6f98cd8e309a96ebf40e35560477f918d4707f89c50c708ece612e378d2ec57d00804fc6cc3361568ff1ce20971835560467f392381cd6c1c216b19349702a22d2ec25754d4a668777fdece75e9e850c434ce8190557f70b09009a1226ef8b20c617bcc8541ad81989df61d04356146cfa47924257a705560447f76e39c0c94e00c7ab296b48e798430b4d4cf041658f4b044908acc7d57e1a6d28190557feb4c373bc2d1c344956cf062fcdcda9bbf64392a09eacf73c52db35c884d62355560437f467dfa7046d6255f5f5a3b238c380d3a4838433517ee549e80b0d2a459d7e8095560417f4abe6f5aa1f74dda431e1f59d9a5c095a149855be01df05bd661fa37eb059b788190557f6d977ecd78888304c0f5a5570b18160c1fe04f824c578b316cf8120c8d6f301755603d7fd4666cd8ae4b437cf511014c3142cad466f0ffb6461ff0c526b40dfdb1b50bdc8190557fc00b9494c521dcf493956e23e128552b5dc366f2d5467a8c6cd12de038a16e0f55603c7f097358ee8049118c86a6c4a248bcc0ba0f37be053f78d3f66920fc7fc7c2fd1f8190557f8cf4e50ecd99372342e0395178fec7ba1d1a4862a6e6349c98171d78d01d46ed55603b7fcff1872cf2be37d5f779c084cf1fcbe6e3ef65e890c3abe6524c619f9394c09d5560387fbae782a1e32180a300824696b6e8305f68addf21e37585c38ca6b11336b161535560377fc0fe000d4b7948bd63d78f1b7b3ef84683223b1e9411a6627447b20f9d58ade45560367fa9bbe8f9a681802a948b422d224d37be65b3a86542516c9058fb7f4c6b6b0b968190557fcb2901bbcc6225559044df6556a47c082da13b3be37d6d1dd01bb7ab229d56ce5560357fef284e6bcdd71e8aa5faec125552ebb012f345a5015f0c1c63e156cff76079055560347ffed85f58f330f9d8886828f9c8d0f31583fca41aafb32327a4a537f889b2951e5560337f8134ee67804993ea6886421e68bc36392f5503007bfd9f545f7a2f542e6fba7e5560317fe3421c0503daae29520ade116120d66e5bc2b27729a1f67469ec296b38c9e2b55560307f840c1483bacdba248d0b971303e017e04594557c838f4b8b875bc68a5a3d6b698190557f0f178adb2baff3d4221425605a7ff08fc6885a8e64f64ecc3c86512d0296dbb755602f7ff2b92f88ad0a9161270bf7122a4a7722b0c8cf250c446e3bc5afd31fc215d57355602e7ffe1c7528d8b1211da31f2fb33d6930379e6b97c0ef6104db0c24e1b1bbd557e955602d7ffa3676f946ee9816433cfca49ec3d91b7e3250a91687ef57b878230d7c9a019e55602c7fc57bac5ed2a51dd43b10d66fc915bc25c71b43a723991e863e02cdb48ba3fe8f8190557f17be6ce6c66ccac4ec663050a51932519e08d89e469b4d55246ee267b83020668190557fae71ea3b64c72686fdba16b3d9ddc35d289d1f067c8abf9a12af88d6f21a369a55602b7fee823636953f4a88ad9899563f87dcea113f42bf7a876355763d7922addd4c8d5560287fce3d854e61837a680f50e379225ee2bd6f7f57dd13875dc9749926d4c96294f18190557f6b30bdac3bd22e52cfc966b185ff54477342fbdb6e1ccb26937cbbfc3397c4425560277f4b34feb721ee5ae2fbefeac70649c1f0e46fea2fa72768aa25fd3f4179d1813d5560267ff23be10d9874b2647bafe007ee598abc9e4036303d285d62c1c7084a33862e378190557fd7f51c03584fa046c2c7d76add9344f364328e056ac81d6d430a2ef8b028b35c8190557fcb7e05bdae206a4f4150785a46e24817fa408a623fa97637f25c21335022aa525560257f2cdfba890c8f7e28c41d73d2bf79f4a96b19f020c8ba95e84be0cf1b4cec149f5560247fe10eaa48062c7a154e77f7bf1d44cfab9b0a25bdc33b354586e08aeafd1b2e9f5560237fd603bac1ce0c8d5aebfc685bc88179e11cd67b6bab0a678b7a943d6a5f12a48e5560227f2730b57e45ca238d111dedbd4d0b366125a02a9f926c3a6274580975fcb4c0f88190557f2f4dd735c8838e1a8c2e4d86e1971b242aa2f3b14595606677640b6486e8b5988190557f4fa64ad9fabf0c64cb0a9a25415348f81dc706d5bb530e4e24cae1d767e07bf68190557fa03ff9a8bb7ca0a57d09b888ef588bcb22fa14a5329272e52f13f9cf42e093fc8190557fd87608a5e15a360c3f917011128e213d43020b1eb1171bda28559915031e97b35560217f43adc47c56248bac16958555246a6630ddc2b8aaede32c585d83e64fb0c500288190557f41ddb2c1e382c926edc2885f62f9b1411332e3c13626990cc4766fa354b44184557f9eba371690f0d6e4b3c858ce71373feae0bb059f536c0e9d9f773da7062356098190557f1f11cbd5aee048651786405ea2a49af7be316c18fd9a79f728ae4534c5d571aa8190557f0dcca45fabe728b4b408fd3d86d94e2fc315e52b654e87a5fde862de95c0971b55601f7f9f4c2c94cf0c0ed85044a2a2c1c9342d15c6087c6621b5f353da440a6ef0e4068190557f3b4c4e66986f2ba3b58bbc8f6f322f96cd13b95864c2904fcce2b0ea713d76b68190557fca93f33c23995be8f9aeb90000008026f5e50a370e9778aa3d3bfd1526a6a0358190557ff3c97940c2e9a45827f8d06fdaee01df700b952d6ac114c950f0a281fea720d755601e7f44390ddf490cc9a4ff51b0024344f1b54dbe438a6a048b47a01078a01336189a8190557f8e8f4dac5409ce77d919a4290c54ab5c0ff03876b170760a16c8545544f8e4c08190557f962624e90d83e55c073f1160c5ce4ac53a5c1d9bcf384bd736547da7dec8913f8190557fa6d1499ce29ca5ff31b2b83a221cc6d34c45314c18bdafc809a83a87ce5ceb188190557f7621eefb6d266976b7978255dbcd7f233350a7a9aeeff5b01067c33670a9ea528190557f9ee8f9dced13350f26bad199c562cbd2f5911d9b26add6d2639418a84018110955601d7f085a07f00690385671a18717ea79c283c8d891fd50e74c7a992499123a0b24f48190557f203ff42c06508455456daf232075cc5251c8d1d1c795432df7037ee71d9127548190557f52d213ba3562f22b0cbba5b1b9d9a2587ac49362abc525d5a72568bd5ddb0e8e8190557fb1b8e24a28bf8b2e02319598c772c6872b6230027fdf8a5bbff90836083b149a8190557fef0087ab2f950739deb2de1ca16f43a72321816e53a68a909c70f059952e023255601c7fe2df89fc9f7f8c6e6b334d311506b1967b2ff19fd217d5afb39896f4552f965d8190557f4e7d1ea2300061288b18449507f23f97ff8fde88e15cf2023f9a10722c73b3b88190557f74eb577f030db5692ea6d21e64ebeba7437aae478825c6d12427cdf3e1df1b798190557f5a3153be18de79d06daf912f20513177e25fcd8fe4a07bb05004a86b625e03628190557f7c2f987356c36d24a1ea841e962a3b2882c768b9cd6b4dfa99c1fd28048456178190557f972caa03ec8162c7d5fe3c4c00b6f17bf1ac2aa882eedadb675f8bcefcd350d58190557f5ab8ad7378fa8c4314b1ba427deb33146f3e38a2d8dc9f754ba3cd10801c9a2355601b7fb6aa63c15149aa017170a608fb037bf59a14808aa09eb4e711b470a14a6a87398190557f22e238f2fe2bac76de8c2d2d8db3481b6021686ba249b47fea33bdda2a833cec8190557f60a72b96cf9023e92a4634e6fc8165befee5a2bdba82ab5a18e3332d047737bf8190557fa22b7872d6297829b81fd484d6acde32f44871c613e9afd4014027eca18398fc55601a7fe34aa8a56d9e8bebb92d36a0046485f16f59e7dd41e62b61c4c121c174d8deb58190557f5a7850fdb29fbb85c447706087505cdf95524101c71083ff7af6333e82236a385560197fdd59c9c8ee827cd776ab48f971126e1cc67a232964cec271013f14f96e57a0b78190557fc66ea357ad76f62b698ad4f861d6ec40d5035c1d619852db69c70908992d33c18190557fe553aed282265d46d206cd82601de4fd6a117fefffe3eeb95411c8ee844dfc568190557f10d25dfe8a581d2742c157417a03ad4f4c564d40033cee874d89346628d549648190557f0863c19d472dce466653088717c6bb3c749a662d4cfebcacf458f6dfa7dad3eb8190557f477120fe806d4182826baff11ef061f3e0fa6f811a0dcb4792a3e401e82607fb8190557f713096bf3a7d1c3813eefdea7c0ac7efdd54c9c4a203e2555d64fcf8f03e22da5560187f186bf52f7c6f6107ea477bca353c8a19f6487a709fc9679ca66a4a7befb38c188190557fa1bdb9d4ac40f195a1a3558f96041df17d5f9a7e0d647c41c1973f26b77f352e8190557f4c68d1c3d0b31f2a823482add0ff0d8f030a8b0e313fe0cf5dee657e5dedfbca8190557fbcb0d3639eb0dea6610bc65a62151c7040f4571105b5f61628679f86027260098190557fbcbbecdc63a11611815e22eb8631e63e9edff9beba8521031138ddf66fca6e6d8190557f9ecfc6a4e87112c46fe49531dfc55fcd8fe1f376250314311434bddefa42d7ec8190557f5e7274ca924b8a4b7d2c8ff56d89dac1ca5f149ad4916da6d33ef3baf3621a8c8190557fda0ac117b70e2c20d3fbd469cd39ac11d26408cfbce10a33f5bc534fd9eb7be58190557f56b2a085a468f7b32ff17a870582b22d3f62ff1fcc5d8d8b263a2f067daf58ca8190557f1d7f9a8eb750797fd1a19013945ca6ab113498842bdd17c6101bca4a2245552e8190557f25d601c3748ca9cb2536c83253aae2b32168174e81a42fa7b1428961ebe1067a5560177f07aa75ece024fbfc8236d13a9af97fbe8454b689f8614d965af87896783eaf1a8190557fe6cff77f131916795af5a63b33b7b6cbcb45f47a6262d5e274f4f6d455024e865560167f1af7febb0b5e19408f7c6174e87f3c01731035980b8804075912dc541e51e2828190557f87403177615db3663210a84ec3eaa545e27c4a49349188c41d30fd841cf9ca4a8190557fec4524dbf42d68e0a3200ec55048e38a36b6912522e0f6f4feb1f9db4081f9b68190557f40fc590c1bafdaf85c6c7c1d2e6d15915cb7118aac1ca4a55886d5099d05366a8190557fd57bc9dfccbc84f0b7262ea0c5c22be55ac987fce3ca935ea1c972712e3c142f8190557f9924f6046a0323d60b328ea05ff2fa432c85d7434a96c3b5a8991e187e85c66a8190557f8503b52c1396cd83e630fe0475dd74e7ca9117a9877f59389ee99455873f039c5560157fdfd9e93b620950ce2a132276dc21cb4f42377d2e9db1601d21bc349390c94f3a8190557f5ea25fccd709f5da96734a1dbc3660741d051b90daef6a1b6b1a3703db741d908190557f91050e642e514de6bf82af9dbeb772af78b60f9334ac9756616635e21cc7fa548190557f92e127ce35cc8e61a9b0312f4b32b1cefb0246d70c35b2535f52e19882dffb5a8190557f836c6480968322c1c75ff38f5ad268ecb24c02af9369f84a2fedc4d66c45154a8190557fbf0585ef4beb62b13562141b9d33df45064eebb22fefc93fb982ff34ec13d5e18190557f42b0cc57f2d83b3c2d91952a9c18a7068e3d2bc7f26d1ea45a4034ad8cdfc6608190557f6b5e2825b072de385581d543e1ca46875aaad149b5f5a3e2862557284f869e1c8190557febde84b71516419a8a44033c1021519bc6b2db5ecb03b638fcbbd1f0d44de9828190557f8bcb9ccf8a5e3648ade025c26683b148e74de0f44183028b87c8585fb240d5748190557f6d215959087fd70311590d5290aa2111cf11d2224c03d6053ec702907dc8ccae8190557f81d5921ea9df35c9c97cae274741e2648a800a18789d145d29a2e5df0054170d8190557f4cb53c465cbf4cfdeca116a86bcfdc876161d77eb2250ba1edc93f7000c8c4838190557fd8a77b2e3f047010e55d9f048cc240500b6d65bf60e45fa636a1a56af94594988190557f1d1e13bc9b1b218d5f45b8fcb27d8dceba282f99535fa28c5e98030a8d06a9625560147f6f942250809e4eaa4a4af4874affa444109017466dca46918d160a5f4cbaad6b8190557fbee67a06c3ac4fb6733bf96a9a04c70f93f9ee3ede2361092e8495634692b7f88190557f6e63970928d98a3e6261a3ed2473eaff0080fbeacaff8dec01f4224c953b754b8190557fb056458196d3b876c9a0a292931d29f297a5e5318af70e2664f3d86656af271e8190557fb607c5baf2debb4959412c3585d1d32c1d49db2dab750e7ed279c9bd9855431a8190557fd6bddbb2a1c632226101d5f6fdcf24bff44838cb6b1e5ceb7e2b1b1b503a5a0c8190557fe61ccf2dcf88996dc6401da09266cef021c3ceab66d663676ace1e9bc5c72f728190557f0fafdb46ff07b3122cd0fcbabce2c57cc30c466b708e0f1633c1e2fd07c847508190557f5a4de4fcb02319f82d5e0a05ebeea8241d771e85e923c39ca9bd1c22680c8eab8190557f259c060072b6f809dbdff771eeeefb7f3adfbff1cf4bdf939cc11779099e1e818190557f7da0c3cd6d61b600da96ba743b085d9670ec789569d20087249fe69b270d96a78190557fef5bf117e62513d1cec35281d682ba0eee4c184b7446c64237aee4ee3d6da8958190557f2345efd2b824fd65790aedeee9ad4290881064cf400b60e32be0745580cf28bd5560137fd8b26aca8d4e070ff318393667d7b8e6ae143810da38f7d9ed09228bdde59abd5560127fd2c522589b1f3e00f066fa878f9d5b83125fee7013d7f09878815e3d72f7b9c18190557f140b2226b06f44ac60118997ae45e68356d138347770caaa63d295d0e0a421898190557faf1c015a70fe45a480e454c576f754bb3e84a380c89c92258448188ab2fc534d8190557fdf815f77599f2e5cd3765a2f7785d81408494502650fc5f53583b6cd835dcc088190557f2c4b4f6bc903100ada6db5a2d68455474f5ee22a6e59d3d74ba0f25d6f0e2c928190557f441f24a11250e124a5f2904e70a248b16c52bdfc27be1091cedb844d30c115748190557fad42e31548d31eba7af8b59b40ffc9b013e9b4fc3d50e0d70df104a51af045bf5560117f6fe1df4da105ee8eb3baa9e79279875a0d44260b1aecdd3dcccdae5e764803ea8190557f359683eefa383c030b7d846bb248e7f3843f48e7745fcd91a68e3f11e84b70598190557f966d85fc5dd1bff019aabbdadbd010ed6f1f1c2d2bc8be993b2d917b86412d0b8190557f8a335539c5517bdfcb2e4ec4579f3589aae7e00377566398e7afb300a427384b8190557f8922eb3102dee5bdd823a7ed727f6490545a96727890a87c000c452ef907b2f88190557fe8ade9f030d2eded8a5b9787ad9bfcc1e70cef865578febc30cc97e9ee4c69a05560107f3ae01fe15531d21da9d9f244220de22abd0467fe1985fc7fb117f7cf6e8b0d9d8190557ff7e6d29cd85404ed19b37a937779a14f3f7cf724279dc7f6679d2f2c20c11b758190557f87f2c05b97c6b0ba34ceeec6b7fb12b84d923163bcb923908ddc741b64f97b348190557f461ba3c66d0b774d0eeeed0563eae8c917cf77c737af451ea8f9fc378f6129d78190557f51326f9c1ed0108d4dbd1e26ff9fc31b12a8f71728fcae31718df23a0f84bc958190557f153ad7ee405566c86c4c8831d4c3192f64e48ec9b9f059eee6e1ca5fe03612a38190557f8b629a2717dcd2520081f17973aa70c08174d34731e8f5020bbb6cd1e0b106908190557ffe7c268d3cf39eaabcbcffe4e9e88bd91005a02d5539c02336a31a3ef5bc90a155600f7f5f93796a4169b04aaec29a75b0f09a8e6bcf849116a88295a488fed3367668428190557ffaa64cfe0544b039d6928440b60c8ad2b9370680479ed336ffa0655aa01b654e8190557fbef2af20e2cadc5491bdcbd79c263d218f04b07dd837cc58c0e1529f609f63ce8190557ff61381bfc42d2441fe3b6afffbaecf09c347094e867882081da5254efe7b04da8190557fc912ad25accd3969c21cfa53f2c0ac8b03dc300da9462bf88d6d31a2164ff5398190557f9a4c6a44d2b1178028c95168bc2167cf93e6434038b9ccf9beb9e6e8f7d60e3455600e7fb8e2d36d39f2fa335e0dafdeab98dddf49f0c692ebf69dbed02e08bed12a132f8190557f3610991a59ee040851026886e87158feb3e7233ee5339fbebe77fdb18daedf5c8190557f8f31f42bbfa8882869c22d13e4d9e3295caf3cf5c955aded26c7ce2e9a4b16018190557f1f0c595750204a52161eb68b1f13cf21689a888d50dd17c3724107abc472fd918190557facd958ec9575a56c685b69218fb043cc15fb241884709454a4494b9e5bc2c28655600d7f5b1de22a71a3dbc05ee3617f0020d583799dab1c9427ff2b973cb06e33df95298190557f2359f285270ed05c8b69b0f1b47dca6915a1ada7426c4ded331adfde7fcb0f6e8190557fed02285db541f284c704a587a0841ac86ddb0386c608752a16449da0268b41f08190557f7f918db62ed1d48c8764c9defee9b8c7ac47d4abbab2f1503307f2bb4223f02f8190557fdaf4cc2ce5e8a0f02cd49476d37a15a5197521c3e12da84066dd9f8863e471558190557f34cc866b790cea0fa2bfae12c2d76cf3f93bb3ca31a765beeccc53e28320ec8e8190557f6fabba70e9172cd558426cb5f9aca05d646204d51ea2766223b60056d41beff58190557f9fcc9432b5502b22e0d60c85675c2914735cc17f2e8c55158c40714f7f4c9d2555600c7ff82a5d53c8f1e5dc36a1ef561fa0774678a1cba3c153c6c5ca1cc1c6222125178190557fec51aa728c774fc5fc52360ab156d1555b913a5fd4f4f133306bed49ae21dcf38190557fcf53f52e6d724f387c5870d4659ea6cde0eb519f181d86686075329862ff3e228190557fa3a5073b59c966f740fd9db6b9e638cafef25689a5c932cabb87b3181fb2c7858190557fc70bee834480f9f58443198a0350ebd2b72d96d40817dd40f6f009bc31eb26af8190557f4c719e81922ee4bca9836ca9a3d44670e8b51dd8ca30bf328da6110705470a5c8190557f5812fd3f7a5575e524f0c9e9f21a3cb985ee3ae9a7b07cb92da4f8b2eb791c9b8190557f52cf2bd9b56d4bae07b799d36e61b02ab89f3309b1d3f9fec59e8aae045b34c08190557fb07878110f5d22a4dd5a6f398e6e788c0e1f8cb0286aa42c3bce5f8f053f15378190557f21a568f4c5f07ffa96eadcc33db3abb3626e884cddbcbc71fee993c1796df0ae8190557f1e1e92361fdb4818a635d29e1752ab6f83e50fdaa114aeb15af1ee3aefe632e28190557fd4b0d17bf38c3683df15ba0111a0e1883d3e2faf15ddb1906576b297afd447d78190557f9e35195d810cdbd5d7c0f6567c0ac5d8788a4b4a9f5797ab4938eacf1a22b61b8190557fce52b083bb21ae07bf2b7968d1b302c42fc2660a8d7230c46a1cf08ec93a56758190557f88cffb075eb4e1502e07ebb333adb858dc0496c22e62c4bda8a46cb127a8020a8190557f811f15392fb6f7a2f322f8915ecca83048584242502eee646cdcc90e3cd7d8828190557f7955886569f5ca0fa71f188c9fbfb524e27e289a1b3618339c5f5044c4cbedb155600b7f0ac388a0abc86efa499e06e5aafc9d7887f511ff54e3a6a76b601385770301a68190557f9cc76e9b0a5d3e5422fba3cd2d5667d1348998c89284c7155486e12dc83535e68190557fcfda778072dd2f302e4388a36993ef1a1bdb9bbc549b190ad764e4d154e10e9e8190557f96d996c4a289d5ef310dd82c9ffd3b6f310557f072e66c2e58d9755051fb7d0d8190557fc08b3042bfab0e7c362394d1ac5ed109557077f5095efe6f3e55f06a3057b14c8190557fdcc680785dc19eae451f93c527f000003bed525133077a64ef088cb04ae406ee55600a7f438ec24e4125898fb027b20c470f624ec15538a2417f513d4c15ad75562d5f648190557f11f2cc397929ddc5cd7ca89ad9170b3300a8292ec6d70d1f6d9c44ac95019aef8190557f5648f35aa0087391d4da8831a4a7df2ec536eeb5ded6a6269903f26aa8b8e5038190557f0bd4565efd059f6f93f2739c805ad008d34743703226d815d100442a585d49e28190557f5e95a5375d71306012c14d8e15b74c5a57c3ab99098982ac1ec5300615a34f6b8190557fb89cb8d72ba3dadf26fff51ed1f6f28be737bba6aadbf7163163db74457c8b488190557f817fe9275e40d772f51350f44ddeaba38ee2f44847c18e8ca91df2cf02b4e8738190557fb7d042eb4005b5946faeebf3301393ed66673ff7da12527fd2518932d23385d2557f133f518865118d2251c2b9736f352cf472046303fd02acade7396c4fdaf782ab8190557f12f89c98522133ecc6c009d9b3f39b70365156c74387f6de321b495deaddfdd48190557f0d93a3d85294157ae73b206a4fedf00b64c3ad0971ba43f8296286735bcefec98190557f5e31f7467394ae8cf614b213b35dbb947cb6ea9197cdf7f3057275978b0e8e8b8190557f1c8f5c9a9be1a40af442bdf55d144eb56e37f8b28dcb87649035b1bf37b466258190557fb1ad1234bcd692e53f98e81174d435390f8bf4642f88acefe57112ff5849198f8190557fb313005f647483b904c0a0c840961a1e3619d0a76b0c5f3c81fa553425412cd88190557f424fae20c21b2738336f5b9a1734669570b76939e88c46fcf1c1209a6473a2a38190557f1a1d2ec12bc45e36318a9d54264890b164a556149d7c9e601a852fbf733e51fc8190557f54b1ccf491c9919283fa2efded38befa4977cedb75e49e427f3afeb2c5ab01f58190557fde6d9fa3aad9ae93d5a7b362505e271445f85c13b3b5d13259cd30d8f6b65f6c8190557f9c80eef808c3a96d945ac268c63e5330bc46e1ca940e9be056b2de0c845796335560087fc597a34470fcfb58b9e385763e1ee8e8fa744ec0cebfc6d022fc04552a7fced98190557f9c3e536f0138345bb3606db85b1dbf4d9632de2bd8e3e55bd31800ccb85944c98190557fe68bdfc3dcea79707bc9fed688ecc8af97c9f1fc934ffd196742122bb28a72728190557fa82e49e46382fe925a184965b2871159f6ecdf02c86d00a3b47af92488c927118190557fd990cbeded8e0ad732804c424db2f06288e95b25b7fd9dedbd28353fa71707fb8190557f8d5f07f56ade63a667d148d90532d6e6f5396983f61810a08aa58c1b9febc9798190557fb3b5a9123c001a5c2e3d4d1146d13cd2d71a811f12a1a370ea604c4f14ca49948190557f92152b4778b98b45a44cc1448b190878ed5bb183c5d9db4c04c0a8608a07419a8190557f5bb69b6a334ffc4add7d61ef621ada6a2f9330dbcc3a39811f1918166d11e20f8190557ff73d20dd7ddc68af4212e3e7d4ad6a4e693deef9546e70fe6668e6ddabffe1ed8190557fbedd7e7b5c81c4c9cfbe50b12fcecb77bd2a4dcfb97d74787f98a404573227738190557f083c295de4602167df56f2a5d1f88ed08e97c9e39e8df310dad216a5b3a7fdde8190557f2e64334f202f93f42c65b114adee71a397bb2a37f3e71e4cfd170176474e0d278190557fa1fa8a581c2fc174611f20bddad4aacbc60d493ecc275e2ab77ad796a7ed593b8190557ff3a10a2a6a80c0fdfbb77d9fc186360774e9f6d5e370376768f7beb187ced1e18190557f294bab164283d94c9dbcb2f22b033853800b030b661ef31faa118210ff1f51a58190557fb41a1899a35dc41cfc07415328d7432e69d5ab84d30fbdc938e3d673f9e7aae58190557f4fccca76019821bdf3966caf7bbd73b649d9183488f7c519d73aff83d9fe9afe8190557fa6dfeb8eaa956e976355c69e9eedda000816e601ca6d2ba592fbc2c4100046018190557ff5372431d57d6ea7886ca8ce4243a3d9170d247cdee08403ea6434f9ae97b5f68190557f306d67ff37394af0741944e5b541a94adbd9849ec2677632cc124168553fa39b5560077fa117b03bff49a35cdfc74abe55b6cc87267e7768557ee889db22d161777e6c5e8190557f96f6e04f462d9bf6cf51840845e037fd854fe894cce70a1445c1176b3705ebed8190557f687484c3742725494072e55adfd0918a20a723b9236117fef391407296b44d3e8190557fcfc8c64363c34170892db77cadedf83fc379bec325003a10fff9ed5fead256218190557f6ee00b16257a13ff108ac92e8c0b4d545420fc3f420657936c784d53ce28e80c8190557f55edb0b1c0a8b7493cbb9fe9ca7cabcaa20075edf2cfa8e432cde1ee6f9eb7798190557ff43ab86d1129a0027375ad2fe8cec1defafff98116d46731253c35096d80a1a38190557f39b130c05858e9eba6daedb67bdb5de32adb769c804aed0948f50786f49274388190557f70fdf51a19c86435ffe6e69d3ab4ebaca322a7dc65fe2666586af9b9901283678190557f04ee484fa0c41f4ac298e5c03d1f4e43d1a5581235641953670e25e983299ca98190557f3fd2891e91f70ec217df8247dd479c47c617106617b308f73916945fc90ce3ac8190557fd89b8a6aceedb50e1005a6fd42880737355f9ea602661461db7a65681a11742a8190557f062475c94b5d62f3d501c8722c2fbf24b02a2f4f816ec5082d92eb09154086d75560067ffa3a722a0416564aa2d369e4d5d11335df8d0f49ba1606a3d53312b5e4b342728190557f32ee6fb8931f858ac14032e2dddcd5c764a79394d264cd941cfaa032bd39aa248190557fc59022642c60424b0a4b6dc278da45c2d2eeca3b1c811794b9cc98b12874ae0d8190557f1d2e54cc63bb642a85e6e15b836cd414f952a8c67dfa4c4c81ee84bbc4291df28190557f91538d753c27cad60eca1ef93cb14d910a9ab47b63341d9716d65d83ee411ffe8190557f5a8b36f2c22e3e4aa9cc678cc02a78378d59b51b19d741eb114e477171441c138190557f9971805f3398486d70cb56665626ed034405580af3450cae7abe3527fe4262b78190557f7f45f1dd650e79185d12d6eb596a48b37032511db42ce65babcce691326abdfe8190557f9614c6b708c7ac58045e950aad473cd05c3ef587886206775c8bc650319a1f2e8190557f7623d71ba10ef4b955e1b1e4b3cbfb3d9650dcd25fde56ff03133dbc40c412c38190557fe03f70e5cfac6da9d8a8c0f6e841f5b0bddce881366e90db148fb3f9503e237a8190557fff0101f2bef70122009bfb9b6297033ec688c0db1dba3cc56c986e34ac7f933e8190557f0de2c7597c17c7fc875d23d3c4af6528690bdb6a421ff8dcf3ba4f4f879bb6608190557fe529d0686b2db1f07a8eae03771c2e015def2cd301ed853c679409a645c7c7808190557fd0ae83b6d2a9a8f19d9d9335aa69c7c75af184de35bafd8f22a68653caff05118190557f3d68ef94bc9dd3c14cd5de927cdf4326c8942e5d037d58a2e9eb3809632f3e5a8190557ffd1cab32b2074123fee79e8621bd9a2fca80488d95a2e676719320a122f076198190557f0210930ce044aac986e54116b14c6028d6b335020e5f7c2b9917ac33ef0762928190557fd4a0b18535709ba808d51c0fb69ebc17422a27da3c59ef74625eb3062d6b19055560057fe876d54742a5747faad2c33b739c5ed2964b49200035c7962ad9a246f9514e398190557faa6f768272f39f6798daeb5bca03bcc21d4f92548b740a7892cfa77f55fefaea8190557f90535e00e50d60c7d2c76d3734f911ae0bd607cad0002fcfc0c0bf36131ff5268190557fb6d7d84aaf3517e2e48fdae0bf4a944c8b5a4735f4ce004da45d31fe72b69d958190557fc2cd7d7eb83185079dcf734f722f6e6bd95b1eabd14ccfe0e7bbfebd8ebbe1c98190557f0ae72265807859f806fb9712fb152dc0b94a05e1ba1b8d7836f054d9ab06ee558190557f22abc548e1fffd3ba1f69cb58eea103c51e410e498d8f821dd3487c72383deb88190557f123442fa09ad67e301ff550ef12d5aeda01fc315e20b77e194e88406c6b841a78190557f1687f4b7814b3d3fb47245703db7c8e4c6a42c53f605c6f5b896776b85c7de168190557fd4c1d60f08422d66f16aa1e81e59676396424808d3138a1478904693971199bf8190557f2f0ea65d8c63c06436ae742abac6253ed9f8fee2df77e51805be19439ca10e808190557fe1d5a80b73f2e1dc8b9582f793a90f571f0d50ca052d5746709766b11e8bddbb8190557faad562b246ad507c805e96a6aae2575c8c0dba21994b0072adcdb286cf6e1a6d8190557fb3fc6d651f62355196a3a150455a8573dd1d79988c707582fe66929756b24f858190557f4ca43de333c30fc823089dc778c9525101a52fc440f91ed76602c3c96146218b8190557f0dfaa9103750bde64e94510590e0c92c75ef9662c3faa5cc531e5c4164b2bcbb8190557f6f7c8b762275b1fad68d9dcc6770b814c07904168121e7aaa404129d908b58ce8190557f166a9b2d315c156714112b5fad0752a95e4a593573ee7b2ff8b2126b99e631fe8190557f8c98a2373602ac0e8e6d3b2652b6123c185b1ce4845489ea55f0a148c200b1238190557f8b1baa8d24c3d2f11fa7d481c1fa102fd710c1e659ee034d7c99db42bac49df28190557f0bb1361050ee95822fa766cad8e9f35f2c98e16e309df2ec70aa5467127fb4a38190557f8165c6f758115f1df813d76328be29effe0061cb9de8746cc4745e67b43b90798190557f87109e089fc74a2ecaba0c68803da3fc0c280be05ee03a2bd35b9d51144e11f98190557f9e76a3e77efc2334998340eebc0ba20f9a6fdbd9839ce71cc5f20d56bc19fa168190557fe7922fd45c3b76c11cc6b4187b2ddf305ae206366e8a31e3ab4fcace85db3bd18190557fc503f8702a533cccd7c9812b6ad457e99e41dfb3b47d885c84cf1a4d5bc337158190557fa3f0c40edbd66977b928958c03aa9204fcff7cc38dc4892cf3615ae7fadd1fca5560047f76bff481376466216a965492997e655510a3068fd0d4e4c950850ea643c1e4748190557f23eb5c3e0a177bde2779ccdc6bcf955b0793f074c34e1a627a914e87ec6a78a98190557ff7792635391efae5bd6eb8e7bb990d35847af336b6728dfaf6b25110d0712b428190557ff486c3620e6778ab915817bea99de07b251765c19552827f2372645701e4dd6b8190557f89cd5222fe89d0648ac7626519cf6325c6a648b9755a5c30240dfa043b457c918190557f8804fe7218207656fadaff217c912be83f265662f912e7111f5fb4d74e8aea0d8190557fcda0fd28b307bfa942c8f7cccdcc7185ea6b224ef82a4fe6bb16a6ef1ac45bd28190557fc4082e08bb516c6e79116a947230ee36af1c82db98cb1ce54b4e22b4146c1cb78190557f080219b6fdac419cd55597365a614336f9151d6c5db351f557de7a207288a7d68190557f4a4a7be8b97599b3858b28fdd875c819c92f47fc6d57ca4f07cfbfb8b3cf8a598190557f63d59483555dacd699ab4b11fdde0f1b778e9dc205c7e20e58cc517ca09c8f198190557f65e4c1fc871a9a060cf7b5b543594e7eb463be4b69c35a4a94406765a9ddd15b8190557f3faf3ebd7d0b7b73b1a87af264ded5eee29944dd6a924c3f1f84db4efbc31e9a8190557f614dbeda1d044d8825b2b430e5ba30ab5dcaeefd3245e41994298982451071c78190557f6fc81c6ecd532b6bd403321129b8b358ffa7c98caabe297ed3c5732f8d69c6e38190557fd8343d86657312199abcf2026ca8d1b9313ee2948e47f9b13435d6df31e26ed08190557f07538b5d66bd49dc0f7ec8ca6826155acf5b51dec71a010e89f885f6eebbfed08190557f5f33902ca0e03e5f1ffe450b3dce45bf33639c714999ed82c90f422ed1d4b40c8190557feffe750a8eea188c470bd0d3e6e6808b70b4ada901034380908010327ef9eedd8190557f64a8eceba83921741626bb2413f01a1d74f80984d3519e97cf054b7800f671928190557fc97b47a0c732f36e46fae0fc2d4d464b39ecf102f57b367178cc54b8b501d8d78190557f39d8a3dd9f66ddc0387820481bcb6a69bfa0ed3606dbbe7452d25b2f304fb2a38190557f111d28b07ef1353db0a4e0f45f4e8d58d90b23ffc73bec350f923f4c508e62bc8190557f967c07d04128787cd92483963b3558fd27b6d53cbebc15777b88842d91e6da0b8190557f450cdcd94ad37a0b1b786b17d4be1dc96bc1be4bf167cacb09612543be7ad34b8190557ff7cb943662281af6e0487b54cc8f75c53af80085360fc2ea67d1c8de29b07a698190557f2e5dfde251818fb0a2d6d3ef921a6a5064628c22f9bb2eefc16e9190543051768190557f17304d0f7784e56013d8628e2b001d5a51f996accd5772f57f4d5c0281aeafbc8190557fb2614191ba34b1d1a10425665a84164116347159129ca03b97df6b47c486db1b8190557f0f3e32407c427af2ad4d6024364e9f8f7cec12896b082d56bc9fd4bd55b8361f8190557fe38cecfea668973c9d0d51d3ff3f5815778ec920a37c683216b4e2cec83dd62d8190557f7b461e324afe73e6573c6e6e439ac7d9e62aae314cd29881c3174d186336685a8190557f3b4c3c85f3c68d9913fab2416e569957c19dfd0625814dc5c48b0b523dea7c188190557fcaef9946f5b4025a6afcad8c254f999a4b77e35768f105970d600aacf141cf4b8190557f7cce64978e2085da9cdb560c924e334c355506d637635ee210c6d023dae6e86a8190557f5f286a2daa782fcfaee08b9aa877656bdb67bb3115db11ce67267011c25000168190557f1bfb2486434b02416d9829651d681db94ba58dd83ce0b4905aa8899d5c7a01628190557fe8c07209fff840f61878c9b159051c52d109ece044ce07a30d27c6b79cdfead38190557f6115c976a33998b0a92a615982280459e258b4a9d0381574d48e4f19569eaf688190557f70a89a6f2665231aefaa73d0d6af719750813dbf4316fbac729856240223b14f8190557ff3b40f4f2ce002446a7b76b033bcbbf1e90abe0d14670247a5c4941c8de45e828190557fc6c1b5a3008a2ff03b78a142e47246be6a8cd13e9bb0373a46f28d8d4d80ccae8190557fbd9e38b175f74d0ec697b3b5562a02feb51d22b3d5993689622a563c28f17ac28190557fa5db8bc343eb929c05ecf178e25ce62879ac63ef8ad69d38d4379e652f38d48c5560037f55d224c8e2f8a4569d328c0337c1cd18c9738764932470f130d0314f0bac02bd8190557f7c50639221da44eb7279e19194f9a37e4af6977a2790487bd9ba8cb24827dd988190557ffd8cd7a289c5924df12e5a41fa83783ba74e4dfb8c286feb8c511d74b9e09f628190557f0dbc62aeb30bb023008217048caeab643cb249d569e54e3f7fe5a55c4aadc1f58190557f1dc59774a6425aafb24678dc65e2cb4084bbb2bcb3cb613a64f3268f3f2d6f258190557fc48ddaf4a0bff2d4ba07b02c096d5d971de47a1c16f56d1941e51960a116ffc38190557f7686777d70eef6750f76f4fdd9a1a4987de8ff511bff528d62f09d6357be3a0e8190557f21f53765401f694127904c635e3409b785747006b23528ba950816416b4a1f7e8190557f0dcfafea3cc14962b0860a4d57cd4b7b62befd387a0837ebe9d9412d7a8cfacb8190557f25a5f8f8cb4ee12a2d427de1f5f19b085f6e0add2c768684adc2ede5add5c13e8190557f6f0789153d8473be6bdd7f7fdbfead82be79577c21b5be202641f37dfc87c46b8190557ffb3667664acf1f687b7db1c7ec5ffa6503eec483754667ec174ddd892ecf15df8190557f55e28c2b5e2b3e7e9b7f1191aa3d94a65dde9ff817796e63c4e216a0c36742198190557f484a3da2970c8fc00c05ccaa3557655ed4360e929b3b4d668d79555e95ab3bab8190557ff268aa72cfa9bda062d406a21ed10173d0c3d62fccd7c676ea56134759b8ef9d8190557f31fbba8c3d259b486f7bb5a5d1797fce24adcb60c94e98c1cfa7a5426377268e8190557fde42d1d8dcd6eafccc8a713e6734102ea4d0579c1281d3222b8aab6b407b2e4b8190557f18a58a01a11e375b86cef69b9aba15d63fad76251f538e5b86637d9fe0523f9f5560027f9d9808742dfad4dd2c470b30d7b8830a1f6200a70aef381a7d11d107819341c78190557f8470ac76d0fbdab231dd0b14384b42e3589c8d6e03bef7e529d92a7e7814a1a28190557fc745ffb0a63fb44fdf7c28b29eac1c850ebd2f0c0c25761c1e2a044d0ebe90e88190557f0787f165d32d545a1223f48040f81d529934f89167e77783315629d2112e96e78190557fdd416b657563e2a9504f8e7c7b40c3769509d3fa76a973558204678596df71f08190557f7a594f218be23b22cc59772cba9a91edb51350d774a375ad06e5b420c099b2a58190557fe95f634dfc45418a05b8c97f32a5b4ec490dd1bcec4bd4ca5df1d5d7a0477f968190557f1e1fce3e3141138c18372eace3e3c6e9ea798603a4f0e94239542b9c2e6b0e9c8190557f6bf17bfcc31da4c090a37ceb6249fb6cad234a87107d0647ae188282a9b258518190557f243cec553953a28852ab8c71bd66ac4a289523f4cdb8565be95fb1a26d54a9fa8190557fc6fba9ae17e5de25c7c07758b6ba35ff1b866c98d76da48b51676f0c37ce8b3a8190557f5b21050c36b3cae7b8461e8f377121b63bb2ebe62bcb35d56bb4daa23973ca398190557f79e0dedb17c991d9b69534a36cfe9f60eeac04a2982c6cfc13f9dec1cefb32d18190557f797d8b72911624f431551bb81806b58a3bace9d95fb6bc19811eafa427b4285e8190557f8efb78744554609cf769286f07eb7a1045df1887d6f607b10f8184b0c5f83d428190557f32f09457c45f6d55a63763fca92ffd7430619e207801cf4817f46e45550f79f28190557fd8dc08459e1fef337028c56b37f2789b2fa2a15285c04f82b534d85adc6b57aa8190557fa63f0bef270e275df73327c7a6601111b859d912a64bad2726445a4593548b055560017ff0b5aceed4369211ef5515d80a34e67390e034ab4fc7805996c773bd0fa6ed588190557f03c597d48eaddb3ba5800aee72bf97c3abc80f7735fec70aefb17761c851cf658190557fe6b21c5f06a56587bb47467312489f94abf2e7f88da222947d13fd7656e1b3ba8190557fee5e9a9f279131b7db74375dfecfc39d9556acc6c278c322726f007f7aabb7878190557fc90dc48fc64d0f1622b10d5b0e4d166585c01bf837b07deb22d504348bb490d58190557f55cc318e19f013f37537c4be0fb1fa00b3067f865a698a2716f812081607748c8190557e42f01e9ee45f9c386a2453bbe056e4af62d118c162b564be09f86b94b959da8190557f10bc230ae42f348df003a9fb6663231d196c7f781a928a7cd29ac4d90173d2118190557fb9beabc6280e5fd2f4d2a1f9aaf9bcd7384a44d1f9f8a391aad5d162100798dc8190557f141bc819860faede29545932b3052af86b709e96466b17463b2504ab4ff119288190557f38b115f525acb3327632d1381f144310d67163b933073231c6fe01f97624b5688190557f06b0eb84447eb6ef7cce245489624891bbebaca5cbfa5b2cf7b24c208771b7e28190557f0a9afb1bea1c3a42de3dbe6553a1080daf9b60483f5ce9368a77cd66c82071a48190557f5d4f2b0c3500af9206746f2b819d7d2b879df12fd26f4e0f2ace184ec625af5b8190557f2f5eb6b45a3ff7d3fa23490140d12128af5fe5f1909c6e2bc0ed58efaa3946308190557fbe9401508a6bf6c7a740bd4adc00b68329151823b49a09f8c3fca0a76aeda9d68190557fc6fa701fb6cb47cc00758d5ce615cd95c5f8386f15d5b170e778aad22cc9ef388190557f7a1084d3915d9f9353090cbf89e4336cbab9ff6596175f4c56f5daf597f346168190557fdec865016d24931c06a70de27f914fc761fd0009729e3c3c168418a25ac517678190557fab808b2eaf7eba98c5d72be31a1a3ca58e4d5514e6097c1c5118983a39020f8f81905573895980246d1854fe1340741a5ca0d823afa9a98e6000527fcca65d1f439ee4e510e33f657f098a4ad7376a9b6b50488f17573d40b80f332355565b82805462003b529062003c7f565b90600052602060002090601f01602090048101928262003b76576000855562003bc1565b82601f1062003b9157805160ff191683800117855562003bc1565b8280016001018555821562003bc1579182015b8281111562003bc157825182559160200191906001019062003ba4565b5062003bcf92915062003bd3565b5090565b5b8082111562003bcf576000815560010162003bd4565b60208082526027908201527f455243373231413a206d61782062617463682073697a65206d757374206265206040820152666e6f6e7a65726f60c81b606082015260800190565b6020808252602e908201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060408201526d6e6f6e7a65726f20737570706c7960901b606082015260800190565b60028104600182168062003c9457607f821691505b6020821081141562003cb657634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a051612b6d62003ced600039600081816117dd015281816118070152611ba8015260005050612b6d6000f3fe60806040526004361061023b5760003560e01c806382cd8c0c1161012e578063c202fea5116100ab578063d7224ba01161006f578063d7224ba01461062d578063e547e69314610642578063e985e9c51461066f578063f2fde38b1461068f578063f47c84c5146106af5761023b565b8063c202fea514610598578063c6788bdd146105b8578063c6cfe192146105d8578063c7876ea4146105f8578063c87b56dd1461060d5761023b565b8063968380f1116100f2578063968380f11461050e57806399c89e811461052e578063a22cb46514610543578063a5c67a9614610563578063b88d4fde146105785761023b565b806382cd8c0c146104915780638473f9cb146104b15780638da5cb5b146104c457806394813a54146104d957806395d89b41146104f95761023b565b80632f745c59116101bc57806355f804b31161018057806355f804b3146104075780636352211e1461042757806370a0823114610447578063715018a614610467578063787a08a61461047c5761023b565b80632f745c591461037d5780633ccfd60b1461039d5780633d4eee52146103b257806342842e0e146103c75780634f6ccce7146103e75761023b565b80630fcf2e75116102035780630fcf2e75146102fc57806318160ddd146103115780631f17b2591461033357806323b872dd146103485780632b585821146103685761023b565b806301ffc9a71461024057806306fdde0314610276578063081812fc14610298578063095ea7b3146102c55780630eeafd87146102e7575b600080fd5b34801561024c57600080fd5b5061026061025b366004612066565b6106c4565b60405161026d919061220d565b60405180910390f35b34801561028257600080fd5b5061028b610727565b60405161026d9190612218565b3480156102a457600080fd5b506102b86102b33660046120e4565b6107b9565b60405161026d9190612157565b3480156102d157600080fd5b506102e56102e036600461203d565b610805565b005b3480156102f357600080fd5b5061026061089e565b34801561030857600080fd5b506102606108ac565b34801561031d57600080fd5b506103266108b5565b60405161026d919061299c565b34801561033f57600080fd5b506102e56108bb565b34801561035457600080fd5b506102e5610363366004611f4f565b61090e565b34801561037457600080fd5b50610260610919565b34801561038957600080fd5b5061032661039836600461203d565b610922565b3480156103a957600080fd5b506102e5610a1e565b3480156103be57600080fd5b506102e5610a8c565b3480156103d357600080fd5b506102e56103e2366004611f4f565b610c79565b3480156103f357600080fd5b506103266104023660046120e4565b610c94565b34801561041357600080fd5b506102e561042236600461209e565b610cc0565b34801561043357600080fd5b506102b86104423660046120e4565b610d16565b34801561045357600080fd5b50610326610462366004611f03565b610d28565b34801561047357600080fd5b506102e5610d75565b34801561048857600080fd5b50610326610dbe565b34801561049d57600080fd5b506102e56104ac3660046120e4565b610dc4565b6102e56104bf3660046120e4565b610e08565b3480156104d057600080fd5b506102b8610f54565b3480156104e557600080fd5b506102e56104f436600461203d565b610f63565b34801561050557600080fd5b5061028b610fcd565b34801561051a57600080fd5b506103266105293660046120e4565b610fdc565b34801561053a57600080fd5b506102e5610fee565b34801561054f57600080fd5b506102e561055e366004612003565b611041565b34801561056f57600080fd5b506102e561110f565b34801561058457600080fd5b506102e5610593366004611f8a565b61116b565b3480156105a457600080fd5b506103266105b3366004611f03565b6111a4565b3480156105c457600080fd5b506102606105d3366004611f03565b6111b6565b3480156105e457600080fd5b506102e56105f33660046120e4565b6111cb565b34801561060457600080fd5b5061032661120f565b34801561061957600080fd5b5061028b6106283660046120e4565b611215565b34801561063957600080fd5b50610326611298565b34801561064e57600080fd5b5061066261065d366004611f03565b61129e565b60405161026d91906121c9565b34801561067b57600080fd5b5061026061068a366004611f1d565b61135c565b34801561069b57600080fd5b506102e56106aa366004611f03565b61138a565b3480156106bb57600080fd5b506103266113f8565b60006001600160e01b031982166380ac58cd60e01b14806106f557506001600160e01b03198216635b5e139f60e01b145b8061071057506001600160e01b0319821663780e9d6360e01b145b8061071f575061071f826113fe565b90505b919050565b60606001805461073690612a75565b80601f016020809104026020016040519081016040528092919081815260200182805461076290612a75565b80156107af5780601f10610784576101008083540402835291602001916107af565b820191906000526020600020905b81548152906001019060200180831161079257829003601f168201915b5050505050905090565b60006107c482611417565b6107e95760405162461bcd60e51b81526004016107e09061290d565b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061081082610d16565b9050806001600160a01b0316836001600160a01b031614156108445760405162461bcd60e51b81526004016107e0906126b1565b806001600160a01b031661085661141e565b6001600160a01b0316148061087257506108728161068a61141e565b61088e5760405162461bcd60e51b81526004016107e090612438565b610899838383611422565b505050565b600c54610100900460ff1681565b600c5460ff1681565b60005490565b6108c361141e565b6001600160a01b03166108d4610f54565b6001600160a01b0316146108fa5760405162461bcd60e51b81526004016107e09061255d565b600e805460ff19811660ff90911615179055565b61089983838361147e565b600e5460ff1681565b600061092d83610d28565b821061094b5760405162461bcd60e51b81526004016107e09061222b565b60006109556108b5565b905060008060005b838110156109ff576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156109b057805192505b876001600160a01b0316836001600160a01b031614156109ec57868414156109de57509350610a1892505050565b836109e881612ab0565b9450505b50806109f781612ab0565b91505061095d565b5060405162461bcd60e51b81526004016107e090612822565b92915050565b610a2661141e565b6001600160a01b0316610a37610f54565b6001600160a01b031614610a5d5760405162461bcd60e51b81526004016107e09061255d565b60405133904780156108fc02916000818181858888f19350505050158015610a89573d6000803e3d6000fd5b50565b3360009081526011602052604090205460ff1615610abc5760405162461bcd60e51b81526004016107e0906127eb565b600c5460ff1615610bb25733600090815260096020526040902054610b3b57600a54610ae66108b5565b610af19060016129c7565b1115610b0f5760405162461bcd60e51b81526004016107e0906128bf565b336000818152601160205260409020805460ff19166001908117909155610b369190611792565b610bad565b600a5433600090815260096020526040902054610b566108b5565b610b6091906129c7565b1115610b7e5760405162461bcd60e51b81526004016107e0906128bf565b336000818152601160209081526040808320805460ff191660011790556009909152902054610bad9190611792565b610c77565b600c54610100900460ff16610bd95760405162461bcd60e51b81526004016107e0906122f6565b600a5433600090815260096020526040902054610bf46108b5565b610bfe91906129c7565b1115610c1c5760405162461bcd60e51b81526004016107e0906128bf565b33600090815260096020526040902054610c485760405162461bcd60e51b81526004016107e09061266a565b336000818152601160209081526040808320805460ff191660011790556009909152902054610c779190611792565b565b6108998383836040518060200160405280600081525061116b565b6000610c9e6108b5565b8210610cbc5760405162461bcd60e51b81526004016107e090612388565b5090565b610cc861141e565b6001600160a01b0316610cd9610f54565b6001600160a01b031614610cff5760405162461bcd60e51b81526004016107e09061255d565b8051610d1290600b906020840190611dd0565b5050565b6000610d21826117ac565b5192915050565b60006001600160a01b038216610d505760405162461bcd60e51b81526004016107e0906124cc565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b610d7d61141e565b6001600160a01b0316610d8e610f54565b6001600160a01b031614610db45760405162461bcd60e51b81526004016107e09061255d565b610c7760006118bf565b600f5481565b610dcc61141e565b6001600160a01b0316610ddd610f54565b6001600160a01b031614610e035760405162461bcd60e51b81526004016107e09061255d565b600f55565b600e5460ff161515600114610e2f5760405162461bcd60e51b81526004016107e090612410565b600f54610e3c9042612a1b565b6000828152601060205260409020541115610e695760405162461bcd60e51b81526004016107e090612495565b33610e7382610d16565b6001600160a01b03161415610e9a5760405162461bcd60e51b81526004016107e0906122b3565b34600d541115610ebc5760405162461bcd60e51b81526004016107e0906127be565b6000818152601060205260409020429055610ed681610d16565b6001600160a01b03166108fc610eed6002346129df565b6040518115909202916000818181858888f19350505050158015610f15573d6000803e3d6000fd5b507f291e581cff438496efc61be8c3cbfac9d1271ca5e0c582e643a3a565ac9c923b338234604051610f49939291906121a8565b60405180910390a150565b6008546001600160a01b031690565b610f6b61141e565b6001600160a01b0316610f7c610f54565b6001600160a01b031614610fa25760405162461bcd60e51b81526004016107e09061255d565b600a5481610fae6108b5565b610fb891906129c7565b1115610fc357600080fd5b610d128282611792565b60606002805461073690612a75565b60106020526000908152604090205481565b610ff661141e565b6001600160a01b0316611007610f54565b6001600160a01b03161461102d5760405162461bcd60e51b81526004016107e09061255d565b600c805460ff19811660ff90911615179055565b61104961141e565b6001600160a01b0316826001600160a01b0316141561107a5760405162461bcd60e51b81526004016107e0906125e1565b806006600061108761141e565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556110cb61141e565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611103919061220d565b60405180910390a35050565b61111761141e565b6001600160a01b0316611128610f54565b6001600160a01b03161461114e5760405162461bcd60e51b81526004016107e09061255d565b600c805461ff001981166101009182900460ff1615909102179055565b61117684848461147e565b61118284848484611911565b61119e5760405162461bcd60e51b81526004016107e0906126f3565b50505050565b60096020526000908152604090205481565b60116020526000908152604090205460ff1681565b6111d361141e565b6001600160a01b03166111e4610f54565b6001600160a01b03161461120a5760405162461bcd60e51b81526004016107e09061255d565b600d55565b600d5481565b606061122082611417565b61123c5760405162461bcd60e51b81526004016107e090612592565b6000611246611a2d565b905060008151116112665760405180602001604052806000815250611291565b8061127084611a3c565b604051602001611281929190612128565b6040516020818303038152906040525b9392505050565b60075481565b606060006112ab83610d28565b905060008167ffffffffffffffff8111156112d657634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156112ff578160200160208202803683370190505b50905060005b82811015611354576113178582610922565b82828151811061133757634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061134c81612ab0565b915050611305565b509392505050565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61139261141e565b6001600160a01b03166113a3610f54565b6001600160a01b0316146113c95760405162461bcd60e51b81526004016107e09061255d565b6001600160a01b0381166113ef5760405162461bcd60e51b81526004016107e09061226d565b610a89816118bf565b600a5481565b6001600160e01b031981166301ffc9a760e01b14919050565b6000541190565b3390565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611489826117ac565b9050600081600001516001600160a01b03166114a361141e565b6001600160a01b031614806114d857506114bb61141e565b6001600160a01b03166114cd846107b9565b6001600160a01b0316145b806114ec575081516114ec9061068a61141e565b90508061150b5760405162461bcd60e51b81526004016107e090612618565b846001600160a01b031682600001516001600160a01b0316146115405760405162461bcd60e51b81526004016107e090612517565b6001600160a01b0384166115665760405162461bcd60e51b81526004016107e0906123cb565b611573858585600161119e565b6115836000848460000151611422565b6001600160a01b03851660009081526004602052604081208054600192906115b59084906001600160801b03166129f3565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092611601918591166129a5565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b0267ffffffffffffffff60a01b19929093166001600160a01b031990911617161790556116978460016129c7565b6000818152600360205260409020549091506001600160a01b031661173c576116bf81611417565b1561173c5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff90811682850190815260008781526003909352949091209251835494516001600160a01b031990951692169190911767ffffffffffffffff60a01b1916600160a01b93909116929092029190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461178a868686600161119e565b505050505050565b610d12828260405180602001604052806000815250611b57565b6117b4611e50565b6117bd82611417565b6117d95760405162461bcd60e51b81526004016107e09061233e565b60007f0000000000000000000000000000000000000000000000000000000000000000831061183a5761182c7f000000000000000000000000000000000000000000000000000000000000000084612a1b565b6118379060016129c7565b90505b825b8181106118a6576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611893579250610722915050565b508061189e81612a5e565b91505061183c565b5060405162461bcd60e51b81526004016107e090612870565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611925846001600160a01b0316611dca565b15611a2157836001600160a01b031663150b7a0261194161141e565b8786866040518563ffffffff1660e01b8152600401611963949392919061216b565b602060405180830381600087803b15801561197d57600080fd5b505af19250505080156119ad575060408051601f3d908101601f191682019092526119aa91810190612082565b60015b611a07573d8080156119db576040519150601f19603f3d011682016040523d82523d6000602084013e6119e0565b606091505b5080516119ff5760405162461bcd60e51b81526004016107e0906126f3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a25565b5060015b949350505050565b6060600b805461073690612a75565b606081611a6157506040805180820190915260018152600360fc1b6020820152610722565b8160005b8115611a8b5780611a7581612ab0565b9150611a849050600a836129df565b9150611a65565b60008167ffffffffffffffff811115611ab457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ade576020820181803683370190505b5090505b8415611a2557611af3600183612a1b565b9150611b00600a86612acb565b611b0b9060306129c7565b60f81b818381518110611b2e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611b50600a866129df565b9450611ae2565b6000546001600160a01b038416611b805760405162461bcd60e51b81526004016107e09061277d565b611b8981611417565b15611ba65760405162461bcd60e51b81526004016107e090612746565b7f0000000000000000000000000000000000000000000000000000000000000000831115611be65760405162461bcd60e51b81526004016107e09061295a565b611bf3600085838661119e565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190611c4f9087906129a5565b6001600160801b03168152602001858360200151611c6d91906129a5565b6001600160801b039081169091526001600160a01b03808816600081815260046020908152604080832087518154988401518816600160801b029088166fffffffffffffffffffffffffffffffff1990991698909817909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b0267ffffffffffffffff60a01b19959093166001600160a01b031990941693909317939093161790915582905b85811015611db85760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611d7c6000888488611911565b611d985760405162461bcd60e51b81526004016107e0906126f3565b81611da281612ab0565b9250508080611db090612ab0565b915050611d2f565b50600081815561178a9087858861119e565b3b151590565b828054611ddc90612a75565b90600052602060002090601f016020900481019282611dfe5760008555611e44565b82601f10611e1757805160ff1916838001178555611e44565b82800160010185558215611e44579182015b82811115611e44578251825591602001919060010190611e29565b50610cbc929150611e67565b604080518082019091526000808252602082015290565b5b80821115610cbc5760008155600101611e68565b600067ffffffffffffffff80841115611e9757611e97612b0b565b604051601f8501601f191681016020018281118282101715611ebb57611ebb612b0b565b604052848152915081838501861015611ed357600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461072257600080fd5b600060208284031215611f14578081fd5b61129182611eec565b60008060408385031215611f2f578081fd5b611f3883611eec565b9150611f4660208401611eec565b90509250929050565b600080600060608486031215611f63578081fd5b611f6c84611eec565b9250611f7a60208501611eec565b9150604084013590509250925092565b60008060008060808587031215611f9f578081fd5b611fa885611eec565b9350611fb660208601611eec565b925060408501359150606085013567ffffffffffffffff811115611fd8578182fd5b8501601f81018713611fe8578182fd5b611ff787823560208401611e7c565b91505092959194509250565b60008060408385031215612015578182fd5b61201e83611eec565b915060208301358015158114612032578182fd5b809150509250929050565b6000806040838503121561204f578182fd5b61205883611eec565b946020939093013593505050565b600060208284031215612077578081fd5b813561129181612b21565b600060208284031215612093578081fd5b815161129181612b21565b6000602082840312156120af578081fd5b813567ffffffffffffffff8111156120c5578182fd5b8201601f810184136120d5578182fd5b611a2584823560208401611e7c565b6000602082840312156120f5578081fd5b5035919050565b60008151808452612114816020860160208601612a32565b601f01601f19169290920160200192915050565b6000835161213a818460208801612a32565b83519083019061214e818360208801612a32565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061219e908301846120fc565b9695505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b81811015612201578351835292840192918401916001016121e5565b50909695505050505050565b901515815260200190565b60006020825261129160208301846120fc565b60208082526022908201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526023908201527f4472696e6b65722063616e27742075736520686973206f776e20636f636b746160408201526234b61760e91b606082015260800190565b60208082526028908201527f5374616b657220636c61696d206d7573742062652061637469766520746f206d604082015267696e74204e46547360c01b606082015260800190565b6020808252602a908201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736040820152693a32b73a103a37b5b2b760b11b606082015260800190565b60208082526023908201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756040820152626e647360e81b606082015260800190565b60208082526025908201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252600e908201526d2130b91034b99031b637b9b2b21760911b604082015260600190565b60208082526039908201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606082015260800190565b6020808252601b908201527f436f6f6c646f776e206f6e20636f636b7461696c206163746976650000000000604082015260600190565b6020808252602b908201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526026908201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746040820152651037bbb732b960d11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252601a908201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604082015260600190565b60208082526032908201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b60208082526027908201527f4164647265737320686173206e6f7420656e6f75676820636f636b7461696c206040820152667469636b65747360c81b606082015260800190565b60208082526022908201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60408201526132b960f11b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020808252601d908201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604082015260600190565b60208082526021908201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526013908201527222ba34103b30b63ab29034b9903bb937b7339760691b604082015260600190565b60208082526018908201527f4164647265737320616c726561647920636c61696d65642e0000000000000000604082015260600190565b6020808252602e908201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060408201526d0deeedccae440c4f240d2dcc8caf60931b606082015260800190565b6020808252602f908201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560408201526e1037bbb732b91037b3103a37b5b2b760891b606082015260800190565b6020808252602e908201527f4d696e74206578636565647320746865206d617820737570706c79206f66207460408201526d34329031b7b63632b1ba34b7b71760911b606082015260800190565b6020808252602d908201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560408201526c3c34b9ba32b73a103a37b5b2b760991b606082015260800190565b60208082526022908201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696040820152610ced60f31b606082015260800190565b90815260200190565b60006001600160801b0380831681851680830382111561214e5761214e612adf565b600082198211156129da576129da612adf565b500190565b6000826129ee576129ee612af5565b500490565b60006001600160801b0383811690831681811015612a1357612a13612adf565b039392505050565b600082821015612a2d57612a2d612adf565b500390565b60005b83811015612a4d578181015183820152602001612a35565b8381111561119e5750506000910152565b600081612a6d57612a6d612adf565b506000190190565b600281046001821680612a8957607f821691505b60208210811415612aaa57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ac457612ac4612adf565b5060010190565b600082612ada57612ada612af5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610a8957600080fdfea2646970667358221220de47907fca62e91689a48822691510d61ea93e62cc0c53dde508eb2d001fe69c64736f6c63430008000033

Deployed Bytecode

0x60806040526004361061023b5760003560e01c806382cd8c0c1161012e578063c202fea5116100ab578063d7224ba01161006f578063d7224ba01461062d578063e547e69314610642578063e985e9c51461066f578063f2fde38b1461068f578063f47c84c5146106af5761023b565b8063c202fea514610598578063c6788bdd146105b8578063c6cfe192146105d8578063c7876ea4146105f8578063c87b56dd1461060d5761023b565b8063968380f1116100f2578063968380f11461050e57806399c89e811461052e578063a22cb46514610543578063a5c67a9614610563578063b88d4fde146105785761023b565b806382cd8c0c146104915780638473f9cb146104b15780638da5cb5b146104c457806394813a54146104d957806395d89b41146104f95761023b565b80632f745c59116101bc57806355f804b31161018057806355f804b3146104075780636352211e1461042757806370a0823114610447578063715018a614610467578063787a08a61461047c5761023b565b80632f745c591461037d5780633ccfd60b1461039d5780633d4eee52146103b257806342842e0e146103c75780634f6ccce7146103e75761023b565b80630fcf2e75116102035780630fcf2e75146102fc57806318160ddd146103115780631f17b2591461033357806323b872dd146103485780632b585821146103685761023b565b806301ffc9a71461024057806306fdde0314610276578063081812fc14610298578063095ea7b3146102c55780630eeafd87146102e7575b600080fd5b34801561024c57600080fd5b5061026061025b366004612066565b6106c4565b60405161026d919061220d565b60405180910390f35b34801561028257600080fd5b5061028b610727565b60405161026d9190612218565b3480156102a457600080fd5b506102b86102b33660046120e4565b6107b9565b60405161026d9190612157565b3480156102d157600080fd5b506102e56102e036600461203d565b610805565b005b3480156102f357600080fd5b5061026061089e565b34801561030857600080fd5b506102606108ac565b34801561031d57600080fd5b506103266108b5565b60405161026d919061299c565b34801561033f57600080fd5b506102e56108bb565b34801561035457600080fd5b506102e5610363366004611f4f565b61090e565b34801561037457600080fd5b50610260610919565b34801561038957600080fd5b5061032661039836600461203d565b610922565b3480156103a957600080fd5b506102e5610a1e565b3480156103be57600080fd5b506102e5610a8c565b3480156103d357600080fd5b506102e56103e2366004611f4f565b610c79565b3480156103f357600080fd5b506103266104023660046120e4565b610c94565b34801561041357600080fd5b506102e561042236600461209e565b610cc0565b34801561043357600080fd5b506102b86104423660046120e4565b610d16565b34801561045357600080fd5b50610326610462366004611f03565b610d28565b34801561047357600080fd5b506102e5610d75565b34801561048857600080fd5b50610326610dbe565b34801561049d57600080fd5b506102e56104ac3660046120e4565b610dc4565b6102e56104bf3660046120e4565b610e08565b3480156104d057600080fd5b506102b8610f54565b3480156104e557600080fd5b506102e56104f436600461203d565b610f63565b34801561050557600080fd5b5061028b610fcd565b34801561051a57600080fd5b506103266105293660046120e4565b610fdc565b34801561053a57600080fd5b506102e5610fee565b34801561054f57600080fd5b506102e561055e366004612003565b611041565b34801561056f57600080fd5b506102e561110f565b34801561058457600080fd5b506102e5610593366004611f8a565b61116b565b3480156105a457600080fd5b506103266105b3366004611f03565b6111a4565b3480156105c457600080fd5b506102606105d3366004611f03565b6111b6565b3480156105e457600080fd5b506102e56105f33660046120e4565b6111cb565b34801561060457600080fd5b5061032661120f565b34801561061957600080fd5b5061028b6106283660046120e4565b611215565b34801561063957600080fd5b50610326611298565b34801561064e57600080fd5b5061066261065d366004611f03565b61129e565b60405161026d91906121c9565b34801561067b57600080fd5b5061026061068a366004611f1d565b61135c565b34801561069b57600080fd5b506102e56106aa366004611f03565b61138a565b3480156106bb57600080fd5b506103266113f8565b60006001600160e01b031982166380ac58cd60e01b14806106f557506001600160e01b03198216635b5e139f60e01b145b8061071057506001600160e01b0319821663780e9d6360e01b145b8061071f575061071f826113fe565b90505b919050565b60606001805461073690612a75565b80601f016020809104026020016040519081016040528092919081815260200182805461076290612a75565b80156107af5780601f10610784576101008083540402835291602001916107af565b820191906000526020600020905b81548152906001019060200180831161079257829003601f168201915b5050505050905090565b60006107c482611417565b6107e95760405162461bcd60e51b81526004016107e09061290d565b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061081082610d16565b9050806001600160a01b0316836001600160a01b031614156108445760405162461bcd60e51b81526004016107e0906126b1565b806001600160a01b031661085661141e565b6001600160a01b0316148061087257506108728161068a61141e565b61088e5760405162461bcd60e51b81526004016107e090612438565b610899838383611422565b505050565b600c54610100900460ff1681565b600c5460ff1681565b60005490565b6108c361141e565b6001600160a01b03166108d4610f54565b6001600160a01b0316146108fa5760405162461bcd60e51b81526004016107e09061255d565b600e805460ff19811660ff90911615179055565b61089983838361147e565b600e5460ff1681565b600061092d83610d28565b821061094b5760405162461bcd60e51b81526004016107e09061222b565b60006109556108b5565b905060008060005b838110156109ff576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156109b057805192505b876001600160a01b0316836001600160a01b031614156109ec57868414156109de57509350610a1892505050565b836109e881612ab0565b9450505b50806109f781612ab0565b91505061095d565b5060405162461bcd60e51b81526004016107e090612822565b92915050565b610a2661141e565b6001600160a01b0316610a37610f54565b6001600160a01b031614610a5d5760405162461bcd60e51b81526004016107e09061255d565b60405133904780156108fc02916000818181858888f19350505050158015610a89573d6000803e3d6000fd5b50565b3360009081526011602052604090205460ff1615610abc5760405162461bcd60e51b81526004016107e0906127eb565b600c5460ff1615610bb25733600090815260096020526040902054610b3b57600a54610ae66108b5565b610af19060016129c7565b1115610b0f5760405162461bcd60e51b81526004016107e0906128bf565b336000818152601160205260409020805460ff19166001908117909155610b369190611792565b610bad565b600a5433600090815260096020526040902054610b566108b5565b610b6091906129c7565b1115610b7e5760405162461bcd60e51b81526004016107e0906128bf565b336000818152601160209081526040808320805460ff191660011790556009909152902054610bad9190611792565b610c77565b600c54610100900460ff16610bd95760405162461bcd60e51b81526004016107e0906122f6565b600a5433600090815260096020526040902054610bf46108b5565b610bfe91906129c7565b1115610c1c5760405162461bcd60e51b81526004016107e0906128bf565b33600090815260096020526040902054610c485760405162461bcd60e51b81526004016107e09061266a565b336000818152601160209081526040808320805460ff191660011790556009909152902054610c779190611792565b565b6108998383836040518060200160405280600081525061116b565b6000610c9e6108b5565b8210610cbc5760405162461bcd60e51b81526004016107e090612388565b5090565b610cc861141e565b6001600160a01b0316610cd9610f54565b6001600160a01b031614610cff5760405162461bcd60e51b81526004016107e09061255d565b8051610d1290600b906020840190611dd0565b5050565b6000610d21826117ac565b5192915050565b60006001600160a01b038216610d505760405162461bcd60e51b81526004016107e0906124cc565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b610d7d61141e565b6001600160a01b0316610d8e610f54565b6001600160a01b031614610db45760405162461bcd60e51b81526004016107e09061255d565b610c7760006118bf565b600f5481565b610dcc61141e565b6001600160a01b0316610ddd610f54565b6001600160a01b031614610e035760405162461bcd60e51b81526004016107e09061255d565b600f55565b600e5460ff161515600114610e2f5760405162461bcd60e51b81526004016107e090612410565b600f54610e3c9042612a1b565b6000828152601060205260409020541115610e695760405162461bcd60e51b81526004016107e090612495565b33610e7382610d16565b6001600160a01b03161415610e9a5760405162461bcd60e51b81526004016107e0906122b3565b34600d541115610ebc5760405162461bcd60e51b81526004016107e0906127be565b6000818152601060205260409020429055610ed681610d16565b6001600160a01b03166108fc610eed6002346129df565b6040518115909202916000818181858888f19350505050158015610f15573d6000803e3d6000fd5b507f291e581cff438496efc61be8c3cbfac9d1271ca5e0c582e643a3a565ac9c923b338234604051610f49939291906121a8565b60405180910390a150565b6008546001600160a01b031690565b610f6b61141e565b6001600160a01b0316610f7c610f54565b6001600160a01b031614610fa25760405162461bcd60e51b81526004016107e09061255d565b600a5481610fae6108b5565b610fb891906129c7565b1115610fc357600080fd5b610d128282611792565b60606002805461073690612a75565b60106020526000908152604090205481565b610ff661141e565b6001600160a01b0316611007610f54565b6001600160a01b03161461102d5760405162461bcd60e51b81526004016107e09061255d565b600c805460ff19811660ff90911615179055565b61104961141e565b6001600160a01b0316826001600160a01b0316141561107a5760405162461bcd60e51b81526004016107e0906125e1565b806006600061108761141e565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556110cb61141e565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611103919061220d565b60405180910390a35050565b61111761141e565b6001600160a01b0316611128610f54565b6001600160a01b03161461114e5760405162461bcd60e51b81526004016107e09061255d565b600c805461ff001981166101009182900460ff1615909102179055565b61117684848461147e565b61118284848484611911565b61119e5760405162461bcd60e51b81526004016107e0906126f3565b50505050565b60096020526000908152604090205481565b60116020526000908152604090205460ff1681565b6111d361141e565b6001600160a01b03166111e4610f54565b6001600160a01b03161461120a5760405162461bcd60e51b81526004016107e09061255d565b600d55565b600d5481565b606061122082611417565b61123c5760405162461bcd60e51b81526004016107e090612592565b6000611246611a2d565b905060008151116112665760405180602001604052806000815250611291565b8061127084611a3c565b604051602001611281929190612128565b6040516020818303038152906040525b9392505050565b60075481565b606060006112ab83610d28565b905060008167ffffffffffffffff8111156112d657634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156112ff578160200160208202803683370190505b50905060005b82811015611354576113178582610922565b82828151811061133757634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061134c81612ab0565b915050611305565b509392505050565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61139261141e565b6001600160a01b03166113a3610f54565b6001600160a01b0316146113c95760405162461bcd60e51b81526004016107e09061255d565b6001600160a01b0381166113ef5760405162461bcd60e51b81526004016107e09061226d565b610a89816118bf565b600a5481565b6001600160e01b031981166301ffc9a760e01b14919050565b6000541190565b3390565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611489826117ac565b9050600081600001516001600160a01b03166114a361141e565b6001600160a01b031614806114d857506114bb61141e565b6001600160a01b03166114cd846107b9565b6001600160a01b0316145b806114ec575081516114ec9061068a61141e565b90508061150b5760405162461bcd60e51b81526004016107e090612618565b846001600160a01b031682600001516001600160a01b0316146115405760405162461bcd60e51b81526004016107e090612517565b6001600160a01b0384166115665760405162461bcd60e51b81526004016107e0906123cb565b611573858585600161119e565b6115836000848460000151611422565b6001600160a01b03851660009081526004602052604081208054600192906115b59084906001600160801b03166129f3565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092611601918591166129a5565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b0267ffffffffffffffff60a01b19929093166001600160a01b031990911617161790556116978460016129c7565b6000818152600360205260409020549091506001600160a01b031661173c576116bf81611417565b1561173c5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff90811682850190815260008781526003909352949091209251835494516001600160a01b031990951692169190911767ffffffffffffffff60a01b1916600160a01b93909116929092029190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461178a868686600161119e565b505050505050565b610d12828260405180602001604052806000815250611b57565b6117b4611e50565b6117bd82611417565b6117d95760405162461bcd60e51b81526004016107e09061233e565b60007f000000000000000000000000000000000000000000000000000000000000015e831061183a5761182c7f000000000000000000000000000000000000000000000000000000000000015e84612a1b565b6118379060016129c7565b90505b825b8181106118a6576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611893579250610722915050565b508061189e81612a5e565b91505061183c565b5060405162461bcd60e51b81526004016107e090612870565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611925846001600160a01b0316611dca565b15611a2157836001600160a01b031663150b7a0261194161141e565b8786866040518563ffffffff1660e01b8152600401611963949392919061216b565b602060405180830381600087803b15801561197d57600080fd5b505af19250505080156119ad575060408051601f3d908101601f191682019092526119aa91810190612082565b60015b611a07573d8080156119db576040519150601f19603f3d011682016040523d82523d6000602084013e6119e0565b606091505b5080516119ff5760405162461bcd60e51b81526004016107e0906126f3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a25565b5060015b949350505050565b6060600b805461073690612a75565b606081611a6157506040805180820190915260018152600360fc1b6020820152610722565b8160005b8115611a8b5780611a7581612ab0565b9150611a849050600a836129df565b9150611a65565b60008167ffffffffffffffff811115611ab457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ade576020820181803683370190505b5090505b8415611a2557611af3600183612a1b565b9150611b00600a86612acb565b611b0b9060306129c7565b60f81b818381518110611b2e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611b50600a866129df565b9450611ae2565b6000546001600160a01b038416611b805760405162461bcd60e51b81526004016107e09061277d565b611b8981611417565b15611ba65760405162461bcd60e51b81526004016107e090612746565b7f000000000000000000000000000000000000000000000000000000000000015e831115611be65760405162461bcd60e51b81526004016107e09061295a565b611bf3600085838661119e565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190611c4f9087906129a5565b6001600160801b03168152602001858360200151611c6d91906129a5565b6001600160801b039081169091526001600160a01b03808816600081815260046020908152604080832087518154988401518816600160801b029088166fffffffffffffffffffffffffffffffff1990991698909817909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b0267ffffffffffffffff60a01b19959093166001600160a01b031990941693909317939093161790915582905b85811015611db85760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611d7c6000888488611911565b611d985760405162461bcd60e51b81526004016107e0906126f3565b81611da281612ab0565b9250508080611db090612ab0565b915050611d2f565b50600081815561178a9087858861119e565b3b151590565b828054611ddc90612a75565b90600052602060002090601f016020900481019282611dfe5760008555611e44565b82601f10611e1757805160ff1916838001178555611e44565b82800160010185558215611e44579182015b82811115611e44578251825591602001919060010190611e29565b50610cbc929150611e67565b604080518082019091526000808252602082015290565b5b80821115610cbc5760008155600101611e68565b600067ffffffffffffffff80841115611e9757611e97612b0b565b604051601f8501601f191681016020018281118282101715611ebb57611ebb612b0b565b604052848152915081838501861015611ed357600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461072257600080fd5b600060208284031215611f14578081fd5b61129182611eec565b60008060408385031215611f2f578081fd5b611f3883611eec565b9150611f4660208401611eec565b90509250929050565b600080600060608486031215611f63578081fd5b611f6c84611eec565b9250611f7a60208501611eec565b9150604084013590509250925092565b60008060008060808587031215611f9f578081fd5b611fa885611eec565b9350611fb660208601611eec565b925060408501359150606085013567ffffffffffffffff811115611fd8578182fd5b8501601f81018713611fe8578182fd5b611ff787823560208401611e7c565b91505092959194509250565b60008060408385031215612015578182fd5b61201e83611eec565b915060208301358015158114612032578182fd5b809150509250929050565b6000806040838503121561204f578182fd5b61205883611eec565b946020939093013593505050565b600060208284031215612077578081fd5b813561129181612b21565b600060208284031215612093578081fd5b815161129181612b21565b6000602082840312156120af578081fd5b813567ffffffffffffffff8111156120c5578182fd5b8201601f810184136120d5578182fd5b611a2584823560208401611e7c565b6000602082840312156120f5578081fd5b5035919050565b60008151808452612114816020860160208601612a32565b601f01601f19169290920160200192915050565b6000835161213a818460208801612a32565b83519083019061214e818360208801612a32565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061219e908301846120fc565b9695505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b81811015612201578351835292840192918401916001016121e5565b50909695505050505050565b901515815260200190565b60006020825261129160208301846120fc565b60208082526022908201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526023908201527f4472696e6b65722063616e27742075736520686973206f776e20636f636b746160408201526234b61760e91b606082015260800190565b60208082526028908201527f5374616b657220636c61696d206d7573742062652061637469766520746f206d604082015267696e74204e46547360c01b606082015260800190565b6020808252602a908201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736040820152693a32b73a103a37b5b2b760b11b606082015260800190565b60208082526023908201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756040820152626e647360e81b606082015260800190565b60208082526025908201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252600e908201526d2130b91034b99031b637b9b2b21760911b604082015260600190565b60208082526039908201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606082015260800190565b6020808252601b908201527f436f6f6c646f776e206f6e20636f636b7461696c206163746976650000000000604082015260600190565b6020808252602b908201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526026908201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746040820152651037bbb732b960d11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252601a908201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604082015260600190565b60208082526032908201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b60208082526027908201527f4164647265737320686173206e6f7420656e6f75676820636f636b7461696c206040820152667469636b65747360c81b606082015260800190565b60208082526022908201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60408201526132b960f11b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020808252601d908201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604082015260600190565b60208082526021908201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526013908201527222ba34103b30b63ab29034b9903bb937b7339760691b604082015260600190565b60208082526018908201527f4164647265737320616c726561647920636c61696d65642e0000000000000000604082015260600190565b6020808252602e908201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060408201526d0deeedccae440c4f240d2dcc8caf60931b606082015260800190565b6020808252602f908201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560408201526e1037bbb732b91037b3103a37b5b2b760891b606082015260800190565b6020808252602e908201527f4d696e74206578636565647320746865206d617820737570706c79206f66207460408201526d34329031b7b63632b1ba34b7b71760911b606082015260800190565b6020808252602d908201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560408201526c3c34b9ba32b73a103a37b5b2b760991b606082015260800190565b60208082526022908201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696040820152610ced60f31b606082015260800190565b90815260200190565b60006001600160801b0380831681851680830382111561214e5761214e612adf565b600082198211156129da576129da612adf565b500190565b6000826129ee576129ee612af5565b500490565b60006001600160801b0383811690831681811015612a1357612a13612adf565b039392505050565b600082821015612a2d57612a2d612adf565b500390565b60005b83811015612a4d578181015183820152602001612a35565b8381111561119e5750506000910152565b600081612a6d57612a6d612adf565b506000190190565b600281046001821680612a8957607f821691505b60208210811415612aaa57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ac457612ac4612adf565b5060010190565b600082612ada57612ada612af5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610a8957600080fdfea2646970667358221220de47907fca62e91689a48822691510d61ea93e62cc0c53dde508eb2d001fe69c64736f6c63430008000033

Deployed Bytecode Sourcemap

96185:3786:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48288:370;;;;;;;;;;-1:-1:-1;48288:370:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50014:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;51539:204::-;;;;;;;;;;-1:-1:-1;51539:204:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;51102:379::-;;;;;;;;;;-1:-1:-1;51102:379:0;;;;;:::i;:::-;;:::i;:::-;;96369:38;;;;;;;;;;;;;:::i;96324:::-;;;;;;;;;;;;;:::i;46849:94::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;99770:83::-;;;;;;;;;;;;;:::i;52389:142::-;;;;;;;;;;-1:-1:-1;52389:142:0;;;;;:::i;:::-;;:::i;96445:21::-;;;;;;;;;;;;;:::i;47480:744::-;;;;;;;;;;-1:-1:-1;47480:744:0;;;;;:::i;:::-;;:::i;99861:107::-;;;;;;;;;;;;;:::i;96791:1127::-;;;;;;;;;;;;;:::i;52594:157::-;;;;;;;;;;-1:-1:-1;52594:157:0;;;;;:::i;:::-;;:::i;47012:177::-;;;;;;;;;;-1:-1:-1;47012:177:0;;;;;:::i;:::-;;:::i;98709:109::-;;;;;;;;;;-1:-1:-1;98709:109:0;;;;;:::i;:::-;;:::i;49837:118::-;;;;;;;;;;-1:-1:-1;49837:118:0;;;;;:::i;:::-;;:::i;48714:211::-;;;;;;;;;;-1:-1:-1;48714:211:0;;;;;:::i;:::-;;:::i;43770:103::-;;;;;;;;;;;;;:::i;96475:31::-;;;;;;;;;;;;;:::i;99181:103::-;;;;;;;;;;-1:-1:-1;99181:103:0;;;;;:::i;:::-;;:::i;97926:566::-;;;;;;:::i;:::-;;:::i;43119:87::-;;;;;;;;;;;;;:::i;98500:201::-;;;;;;;;;;-1:-1:-1;98500:201:0;;;;;:::i;:::-;;:::i;50169:98::-;;;;;;;;;;;;;:::i;96515:50::-;;;;;;;;;;-1:-1:-1;96515:50:0;;;;;:::i;:::-;;:::i;98951:107::-;;;;;;;;;;;;;:::i;51807:274::-;;;;;;;;;;-1:-1:-1;51807:274:0;;;;;:::i;:::-;;:::i;99066:107::-;;;;;;;;;;;;;:::i;52814:311::-;;;;;;;;;;-1:-1:-1;52814:311:0;;;;;:::i;:::-;;:::i;60733:53::-;;;;;;;;;;-1:-1:-1;60733:53:0;;;;;:::i;:::-;;:::i;96572:41::-;;;;;;;;;;-1:-1:-1;96572:41:0;;;;;:::i;:::-;;:::i;99651:111::-;;;;;;;;;;-1:-1:-1;99651:111:0;;;;;:::i;:::-;;:::i;96414:24::-;;;;;;;;;;;;;:::i;50330:394::-;;;;;;;;;;-1:-1:-1;50330:394:0;;;;;:::i;:::-;;:::i;57229:43::-;;;;;;;;;;;;;:::i;99292:351::-;;;;;;;;;;-1:-1:-1;99292:351:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;52144:186::-;;;;;;;;;;-1:-1:-1;52144:186:0;;;;;:::i;:::-;;:::i;44028:201::-;;;;;;;;;;-1:-1:-1;44028:201:0;;;;;:::i;:::-;;:::i;96250:29::-;;;;;;;;;;;;;:::i;48288:370::-;48415:4;-1:-1:-1;;;;;;48445:40:0;;-1:-1:-1;;;48445:40:0;;:99;;-1:-1:-1;;;;;;;48496:48:0;;-1:-1:-1;;;48496:48:0;48445:99;:160;;;-1:-1:-1;;;;;;;48555:50:0;;-1:-1:-1;;;48555:50:0;48445:160;:207;;;;48616:36;48640:11;48616:23;:36::i;:::-;48431:221;;48288:370;;;;:::o;50014:94::-;50068:13;50097:5;50090:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50014:94;:::o;51539:204::-;51607:7;51631:16;51639:7;51631;:16::i;:::-;51623:74;;;;-1:-1:-1;;;51623:74:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;51713:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;51713:24:0;;51539:204::o;51102:379::-;51171:13;51187:24;51203:7;51187:15;:24::i;:::-;51171:40;;51232:5;-1:-1:-1;;;;;51226:11:0;:2;-1:-1:-1;;;;;51226:11:0;;;51218:58;;;;-1:-1:-1;;;51218:58:0;;;;;;;:::i;:::-;51317:5;-1:-1:-1;;;;;51301:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;51301:21:0;;:62;;;;51326:37;51343:5;51350:12;:10;:12::i;51326:37::-;51285:153;;;;-1:-1:-1;;;51285:153:0;;;;;;;:::i;:::-;51447:28;51456:2;51460:7;51469:5;51447:8;:28::i;:::-;51102:379;;;:::o;96369:38::-;;;;;;;;;:::o;96324:::-;;;;;;:::o;46849:94::-;46902:7;46925:12;46849:94;:::o;99770:83::-;43350:12;:10;:12::i;:::-;-1:-1:-1;;;;;43339:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43339:23:0;;43331:68;;;;-1:-1:-1;;;43331:68:0;;;;;;;:::i;:::-;99836:9:::1;::::0;;-1:-1:-1;;99823:22:0;::::1;99836:9;::::0;;::::1;99835:10;99823:22;::::0;;99770:83::o;52389:142::-;52497:28;52507:4;52513:2;52517:7;52497:9;:28::i;96445:21::-;;;;;;:::o;47480:744::-;47589:7;47624:16;47634:5;47624:9;:16::i;:::-;47616:5;:24;47608:71;;;;-1:-1:-1;;;47608:71:0;;;;;;;:::i;:::-;47686:22;47711:13;:11;:13::i;:::-;47686:38;;47731:19;47761:25;47811:9;47806:350;47830:14;47826:1;:18;47806:350;;;47860:31;47894:14;;;:11;:14;;;;;;;;;47860:48;;;;;;;;;-1:-1:-1;;;;;47860:48:0;;;;;-1:-1:-1;;;47860:48:0;;;;;;;;;;;;47921:28;47917:89;;47982:14;;;-1:-1:-1;47917:89:0;48039:5;-1:-1:-1;;;;;48018:26:0;:17;-1:-1:-1;;;;;48018:26:0;;48014:135;;;48076:5;48061:11;:20;48057:59;;;-1:-1:-1;48103:1:0;-1:-1:-1;48096:8:0;;-1:-1:-1;;;48096:8:0;48057:59;48126:13;;;;:::i;:::-;;;;48014:135;-1:-1:-1;47846:3:0;;;;:::i;:::-;;;;47806:350;;;;48162:56;;-1:-1:-1;;;48162:56:0;;;;;;;:::i;47480:744::-;;;;;:::o;99861:107::-;43350:12;:10;:12::i;:::-;-1:-1:-1;;;;;43339:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43339:23:0;;43331:68;;;;-1:-1:-1;;;43331:68:0;;;;;;;:::i;:::-;99909:51:::1;::::0;99917:10:::1;::::0;99938:21:::1;99909:51:::0;::::1;;;::::0;::::1;::::0;;;99938:21;99917:10;99909:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;99861:107::o:0;96791:1127::-;96849:10;96842:18;;;;:6;:18;;;;;;;;:27;96834:64;;;;-1:-1:-1;;;96834:64:0;;;;;;;:::i;:::-;96913:18;;;;96909:1002;;;96969:10;96952:28;;;;:16;:28;;;;;;96948:511;;97033:10;;97012:13;:11;:13::i;:::-;:17;;97028:1;97012:17;:::i;:::-;:31;;97004:90;;;;-1:-1:-1;;;97004:90:0;;;;;;;:::i;:::-;97118:10;97111:18;;;;:6;:18;;;;;:25;;-1:-1:-1;;97111:25:0;97132:4;97111:25;;;;;;97153:24;;97118:10;97153:9;:24::i;:::-;96948:511;;;97272:10;;97257;97240:28;;;;:16;:28;;;;;;97224:13;:11;:13::i;:::-;:44;;;;:::i;:::-;:58;;97216:117;;;;-1:-1:-1;;;97216:117:0;;;;;;;:::i;:::-;97357:10;97350:18;;;;:6;:18;;;;;;;;:25;;-1:-1:-1;;97350:25:0;97371:4;97350:25;;;97414:16;:28;;;;;;97392:51;;97357:10;97392:9;:51::i;:::-;96909:1002;;;97499:18;;;;;;;97491:71;;;;-1:-1:-1;;;97491:71:0;;;;;;;:::i;:::-;97633:10;;97618;97601:28;;;;:16;:28;;;;;;97585:13;:11;:13::i;:::-;:44;;;;:::i;:::-;:58;;97577:117;;;;-1:-1:-1;;;97577:117:0;;;;;;;:::i;:::-;97734:10;97748:1;97717:28;;;:16;:28;;;;;;97709:84;;;;-1:-1:-1;;;97709:84:0;;;;;;;:::i;:::-;97815:10;97808:18;;;;:6;:18;;;;;;;;:25;;-1:-1:-1;;97808:25:0;97829:4;97808:25;;;97870:16;:28;;;;;;97848:51;;97815:10;97848:9;:51::i;:::-;96791:1127::o;52594:157::-;52706:39;52723:4;52729:2;52733:7;52706:39;;;;;;;;;;;;:16;:39::i;47012:177::-;47079:7;47111:13;:11;:13::i;:::-;47103:5;:21;47095:69;;;;-1:-1:-1;;;47095:69:0;;;;;;;:::i;:::-;-1:-1:-1;47178:5:0;47012:177::o;98709:109::-;43350:12;:10;:12::i;:::-;-1:-1:-1;;;;;43339:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43339:23:0;;43331:68;;;;-1:-1:-1;;;43331:68:0;;;;;;;:::i;:::-;98783:27;;::::1;::::0;:16:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;:::-;;98709:109:::0;:::o;49837:118::-;49901:7;49924:20;49936:7;49924:11;:20::i;:::-;:25;;49837:118;-1:-1:-1;;49837:118:0:o;48714:211::-;48778:7;-1:-1:-1;;;;;48802:19:0;;48794:75;;;;-1:-1:-1;;;48794:75:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;48891:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;48891:27:0;;48714:211::o;43770:103::-;43350:12;:10;:12::i;:::-;-1:-1:-1;;;;;43339:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43339:23:0;;43331:68;;;;-1:-1:-1;;;43331:68:0;;;;;;;:::i;:::-;43835:30:::1;43862:1;43835:18;:30::i;96475:31::-:0;;;;:::o;99181:103::-;43350:12;:10;:12::i;:::-;-1:-1:-1;;;;;43339:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43339:23:0;;43331:68;;;;-1:-1:-1;;;43331:68:0;;;;;;;:::i;:::-;99254:8:::1;:22:::0;99181:103::o;97926:566::-;98003:9;;;;:17;;:9;:17;97995:44;;;;-1:-1:-1;;;97995:44:0;;;;;;;:::i;:::-;98104:8;;98086:26;;:15;:26;:::i;:::-;98058:24;;;;:12;:24;;;;;;:54;;98050:94;;;;-1:-1:-1;;;98050:94:0;;;;;;;:::i;:::-;98186:10;98163:19;98171:10;98163:7;:19::i;:::-;-1:-1:-1;;;;;98163:33:0;;;98155:81;;;;-1:-1:-1;;;98155:81:0;;;;;;;:::i;:::-;98268:9;98255;;:22;;98247:54;;;;-1:-1:-1;;;98247:54:0;;;;;;;:::i;:::-;98312:24;;;;:12;:24;;;;;98339:15;98312:42;;98373:19;98325:10;98373:7;:19::i;:::-;-1:-1:-1;;;;;98365:37:0;:52;98403:13;98415:1;98403:9;:13;:::i;:::-;98365:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98433:51;98450:10;98462;98474:9;98433:51;;;;;;;;:::i;:::-;;;;;;;;97926:566;:::o;43119:87::-;43192:6;;-1:-1:-1;;;;;43192:6:0;43119:87;:::o;98500:201::-;43350:12;:10;:12::i;:::-;-1:-1:-1;;;;;43339:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43339:23:0;;43331:68;;;;-1:-1:-1;;;43331:68:0;;;;;;;:::i;:::-;98632:10:::1;;98614:14;98598:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;98590:53;;;::::0;::::1;;98655:38;98665:11;98678:14;98655:9;:38::i;50169:98::-:0;50225:13;50254:7;50247:14;;;;;:::i;96515:50::-;;;;;;;;;;;;;:::o;98951:107::-;43350:12;:10;:12::i;:::-;-1:-1:-1;;;;;43339:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43339:23:0;;43331:68;;;;-1:-1:-1;;;43331:68:0;;;;;;;:::i;:::-;99032:18:::1;::::0;;-1:-1:-1;;99010:40:0;::::1;99032:18;::::0;;::::1;99031:19;99010:40;::::0;;98951:107::o;51807:274::-;51910:12;:10;:12::i;:::-;-1:-1:-1;;;;;51898:24:0;:8;-1:-1:-1;;;;;51898:24:0;;;51890:63;;;;-1:-1:-1;;;51890:63:0;;;;;;;:::i;:::-;52007:8;51962:18;:32;51981:12;:10;:12::i;:::-;-1:-1:-1;;;;;51962:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;51962:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;51962:53:0;;;;;;;;;;;52042:12;:10;:12::i;:::-;-1:-1:-1;;;;;52027:48:0;;52066:8;52027:48;;;;;;:::i;:::-;;;;;;;;51807:274;;:::o;99066:107::-;43350:12;:10;:12::i;:::-;-1:-1:-1;;;;;43339:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43339:23:0;;43331:68;;;;-1:-1:-1;;;43331:68:0;;;;;;;:::i;:::-;99147:18:::1;::::0;;-1:-1:-1;;99125:40:0;::::1;99147:18;::::0;;;::::1;;;99146:19;99125:40:::0;;::::1;;::::0;;99066:107::o;52814:311::-;52951:28;52961:4;52967:2;52971:7;52951:9;:28::i;:::-;53002:48;53025:4;53031:2;53035:7;53044:5;53002:22;:48::i;:::-;52986:133;;;;-1:-1:-1;;;52986:133:0;;;;;;;:::i;:::-;52814:311;;;;:::o;60733:53::-;;;;;;;;;;;;;:::o;96572:41::-;;;;;;;;;;;;;;;:::o;99651:111::-;43350:12;:10;:12::i;:::-;-1:-1:-1;;;;;43339:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43339:23:0;;43331:68;;;;-1:-1:-1;;;43331:68:0;;;;;;;:::i;:::-;99728:9:::1;:26:::0;99651:111::o;96414:24::-;;;;:::o;50330:394::-;50428:13;50469:16;50477:7;50469;:16::i;:::-;50453:97;;;;-1:-1:-1;;;50453:97:0;;;;;;;:::i;:::-;50559:21;50583:10;:8;:10::i;:::-;50559:34;;50638:1;50620:7;50614:21;:25;:104;;;;;;;;;;;;;;;;;50675:7;50684:18;:7;:16;:18::i;:::-;50658:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50614:104;50600:118;50330:394;-1:-1:-1;;;50330:394:0:o;57229:43::-;;;;:::o;99292:351::-;99362:16;99391:18;99412:17;99422:6;99412:9;:17::i;:::-;99391:38;;99440:25;99482:10;99468:25;;;;;;-1:-1:-1;;;99468:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;99468:25:0;;99440:53;;99508:9;99504:106;99523:10;99519:1;:14;99504:106;;;99568:30;99588:6;99596:1;99568:19;:30::i;:::-;99554:8;99563:1;99554:11;;;;;;-1:-1:-1;;;99554:11:0;;;;;;;;;;;;;;;;;;:44;99535:3;;;;:::i;:::-;;;;99504:106;;;-1:-1:-1;99627:8:0;99292:351;-1:-1:-1;;;99292:351:0:o;52144:186::-;-1:-1:-1;;;;;52289:25:0;;;52266:4;52289:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;52144:186::o;44028:201::-;43350:12;:10;:12::i;:::-;-1:-1:-1;;;;;43339:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43339:23:0;;43331:68;;;;-1:-1:-1;;;43331:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44117:22:0;::::1;44109:73;;;;-1:-1:-1::0;;;44109:73:0::1;;;;;;;:::i;:::-;44193:28;44212:8;44193:18;:28::i;96250:29::-:0;;;;:::o;19829:157::-;-1:-1:-1;;;;;;19938:40:0;;-1:-1:-1;;;19938:40:0;19829:157;;;:::o;53364:105::-;53421:4;53451:12;-1:-1:-1;53441:22:0;53364:105::o;16626:98::-;16706:10;16626:98;:::o;57051:172::-;57148:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;57148:29:0;-1:-1:-1;;;;;57148:29:0;;;;;;;;;57189:28;;57148:24;;57189:28;;;;;;;57051:172;;;:::o;55416:1529::-;55513:35;55551:20;55563:7;55551:11;:20::i;:::-;55513:58;;55580:22;55622:13;:18;;;-1:-1:-1;;;;;55606:34:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;55606:34:0;;:81;;;;55675:12;:10;:12::i;:::-;-1:-1:-1;;;;;55651:36:0;:20;55663:7;55651:11;:20::i;:::-;-1:-1:-1;;;;;55651:36:0;;55606:81;:142;;;-1:-1:-1;55715:18:0;;55698:50;;55735:12;:10;:12::i;55698:50::-;55580:169;;55774:17;55758:101;;;;-1:-1:-1;;;55758:101:0;;;;;;;:::i;:::-;55906:4;-1:-1:-1;;;;;55884:26:0;:13;:18;;;-1:-1:-1;;;;;55884:26:0;;55868:98;;;;-1:-1:-1;;;55868:98:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55981:16:0;;55973:66;;;;-1:-1:-1;;;55973:66:0;;;;;;;:::i;:::-;56048:43;56070:4;56076:2;56080:7;56089:1;56048:21;:43::i;:::-;56148:49;56165:1;56169:7;56178:13;:18;;;56148:8;:49::i;:::-;-1:-1:-1;;;;;56206:18:0;;;;;;:12;:18;;;;;:31;;56236:1;;56206:18;:31;;56236:1;;-1:-1:-1;;;;;56206:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;56206:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;56244:16:0;;-1:-1:-1;56244:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;56244:16:0;;:29;;-1:-1:-1;;56244:29:0;;:::i;:::-;;;-1:-1:-1;;;;;56244:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56303:43:0;;;;;;;;-1:-1:-1;;;;;56303:43:0;;;;;;56329:15;56303:43;;;;;;;;;-1:-1:-1;56280:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;56280:66:0;-1:-1:-1;;;;56280:66:0;;;;-1:-1:-1;;;;;;56280:66:0;;;;;;;;56596:11;56292:7;-1:-1:-1;56596:11:0;:::i;:::-;56659:1;56618:24;;;:11;:24;;;;;:29;56574:33;;-1:-1:-1;;;;;;56618:29:0;56614:236;;56676:20;56684:11;56676:7;:20::i;:::-;56672:171;;;56736:97;;;;;;;;56763:18;;-1:-1:-1;;;;;56736:97:0;;;;;;56794:28;;;;56736:97;;;;;;;;;;-1:-1:-1;56709:24:0;;;:11;:24;;;;;;;:124;;;;;;-1:-1:-1;;;;;;56709:124:0;;;;;;;;;-1:-1:-1;;;;56709:124:0;-1:-1:-1;;;56709:124:0;;;;;;;;;;;;;;56672:171;56882:7;56878:2;-1:-1:-1;;;;;56863:27:0;56872:4;-1:-1:-1;;;;;56863:27:0;;;;;;;;;;;56897:42;56918:4;56924:2;56928:7;56937:1;56897:20;:42::i;:::-;55416:1529;;;;;;:::o;53475:98::-;53540:27;53550:2;53554:8;53540:27;;;;;;;;;;;;:9;:27::i;49177:606::-;49253:21;;:::i;:::-;49294:16;49302:7;49294;:16::i;:::-;49286:71;;;;-1:-1:-1;;;49286:71:0;;;;;;;:::i;:::-;49366:26;49414:12;49403:7;:23;49399:93;;49458:22;49468:12;49458:7;:22;:::i;:::-;:26;;49483:1;49458:26;:::i;:::-;49437:47;;49399:93;49520:7;49500:212;49537:18;49529:4;:26;49500:212;;49574:31;49608:17;;;:11;:17;;;;;;;;;49574:51;;;;;;;;;-1:-1:-1;;;;;49574:51:0;;;;;-1:-1:-1;;;49574:51:0;;;;;;;;;;;;49638:28;49634:71;;49686:9;-1:-1:-1;49679:16:0;;-1:-1:-1;;49679:16:0;49634:71;-1:-1:-1;49557:6:0;;;;:::i;:::-;;;;49500:212;;;;49720:57;;-1:-1:-1;;;49720:57:0;;;;;;;:::i;44389:191::-;44482:6;;;-1:-1:-1;;;;;44499:17:0;;;-1:-1:-1;;;;;;44499:17:0;;;;;;;44532:40;;44482:6;;;44499:17;44482:6;;44532:40;;44463:16;;44532:40;44389:191;;:::o;58766:690::-;58903:4;58920:15;:2;-1:-1:-1;;;;;58920:13:0;;:15::i;:::-;58916:535;;;58975:2;-1:-1:-1;;;;;58959:36:0;;58996:12;:10;:12::i;:::-;59010:4;59016:7;59025:5;58959:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58959:72:0;;;;;;;;-1:-1:-1;;58959:72:0;;;;;;;;;;;;:::i;:::-;;;58946:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59190:13:0;;59186:215;;59223:61;;-1:-1:-1;;;59223:61:0;;;;;;;:::i;59186:215::-;59369:6;59363:13;59354:6;59350:2;59346:15;59339:38;58946:464;-1:-1:-1;;;;;;59081:55:0;-1:-1:-1;;;59081:55:0;;-1:-1:-1;59074:62:0;;58916:535;-1:-1:-1;59439:4:0;58916:535;58766:690;;;;;;:::o;98826:117::-;98886:13;98919:16;98912:23;;;;;:::i;17205:723::-;17261:13;17482:10;17478:53;;-1:-1:-1;17509:10:0;;;;;;;;;;;;-1:-1:-1;;;17509:10:0;;;;;;17478:53;17556:5;17541:12;17597:78;17604:9;;17597:78;;17630:8;;;;:::i;:::-;;-1:-1:-1;17653:10:0;;-1:-1:-1;17661:2:0;17653:10;;:::i;:::-;;;17597:78;;;17685:19;17717:6;17707:17;;;;;;-1:-1:-1;;;17707:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17707:17:0;;17685:39;;17735:154;17742:10;;17735:154;;17769:11;17779:1;17769:11;;:::i;:::-;;-1:-1:-1;17838:10:0;17846:2;17838:5;:10;:::i;:::-;17825:24;;:2;:24;:::i;:::-;17812:39;;17795:6;17802;17795:14;;;;;;-1:-1:-1;;;17795:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17795:56:0;;;;;;;;-1:-1:-1;17866:11:0;17875:2;17866:11;;:::i;:::-;;;17735:154;;53912:1272;54017:20;54040:12;-1:-1:-1;;;;;54067:16:0;;54059:62;;;;-1:-1:-1;;;54059:62:0;;;;;;;:::i;:::-;54258:21;54266:12;54258:7;:21::i;:::-;54257:22;54249:64;;;;-1:-1:-1;;;54249:64:0;;;;;;;:::i;:::-;54340:12;54328:8;:24;;54320:71;;;;-1:-1:-1;;;54320:71:0;;;;;;;:::i;:::-;54400:61;54430:1;54434:2;54438:12;54452:8;54400:21;:61::i;:::-;-1:-1:-1;;;;;54503:16:0;;54470:30;54503:16;;;:12;:16;;;;;;;;;54470:49;;;;;;;;;-1:-1:-1;;;;;54470:49:0;;;;;-1:-1:-1;;;54470:49:0;;;;;;;;;;;54545:119;;;;;;;;54565:19;;54470:49;;54545:119;;;54565:39;;54595:8;;54565:39;:::i;:::-;-1:-1:-1;;;;;54545:119:0;;;;;54648:8;54613:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;54545:119:0;;;;;;-1:-1:-1;;;;;54526:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;;;-1:-1:-1;;;54526:138:0;;;;-1:-1:-1;;54526:138:0;;;;;;;;;;;;;;;;;54699:43;;;;;;;;;;;54725:15;54699:43;;;;;;;;54671:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;54671:71:0;-1:-1:-1;;;;54671:71:0;;;;-1:-1:-1;;;;;;54671:71:0;;;;;;;;;;;;;;;54683:12;;54795:281;54819:8;54815:1;:12;54795:281;;;54848:38;;54873:12;;-1:-1:-1;;;;;54848:38:0;;;54865:1;;54848:38;;54865:1;;54848:38;54913:59;54944:1;54948:2;54952:12;54966:5;54913:22;:59::i;:::-;54895:150;;;;-1:-1:-1;;;54895:150:0;;;;;;;:::i;:::-;55054:14;;;;:::i;:::-;;;;54829:3;;;;;:::i;:::-;;;;54795:281;;;-1:-1:-1;55084:12:0;:27;;;55118:60;;55151:2;55155:12;55169:8;55118:20;:60::i;8616:387::-;8939:20;8987:8;;;8616:387::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:607:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:175::-;696:20;;-1:-1:-1;;;;;745:31:1;;735:42;;725:2;;791:1;788;781:12;806:198;;918:2;906:9;897:7;893:23;889:32;886:2;;;939:6;931;924:22;886:2;967:31;988:9;967:31;:::i;1009:274::-;;;1138:2;1126:9;1117:7;1113:23;1109:32;1106:2;;;1159:6;1151;1144:22;1106:2;1187:31;1208:9;1187:31;:::i;:::-;1177:41;;1237:40;1273:2;1262:9;1258:18;1237:40;:::i;:::-;1227:50;;1096:187;;;;;:::o;1288:342::-;;;;1434:2;1422:9;1413:7;1409:23;1405:32;1402:2;;;1455:6;1447;1440:22;1402:2;1483:31;1504:9;1483:31;:::i;:::-;1473:41;;1533:40;1569:2;1558:9;1554:18;1533:40;:::i;:::-;1523:50;;1620:2;1609:9;1605:18;1592:32;1582:42;;1392:238;;;;;:::o;1635:702::-;;;;;1807:3;1795:9;1786:7;1782:23;1778:33;1775:2;;;1829:6;1821;1814:22;1775:2;1857:31;1878:9;1857:31;:::i;:::-;1847:41;;1907:40;1943:2;1932:9;1928:18;1907:40;:::i;:::-;1897:50;;1994:2;1983:9;1979:18;1966:32;1956:42;;2049:2;2038:9;2034:18;2021:32;2076:18;2068:6;2065:30;2062:2;;;2113:6;2105;2098:22;2062:2;2141:22;;2194:4;2186:13;;2182:27;-1:-1:-1;2172:2:1;;2228:6;2220;2213:22;2172:2;2256:75;2323:7;2318:2;2305:16;2300:2;2296;2292:11;2256:75;:::i;:::-;2246:85;;;1765:572;;;;;;;:::o;2342:369::-;;;2468:2;2456:9;2447:7;2443:23;2439:32;2436:2;;;2489:6;2481;2474:22;2436:2;2517:31;2538:9;2517:31;:::i;:::-;2507:41;;2598:2;2587:9;2583:18;2570:32;2645:5;2638:13;2631:21;2624:5;2621:32;2611:2;;2672:6;2664;2657:22;2611:2;2700:5;2690:15;;;2426:285;;;;;:::o;2716:266::-;;;2845:2;2833:9;2824:7;2820:23;2816:32;2813:2;;;2866:6;2858;2851:22;2813:2;2894:31;2915:9;2894:31;:::i;:::-;2884:41;2972:2;2957:18;;;;2944:32;;-1:-1:-1;;;2803:179:1:o;2987:257::-;;3098:2;3086:9;3077:7;3073:23;3069:32;3066:2;;;3119:6;3111;3104:22;3066:2;3163:9;3150:23;3182:32;3208:5;3182:32;:::i;3249:261::-;;3371:2;3359:9;3350:7;3346:23;3342:32;3339:2;;;3392:6;3384;3377:22;3339:2;3429:9;3423:16;3448:32;3474:5;3448:32;:::i;3515:482::-;;3637:2;3625:9;3616:7;3612:23;3608:32;3605:2;;;3658:6;3650;3643:22;3605:2;3703:9;3690:23;3736:18;3728:6;3725:30;3722:2;;;3773:6;3765;3758:22;3722:2;3801:22;;3854:4;3846:13;;3842:27;-1:-1:-1;3832:2:1;;3888:6;3880;3873:22;3832:2;3916:75;3983:7;3978:2;3965:16;3960:2;3956;3952:11;3916:75;:::i;4002:190::-;;4114:2;4102:9;4093:7;4089:23;4085:32;4082:2;;;4135:6;4127;4120:22;4082:2;-1:-1:-1;4163:23:1;;4072:120;-1:-1:-1;4072:120:1:o;4197:259::-;;4278:5;4272:12;4305:6;4300:3;4293:19;4321:63;4377:6;4370:4;4365:3;4361:14;4354:4;4347:5;4343:16;4321:63;:::i;:::-;4438:2;4417:15;-1:-1:-1;;4413:29:1;4404:39;;;;4445:4;4400:50;;4248:208;-1:-1:-1;;4248:208:1:o;4461:470::-;;4678:6;4672:13;4694:53;4740:6;4735:3;4728:4;4720:6;4716:17;4694:53;:::i;:::-;4810:13;;4769:16;;;;4832:57;4810:13;4769:16;4866:4;4854:17;;4832:57;:::i;:::-;4905:20;;4648:283;-1:-1:-1;;;;4648:283:1:o;4936:203::-;-1:-1:-1;;;;;5100:32:1;;;;5082:51;;5070:2;5055:18;;5037:102::o;5144:490::-;-1:-1:-1;;;;;5413:15:1;;;5395:34;;5465:15;;5460:2;5445:18;;5438:43;5512:2;5497:18;;5490:34;;;5560:3;5555:2;5540:18;;5533:31;;;5144:490;;5581:47;;5608:19;;5600:6;5581:47;:::i;:::-;5573:55;5347:287;-1:-1:-1;;;;;;5347:287:1:o;5639:345::-;-1:-1:-1;;;;;5859:32:1;;;;5841:51;;5923:2;5908:18;;5901:34;;;;5966:2;5951:18;;5944:34;5829:2;5814:18;;5796:188::o;5989:635::-;6160:2;6212:21;;;6282:13;;6185:18;;;6304:22;;;5989:635;;6160:2;6383:15;;;;6357:2;6342:18;;;5989:635;6429:169;6443:6;6440:1;6437:13;6429:169;;;6504:13;;6492:26;;6573:15;;;;6538:12;;;;6465:1;6458:9;6429:169;;;-1:-1:-1;6615:3:1;;6140:484;-1:-1:-1;;;;;;6140:484:1:o;6629:187::-;6794:14;;6787:22;6769:41;;6757:2;6742:18;;6724:92::o;6821:221::-;;6970:2;6959:9;6952:21;6990:46;7032:2;7021:9;7017:18;7009:6;6990:46;:::i;7047:398::-;7249:2;7231:21;;;7288:2;7268:18;;;7261:30;7327:34;7322:2;7307:18;;7300:62;-1:-1:-1;;;7393:2:1;7378:18;;7371:32;7435:3;7420:19;;7221:224::o;7450:402::-;7652:2;7634:21;;;7691:2;7671:18;;;7664:30;7730:34;7725:2;7710:18;;7703:62;-1:-1:-1;;;7796:2:1;7781:18;;7774:36;7842:3;7827:19;;7624:228::o;7857:399::-;8059:2;8041:21;;;8098:2;8078:18;;;8071:30;8137:34;8132:2;8117:18;;8110:62;-1:-1:-1;;;8203:2:1;8188:18;;8181:33;8246:3;8231:19;;8031:225::o;8261:404::-;8463:2;8445:21;;;8502:2;8482:18;;;8475:30;8541:34;8536:2;8521:18;;8514:62;-1:-1:-1;;;8607:2:1;8592:18;;8585:38;8655:3;8640:19;;8435:230::o;8670:406::-;8872:2;8854:21;;;8911:2;8891:18;;;8884:30;8950:34;8945:2;8930:18;;8923:62;-1:-1:-1;;;9016:2:1;9001:18;;8994:40;9066:3;9051:19;;8844:232::o;9081:399::-;9283:2;9265:21;;;9322:2;9302:18;;;9295:30;9361:34;9356:2;9341:18;;9334:62;-1:-1:-1;;;9427:2:1;9412:18;;9405:33;9470:3;9455:19;;9255:225::o;9485:401::-;9687:2;9669:21;;;9726:2;9706:18;;;9699:30;9765:34;9760:2;9745:18;;9738:62;-1:-1:-1;;;9831:2:1;9816:18;;9809:35;9876:3;9861:19;;9659:227::o;9891:338::-;10093:2;10075:21;;;10132:2;10112:18;;;10105:30;-1:-1:-1;;;10166:2:1;10151:18;;10144:44;10220:2;10205:18;;10065:164::o;10234:421::-;10436:2;10418:21;;;10475:2;10455:18;;;10448:30;10514:34;10509:2;10494:18;;10487:62;10585:27;10580:2;10565:18;;10558:55;10645:3;10630:19;;10408:247::o;10660:351::-;10862:2;10844:21;;;10901:2;10881:18;;;10874:30;10940:29;10935:2;10920:18;;10913:57;11002:2;10987:18;;10834:177::o;11016:407::-;11218:2;11200:21;;;11257:2;11237:18;;;11230:30;11296:34;11291:2;11276:18;;11269:62;-1:-1:-1;;;11362:2:1;11347:18;;11340:41;11413:3;11398:19;;11190:233::o;11428:402::-;11630:2;11612:21;;;11669:2;11649:18;;;11642:30;11708:34;11703:2;11688:18;;11681:62;-1:-1:-1;;;11774:2:1;11759:18;;11752:36;11820:3;11805:19;;11602:228::o;11835:356::-;12037:2;12019:21;;;12056:18;;;12049:30;12115:34;12110:2;12095:18;;12088:62;12182:2;12167:18;;12009:182::o;12196:411::-;12398:2;12380:21;;;12437:2;12417:18;;;12410:30;12476:34;12471:2;12456:18;;12449:62;-1:-1:-1;;;12542:2:1;12527:18;;12520:45;12597:3;12582:19;;12370:237::o;12612:350::-;12814:2;12796:21;;;12853:2;12833:18;;;12826:30;12892:28;12887:2;12872:18;;12865:56;12953:2;12938:18;;12786:176::o;12967:414::-;13169:2;13151:21;;;13208:2;13188:18;;;13181:30;13247:34;13242:2;13227:18;;13220:62;-1:-1:-1;;;13313:2:1;13298:18;;13291:48;13371:3;13356:19;;13141:240::o;13386:403::-;13588:2;13570:21;;;13627:2;13607:18;;;13600:30;13666:34;13661:2;13646:18;;13639:62;-1:-1:-1;;;13732:2:1;13717:18;;13710:37;13779:3;13764:19;;13560:229::o;13794:398::-;13996:2;13978:21;;;14035:2;14015:18;;;14008:30;14074:34;14069:2;14054:18;;14047:62;-1:-1:-1;;;14140:2:1;14125:18;;14118:32;14182:3;14167:19;;13968:224::o;14197:415::-;14399:2;14381:21;;;14438:2;14418:18;;;14411:30;14477:34;14472:2;14457:18;;14450:62;-1:-1:-1;;;14543:2:1;14528:18;;14521:49;14602:3;14587:19;;14371:241::o;14617:353::-;14819:2;14801:21;;;14858:2;14838:18;;;14831:30;14897:31;14892:2;14877:18;;14870:59;14961:2;14946:18;;14791:179::o;14975:397::-;15177:2;15159:21;;;15216:2;15196:18;;;15189:30;15255:34;15250:2;15235:18;;15228:62;-1:-1:-1;;;15321:2:1;15306:18;;15299:31;15362:3;15347:19;;15149:223::o;15377:343::-;15579:2;15561:21;;;15618:2;15598:18;;;15591:30;-1:-1:-1;;;15652:2:1;15637:18;;15630:49;15711:2;15696:18;;15551:169::o;15725:348::-;15927:2;15909:21;;;15966:2;15946:18;;;15939:30;16005:26;16000:2;15985:18;;15978:54;16064:2;16049:18;;15899:174::o;16078:410::-;16280:2;16262:21;;;16319:2;16299:18;;;16292:30;16358:34;16353:2;16338:18;;16331:62;-1:-1:-1;;;16424:2:1;16409:18;;16402:44;16478:3;16463:19;;16252:236::o;16493:411::-;16695:2;16677:21;;;16734:2;16714:18;;;16707:30;16773:34;16768:2;16753:18;;16746:62;-1:-1:-1;;;16839:2:1;16824:18;;16817:45;16894:3;16879:19;;16667:237::o;16909:410::-;17111:2;17093:21;;;17150:2;17130:18;;;17123:30;17189:34;17184:2;17169:18;;17162:62;-1:-1:-1;;;17255:2:1;17240:18;;17233:44;17309:3;17294:19;;17083:236::o;17324:409::-;17526:2;17508:21;;;17565:2;17545:18;;;17538:30;17604:34;17599:2;17584:18;;17577:62;-1:-1:-1;;;17670:2:1;17655:18;;17648:43;17723:3;17708:19;;17498:235::o;17738:398::-;17940:2;17922:21;;;17979:2;17959:18;;;17952:30;18018:34;18013:2;17998:18;;17991:62;-1:-1:-1;;;18084:2:1;18069:18;;18062:32;18126:3;18111:19;;17912:224::o;18141:177::-;18287:25;;;18275:2;18260:18;;18242:76::o;18323:253::-;;-1:-1:-1;;;;;18452:2:1;18449:1;18445:10;18482:2;18479:1;18475:10;18513:3;18509:2;18505:12;18500:3;18497:21;18494:2;;;18521:18;;:::i;18581:128::-;;18652:1;18648:6;18645:1;18642:13;18639:2;;;18658:18;;:::i;:::-;-1:-1:-1;18694:9:1;;18629:80::o;18714:120::-;;18780:1;18770:2;;18785:18;;:::i;:::-;-1:-1:-1;18819:9:1;;18760:74::o;18839:246::-;;-1:-1:-1;;;;;18992:10:1;;;;18962;;19014:12;;;19011:2;;;19029:18;;:::i;:::-;19066:13;;18888:197;-1:-1:-1;;;18888:197:1:o;19090:125::-;;19158:1;19155;19152:8;19149:2;;;19163:18;;:::i;:::-;-1:-1:-1;19200:9:1;;19139:76::o;19220:258::-;19292:1;19302:113;19316:6;19313:1;19310:13;19302:113;;;19392:11;;;19386:18;19373:11;;;19366:39;19338:2;19331:10;19302:113;;;19433:6;19430:1;19427:13;19424:2;;;-1:-1:-1;;19468:1:1;19450:16;;19443:27;19273:205::o;19483:136::-;;19550:5;19540:2;;19559:18;;:::i;:::-;-1:-1:-1;;;19595:18:1;;19530:89::o;19624:380::-;19709:1;19699:12;;19756:1;19746:12;;;19767:2;;19821:4;19813:6;19809:17;19799:27;;19767:2;19874;19866:6;19863:14;19843:18;19840:38;19837:2;;;19920:10;19915:3;19911:20;19908:1;19901:31;19955:4;19952:1;19945:15;19983:4;19980:1;19973:15;19837:2;;19679:325;;;:::o;20009:135::-;;-1:-1:-1;;20069:17:1;;20066:2;;;20089:18;;:::i;:::-;-1:-1:-1;20136:1:1;20125:13;;20056:88::o;20149:112::-;;20207:1;20197:2;;20212:18;;:::i;:::-;-1:-1:-1;20246:9:1;;20187:74::o;20266:127::-;20327:10;20322:3;20318:20;20315:1;20308:31;20358:4;20355:1;20348:15;20382:4;20379:1;20372:15;20398:127;20459:10;20454:3;20450:20;20447:1;20440:31;20490:4;20487:1;20480:15;20514:4;20511:1;20504:15;20530:127;20591:10;20586:3;20582:20;20579:1;20572:31;20622:4;20619:1;20612:15;20646:4;20643:1;20636:15;20662:133;-1:-1:-1;;;;;;20738:32:1;;20728:43;;20718:2;;20785:1;20782;20775:12

Swarm Source

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