ETH Price: $3,622.36 (-2.47%)

Token

: Layer2DAO Early Adopter - Level 3 (L2DAO-LVL3)

Overview

Max Total Supply

4,450 L2DAO-LVL3

Holders

4,412

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 L2DAO-LVL3
0x24d9Ad4603a20512D6Ac47a1404aDb130180062d
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
QuixoticLaunchpadERC721

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at optimistic.etherscan.io on 2022-03-29
*/

// Sources flattened with hardhat v2.8.4 https://hardhat.org

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

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

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

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

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

// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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/[email protected]

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

pragma solidity ^0.8.0;

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

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


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

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

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

pragma solidity ^0.8.0;

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


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

// OpenZeppelin Contracts (last updated v4.5.0) (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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// OpenZeppelin Contracts (last updated v4.5.0) (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);

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

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

// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File Contracts/LaunchpadNFT.sol

pragma solidity ^0.8.1;



contract QuixoticLaunchpadERC721 is ERC721("Layer2DAO Early Adopter - Level 3", "L2DAO-LVL3"), ERC721Enumerable, Ownable {

    string private _baseURIextended;
    bool public frozenMetadata = false;
    uint256 public MAX_TOKENS = 39562;
    uint256 public constant maxMintPerTxn = 1;
    bool public saleIsActive = false;
    bool public greenListSaleIsActive = false;
    mapping(address => uint256) addressToGreenListNumberMinted;
    address private bouncer = 0xd47257ee6cD0a80Ed1ba7bDdC722Ef8eE44a8d7d;

    bool private _baseUriIncludeTokenId = true;

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    
    function flipSaleState() public onlyOwner {
            saleIsActive = !saleIsActive;
    }


    
    function flipGreenListSaleState() public onlyOwner {
            greenListSaleIsActive = !greenListSaleIsActive;
    }


    function setBaseURI(string memory baseURI_, bool includeTokenId) external onlyOwner() {
        require(!frozenMetadata, "The metadata URI is frozen. You can no longer set the baseURI");
        _baseUriIncludeTokenId = includeTokenId;
        _baseURIextended = baseURI_;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }
    
    function freezeMetadata() external onlyOwner {
        frozenMetadata = true;
    }
    
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
    
        string memory baseURI = _baseURI();
        if (_baseUriIncludeTokenId) {
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, Strings.toString(tokenId))) : "";
        } else {
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI)) : "";
        }
    }

    
    function mintToken(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint Tokens");
        require(numberOfTokens <= maxMintPerTxn, "Exceeded max mint per transaction");
        require(totalSupply() + numberOfTokens <= MAX_TOKENS, "Purchase would exceed max supply of tokens");
        require(0 * numberOfTokens <= msg.value, "Ether value sent is not correct");

        for (uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_TOKENS) {
                _safeMint(_msgSender(), mintIndex);
            }
        }
    }


    
    function greenListMintToken(uint numberOfTokens, bytes memory signature) public payable {
        require(greenListSaleIsActive, "Sale must be active to mint Tokens");
        require(numberOfTokens + addressToGreenListNumberMinted[_msgSender()] <= 1, "Exceeded max token purchase");
        require(totalSupply() + numberOfTokens <= MAX_TOKENS, "Purchase would exceed max supply of tokens");
        require(0 * numberOfTokens <= msg.value, "Ether value sent is not correct");

        bytes32 hashedMinter = ECDSA.toEthSignedMessageHash(keccak256(abi.encodePacked(_msgSender())));
        address recoveredBouncer = ECDSA.recover(hashedMinter, signature);
        require(recoveredBouncer == bouncer, "The signature for the greenlist is invalid");

        for (uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_TOKENS) {
                _safeMint(_msgSender(), mintIndex);
                addressToGreenListNumberMinted[_msgSender()] += 1;
            }
        }
    }
    

    

}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"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":"flipGreenListSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freezeMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"frozenMetadata","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"greenListMintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"greenListSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTxn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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"},{"internalType":"bool","name":"includeTokenId","type":"bool"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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"}]

60806040526000600c60006101000a81548160ff021916908315150217905550619a8a600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff02191690831515021790555073d47257ee6cd0a80ed1ba7bddc722ef8ee44a8d7d601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601060146101000a81548160ff021916908315150217905550348015620000d857600080fd5b5060405180606001604052806021815260200162004fd8602191396040518060400160405280600a81526020017f4c3244414f2d4c564c330000000000000000000000000000000000000000000081525081600090805190602001906200014192919062000251565b5080600190805190602001906200015a92919062000251565b5050506200017d620001716200018360201b60201c565b6200018b60201b60201c565b62000366565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025f9062000301565b90600052602060002090601f016020900481019282620002835760008555620002cf565b82601f106200029e57805160ff1916838001178555620002cf565b82800160010185558215620002cf579182015b82811115620002ce578251825591602001919060010190620002b1565b5b509050620002de9190620002e2565b5090565b5b80821115620002fd576000816000905550600101620002e3565b5090565b600060028204905060018216806200031a57607f821691505b6020821081141562000331576200033062000337565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614c6280620003766000396000f3fe6080604052600436106101cd5760003560e01c80638529ccad116100f7578063c87b56dd11610095578063eb8d244411610064578063eb8d244414610655578063f2fde38b14610680578063f47c84c5146106a9578063f7f7bf7b146106d4576101cd565b8063c87b56dd14610599578063caa8078f146105d6578063d111515d14610601578063e985e9c514610618576101cd565b8063a22cb465116100d1578063a22cb46514610502578063b64b21ca1461052b578063b88d4fde14610554578063c634d0321461057d576101cd565b80638529ccad146104815780638da5cb5b146104ac57806395d89b41146104d7576101cd565b80632da435f71161016f5780634f6ccce71161013e5780634f6ccce7146103b35780636352211e146103f057806370a082311461042d578063715018a61461046a576101cd565b80632da435f71461031f5780632f745c591461033657806334918dfd1461037357806342842e0e1461038a576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb5780632541865c146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f4919061331d565b6106f0565b6040516102069190613a75565b60405180910390f35b34801561021b57600080fd5b50610224610702565b6040516102319190613ad5565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c91906133d3565b610794565b60405161026e9190613a0e565b60405180910390f35b34801561028357600080fd5b5061029e600480360381019061029991906132dd565b610819565b005b3480156102ac57600080fd5b506102b5610931565b6040516102c29190613e97565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed91906131c7565b61093e565b005b34801561030057600080fd5b5061030961099e565b6040516103169190613a75565b60405180910390f35b34801561032b57600080fd5b506103346109b1565b005b34801561034257600080fd5b5061035d600480360381019061035891906132dd565b610a59565b60405161036a9190613e97565b60405180910390f35b34801561037f57600080fd5b50610388610afe565b005b34801561039657600080fd5b506103b160048036038101906103ac91906131c7565b610ba6565b005b3480156103bf57600080fd5b506103da60048036038101906103d591906133d3565b610bc6565b6040516103e79190613e97565b60405180910390f35b3480156103fc57600080fd5b50610417600480360381019061041291906133d3565b610c37565b6040516104249190613a0e565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f919061315a565b610ce9565b6040516104619190613e97565b60405180910390f35b34801561047657600080fd5b5061047f610da1565b005b34801561048d57600080fd5b50610496610e29565b6040516104a39190613a75565b60405180910390f35b3480156104b857600080fd5b506104c1610e3c565b6040516104ce9190613a0e565b60405180910390f35b3480156104e357600080fd5b506104ec610e66565b6040516104f99190613ad5565b60405180910390f35b34801561050e57600080fd5b506105296004803603810190610524919061329d565b610ef8565b005b34801561053757600080fd5b50610552600480360381019061054d9190613377565b610f0e565b005b34801561056057600080fd5b5061057b6004803603810190610576919061321a565b61100f565b005b610597600480360381019061059291906133d3565b611071565b005b3480156105a557600080fd5b506105c060048036038101906105bb91906133d3565b6111fc565b6040516105cd9190613ad5565b60405180910390f35b3480156105e257600080fd5b506105eb611300565b6040516105f89190613e97565b60405180910390f35b34801561060d57600080fd5b50610616611305565b005b34801561062457600080fd5b5061063f600480360381019061063a9190613187565b61139e565b60405161064c9190613a75565b60405180910390f35b34801561066157600080fd5b5061066a611432565b6040516106779190613a75565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a2919061315a565b611445565b005b3480156106b557600080fd5b506106be61153d565b6040516106cb9190613e97565b60405180910390f35b6106ee60048036038101906106e99190613400565b611543565b005b60006106fb82611858565b9050919050565b6060600080546107119061415e565b80601f016020809104026020016040519081016040528092919081815260200182805461073d9061415e565b801561078a5780601f1061075f5761010080835404028352916020019161078a565b820191906000526020600020905b81548152906001019060200180831161076d57829003601f168201915b5050505050905090565b600061079f826118d2565b6107de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d590613d77565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061082482610c37565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088c90613df7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108b461193e565b73ffffffffffffffffffffffffffffffffffffffff1614806108e357506108e2816108dd61193e565b61139e565b5b610922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091990613c97565b60405180910390fd5b61092c8383611946565b505050565b6000600880549050905090565b61094f61094961193e565b826119ff565b61098e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098590613e37565b60405180910390fd5b610999838383611add565b505050565b600e60019054906101000a900460ff1681565b6109b961193e565b73ffffffffffffffffffffffffffffffffffffffff166109d7610e3c565b73ffffffffffffffffffffffffffffffffffffffff1614610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2490613d97565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b6000610a6483610ce9565b8210610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c90613b37565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b0661193e565b73ffffffffffffffffffffffffffffffffffffffff16610b24610e3c565b73ffffffffffffffffffffffffffffffffffffffff1614610b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7190613d97565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610bc18383836040518060200160405280600081525061100f565b505050565b6000610bd0610931565b8210610c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0890613e57565b60405180910390fd5b60088281548110610c2557610c24614354565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd790613cd7565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5190613cb7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610da961193e565b73ffffffffffffffffffffffffffffffffffffffff16610dc7610e3c565b73ffffffffffffffffffffffffffffffffffffffff1614610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1490613d97565b60405180910390fd5b610e276000611d44565b565b600c60009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e759061415e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea19061415e565b8015610eee5780601f10610ec357610100808354040283529160200191610eee565b820191906000526020600020905b815481529060010190602001808311610ed157829003601f168201915b5050505050905090565b610f0a610f0361193e565b8383611e0a565b5050565b610f1661193e565b73ffffffffffffffffffffffffffffffffffffffff16610f34610e3c565b73ffffffffffffffffffffffffffffffffffffffff1614610f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8190613d97565b60405180910390fd5b600c60009054906101000a900460ff1615610fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd190613d57565b60405180910390fd5b80601060146101000a81548160ff02191690831515021790555081600b908051906020019061100a929190612f6e565b505050565b61102061101a61193e565b836119ff565b61105f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105690613e37565b60405180910390fd5b61106b84848484611f77565b50505050565b600e60009054906101000a900460ff166110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b790613c37565b60405180910390fd5b6001811115611104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fb90613db7565b60405180910390fd5b600d5481611110610931565b61111a9190613f7c565b111561115b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115290613cf7565b60405180910390fd5b348160006111699190614003565b11156111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a190613c17565b60405180910390fd5b60005b818110156111f85760006111bf610931565b9050600d546111cc610931565b10156111e4576111e36111dd61193e565b82611fd3565b5b5080806111f0906141c1565b9150506111ad565b5050565b6060611207826118d2565b611246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123d90613dd7565b60405180910390fd5b6000611250611ff1565b9050601060149054906101000a900460ff16156112b857600081511161128557604051806020016040528060008152506112b0565b8061128f84612083565b6040516020016112a09291906139c4565b6040516020818303038152906040525b9150506112fb565b60008151116112d657604051806020016040528060008152506112f7565b806040516020016112e791906139ad565b6040516020818303038152906040525b9150505b919050565b600181565b61130d61193e565b73ffffffffffffffffffffffffffffffffffffffff1661132b610e3c565b73ffffffffffffffffffffffffffffffffffffffff1614611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137890613d97565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b61144d61193e565b73ffffffffffffffffffffffffffffffffffffffff1661146b610e3c565b73ffffffffffffffffffffffffffffffffffffffff16146114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b890613d97565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890613b77565b60405180910390fd5b61153a81611d44565b50565b600d5481565b600e60019054906101000a900460ff16611592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158990613c37565b60405180910390fd5b6001600f60006115a061193e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836115e69190613f7c565b1115611627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161e90613e17565b60405180910390fd5b600d5482611633610931565b61163d9190613f7c565b111561167e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167590613cf7565b60405180910390fd5b3482600061168c9190614003565b11156116cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c490613c17565b60405180910390fd5b60006117056116da61193e565b6040516020016116ea9190613992565b604051602081830303815290604052805190602001206121e4565b905060006117138284612214565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90613e77565b60405180910390fd5b60005b848110156118515760006117ba610931565b9050600d546117c7610931565b101561183d576117de6117d861193e565b82611fd3565b6001600f60006117ec61193e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118359190613f7c565b925050819055505b508080611849906141c1565b9150506117a8565b5050505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118cb57506118ca8261223b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119b983610c37565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a0a826118d2565b611a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4090613c77565b60405180910390fd5b6000611a5483610c37565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ac357508373ffffffffffffffffffffffffffffffffffffffff16611aab84610794565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ad45750611ad3818561139e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611afd82610c37565b73ffffffffffffffffffffffffffffffffffffffff1614611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a90613b97565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bba90613bd7565b60405180910390fd5b611bce83838361231d565b611bd9600082611946565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c29919061405d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c809190613f7c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d3f83838361232d565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7090613bf7565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f6a9190613a75565b60405180910390a3505050565b611f82848484611add565b611f8e84848484612332565b611fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc490613b57565b60405180910390fd5b50505050565b611fed8282604051806020016040528060008152506124c9565b5050565b6060600b80546120009061415e565b80601f016020809104026020016040519081016040528092919081815260200182805461202c9061415e565b80156120795780601f1061204e57610100808354040283529160200191612079565b820191906000526020600020905b81548152906001019060200180831161205c57829003601f168201915b5050505050905090565b606060008214156120cb576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121df565b600082905060005b600082146120fd5780806120e6906141c1565b915050600a826120f69190613fd2565b91506120d3565b60008167ffffffffffffffff81111561211957612118614383565b5b6040519080825280601f01601f19166020018201604052801561214b5781602001600182028036833780820191505090505b5090505b600085146121d857600182612164919061405d565b9150600a856121739190614238565b603061217f9190613f7c565b60f81b81838151811061219557612194614354565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121d19190613fd2565b945061214f565b8093505050505b919050565b6000816040516020016121f791906139e8565b604051602081830303815290604052805190602001209050919050565b60008060006122238585612524565b91509150612230816125a7565b819250505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061230657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061231657506123158261277c565b5b9050919050565b6123288383836127e6565b505050565b505050565b60006123538473ffffffffffffffffffffffffffffffffffffffff166128fa565b156124bc578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261237c61193e565b8786866040518563ffffffff1660e01b815260040161239e9493929190613a29565b602060405180830381600087803b1580156123b857600080fd5b505af19250505080156123e957506040513d601f19601f820116820180604052508101906123e6919061334a565b60015b61246c573d8060008114612419576040519150601f19603f3d011682016040523d82523d6000602084013e61241e565b606091505b50600081511415612464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245b90613b57565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124c1565b600190505b949350505050565b6124d3838361291d565b6124e06000848484612332565b61251f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251690613b57565b60405180910390fd5b505050565b6000806041835114156125665760008060006020860151925060408601519150606086015160001a905061255a87828585612af7565b945094505050506125a0565b60408351141561259757600080602085015191506040850151905061258c868383612c04565b9350935050506125a0565b60006002915091505b9250929050565b600060048111156125bb576125ba6142c7565b5b8160048111156125ce576125cd6142c7565b5b14156125d957612779565b600160048111156125ed576125ec6142c7565b5b816004811115612600576125ff6142c7565b5b1415612641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263890613af7565b60405180910390fd5b60026004811115612655576126546142c7565b5b816004811115612668576126676142c7565b5b14156126a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a090613b17565b60405180910390fd5b600360048111156126bd576126bc6142c7565b5b8160048111156126d0576126cf6142c7565b5b1415612711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270890613c57565b60405180910390fd5b600480811115612724576127236142c7565b5b816004811115612737576127366142c7565b5b1415612778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276f90613d17565b60405180910390fd5b5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6127f1838383612c63565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128345761282f81612c68565b612873565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612872576128718382612cb1565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128b6576128b181612e1e565b6128f5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146128f4576128f38282612eef565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561298d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298490613d37565b60405180910390fd5b612996816118d2565b156129d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cd90613bb7565b60405180910390fd5b6129e26000838361231d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a329190613f7c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612af36000838361232d565b5050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612b32576000600391509150612bfb565b601b8560ff1614158015612b4a5750601c8560ff1614155b15612b5c576000600491509150612bfb565b600060018787878760405160008152602001604052604051612b819493929190613a90565b6020604051602081039080840390855afa158015612ba3573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612bf257600060019250925050612bfb565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c612c479190613f7c565b9050612c5587828885612af7565b935093505050935093915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612cbe84610ce9565b612cc8919061405d565b9050600060076000848152602001908152602001600020549050818114612dad576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e32919061405d565b9050600060096000848152602001908152602001600020549050600060088381548110612e6257612e61614354565b5b906000526020600020015490508060088381548110612e8457612e83614354565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ed357612ed2614325565b5b6001900381819060005260206000200160009055905550505050565b6000612efa83610ce9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612f7a9061415e565b90600052602060002090601f016020900481019282612f9c5760008555612fe3565b82601f10612fb557805160ff1916838001178555612fe3565b82800160010185558215612fe3579182015b82811115612fe2578251825591602001919060010190612fc7565b5b509050612ff09190612ff4565b5090565b5b8082111561300d576000816000905550600101612ff5565b5090565b600061302461301f84613ed7565b613eb2565b9050828152602081018484840111156130405761303f6143b7565b5b61304b84828561411c565b509392505050565b600061306661306184613f08565b613eb2565b905082815260208101848484011115613082576130816143b7565b5b61308d84828561411c565b509392505050565b6000813590506130a481614bd0565b92915050565b6000813590506130b981614be7565b92915050565b6000813590506130ce81614bfe565b92915050565b6000815190506130e381614bfe565b92915050565b600082601f8301126130fe576130fd6143b2565b5b813561310e848260208601613011565b91505092915050565b600082601f83011261312c5761312b6143b2565b5b813561313c848260208601613053565b91505092915050565b60008135905061315481614c15565b92915050565b6000602082840312156131705761316f6143c1565b5b600061317e84828501613095565b91505092915050565b6000806040838503121561319e5761319d6143c1565b5b60006131ac85828601613095565b92505060206131bd85828601613095565b9150509250929050565b6000806000606084860312156131e0576131df6143c1565b5b60006131ee86828701613095565b93505060206131ff86828701613095565b925050604061321086828701613145565b9150509250925092565b60008060008060808587031215613234576132336143c1565b5b600061324287828801613095565b945050602061325387828801613095565b935050604061326487828801613145565b925050606085013567ffffffffffffffff811115613285576132846143bc565b5b613291878288016130e9565b91505092959194509250565b600080604083850312156132b4576132b36143c1565b5b60006132c285828601613095565b92505060206132d3858286016130aa565b9150509250929050565b600080604083850312156132f4576132f36143c1565b5b600061330285828601613095565b925050602061331385828601613145565b9150509250929050565b600060208284031215613333576133326143c1565b5b6000613341848285016130bf565b91505092915050565b6000602082840312156133605761335f6143c1565b5b600061336e848285016130d4565b91505092915050565b6000806040838503121561338e5761338d6143c1565b5b600083013567ffffffffffffffff8111156133ac576133ab6143bc565b5b6133b885828601613117565b92505060206133c9858286016130aa565b9150509250929050565b6000602082840312156133e9576133e86143c1565b5b60006133f784828501613145565b91505092915050565b60008060408385031215613417576134166143c1565b5b600061342585828601613145565b925050602083013567ffffffffffffffff811115613446576134456143bc565b5b613452858286016130e9565b9150509250929050565b61346581614091565b82525050565b61347c61347782614091565b61420a565b82525050565b61348b816140a3565b82525050565b61349a816140af565b82525050565b6134b16134ac826140af565b61421c565b82525050565b60006134c282613f39565b6134cc8185613f4f565b93506134dc81856020860161412b565b6134e5816143c6565b840191505092915050565b60006134fb82613f44565b6135058185613f60565b935061351581856020860161412b565b61351e816143c6565b840191505092915050565b600061353482613f44565b61353e8185613f71565b935061354e81856020860161412b565b80840191505092915050565b6000613567601883613f60565b9150613572826143e4565b602082019050919050565b600061358a601f83613f60565b91506135958261440d565b602082019050919050565b60006135ad601c83613f71565b91506135b882614436565b601c82019050919050565b60006135d0602b83613f60565b91506135db8261445f565b604082019050919050565b60006135f3603283613f60565b91506135fe826144ae565b604082019050919050565b6000613616602683613f60565b9150613621826144fd565b604082019050919050565b6000613639602583613f60565b91506136448261454c565b604082019050919050565b600061365c601c83613f60565b91506136678261459b565b602082019050919050565b600061367f602483613f60565b915061368a826145c4565b604082019050919050565b60006136a2601983613f60565b91506136ad82614613565b602082019050919050565b60006136c5601f83613f60565b91506136d08261463c565b602082019050919050565b60006136e8602283613f60565b91506136f382614665565b604082019050919050565b600061370b602283613f60565b9150613716826146b4565b604082019050919050565b600061372e602c83613f60565b915061373982614703565b604082019050919050565b6000613751603883613f60565b915061375c82614752565b604082019050919050565b6000613774602a83613f60565b915061377f826147a1565b604082019050919050565b6000613797602983613f60565b91506137a2826147f0565b604082019050919050565b60006137ba602a83613f60565b91506137c58261483f565b604082019050919050565b60006137dd602283613f60565b91506137e88261488e565b604082019050919050565b6000613800602083613f60565b915061380b826148dd565b602082019050919050565b6000613823603d83613f60565b915061382e82614906565b604082019050919050565b6000613846602c83613f60565b915061385182614955565b604082019050919050565b6000613869602083613f60565b9150613874826149a4565b602082019050919050565b600061388c602183613f60565b9150613897826149cd565b604082019050919050565b60006138af602f83613f60565b91506138ba82614a1c565b604082019050919050565b60006138d2602183613f60565b91506138dd82614a6b565b604082019050919050565b60006138f5601b83613f60565b915061390082614aba565b602082019050919050565b6000613918603183613f60565b915061392382614ae3565b604082019050919050565b600061393b602c83613f60565b915061394682614b32565b604082019050919050565b600061395e602a83613f60565b915061396982614b81565b604082019050919050565b61397d81614105565b82525050565b61398c8161410f565b82525050565b600061399e828461346b565b60148201915081905092915050565b60006139b98284613529565b915081905092915050565b60006139d08285613529565b91506139dc8284613529565b91508190509392505050565b60006139f3826135a0565b91506139ff82846134a0565b60208201915081905092915050565b6000602082019050613a23600083018461345c565b92915050565b6000608082019050613a3e600083018761345c565b613a4b602083018661345c565b613a586040830185613974565b8181036060830152613a6a81846134b7565b905095945050505050565b6000602082019050613a8a6000830184613482565b92915050565b6000608082019050613aa56000830187613491565b613ab26020830186613983565b613abf6040830185613491565b613acc6060830184613491565b95945050505050565b60006020820190508181036000830152613aef81846134f0565b905092915050565b60006020820190508181036000830152613b108161355a565b9050919050565b60006020820190508181036000830152613b308161357d565b9050919050565b60006020820190508181036000830152613b50816135c3565b9050919050565b60006020820190508181036000830152613b70816135e6565b9050919050565b60006020820190508181036000830152613b9081613609565b9050919050565b60006020820190508181036000830152613bb08161362c565b9050919050565b60006020820190508181036000830152613bd08161364f565b9050919050565b60006020820190508181036000830152613bf081613672565b9050919050565b60006020820190508181036000830152613c1081613695565b9050919050565b60006020820190508181036000830152613c30816136b8565b9050919050565b60006020820190508181036000830152613c50816136db565b9050919050565b60006020820190508181036000830152613c70816136fe565b9050919050565b60006020820190508181036000830152613c9081613721565b9050919050565b60006020820190508181036000830152613cb081613744565b9050919050565b60006020820190508181036000830152613cd081613767565b9050919050565b60006020820190508181036000830152613cf08161378a565b9050919050565b60006020820190508181036000830152613d10816137ad565b9050919050565b60006020820190508181036000830152613d30816137d0565b9050919050565b60006020820190508181036000830152613d50816137f3565b9050919050565b60006020820190508181036000830152613d7081613816565b9050919050565b60006020820190508181036000830152613d9081613839565b9050919050565b60006020820190508181036000830152613db08161385c565b9050919050565b60006020820190508181036000830152613dd08161387f565b9050919050565b60006020820190508181036000830152613df0816138a2565b9050919050565b60006020820190508181036000830152613e10816138c5565b9050919050565b60006020820190508181036000830152613e30816138e8565b9050919050565b60006020820190508181036000830152613e508161390b565b9050919050565b60006020820190508181036000830152613e708161392e565b9050919050565b60006020820190508181036000830152613e9081613951565b9050919050565b6000602082019050613eac6000830184613974565b92915050565b6000613ebc613ecd565b9050613ec88282614190565b919050565b6000604051905090565b600067ffffffffffffffff821115613ef257613ef1614383565b5b613efb826143c6565b9050602081019050919050565b600067ffffffffffffffff821115613f2357613f22614383565b5b613f2c826143c6565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f8782614105565b9150613f9283614105565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fc757613fc6614269565b5b828201905092915050565b6000613fdd82614105565b9150613fe883614105565b925082613ff857613ff7614298565b5b828204905092915050565b600061400e82614105565b915061401983614105565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561405257614051614269565b5b828202905092915050565b600061406882614105565b915061407383614105565b92508282101561408657614085614269565b5b828203905092915050565b600061409c826140e5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561414957808201518184015260208101905061412e565b83811115614158576000848401525b50505050565b6000600282049050600182168061417657607f821691505b6020821081141561418a576141896142f6565b5b50919050565b614199826143c6565b810181811067ffffffffffffffff821117156141b8576141b7614383565b5b80604052505050565b60006141cc82614105565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141ff576141fe614269565b5b600182019050919050565b600061421582614226565b9050919050565b6000819050919050565b6000614231826143d7565b9050919050565b600061424382614105565b915061424e83614105565b92508261425e5761425d614298565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420546f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f546865206d65746164617461205552492069732066726f7a656e2e20596f752060008201527f63616e206e6f206c6f6e67657220736574207468652062617365555249000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4578636565646564206d6178206d696e7420706572207472616e73616374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f546865207369676e617475726520666f722074686520677265656e6c6973742060008201527f697320696e76616c696400000000000000000000000000000000000000000000602082015250565b614bd981614091565b8114614be457600080fd5b50565b614bf0816140a3565b8114614bfb57600080fd5b50565b614c07816140b9565b8114614c1257600080fd5b50565b614c1e81614105565b8114614c2957600080fd5b5056fea26469706673582212209a0168541e5024b30adcee0207465a7aa1f1bd0021165f0a1fa662a92ce8181f64736f6c634300080700334c617965723244414f204561726c792041646f70746572202d204c6576656c2033

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c80638529ccad116100f7578063c87b56dd11610095578063eb8d244411610064578063eb8d244414610655578063f2fde38b14610680578063f47c84c5146106a9578063f7f7bf7b146106d4576101cd565b8063c87b56dd14610599578063caa8078f146105d6578063d111515d14610601578063e985e9c514610618576101cd565b8063a22cb465116100d1578063a22cb46514610502578063b64b21ca1461052b578063b88d4fde14610554578063c634d0321461057d576101cd565b80638529ccad146104815780638da5cb5b146104ac57806395d89b41146104d7576101cd565b80632da435f71161016f5780634f6ccce71161013e5780634f6ccce7146103b35780636352211e146103f057806370a082311461042d578063715018a61461046a576101cd565b80632da435f71461031f5780632f745c591461033657806334918dfd1461037357806342842e0e1461038a576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb5780632541865c146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f4919061331d565b6106f0565b6040516102069190613a75565b60405180910390f35b34801561021b57600080fd5b50610224610702565b6040516102319190613ad5565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c91906133d3565b610794565b60405161026e9190613a0e565b60405180910390f35b34801561028357600080fd5b5061029e600480360381019061029991906132dd565b610819565b005b3480156102ac57600080fd5b506102b5610931565b6040516102c29190613e97565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed91906131c7565b61093e565b005b34801561030057600080fd5b5061030961099e565b6040516103169190613a75565b60405180910390f35b34801561032b57600080fd5b506103346109b1565b005b34801561034257600080fd5b5061035d600480360381019061035891906132dd565b610a59565b60405161036a9190613e97565b60405180910390f35b34801561037f57600080fd5b50610388610afe565b005b34801561039657600080fd5b506103b160048036038101906103ac91906131c7565b610ba6565b005b3480156103bf57600080fd5b506103da60048036038101906103d591906133d3565b610bc6565b6040516103e79190613e97565b60405180910390f35b3480156103fc57600080fd5b50610417600480360381019061041291906133d3565b610c37565b6040516104249190613a0e565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f919061315a565b610ce9565b6040516104619190613e97565b60405180910390f35b34801561047657600080fd5b5061047f610da1565b005b34801561048d57600080fd5b50610496610e29565b6040516104a39190613a75565b60405180910390f35b3480156104b857600080fd5b506104c1610e3c565b6040516104ce9190613a0e565b60405180910390f35b3480156104e357600080fd5b506104ec610e66565b6040516104f99190613ad5565b60405180910390f35b34801561050e57600080fd5b506105296004803603810190610524919061329d565b610ef8565b005b34801561053757600080fd5b50610552600480360381019061054d9190613377565b610f0e565b005b34801561056057600080fd5b5061057b6004803603810190610576919061321a565b61100f565b005b610597600480360381019061059291906133d3565b611071565b005b3480156105a557600080fd5b506105c060048036038101906105bb91906133d3565b6111fc565b6040516105cd9190613ad5565b60405180910390f35b3480156105e257600080fd5b506105eb611300565b6040516105f89190613e97565b60405180910390f35b34801561060d57600080fd5b50610616611305565b005b34801561062457600080fd5b5061063f600480360381019061063a9190613187565b61139e565b60405161064c9190613a75565b60405180910390f35b34801561066157600080fd5b5061066a611432565b6040516106779190613a75565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a2919061315a565b611445565b005b3480156106b557600080fd5b506106be61153d565b6040516106cb9190613e97565b60405180910390f35b6106ee60048036038101906106e99190613400565b611543565b005b60006106fb82611858565b9050919050565b6060600080546107119061415e565b80601f016020809104026020016040519081016040528092919081815260200182805461073d9061415e565b801561078a5780601f1061075f5761010080835404028352916020019161078a565b820191906000526020600020905b81548152906001019060200180831161076d57829003601f168201915b5050505050905090565b600061079f826118d2565b6107de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d590613d77565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061082482610c37565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088c90613df7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108b461193e565b73ffffffffffffffffffffffffffffffffffffffff1614806108e357506108e2816108dd61193e565b61139e565b5b610922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091990613c97565b60405180910390fd5b61092c8383611946565b505050565b6000600880549050905090565b61094f61094961193e565b826119ff565b61098e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098590613e37565b60405180910390fd5b610999838383611add565b505050565b600e60019054906101000a900460ff1681565b6109b961193e565b73ffffffffffffffffffffffffffffffffffffffff166109d7610e3c565b73ffffffffffffffffffffffffffffffffffffffff1614610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2490613d97565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b6000610a6483610ce9565b8210610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c90613b37565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b0661193e565b73ffffffffffffffffffffffffffffffffffffffff16610b24610e3c565b73ffffffffffffffffffffffffffffffffffffffff1614610b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7190613d97565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610bc18383836040518060200160405280600081525061100f565b505050565b6000610bd0610931565b8210610c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0890613e57565b60405180910390fd5b60088281548110610c2557610c24614354565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd790613cd7565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5190613cb7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610da961193e565b73ffffffffffffffffffffffffffffffffffffffff16610dc7610e3c565b73ffffffffffffffffffffffffffffffffffffffff1614610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1490613d97565b60405180910390fd5b610e276000611d44565b565b600c60009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e759061415e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea19061415e565b8015610eee5780601f10610ec357610100808354040283529160200191610eee565b820191906000526020600020905b815481529060010190602001808311610ed157829003601f168201915b5050505050905090565b610f0a610f0361193e565b8383611e0a565b5050565b610f1661193e565b73ffffffffffffffffffffffffffffffffffffffff16610f34610e3c565b73ffffffffffffffffffffffffffffffffffffffff1614610f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8190613d97565b60405180910390fd5b600c60009054906101000a900460ff1615610fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd190613d57565b60405180910390fd5b80601060146101000a81548160ff02191690831515021790555081600b908051906020019061100a929190612f6e565b505050565b61102061101a61193e565b836119ff565b61105f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105690613e37565b60405180910390fd5b61106b84848484611f77565b50505050565b600e60009054906101000a900460ff166110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b790613c37565b60405180910390fd5b6001811115611104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fb90613db7565b60405180910390fd5b600d5481611110610931565b61111a9190613f7c565b111561115b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115290613cf7565b60405180910390fd5b348160006111699190614003565b11156111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a190613c17565b60405180910390fd5b60005b818110156111f85760006111bf610931565b9050600d546111cc610931565b10156111e4576111e36111dd61193e565b82611fd3565b5b5080806111f0906141c1565b9150506111ad565b5050565b6060611207826118d2565b611246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123d90613dd7565b60405180910390fd5b6000611250611ff1565b9050601060149054906101000a900460ff16156112b857600081511161128557604051806020016040528060008152506112b0565b8061128f84612083565b6040516020016112a09291906139c4565b6040516020818303038152906040525b9150506112fb565b60008151116112d657604051806020016040528060008152506112f7565b806040516020016112e791906139ad565b6040516020818303038152906040525b9150505b919050565b600181565b61130d61193e565b73ffffffffffffffffffffffffffffffffffffffff1661132b610e3c565b73ffffffffffffffffffffffffffffffffffffffff1614611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137890613d97565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b61144d61193e565b73ffffffffffffffffffffffffffffffffffffffff1661146b610e3c565b73ffffffffffffffffffffffffffffffffffffffff16146114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b890613d97565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890613b77565b60405180910390fd5b61153a81611d44565b50565b600d5481565b600e60019054906101000a900460ff16611592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158990613c37565b60405180910390fd5b6001600f60006115a061193e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836115e69190613f7c565b1115611627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161e90613e17565b60405180910390fd5b600d5482611633610931565b61163d9190613f7c565b111561167e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167590613cf7565b60405180910390fd5b3482600061168c9190614003565b11156116cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c490613c17565b60405180910390fd5b60006117056116da61193e565b6040516020016116ea9190613992565b604051602081830303815290604052805190602001206121e4565b905060006117138284612214565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90613e77565b60405180910390fd5b60005b848110156118515760006117ba610931565b9050600d546117c7610931565b101561183d576117de6117d861193e565b82611fd3565b6001600f60006117ec61193e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118359190613f7c565b925050819055505b508080611849906141c1565b9150506117a8565b5050505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118cb57506118ca8261223b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119b983610c37565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a0a826118d2565b611a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4090613c77565b60405180910390fd5b6000611a5483610c37565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ac357508373ffffffffffffffffffffffffffffffffffffffff16611aab84610794565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ad45750611ad3818561139e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611afd82610c37565b73ffffffffffffffffffffffffffffffffffffffff1614611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a90613b97565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bba90613bd7565b60405180910390fd5b611bce83838361231d565b611bd9600082611946565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c29919061405d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c809190613f7c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d3f83838361232d565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7090613bf7565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f6a9190613a75565b60405180910390a3505050565b611f82848484611add565b611f8e84848484612332565b611fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc490613b57565b60405180910390fd5b50505050565b611fed8282604051806020016040528060008152506124c9565b5050565b6060600b80546120009061415e565b80601f016020809104026020016040519081016040528092919081815260200182805461202c9061415e565b80156120795780601f1061204e57610100808354040283529160200191612079565b820191906000526020600020905b81548152906001019060200180831161205c57829003601f168201915b5050505050905090565b606060008214156120cb576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121df565b600082905060005b600082146120fd5780806120e6906141c1565b915050600a826120f69190613fd2565b91506120d3565b60008167ffffffffffffffff81111561211957612118614383565b5b6040519080825280601f01601f19166020018201604052801561214b5781602001600182028036833780820191505090505b5090505b600085146121d857600182612164919061405d565b9150600a856121739190614238565b603061217f9190613f7c565b60f81b81838151811061219557612194614354565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121d19190613fd2565b945061214f565b8093505050505b919050565b6000816040516020016121f791906139e8565b604051602081830303815290604052805190602001209050919050565b60008060006122238585612524565b91509150612230816125a7565b819250505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061230657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061231657506123158261277c565b5b9050919050565b6123288383836127e6565b505050565b505050565b60006123538473ffffffffffffffffffffffffffffffffffffffff166128fa565b156124bc578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261237c61193e565b8786866040518563ffffffff1660e01b815260040161239e9493929190613a29565b602060405180830381600087803b1580156123b857600080fd5b505af19250505080156123e957506040513d601f19601f820116820180604052508101906123e6919061334a565b60015b61246c573d8060008114612419576040519150601f19603f3d011682016040523d82523d6000602084013e61241e565b606091505b50600081511415612464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245b90613b57565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124c1565b600190505b949350505050565b6124d3838361291d565b6124e06000848484612332565b61251f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251690613b57565b60405180910390fd5b505050565b6000806041835114156125665760008060006020860151925060408601519150606086015160001a905061255a87828585612af7565b945094505050506125a0565b60408351141561259757600080602085015191506040850151905061258c868383612c04565b9350935050506125a0565b60006002915091505b9250929050565b600060048111156125bb576125ba6142c7565b5b8160048111156125ce576125cd6142c7565b5b14156125d957612779565b600160048111156125ed576125ec6142c7565b5b816004811115612600576125ff6142c7565b5b1415612641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263890613af7565b60405180910390fd5b60026004811115612655576126546142c7565b5b816004811115612668576126676142c7565b5b14156126a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a090613b17565b60405180910390fd5b600360048111156126bd576126bc6142c7565b5b8160048111156126d0576126cf6142c7565b5b1415612711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270890613c57565b60405180910390fd5b600480811115612724576127236142c7565b5b816004811115612737576127366142c7565b5b1415612778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276f90613d17565b60405180910390fd5b5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6127f1838383612c63565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128345761282f81612c68565b612873565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612872576128718382612cb1565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128b6576128b181612e1e565b6128f5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146128f4576128f38282612eef565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561298d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298490613d37565b60405180910390fd5b612996816118d2565b156129d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cd90613bb7565b60405180910390fd5b6129e26000838361231d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a329190613f7c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612af36000838361232d565b5050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612b32576000600391509150612bfb565b601b8560ff1614158015612b4a5750601c8560ff1614155b15612b5c576000600491509150612bfb565b600060018787878760405160008152602001604052604051612b819493929190613a90565b6020604051602081039080840390855afa158015612ba3573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612bf257600060019250925050612bfb565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c612c479190613f7c565b9050612c5587828885612af7565b935093505050935093915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612cbe84610ce9565b612cc8919061405d565b9050600060076000848152602001908152602001600020549050818114612dad576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e32919061405d565b9050600060096000848152602001908152602001600020549050600060088381548110612e6257612e61614354565b5b906000526020600020015490508060088381548110612e8457612e83614354565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ed357612ed2614325565b5b6001900381819060005260206000200160009055905550505050565b6000612efa83610ce9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612f7a9061415e565b90600052602060002090601f016020900481019282612f9c5760008555612fe3565b82601f10612fb557805160ff1916838001178555612fe3565b82800160010185558215612fe3579182015b82811115612fe2578251825591602001919060010190612fc7565b5b509050612ff09190612ff4565b5090565b5b8082111561300d576000816000905550600101612ff5565b5090565b600061302461301f84613ed7565b613eb2565b9050828152602081018484840111156130405761303f6143b7565b5b61304b84828561411c565b509392505050565b600061306661306184613f08565b613eb2565b905082815260208101848484011115613082576130816143b7565b5b61308d84828561411c565b509392505050565b6000813590506130a481614bd0565b92915050565b6000813590506130b981614be7565b92915050565b6000813590506130ce81614bfe565b92915050565b6000815190506130e381614bfe565b92915050565b600082601f8301126130fe576130fd6143b2565b5b813561310e848260208601613011565b91505092915050565b600082601f83011261312c5761312b6143b2565b5b813561313c848260208601613053565b91505092915050565b60008135905061315481614c15565b92915050565b6000602082840312156131705761316f6143c1565b5b600061317e84828501613095565b91505092915050565b6000806040838503121561319e5761319d6143c1565b5b60006131ac85828601613095565b92505060206131bd85828601613095565b9150509250929050565b6000806000606084860312156131e0576131df6143c1565b5b60006131ee86828701613095565b93505060206131ff86828701613095565b925050604061321086828701613145565b9150509250925092565b60008060008060808587031215613234576132336143c1565b5b600061324287828801613095565b945050602061325387828801613095565b935050604061326487828801613145565b925050606085013567ffffffffffffffff811115613285576132846143bc565b5b613291878288016130e9565b91505092959194509250565b600080604083850312156132b4576132b36143c1565b5b60006132c285828601613095565b92505060206132d3858286016130aa565b9150509250929050565b600080604083850312156132f4576132f36143c1565b5b600061330285828601613095565b925050602061331385828601613145565b9150509250929050565b600060208284031215613333576133326143c1565b5b6000613341848285016130bf565b91505092915050565b6000602082840312156133605761335f6143c1565b5b600061336e848285016130d4565b91505092915050565b6000806040838503121561338e5761338d6143c1565b5b600083013567ffffffffffffffff8111156133ac576133ab6143bc565b5b6133b885828601613117565b92505060206133c9858286016130aa565b9150509250929050565b6000602082840312156133e9576133e86143c1565b5b60006133f784828501613145565b91505092915050565b60008060408385031215613417576134166143c1565b5b600061342585828601613145565b925050602083013567ffffffffffffffff811115613446576134456143bc565b5b613452858286016130e9565b9150509250929050565b61346581614091565b82525050565b61347c61347782614091565b61420a565b82525050565b61348b816140a3565b82525050565b61349a816140af565b82525050565b6134b16134ac826140af565b61421c565b82525050565b60006134c282613f39565b6134cc8185613f4f565b93506134dc81856020860161412b565b6134e5816143c6565b840191505092915050565b60006134fb82613f44565b6135058185613f60565b935061351581856020860161412b565b61351e816143c6565b840191505092915050565b600061353482613f44565b61353e8185613f71565b935061354e81856020860161412b565b80840191505092915050565b6000613567601883613f60565b9150613572826143e4565b602082019050919050565b600061358a601f83613f60565b91506135958261440d565b602082019050919050565b60006135ad601c83613f71565b91506135b882614436565b601c82019050919050565b60006135d0602b83613f60565b91506135db8261445f565b604082019050919050565b60006135f3603283613f60565b91506135fe826144ae565b604082019050919050565b6000613616602683613f60565b9150613621826144fd565b604082019050919050565b6000613639602583613f60565b91506136448261454c565b604082019050919050565b600061365c601c83613f60565b91506136678261459b565b602082019050919050565b600061367f602483613f60565b915061368a826145c4565b604082019050919050565b60006136a2601983613f60565b91506136ad82614613565b602082019050919050565b60006136c5601f83613f60565b91506136d08261463c565b602082019050919050565b60006136e8602283613f60565b91506136f382614665565b604082019050919050565b600061370b602283613f60565b9150613716826146b4565b604082019050919050565b600061372e602c83613f60565b915061373982614703565b604082019050919050565b6000613751603883613f60565b915061375c82614752565b604082019050919050565b6000613774602a83613f60565b915061377f826147a1565b604082019050919050565b6000613797602983613f60565b91506137a2826147f0565b604082019050919050565b60006137ba602a83613f60565b91506137c58261483f565b604082019050919050565b60006137dd602283613f60565b91506137e88261488e565b604082019050919050565b6000613800602083613f60565b915061380b826148dd565b602082019050919050565b6000613823603d83613f60565b915061382e82614906565b604082019050919050565b6000613846602c83613f60565b915061385182614955565b604082019050919050565b6000613869602083613f60565b9150613874826149a4565b602082019050919050565b600061388c602183613f60565b9150613897826149cd565b604082019050919050565b60006138af602f83613f60565b91506138ba82614a1c565b604082019050919050565b60006138d2602183613f60565b91506138dd82614a6b565b604082019050919050565b60006138f5601b83613f60565b915061390082614aba565b602082019050919050565b6000613918603183613f60565b915061392382614ae3565b604082019050919050565b600061393b602c83613f60565b915061394682614b32565b604082019050919050565b600061395e602a83613f60565b915061396982614b81565b604082019050919050565b61397d81614105565b82525050565b61398c8161410f565b82525050565b600061399e828461346b565b60148201915081905092915050565b60006139b98284613529565b915081905092915050565b60006139d08285613529565b91506139dc8284613529565b91508190509392505050565b60006139f3826135a0565b91506139ff82846134a0565b60208201915081905092915050565b6000602082019050613a23600083018461345c565b92915050565b6000608082019050613a3e600083018761345c565b613a4b602083018661345c565b613a586040830185613974565b8181036060830152613a6a81846134b7565b905095945050505050565b6000602082019050613a8a6000830184613482565b92915050565b6000608082019050613aa56000830187613491565b613ab26020830186613983565b613abf6040830185613491565b613acc6060830184613491565b95945050505050565b60006020820190508181036000830152613aef81846134f0565b905092915050565b60006020820190508181036000830152613b108161355a565b9050919050565b60006020820190508181036000830152613b308161357d565b9050919050565b60006020820190508181036000830152613b50816135c3565b9050919050565b60006020820190508181036000830152613b70816135e6565b9050919050565b60006020820190508181036000830152613b9081613609565b9050919050565b60006020820190508181036000830152613bb08161362c565b9050919050565b60006020820190508181036000830152613bd08161364f565b9050919050565b60006020820190508181036000830152613bf081613672565b9050919050565b60006020820190508181036000830152613c1081613695565b9050919050565b60006020820190508181036000830152613c30816136b8565b9050919050565b60006020820190508181036000830152613c50816136db565b9050919050565b60006020820190508181036000830152613c70816136fe565b9050919050565b60006020820190508181036000830152613c9081613721565b9050919050565b60006020820190508181036000830152613cb081613744565b9050919050565b60006020820190508181036000830152613cd081613767565b9050919050565b60006020820190508181036000830152613cf08161378a565b9050919050565b60006020820190508181036000830152613d10816137ad565b9050919050565b60006020820190508181036000830152613d30816137d0565b9050919050565b60006020820190508181036000830152613d50816137f3565b9050919050565b60006020820190508181036000830152613d7081613816565b9050919050565b60006020820190508181036000830152613d9081613839565b9050919050565b60006020820190508181036000830152613db08161385c565b9050919050565b60006020820190508181036000830152613dd08161387f565b9050919050565b60006020820190508181036000830152613df0816138a2565b9050919050565b60006020820190508181036000830152613e10816138c5565b9050919050565b60006020820190508181036000830152613e30816138e8565b9050919050565b60006020820190508181036000830152613e508161390b565b9050919050565b60006020820190508181036000830152613e708161392e565b9050919050565b60006020820190508181036000830152613e9081613951565b9050919050565b6000602082019050613eac6000830184613974565b92915050565b6000613ebc613ecd565b9050613ec88282614190565b919050565b6000604051905090565b600067ffffffffffffffff821115613ef257613ef1614383565b5b613efb826143c6565b9050602081019050919050565b600067ffffffffffffffff821115613f2357613f22614383565b5b613f2c826143c6565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f8782614105565b9150613f9283614105565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fc757613fc6614269565b5b828201905092915050565b6000613fdd82614105565b9150613fe883614105565b925082613ff857613ff7614298565b5b828204905092915050565b600061400e82614105565b915061401983614105565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561405257614051614269565b5b828202905092915050565b600061406882614105565b915061407383614105565b92508282101561408657614085614269565b5b828203905092915050565b600061409c826140e5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561414957808201518184015260208101905061412e565b83811115614158576000848401525b50505050565b6000600282049050600182168061417657607f821691505b6020821081141561418a576141896142f6565b5b50919050565b614199826143c6565b810181811067ffffffffffffffff821117156141b8576141b7614383565b5b80604052505050565b60006141cc82614105565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141ff576141fe614269565b5b600182019050919050565b600061421582614226565b9050919050565b6000819050919050565b6000614231826143d7565b9050919050565b600061424382614105565b915061424e83614105565b92508261425e5761425d614298565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420546f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f546865206d65746164617461205552492069732066726f7a656e2e20596f752060008201527f63616e206e6f206c6f6e67657220736574207468652062617365555249000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4578636565646564206d6178206d696e7420706572207472616e73616374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f546865207369676e617475726520666f722074686520677265656e6c6973742060008201527f697320696e76616c696400000000000000000000000000000000000000000000602082015250565b614bd981614091565b8114614be457600080fd5b50565b614bf0816140a3565b8114614bfb57600080fd5b50565b614c07816140b9565b8114614c1257600080fd5b50565b614c1e81614105565b8114614c2957600080fd5b5056fea26469706673582212209a0168541e5024b30adcee0207465a7aa1f1bd0021165f0a1fa662a92ce8181f64736f6c63430008070033

Deployed Bytecode Sourcemap

55222:3969:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55988:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22665:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24224:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23747:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40107:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24974:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55558:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56290:120;;;;;;;;;;;;;:::i;:::-;;39775:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56181:93;;;;;;;;;;;;;:::i;:::-;;25384:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40297:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22359:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22089:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36551:103;;;;;;;;;;;;;:::i;:::-;;55390:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35900:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22834:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24517:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56420:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25640:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57455:643;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56936:505;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55471:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56839:85;;;;;;;;;;;;;:::i;:::-;;24743:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55519:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36809:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55431:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58114:1058;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55988:179;56099:4;56123:36;56147:11;56123:23;:36::i;:::-;56116:43;;55988:179;;;:::o;22665:100::-;22719:13;22752:5;22745:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22665:100;:::o;24224:221::-;24300:7;24328:16;24336:7;24328;:16::i;:::-;24320:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24413:15;:24;24429:7;24413:24;;;;;;;;;;;;;;;;;;;;;24406:31;;24224:221;;;:::o;23747:411::-;23828:13;23844:23;23859:7;23844:14;:23::i;:::-;23828:39;;23892:5;23886:11;;:2;:11;;;;23878:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23986:5;23970:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23995:37;24012:5;24019:12;:10;:12::i;:::-;23995:16;:37::i;:::-;23970:62;23948:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24129:21;24138:2;24142:7;24129:8;:21::i;:::-;23817:341;23747:411;;:::o;40107:113::-;40168:7;40195:10;:17;;;;40188:24;;40107:113;:::o;24974:339::-;25169:41;25188:12;:10;:12::i;:::-;25202:7;25169:18;:41::i;:::-;25161:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25277:28;25287:4;25293:2;25297:7;25277:9;:28::i;:::-;24974:339;;;:::o;55558:41::-;;;;;;;;;;;;;:::o;56290:120::-;36131:12;:10;:12::i;:::-;36120:23;;:7;:5;:7::i;:::-;:23;;;36112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56381:21:::1;;;;;;;;;;;56380:22;56356:21;;:46;;;;;;;;;;;;;;;;;;56290:120::o:0;39775:256::-;39872:7;39908:23;39925:5;39908:16;:23::i;:::-;39900:5;:31;39892:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;39997:12;:19;40010:5;39997:19;;;;;;;;;;;;;;;:26;40017:5;39997:26;;;;;;;;;;;;39990:33;;39775:256;;;;:::o;56181:93::-;36131:12;:10;:12::i;:::-;36120:23;;:7;:5;:7::i;:::-;:23;;;36112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56254:12:::1;;;;;;;;;;;56253:13;56238:12;;:28;;;;;;;;;;;;;;;;;;56181:93::o:0;25384:185::-;25522:39;25539:4;25545:2;25549:7;25522:39;;;;;;;;;;;;:16;:39::i;:::-;25384:185;;;:::o;40297:233::-;40372:7;40408:30;:28;:30::i;:::-;40400:5;:38;40392:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40505:10;40516:5;40505:17;;;;;;;;:::i;:::-;;;;;;;;;;40498:24;;40297:233;;;:::o;22359:239::-;22431:7;22451:13;22467:7;:16;22475:7;22467:16;;;;;;;;;;;;;;;;;;;;;22451:32;;22519:1;22502:19;;:5;:19;;;;22494:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22585:5;22578:12;;;22359:239;;;:::o;22089:208::-;22161:7;22206:1;22189:19;;:5;:19;;;;22181:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22273:9;:16;22283:5;22273:16;;;;;;;;;;;;;;;;22266:23;;22089:208;;;:::o;36551:103::-;36131:12;:10;:12::i;:::-;36120:23;;:7;:5;:7::i;:::-;:23;;;36112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36616:30:::1;36643:1;36616:18;:30::i;:::-;36551:103::o:0;55390:34::-;;;;;;;;;;;;;:::o;35900:87::-;35946:7;35973:6;;;;;;;;;;;35966:13;;35900:87;:::o;22834:104::-;22890:13;22923:7;22916:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22834:104;:::o;24517:155::-;24612:52;24631:12;:10;:12::i;:::-;24645:8;24655;24612:18;:52::i;:::-;24517:155;;:::o;56420:282::-;36131:12;:10;:12::i;:::-;36120:23;;:7;:5;:7::i;:::-;:23;;;36112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56526:14:::1;;;;;;;;;;;56525:15;56517:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;56642:14;56617:22;;:39;;;;;;;;;;;;;;;;;;56686:8;56667:16;:27;;;;;;;;;;;;:::i;:::-;;56420:282:::0;;:::o;25640:328::-;25815:41;25834:12;:10;:12::i;:::-;25848:7;25815:18;:41::i;:::-;25807:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25921:39;25935:4;25941:2;25945:7;25954:5;25921:13;:39::i;:::-;25640:328;;;;:::o;57455:643::-;57529:12;;;;;;;;;;;57521:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;55511:1;57599:14;:31;;57591:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;57721:10;;57703:14;57687:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;57679:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;57819:9;57801:14;57797:1;:18;;;;:::i;:::-;:31;;57789:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;57882:6;57877:214;57898:14;57894:1;:18;57877:214;;;57934:14;57951:13;:11;:13::i;:::-;57934:30;;57999:10;;57983:13;:11;:13::i;:::-;:26;57979:101;;;58030:34;58040:12;:10;:12::i;:::-;58054:9;58030;:34::i;:::-;57979:101;57919:172;57914:3;;;;;:::i;:::-;;;;57877:214;;;;57455:643;:::o;56936:505::-;57009:13;57043:16;57051:7;57043;:16::i;:::-;57035:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;57128:21;57152:10;:8;:10::i;:::-;57128:34;;57177:22;;;;;;;;;;;57173:261;;;57247:1;57229:7;57223:21;:25;:93;;;;;;;;;;;;;;;;;57275:7;57284:25;57301:7;57284:16;:25::i;:::-;57258:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57223:93;57216:100;;;;;57173:261;57380:1;57362:7;57356:21;:25;:66;;;;;;;;;;;;;;;;;57408:7;57391:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;57356:66;57349:73;;;56936:505;;;;:::o;55471:41::-;55511:1;55471:41;:::o;56839:85::-;36131:12;:10;:12::i;:::-;36120:23;;:7;:5;:7::i;:::-;:23;;;36112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56912:4:::1;56895:14;;:21;;;;;;;;;;;;;;;;;;56839:85::o:0;24743:164::-;24840:4;24864:18;:25;24883:5;24864:25;;;;;;;;;;;;;;;:35;24890:8;24864:35;;;;;;;;;;;;;;;;;;;;;;;;;24857:42;;24743:164;;;;:::o;55519:32::-;;;;;;;;;;;;;:::o;36809:201::-;36131:12;:10;:12::i;:::-;36120:23;;:7;:5;:7::i;:::-;:23;;;36112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36918:1:::1;36898:22;;:8;:22;;;;36890:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36974:28;36993:8;36974:18;:28::i;:::-;36809:201:::0;:::o;55431:33::-;;;;:::o;58114:1058::-;58221:21;;;;;;;;;;;58213:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58365:1;58317:30;:44;58348:12;:10;:12::i;:::-;58317:44;;;;;;;;;;;;;;;;58300:14;:61;;;;:::i;:::-;:66;;58292:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;58451:10;;58433:14;58417:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;58409:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;58549:9;58531:14;58527:1;:18;;;;:::i;:::-;:31;;58519:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;58607:20;58630:71;58686:12;:10;:12::i;:::-;58669:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;58659:41;;;;;;58630:28;:71::i;:::-;58607:94;;58712:24;58739:38;58753:12;58767:9;58739:13;:38::i;:::-;58712:65;;58816:7;;;;;;;;;;;58796:27;;:16;:27;;;58788:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;58888:6;58883:282;58904:14;58900:1;:18;58883:282;;;58940:14;58957:13;:11;:13::i;:::-;58940:30;;59005:10;;58989:13;:11;:13::i;:::-;:26;58985:169;;;59036:34;59046:12;:10;:12::i;:::-;59060:9;59036;:34::i;:::-;59137:1;59089:30;:44;59120:12;:10;:12::i;:::-;59089:44;;;;;;;;;;;;;;;;:49;;;;;;;:::i;:::-;;;;;;;;58985:169;58925:240;58920:3;;;;;:::i;:::-;;;;58883:282;;;;58202:970;;58114:1058;;:::o;39467:224::-;39569:4;39608:35;39593:50;;;:11;:50;;;;:90;;;;39647:36;39671:11;39647:23;:36::i;:::-;39593:90;39586:97;;39467:224;;;:::o;27478:127::-;27543:4;27595:1;27567:30;;:7;:16;27575:7;27567:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27560:37;;27478:127;;;:::o;16932:98::-;16985:7;17012:10;17005:17;;16932:98;:::o;31624:174::-;31726:2;31699:15;:24;31715:7;31699:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31782:7;31778:2;31744:46;;31753:23;31768:7;31753:14;:23::i;:::-;31744:46;;;;;;;;;;;;31624:174;;:::o;27772:348::-;27865:4;27890:16;27898:7;27890;:16::i;:::-;27882:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27966:13;27982:23;27997:7;27982:14;:23::i;:::-;27966:39;;28035:5;28024:16;;:7;:16;;;:51;;;;28068:7;28044:31;;:20;28056:7;28044:11;:20::i;:::-;:31;;;28024:51;:87;;;;28079:32;28096:5;28103:7;28079:16;:32::i;:::-;28024:87;28016:96;;;27772:348;;;;:::o;30881:625::-;31040:4;31013:31;;:23;31028:7;31013:14;:23::i;:::-;:31;;;31005:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31119:1;31105:16;;:2;:16;;;;31097:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31175:39;31196:4;31202:2;31206:7;31175:20;:39::i;:::-;31279:29;31296:1;31300:7;31279:8;:29::i;:::-;31340:1;31321:9;:15;31331:4;31321:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31369:1;31352:9;:13;31362:2;31352:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31400:2;31381:7;:16;31389:7;31381:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31439:7;31435:2;31420:27;;31429:4;31420:27;;;;;;;;;;;;31460:38;31480:4;31486:2;31490:7;31460:19;:38::i;:::-;30881:625;;;:::o;37170:191::-;37244:16;37263:6;;;;;;;;;;;37244:25;;37289:8;37280:6;;:17;;;;;;;;;;;;;;;;;;37344:8;37313:40;;37334:8;37313:40;;;;;;;;;;;;37233:128;37170:191;:::o;31940:315::-;32095:8;32086:17;;:5;:17;;;;32078:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32182:8;32144:18;:25;32163:5;32144:25;;;;;;;;;;;;;;;:35;32170:8;32144:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32228:8;32206:41;;32221:5;32206:41;;;32238:8;32206:41;;;;;;:::i;:::-;;;;;;;;31940:315;;;:::o;26850:::-;27007:28;27017:4;27023:2;27027:7;27007:9;:28::i;:::-;27054:48;27077:4;27083:2;27087:7;27096:5;27054:22;:48::i;:::-;27046:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26850:315;;;;:::o;28462:110::-;28538:26;28548:2;28552:7;28538:26;;;;;;;;;;;;:9;:26::i;:::-;28462:110;;:::o;56710:117::-;56770:13;56803:16;56796:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56710:117;:::o;17517:723::-;17573:13;17803:1;17794:5;:10;17790:53;;;17821:10;;;;;;;;;;;;;;;;;;;;;17790:53;17853:12;17868:5;17853:20;;17884:14;17909:78;17924:1;17916:4;:9;17909:78;;17942:8;;;;;:::i;:::-;;;;17973:2;17965:10;;;;;:::i;:::-;;;17909:78;;;17997:19;18029:6;18019:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17997:39;;18047:154;18063:1;18054:5;:10;18047:154;;18091:1;18081:11;;;;;:::i;:::-;;;18158:2;18150:5;:10;;;;:::i;:::-;18137:2;:24;;;;:::i;:::-;18124:39;;18107:6;18114;18107:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18187:2;18178:11;;;;;:::i;:::-;;;18047:154;;;18225:6;18211:21;;;;;17517:723;;;;:::o;53838:269::-;53907:7;54093:4;54040:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;54030:69;;;;;;54023:76;;53838:269;;;:::o;50036:231::-;50114:7;50135:17;50154:18;50176:27;50187:4;50193:9;50176:10;:27::i;:::-;50134:69;;;;50214:18;50226:5;50214:11;:18::i;:::-;50250:9;50243:16;;;;50036:231;;;;:::o;21720:305::-;21822:4;21874:25;21859:40;;;:11;:40;;;;:105;;;;21931:33;21916:48;;;:11;:48;;;;21859:105;:158;;;;21981:36;22005:11;21981:23;:36::i;:::-;21859:158;21839:178;;21720:305;;;:::o;55799:181::-;55927:45;55954:4;55960:2;55964:7;55927:26;:45::i;:::-;55799:181;;;:::o;34702:125::-;;;;:::o;32820:799::-;32975:4;32996:15;:2;:13;;;:15::i;:::-;32992:620;;;33048:2;33032:36;;;33069:12;:10;:12::i;:::-;33083:4;33089:7;33098:5;33032:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33028:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33291:1;33274:6;:13;:18;33270:272;;;33317:60;;;;;;;;;;:::i;:::-;;;;;;;;33270:272;33492:6;33486:13;33477:6;33473:2;33469:15;33462:38;33028:529;33165:41;;;33155:51;;;:6;:51;;;;33148:58;;;;;32992:620;33596:4;33589:11;;32820:799;;;;;;;:::o;28799:321::-;28929:18;28935:2;28939:7;28929:5;:18::i;:::-;28980:54;29011:1;29015:2;29019:7;29028:5;28980:22;:54::i;:::-;28958:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28799:321;;;:::o;47926:1308::-;48007:7;48016:12;48261:2;48241:9;:16;:22;48237:990;;;48280:9;48304;48328:7;48537:4;48526:9;48522:20;48516:27;48511:32;;48587:4;48576:9;48572:20;48566:27;48561:32;;48645:4;48634:9;48630:20;48624:27;48621:1;48616:36;48611:41;;48688:25;48699:4;48705:1;48708;48711;48688:10;:25::i;:::-;48681:32;;;;;;;;;48237:990;48755:2;48735:9;:16;:22;48731:496;;;48774:9;48798:10;49010:4;48999:9;48995:20;48989:27;48984:32;;49061:4;49050:9;49046:20;49040:27;49034:33;;49103:23;49114:4;49120:1;49123:2;49103:10;:23::i;:::-;49096:30;;;;;;;;48731:496;49175:1;49179:35;49159:56;;;;47926:1308;;;;;;:::o;46197:643::-;46275:20;46266:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;46262:571;;;46312:7;;46262:571;46373:29;46364:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;46360:473;;;46419:34;;;;;;;;;;:::i;:::-;;;;;;;;46360:473;46484:35;46475:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;46471:362;;;46536:41;;;;;;;;;;:::i;:::-;;;;;;;;46471:362;46608:30;46599:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;46595:238;;;46655:44;;;;;;;;;;:::i;:::-;;;;;;;;46595:238;46730:30;46721:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;46717:116;;;46777:44;;;;;;;;;;:::i;:::-;;;;;;;;46717:116;46197:643;;:::o;20145:157::-;20230:4;20269:25;20254:40;;;:11;:40;;;;20247:47;;20145:157;;;:::o;41143:589::-;41287:45;41314:4;41320:2;41324:7;41287:26;:45::i;:::-;41365:1;41349:18;;:4;:18;;;41345:187;;;41384:40;41416:7;41384:31;:40::i;:::-;41345:187;;;41454:2;41446:10;;:4;:10;;;41442:90;;41473:47;41506:4;41512:7;41473:32;:47::i;:::-;41442:90;41345:187;41560:1;41546:16;;:2;:16;;;41542:183;;;41579:45;41616:7;41579:36;:45::i;:::-;41542:183;;;41652:4;41646:10;;:2;:10;;;41642:83;;41673:40;41701:2;41705:7;41673:27;:40::i;:::-;41642:83;41542:183;41143:589;;;:::o;8977:326::-;9037:4;9294:1;9272:7;:19;;;:23;9265:30;;8977:326;;;:::o;29456:439::-;29550:1;29536:16;;:2;:16;;;;29528:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29609:16;29617:7;29609;:16::i;:::-;29608:17;29600:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29671:45;29700:1;29704:2;29708:7;29671:20;:45::i;:::-;29746:1;29729:9;:13;29739:2;29729:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29777:2;29758:7;:16;29766:7;29758:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29822:7;29818:2;29797:33;;29814:1;29797:33;;;;;;;;;;;;29843:44;29871:1;29875:2;29879:7;29843:19;:44::i;:::-;29456:439;;:::o;51488:1632::-;51619:7;51628:12;52553:66;52548:1;52540:10;;:79;52536:163;;;52652:1;52656:30;52636:51;;;;;;52536:163;52718:2;52713:1;:7;;;;:18;;;;;52729:2;52724:1;:7;;;;52713:18;52709:102;;;52764:1;52768:30;52748:51;;;;;;52709:102;52908:14;52925:24;52935:4;52941:1;52944;52947;52925:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52908:41;;52982:1;52964:20;;:6;:20;;;52960:103;;;53017:1;53021:29;53001:50;;;;;;;52960:103;53083:6;53091:20;53075:37;;;;;51488:1632;;;;;;;;:::o;50530:344::-;50644:7;50653:12;50678:9;50703:66;50695:75;;50690:2;:80;50678:92;;50781:7;50820:2;50813:3;50806:2;50798:11;;:18;;50797:25;;;;:::i;:::-;50781:42;;50841:25;50852:4;50858:1;50861;50864;50841:10;:25::i;:::-;50834:32;;;;;;50530:344;;;;;;:::o;34191:126::-;;;;:::o;42455:164::-;42559:10;:17;;;;42532:15;:24;42548:7;42532:24;;;;;;;;;;;:44;;;;42587:10;42603:7;42587:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42455:164;:::o;43246:988::-;43512:22;43562:1;43537:22;43554:4;43537:16;:22::i;:::-;:26;;;;:::i;:::-;43512:51;;43574:18;43595:17;:26;43613:7;43595:26;;;;;;;;;;;;43574:47;;43742:14;43728:10;:28;43724:328;;43773:19;43795:12;:18;43808:4;43795:18;;;;;;;;;;;;;;;:34;43814:14;43795:34;;;;;;;;;;;;43773:56;;43879:11;43846:12;:18;43859:4;43846:18;;;;;;;;;;;;;;;:30;43865:10;43846:30;;;;;;;;;;;:44;;;;43996:10;43963:17;:30;43981:11;43963:30;;;;;;;;;;;:43;;;;43758:294;43724:328;44148:17;:26;44166:7;44148:26;;;;;;;;;;;44141:33;;;44192:12;:18;44205:4;44192:18;;;;;;;;;;;;;;;:34;44211:14;44192:34;;;;;;;;;;;44185:41;;;43327:907;;43246:988;;:::o;44529:1079::-;44782:22;44827:1;44807:10;:17;;;;:21;;;;:::i;:::-;44782:46;;44839:18;44860:15;:24;44876:7;44860:24;;;;;;;;;;;;44839:45;;45211:19;45233:10;45244:14;45233:26;;;;;;;;:::i;:::-;;;;;;;;;;45211:48;;45297:11;45272:10;45283;45272:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45408:10;45377:15;:28;45393:11;45377:28;;;;;;;;;;;:41;;;;45549:15;:24;45565:7;45549:24;;;;;;;;;;;45542:31;;;45584:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44600:1008;;;44529:1079;:::o;42033:221::-;42118:14;42135:20;42152:2;42135:16;:20::i;:::-;42118:37;;42193:7;42166:12;:16;42179:2;42166:16;;;;;;;;;;;;;;;:24;42183:6;42166:24;;;;;;;;;;;:34;;;;42240:6;42211:17;:26;42229:7;42211:26;;;;;;;;;;;:35;;;;42107:147;42033:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:648::-;6383:6;6391;6440:2;6428:9;6419:7;6415:23;6411:32;6408:119;;;6446:79;;:::i;:::-;6408:119;6594:1;6583:9;6579:17;6566:31;6624:18;6616:6;6613:30;6610:117;;;6646:79;;:::i;:::-;6610:117;6751:63;6806:7;6797:6;6786:9;6782:22;6751:63;:::i;:::-;6741:73;;6537:287;6863:2;6889:50;6931:7;6922:6;6911:9;6907:22;6889:50;:::i;:::-;6879:60;;6834:115;6308:648;;;;;:::o;6962:329::-;7021:6;7070:2;7058:9;7049:7;7045:23;7041:32;7038:119;;;7076:79;;:::i;:::-;7038:119;7196:1;7221:53;7266:7;7257:6;7246:9;7242:22;7221:53;:::i;:::-;7211:63;;7167:117;6962:329;;;;:::o;7297:652::-;7374:6;7382;7431:2;7419:9;7410:7;7406:23;7402:32;7399:119;;;7437:79;;:::i;:::-;7399:119;7557:1;7582:53;7627:7;7618:6;7607:9;7603:22;7582:53;:::i;:::-;7572:63;;7528:117;7712:2;7701:9;7697:18;7684:32;7743:18;7735:6;7732:30;7729:117;;;7765:79;;:::i;:::-;7729:117;7870:62;7924:7;7915:6;7904:9;7900:22;7870:62;:::i;:::-;7860:72;;7655:287;7297:652;;;;;:::o;7955:118::-;8042:24;8060:5;8042:24;:::i;:::-;8037:3;8030:37;7955:118;;:::o;8079:157::-;8184:45;8204:24;8222:5;8204:24;:::i;:::-;8184:45;:::i;:::-;8179:3;8172:58;8079:157;;:::o;8242:109::-;8323:21;8338:5;8323:21;:::i;:::-;8318:3;8311:34;8242:109;;:::o;8357:118::-;8444:24;8462:5;8444:24;:::i;:::-;8439:3;8432:37;8357:118;;:::o;8481:157::-;8586:45;8606:24;8624:5;8606:24;:::i;:::-;8586:45;:::i;:::-;8581:3;8574:58;8481:157;;:::o;8644:360::-;8730:3;8758:38;8790:5;8758:38;:::i;:::-;8812:70;8875:6;8870:3;8812:70;:::i;:::-;8805:77;;8891:52;8936:6;8931:3;8924:4;8917:5;8913:16;8891:52;:::i;:::-;8968:29;8990:6;8968:29;:::i;:::-;8963:3;8959:39;8952:46;;8734:270;8644:360;;;;:::o;9010:364::-;9098:3;9126:39;9159:5;9126:39;:::i;:::-;9181:71;9245:6;9240:3;9181:71;:::i;:::-;9174:78;;9261:52;9306:6;9301:3;9294:4;9287:5;9283:16;9261:52;:::i;:::-;9338:29;9360:6;9338:29;:::i;:::-;9333:3;9329:39;9322:46;;9102:272;9010:364;;;;:::o;9380:377::-;9486:3;9514:39;9547:5;9514:39;:::i;:::-;9569:89;9651:6;9646:3;9569:89;:::i;:::-;9562:96;;9667:52;9712:6;9707:3;9700:4;9693:5;9689:16;9667:52;:::i;:::-;9744:6;9739:3;9735:16;9728:23;;9490:267;9380:377;;;;:::o;9763:366::-;9905:3;9926:67;9990:2;9985:3;9926:67;:::i;:::-;9919:74;;10002:93;10091:3;10002:93;:::i;:::-;10120:2;10115:3;10111:12;10104:19;;9763:366;;;:::o;10135:::-;10277:3;10298:67;10362:2;10357:3;10298:67;:::i;:::-;10291:74;;10374:93;10463:3;10374:93;:::i;:::-;10492:2;10487:3;10483:12;10476:19;;10135:366;;;:::o;10507:402::-;10667:3;10688:85;10770:2;10765:3;10688:85;:::i;:::-;10681:92;;10782:93;10871:3;10782:93;:::i;:::-;10900:2;10895:3;10891:12;10884:19;;10507:402;;;:::o;10915:366::-;11057:3;11078:67;11142:2;11137:3;11078:67;:::i;:::-;11071:74;;11154:93;11243:3;11154:93;:::i;:::-;11272:2;11267:3;11263:12;11256:19;;10915:366;;;:::o;11287:::-;11429:3;11450:67;11514:2;11509:3;11450:67;:::i;:::-;11443:74;;11526:93;11615:3;11526:93;:::i;:::-;11644:2;11639:3;11635:12;11628:19;;11287:366;;;:::o;11659:::-;11801:3;11822:67;11886:2;11881:3;11822:67;:::i;:::-;11815:74;;11898:93;11987:3;11898:93;:::i;:::-;12016:2;12011:3;12007:12;12000:19;;11659:366;;;:::o;12031:::-;12173:3;12194:67;12258:2;12253:3;12194:67;:::i;:::-;12187:74;;12270:93;12359:3;12270:93;:::i;:::-;12388:2;12383:3;12379:12;12372:19;;12031:366;;;:::o;12403:::-;12545:3;12566:67;12630:2;12625:3;12566:67;:::i;:::-;12559:74;;12642:93;12731:3;12642:93;:::i;:::-;12760:2;12755:3;12751:12;12744:19;;12403:366;;;:::o;12775:::-;12917:3;12938:67;13002:2;12997:3;12938:67;:::i;:::-;12931:74;;13014:93;13103:3;13014:93;:::i;:::-;13132:2;13127:3;13123:12;13116:19;;12775:366;;;:::o;13147:::-;13289:3;13310:67;13374:2;13369:3;13310:67;:::i;:::-;13303:74;;13386:93;13475:3;13386:93;:::i;:::-;13504:2;13499:3;13495:12;13488:19;;13147:366;;;:::o;13519:::-;13661:3;13682:67;13746:2;13741:3;13682:67;:::i;:::-;13675:74;;13758:93;13847:3;13758:93;:::i;:::-;13876:2;13871:3;13867:12;13860:19;;13519:366;;;:::o;13891:::-;14033:3;14054:67;14118:2;14113:3;14054:67;:::i;:::-;14047:74;;14130:93;14219:3;14130:93;:::i;:::-;14248:2;14243:3;14239:12;14232:19;;13891:366;;;:::o;14263:::-;14405:3;14426:67;14490:2;14485:3;14426:67;:::i;:::-;14419:74;;14502:93;14591:3;14502:93;:::i;:::-;14620:2;14615:3;14611:12;14604:19;;14263:366;;;:::o;14635:::-;14777:3;14798:67;14862:2;14857:3;14798:67;:::i;:::-;14791:74;;14874:93;14963:3;14874:93;:::i;:::-;14992:2;14987:3;14983:12;14976:19;;14635:366;;;:::o;15007:::-;15149:3;15170:67;15234:2;15229:3;15170:67;:::i;:::-;15163:74;;15246:93;15335:3;15246:93;:::i;:::-;15364:2;15359:3;15355:12;15348:19;;15007:366;;;:::o;15379:::-;15521:3;15542:67;15606:2;15601:3;15542:67;:::i;:::-;15535:74;;15618:93;15707:3;15618:93;:::i;:::-;15736:2;15731:3;15727:12;15720:19;;15379:366;;;:::o;15751:::-;15893:3;15914:67;15978:2;15973:3;15914:67;:::i;:::-;15907:74;;15990:93;16079:3;15990:93;:::i;:::-;16108:2;16103:3;16099:12;16092:19;;15751:366;;;:::o;16123:::-;16265:3;16286:67;16350:2;16345:3;16286:67;:::i;:::-;16279:74;;16362:93;16451:3;16362:93;:::i;:::-;16480:2;16475:3;16471:12;16464:19;;16123:366;;;:::o;16495:::-;16637:3;16658:67;16722:2;16717:3;16658:67;:::i;:::-;16651:74;;16734:93;16823:3;16734:93;:::i;:::-;16852:2;16847:3;16843:12;16836:19;;16495:366;;;:::o;16867:::-;17009:3;17030:67;17094:2;17089:3;17030:67;:::i;:::-;17023:74;;17106:93;17195:3;17106:93;:::i;:::-;17224:2;17219:3;17215:12;17208:19;;16867:366;;;:::o;17239:::-;17381:3;17402:67;17466:2;17461:3;17402:67;:::i;:::-;17395:74;;17478:93;17567:3;17478:93;:::i;:::-;17596:2;17591:3;17587:12;17580:19;;17239:366;;;:::o;17611:::-;17753:3;17774:67;17838:2;17833:3;17774:67;:::i;:::-;17767:74;;17850:93;17939:3;17850:93;:::i;:::-;17968:2;17963:3;17959:12;17952:19;;17611:366;;;:::o;17983:::-;18125:3;18146:67;18210:2;18205:3;18146:67;:::i;:::-;18139:74;;18222:93;18311:3;18222:93;:::i;:::-;18340:2;18335:3;18331:12;18324:19;;17983:366;;;:::o;18355:::-;18497:3;18518:67;18582:2;18577:3;18518:67;:::i;:::-;18511:74;;18594:93;18683:3;18594:93;:::i;:::-;18712:2;18707:3;18703:12;18696:19;;18355:366;;;:::o;18727:::-;18869:3;18890:67;18954:2;18949:3;18890:67;:::i;:::-;18883:74;;18966:93;19055:3;18966:93;:::i;:::-;19084:2;19079:3;19075:12;19068:19;;18727:366;;;:::o;19099:::-;19241:3;19262:67;19326:2;19321:3;19262:67;:::i;:::-;19255:74;;19338:93;19427:3;19338:93;:::i;:::-;19456:2;19451:3;19447:12;19440:19;;19099:366;;;:::o;19471:::-;19613:3;19634:67;19698:2;19693:3;19634:67;:::i;:::-;19627:74;;19710:93;19799:3;19710:93;:::i;:::-;19828:2;19823:3;19819:12;19812:19;;19471:366;;;:::o;19843:::-;19985:3;20006:67;20070:2;20065:3;20006:67;:::i;:::-;19999:74;;20082:93;20171:3;20082:93;:::i;:::-;20200:2;20195:3;20191:12;20184:19;;19843:366;;;:::o;20215:::-;20357:3;20378:67;20442:2;20437:3;20378:67;:::i;:::-;20371:74;;20454:93;20543:3;20454:93;:::i;:::-;20572:2;20567:3;20563:12;20556:19;;20215:366;;;:::o;20587:::-;20729:3;20750:67;20814:2;20809:3;20750:67;:::i;:::-;20743:74;;20826:93;20915:3;20826:93;:::i;:::-;20944:2;20939:3;20935:12;20928:19;;20587:366;;;:::o;20959:118::-;21046:24;21064:5;21046:24;:::i;:::-;21041:3;21034:37;20959:118;;:::o;21083:112::-;21166:22;21182:5;21166:22;:::i;:::-;21161:3;21154:35;21083:112;;:::o;21201:256::-;21313:3;21328:75;21399:3;21390:6;21328:75;:::i;:::-;21428:2;21423:3;21419:12;21412:19;;21448:3;21441:10;;21201:256;;;;:::o;21463:275::-;21595:3;21617:95;21708:3;21699:6;21617:95;:::i;:::-;21610:102;;21729:3;21722:10;;21463:275;;;;:::o;21744:435::-;21924:3;21946:95;22037:3;22028:6;21946:95;:::i;:::-;21939:102;;22058:95;22149:3;22140:6;22058:95;:::i;:::-;22051:102;;22170:3;22163:10;;21744:435;;;;;:::o;22185:522::-;22398:3;22420:148;22564:3;22420:148;:::i;:::-;22413:155;;22578:75;22649:3;22640:6;22578:75;:::i;:::-;22678:2;22673:3;22669:12;22662:19;;22698:3;22691:10;;22185:522;;;;:::o;22713:222::-;22806:4;22844:2;22833:9;22829:18;22821:26;;22857:71;22925:1;22914:9;22910:17;22901:6;22857:71;:::i;:::-;22713:222;;;;:::o;22941:640::-;23136:4;23174:3;23163:9;23159:19;23151:27;;23188:71;23256:1;23245:9;23241:17;23232:6;23188:71;:::i;:::-;23269:72;23337:2;23326:9;23322:18;23313:6;23269:72;:::i;:::-;23351;23419:2;23408:9;23404:18;23395:6;23351:72;:::i;:::-;23470:9;23464:4;23460:20;23455:2;23444:9;23440:18;23433:48;23498:76;23569:4;23560:6;23498:76;:::i;:::-;23490:84;;22941:640;;;;;;;:::o;23587:210::-;23674:4;23712:2;23701:9;23697:18;23689:26;;23725:65;23787:1;23776:9;23772:17;23763:6;23725:65;:::i;:::-;23587:210;;;;:::o;23803:545::-;23976:4;24014:3;24003:9;23999:19;23991:27;;24028:71;24096:1;24085:9;24081:17;24072:6;24028:71;:::i;:::-;24109:68;24173:2;24162:9;24158:18;24149:6;24109:68;:::i;:::-;24187:72;24255:2;24244:9;24240:18;24231:6;24187:72;:::i;:::-;24269;24337:2;24326:9;24322:18;24313:6;24269:72;:::i;:::-;23803:545;;;;;;;:::o;24354:313::-;24467:4;24505:2;24494:9;24490:18;24482:26;;24554:9;24548:4;24544:20;24540:1;24529:9;24525:17;24518:47;24582:78;24655:4;24646:6;24582:78;:::i;:::-;24574:86;;24354:313;;;;:::o;24673:419::-;24839:4;24877:2;24866:9;24862:18;24854:26;;24926:9;24920:4;24916:20;24912:1;24901:9;24897:17;24890:47;24954:131;25080:4;24954:131;:::i;:::-;24946:139;;24673:419;;;:::o;25098:::-;25264:4;25302:2;25291:9;25287:18;25279:26;;25351:9;25345:4;25341:20;25337:1;25326:9;25322:17;25315:47;25379:131;25505:4;25379:131;:::i;:::-;25371:139;;25098:419;;;:::o;25523:::-;25689:4;25727:2;25716:9;25712:18;25704:26;;25776:9;25770:4;25766:20;25762:1;25751:9;25747:17;25740:47;25804:131;25930:4;25804:131;:::i;:::-;25796:139;;25523:419;;;:::o;25948:::-;26114:4;26152:2;26141:9;26137:18;26129:26;;26201:9;26195:4;26191:20;26187:1;26176:9;26172:17;26165:47;26229:131;26355:4;26229:131;:::i;:::-;26221:139;;25948:419;;;:::o;26373:::-;26539:4;26577:2;26566:9;26562:18;26554:26;;26626:9;26620:4;26616:20;26612:1;26601:9;26597:17;26590:47;26654:131;26780:4;26654:131;:::i;:::-;26646:139;;26373:419;;;:::o;26798:::-;26964:4;27002:2;26991:9;26987:18;26979:26;;27051:9;27045:4;27041:20;27037:1;27026:9;27022:17;27015:47;27079:131;27205:4;27079:131;:::i;:::-;27071:139;;26798:419;;;:::o;27223:::-;27389:4;27427:2;27416:9;27412:18;27404:26;;27476:9;27470:4;27466:20;27462:1;27451:9;27447:17;27440:47;27504:131;27630:4;27504:131;:::i;:::-;27496:139;;27223:419;;;:::o;27648:::-;27814:4;27852:2;27841:9;27837:18;27829:26;;27901:9;27895:4;27891:20;27887:1;27876:9;27872:17;27865:47;27929:131;28055:4;27929:131;:::i;:::-;27921:139;;27648:419;;;:::o;28073:::-;28239:4;28277:2;28266:9;28262:18;28254:26;;28326:9;28320:4;28316:20;28312:1;28301:9;28297:17;28290:47;28354:131;28480:4;28354:131;:::i;:::-;28346:139;;28073:419;;;:::o;28498:::-;28664:4;28702:2;28691:9;28687:18;28679:26;;28751:9;28745:4;28741:20;28737:1;28726:9;28722:17;28715:47;28779:131;28905:4;28779:131;:::i;:::-;28771:139;;28498:419;;;:::o;28923:::-;29089:4;29127:2;29116:9;29112:18;29104:26;;29176:9;29170:4;29166:20;29162:1;29151:9;29147:17;29140:47;29204:131;29330:4;29204:131;:::i;:::-;29196:139;;28923:419;;;:::o;29348:::-;29514:4;29552:2;29541:9;29537:18;29529:26;;29601:9;29595:4;29591:20;29587:1;29576:9;29572:17;29565:47;29629:131;29755:4;29629:131;:::i;:::-;29621:139;;29348:419;;;:::o;29773:::-;29939:4;29977:2;29966:9;29962:18;29954:26;;30026:9;30020:4;30016:20;30012:1;30001:9;29997:17;29990:47;30054:131;30180:4;30054:131;:::i;:::-;30046:139;;29773:419;;;:::o;30198:::-;30364:4;30402:2;30391:9;30387:18;30379:26;;30451:9;30445:4;30441:20;30437:1;30426:9;30422:17;30415:47;30479:131;30605:4;30479:131;:::i;:::-;30471:139;;30198:419;;;:::o;30623:::-;30789:4;30827:2;30816:9;30812:18;30804:26;;30876:9;30870:4;30866:20;30862:1;30851:9;30847:17;30840:47;30904:131;31030:4;30904:131;:::i;:::-;30896:139;;30623:419;;;:::o;31048:::-;31214:4;31252:2;31241:9;31237:18;31229:26;;31301:9;31295:4;31291:20;31287:1;31276:9;31272:17;31265:47;31329:131;31455:4;31329:131;:::i;:::-;31321:139;;31048:419;;;:::o;31473:::-;31639:4;31677:2;31666:9;31662:18;31654:26;;31726:9;31720:4;31716:20;31712:1;31701:9;31697:17;31690:47;31754:131;31880:4;31754:131;:::i;:::-;31746:139;;31473:419;;;:::o;31898:::-;32064:4;32102:2;32091:9;32087:18;32079:26;;32151:9;32145:4;32141:20;32137:1;32126:9;32122:17;32115:47;32179:131;32305:4;32179:131;:::i;:::-;32171:139;;31898:419;;;:::o;32323:::-;32489:4;32527:2;32516:9;32512:18;32504:26;;32576:9;32570:4;32566:20;32562:1;32551:9;32547:17;32540:47;32604:131;32730:4;32604:131;:::i;:::-;32596:139;;32323:419;;;:::o;32748:::-;32914:4;32952:2;32941:9;32937:18;32929:26;;33001:9;32995:4;32991:20;32987:1;32976:9;32972:17;32965:47;33029:131;33155:4;33029:131;:::i;:::-;33021:139;;32748:419;;;:::o;33173:::-;33339:4;33377:2;33366:9;33362:18;33354:26;;33426:9;33420:4;33416:20;33412:1;33401:9;33397:17;33390:47;33454:131;33580:4;33454:131;:::i;:::-;33446:139;;33173:419;;;:::o;33598:::-;33764:4;33802:2;33791:9;33787:18;33779:26;;33851:9;33845:4;33841:20;33837:1;33826:9;33822:17;33815:47;33879:131;34005:4;33879:131;:::i;:::-;33871:139;;33598:419;;;:::o;34023:::-;34189:4;34227:2;34216:9;34212:18;34204:26;;34276:9;34270:4;34266:20;34262:1;34251:9;34247:17;34240:47;34304:131;34430:4;34304:131;:::i;:::-;34296:139;;34023:419;;;:::o;34448:::-;34614:4;34652:2;34641:9;34637:18;34629:26;;34701:9;34695:4;34691:20;34687:1;34676:9;34672:17;34665:47;34729:131;34855:4;34729:131;:::i;:::-;34721:139;;34448:419;;;:::o;34873:::-;35039:4;35077:2;35066:9;35062:18;35054:26;;35126:9;35120:4;35116:20;35112:1;35101:9;35097:17;35090:47;35154:131;35280:4;35154:131;:::i;:::-;35146:139;;34873:419;;;:::o;35298:::-;35464:4;35502:2;35491:9;35487:18;35479:26;;35551:9;35545:4;35541:20;35537:1;35526:9;35522:17;35515:47;35579:131;35705:4;35579:131;:::i;:::-;35571:139;;35298:419;;;:::o;35723:::-;35889:4;35927:2;35916:9;35912:18;35904:26;;35976:9;35970:4;35966:20;35962:1;35951:9;35947:17;35940:47;36004:131;36130:4;36004:131;:::i;:::-;35996:139;;35723:419;;;:::o;36148:::-;36314:4;36352:2;36341:9;36337:18;36329:26;;36401:9;36395:4;36391:20;36387:1;36376:9;36372:17;36365:47;36429:131;36555:4;36429:131;:::i;:::-;36421:139;;36148:419;;;:::o;36573:::-;36739:4;36777:2;36766:9;36762:18;36754:26;;36826:9;36820:4;36816:20;36812:1;36801:9;36797:17;36790:47;36854:131;36980:4;36854:131;:::i;:::-;36846:139;;36573:419;;;:::o;36998:222::-;37091:4;37129:2;37118:9;37114:18;37106:26;;37142:71;37210:1;37199:9;37195:17;37186:6;37142:71;:::i;:::-;36998:222;;;;:::o;37226:129::-;37260:6;37287:20;;:::i;:::-;37277:30;;37316:33;37344:4;37336:6;37316:33;:::i;:::-;37226:129;;;:::o;37361:75::-;37394:6;37427:2;37421:9;37411:19;;37361:75;:::o;37442:307::-;37503:4;37593:18;37585:6;37582:30;37579:56;;;37615:18;;:::i;:::-;37579:56;37653:29;37675:6;37653:29;:::i;:::-;37645:37;;37737:4;37731;37727:15;37719:23;;37442:307;;;:::o;37755:308::-;37817:4;37907:18;37899:6;37896:30;37893:56;;;37929:18;;:::i;:::-;37893:56;37967:29;37989:6;37967:29;:::i;:::-;37959:37;;38051:4;38045;38041:15;38033:23;;37755:308;;;:::o;38069:98::-;38120:6;38154:5;38148:12;38138:22;;38069:98;;;:::o;38173:99::-;38225:6;38259:5;38253:12;38243:22;;38173:99;;;:::o;38278:168::-;38361:11;38395:6;38390:3;38383:19;38435:4;38430:3;38426:14;38411:29;;38278:168;;;;:::o;38452:169::-;38536:11;38570:6;38565:3;38558:19;38610:4;38605:3;38601:14;38586:29;;38452:169;;;;:::o;38627:148::-;38729:11;38766:3;38751:18;;38627:148;;;;:::o;38781:305::-;38821:3;38840:20;38858:1;38840:20;:::i;:::-;38835:25;;38874:20;38892:1;38874:20;:::i;:::-;38869:25;;39028:1;38960:66;38956:74;38953:1;38950:81;38947:107;;;39034:18;;:::i;:::-;38947:107;39078:1;39075;39071:9;39064:16;;38781:305;;;;:::o;39092:185::-;39132:1;39149:20;39167:1;39149:20;:::i;:::-;39144:25;;39183:20;39201:1;39183:20;:::i;:::-;39178:25;;39222:1;39212:35;;39227:18;;:::i;:::-;39212:35;39269:1;39266;39262:9;39257:14;;39092:185;;;;:::o;39283:348::-;39323:7;39346:20;39364:1;39346:20;:::i;:::-;39341:25;;39380:20;39398:1;39380:20;:::i;:::-;39375:25;;39568:1;39500:66;39496:74;39493:1;39490:81;39485:1;39478:9;39471:17;39467:105;39464:131;;;39575:18;;:::i;:::-;39464:131;39623:1;39620;39616:9;39605:20;;39283:348;;;;:::o;39637:191::-;39677:4;39697:20;39715:1;39697:20;:::i;:::-;39692:25;;39731:20;39749:1;39731:20;:::i;:::-;39726:25;;39770:1;39767;39764:8;39761:34;;;39775:18;;:::i;:::-;39761:34;39820:1;39817;39813:9;39805:17;;39637:191;;;;:::o;39834:96::-;39871:7;39900:24;39918:5;39900:24;:::i;:::-;39889:35;;39834:96;;;:::o;39936:90::-;39970:7;40013:5;40006:13;39999:21;39988:32;;39936:90;;;:::o;40032:77::-;40069:7;40098:5;40087:16;;40032:77;;;:::o;40115:149::-;40151:7;40191:66;40184:5;40180:78;40169:89;;40115:149;;;:::o;40270:126::-;40307:7;40347:42;40340:5;40336:54;40325:65;;40270:126;;;:::o;40402:77::-;40439:7;40468:5;40457:16;;40402:77;;;:::o;40485:86::-;40520:7;40560:4;40553:5;40549:16;40538:27;;40485:86;;;:::o;40577:154::-;40661:6;40656:3;40651;40638:30;40723:1;40714:6;40709:3;40705:16;40698:27;40577:154;;;:::o;40737:307::-;40805:1;40815:113;40829:6;40826:1;40823:13;40815:113;;;40914:1;40909:3;40905:11;40899:18;40895:1;40890:3;40886:11;40879:39;40851:2;40848:1;40844:10;40839:15;;40815:113;;;40946:6;40943:1;40940:13;40937:101;;;41026:1;41017:6;41012:3;41008:16;41001:27;40937:101;40786:258;40737:307;;;:::o;41050:320::-;41094:6;41131:1;41125:4;41121:12;41111:22;;41178:1;41172:4;41168:12;41199:18;41189:81;;41255:4;41247:6;41243:17;41233:27;;41189:81;41317:2;41309:6;41306:14;41286:18;41283:38;41280:84;;;41336:18;;:::i;:::-;41280:84;41101:269;41050:320;;;:::o;41376:281::-;41459:27;41481:4;41459:27;:::i;:::-;41451:6;41447:40;41589:6;41577:10;41574:22;41553:18;41541:10;41538:34;41535:62;41532:88;;;41600:18;;:::i;:::-;41532:88;41640:10;41636:2;41629:22;41419:238;41376:281;;:::o;41663:233::-;41702:3;41725:24;41743:5;41725:24;:::i;:::-;41716:33;;41771:66;41764:5;41761:77;41758:103;;;41841:18;;:::i;:::-;41758:103;41888:1;41881:5;41877:13;41870:20;;41663:233;;;:::o;41902:100::-;41941:7;41970:26;41990:5;41970:26;:::i;:::-;41959:37;;41902:100;;;:::o;42008:79::-;42047:7;42076:5;42065:16;;42008:79;;;:::o;42093:94::-;42132:7;42161:20;42175:5;42161:20;:::i;:::-;42150:31;;42093:94;;;:::o;42193:176::-;42225:1;42242:20;42260:1;42242:20;:::i;:::-;42237:25;;42276:20;42294:1;42276:20;:::i;:::-;42271:25;;42315:1;42305:35;;42320:18;;:::i;:::-;42305:35;42361:1;42358;42354:9;42349:14;;42193:176;;;;:::o;42375:180::-;42423:77;42420:1;42413:88;42520:4;42517:1;42510:15;42544:4;42541:1;42534:15;42561:180;42609:77;42606:1;42599:88;42706:4;42703:1;42696:15;42730:4;42727:1;42720:15;42747:180;42795:77;42792:1;42785:88;42892:4;42889:1;42882:15;42916:4;42913:1;42906:15;42933:180;42981:77;42978:1;42971:88;43078:4;43075:1;43068:15;43102:4;43099:1;43092:15;43119:180;43167:77;43164:1;43157:88;43264:4;43261:1;43254:15;43288:4;43285:1;43278:15;43305:180;43353:77;43350:1;43343:88;43450:4;43447:1;43440:15;43474:4;43471:1;43464:15;43491:180;43539:77;43536:1;43529:88;43636:4;43633:1;43626:15;43660:4;43657:1;43650:15;43677:117;43786:1;43783;43776:12;43800:117;43909:1;43906;43899:12;43923:117;44032:1;44029;44022:12;44046:117;44155:1;44152;44145:12;44169:102;44210:6;44261:2;44257:7;44252:2;44245:5;44241:14;44237:28;44227:38;;44169:102;;;:::o;44277:94::-;44310:8;44358:5;44354:2;44350:14;44329:35;;44277:94;;;:::o;44377:174::-;44517:26;44513:1;44505:6;44501:14;44494:50;44377:174;:::o;44557:181::-;44697:33;44693:1;44685:6;44681:14;44674:57;44557:181;:::o;44744:214::-;44884:66;44880:1;44872:6;44868:14;44861:90;44744:214;:::o;44964:230::-;45104:34;45100:1;45092:6;45088:14;45081:58;45173:13;45168:2;45160:6;45156:15;45149:38;44964:230;:::o;45200:237::-;45340:34;45336:1;45328:6;45324:14;45317:58;45409:20;45404:2;45396:6;45392:15;45385:45;45200:237;:::o;45443:225::-;45583:34;45579:1;45571:6;45567:14;45560:58;45652:8;45647:2;45639:6;45635:15;45628:33;45443:225;:::o;45674:224::-;45814:34;45810:1;45802:6;45798:14;45791:58;45883:7;45878:2;45870:6;45866:15;45859:32;45674:224;:::o;45904:178::-;46044:30;46040:1;46032:6;46028:14;46021:54;45904:178;:::o;46088:223::-;46228:34;46224:1;46216:6;46212:14;46205:58;46297:6;46292:2;46284:6;46280:15;46273:31;46088:223;:::o;46317:175::-;46457:27;46453:1;46445:6;46441:14;46434:51;46317:175;:::o;46498:181::-;46638:33;46634:1;46626:6;46622:14;46615:57;46498:181;:::o;46685:221::-;46825:34;46821:1;46813:6;46809:14;46802:58;46894:4;46889:2;46881:6;46877:15;46870:29;46685:221;:::o;46912:::-;47052:34;47048:1;47040:6;47036:14;47029:58;47121:4;47116:2;47108:6;47104:15;47097:29;46912:221;:::o;47139:231::-;47279:34;47275:1;47267:6;47263:14;47256:58;47348:14;47343:2;47335:6;47331:15;47324:39;47139:231;:::o;47376:243::-;47516:34;47512:1;47504:6;47500:14;47493:58;47585:26;47580:2;47572:6;47568:15;47561:51;47376:243;:::o;47625:229::-;47765:34;47761:1;47753:6;47749:14;47742:58;47834:12;47829:2;47821:6;47817:15;47810:37;47625:229;:::o;47860:228::-;48000:34;47996:1;47988:6;47984:14;47977:58;48069:11;48064:2;48056:6;48052:15;48045:36;47860:228;:::o;48094:229::-;48234:34;48230:1;48222:6;48218:14;48211:58;48303:12;48298:2;48290:6;48286:15;48279:37;48094:229;:::o;48329:221::-;48469:34;48465:1;48457:6;48453:14;48446:58;48538:4;48533:2;48525:6;48521:15;48514:29;48329:221;:::o;48556:182::-;48696:34;48692:1;48684:6;48680:14;48673:58;48556:182;:::o;48744:248::-;48884:34;48880:1;48872:6;48868:14;48861:58;48953:31;48948:2;48940:6;48936:15;48929:56;48744:248;:::o;48998:231::-;49138:34;49134:1;49126:6;49122:14;49115:58;49207:14;49202:2;49194:6;49190:15;49183:39;48998:231;:::o;49235:182::-;49375:34;49371:1;49363:6;49359:14;49352:58;49235:182;:::o;49423:220::-;49563:34;49559:1;49551:6;49547:14;49540:58;49632:3;49627:2;49619:6;49615:15;49608:28;49423:220;:::o;49649:234::-;49789:34;49785:1;49777:6;49773:14;49766:58;49858:17;49853:2;49845:6;49841:15;49834:42;49649:234;:::o;49889:220::-;50029:34;50025:1;50017:6;50013:14;50006:58;50098:3;50093:2;50085:6;50081:15;50074:28;49889:220;:::o;50115:177::-;50255:29;50251:1;50243:6;50239:14;50232:53;50115:177;:::o;50298:236::-;50438:34;50434:1;50426:6;50422:14;50415:58;50507:19;50502:2;50494:6;50490:15;50483:44;50298:236;:::o;50540:231::-;50680:34;50676:1;50668:6;50664:14;50657:58;50749:14;50744:2;50736:6;50732:15;50725:39;50540:231;:::o;50777:229::-;50917:34;50913:1;50905:6;50901:14;50894:58;50986:12;50981:2;50973:6;50969:15;50962:37;50777:229;:::o;51012:122::-;51085:24;51103:5;51085:24;:::i;:::-;51078:5;51075:35;51065:63;;51124:1;51121;51114:12;51065:63;51012:122;:::o;51140:116::-;51210:21;51225:5;51210:21;:::i;:::-;51203:5;51200:32;51190:60;;51246:1;51243;51236:12;51190:60;51140:116;:::o;51262:120::-;51334:23;51351:5;51334:23;:::i;:::-;51327:5;51324:34;51314:62;;51372:1;51369;51362:12;51314:62;51262:120;:::o;51388:122::-;51461:24;51479:5;51461:24;:::i;:::-;51454:5;51451:35;51441:63;;51500:1;51497;51490:12;51441:63;51388:122;:::o

Swarm Source

ipfs://9a0168541e5024b30adcee0207465a7aa1f1bd0021165f0a1fa662a92ce8181f
[ 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.