ETH Price: $3,624.66 (-2.41%)

Token

: Bored Town (BORED)

Overview

Max Total Supply

5,555 BORED

Holders

3,941

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BORED
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, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at optimistic.etherscan.io on 2022-06-10
*/

// 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("Bored Town", "BORED"), ERC721Enumerable, Ownable {

    string private _baseURIextended;
    string private _baseURISuffix = "";
    bool public frozenMetadata = false;
    uint256 public MAX_TOKENS = 5555;
    bool public saleIsActive = false;
    bool public greenListSaleIsActive = false;
    mapping(address => uint256) addressToGreenListNumberMinted;
    mapping(address => uint256) addressToNumberMinted;
    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, string memory suffix) external onlyOwner() {
        require(!frozenMetadata, "The metadata URI is frozen. You can no longer set the baseURI");
        _baseUriIncludeTokenId = includeTokenId;
        _baseURIextended = baseURI_;
        _baseURISuffix = suffix;
    }

    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), _baseURISuffix)) : "";        
        } 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 + addressToNumberMinted[_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");

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


    
    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":[{"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"},{"internalType":"string","name":"suffix","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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"}]

608060405260405180602001604052806000815250600c90805190602001906200002b92919062000295565b506000600d60006101000a81548160ff0219169083151502179055506115b3600e556000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff02191690831515021790555073d47257ee6cd0a80ed1ba7bddc722ef8ee44a8d7d601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601260146101000a81548160ff0219169083151502179055503480156200010057600080fd5b506040518060400160405280600a81526020017f426f72656420546f776e000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f424f52454400000000000000000000000000000000000000000000000000000081525081600090805190602001906200018592919062000295565b5080600190805190602001906200019e92919062000295565b505050620001c1620001b5620001c760201b60201c565b620001cf60201b60201c565b620003aa565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002a39062000345565b90600052602060002090601f016020900481019282620002c7576000855562000313565b82601f10620002e257805160ff191683800117855562000313565b8280016001018555821562000313579182015b8281111562000312578251825591602001919060010190620002f5565b5b50905062000322919062000326565b5090565b5b808211156200034157600081600090555060010162000327565b5090565b600060028204905060018216806200035e57607f821691505b602082108114156200037557620003746200037b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614d2f80620003ba6000396000f3fe6080604052600436106101c25760003560e01c8063715018a6116100f7578063c634d03211610095578063eb8d244411610064578063eb8d24441461061f578063f2fde38b1461064a578063f47c84c514610673578063f7f7bf7b1461069e576101c2565b8063c634d03214610572578063c87b56dd1461058e578063d111515d146105cb578063e985e9c5146105e2576101c2565b806393b15295116100d157806393b15295146104cc57806395d89b41146104f5578063a22cb46514610520578063b88d4fde14610549576101c2565b8063715018a61461045f5780638529ccad146104765780638da5cb5b146104a1576101c2565b80632da435f71161016457806342842e0e1161013e57806342842e0e1461037f5780634f6ccce7146103a85780636352211e146103e557806370a0823114610422576101c2565b80632da435f7146103145780632f745c591461032b57806334918dfd14610368576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c05780632541865c146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906133ac565b6106ba565b6040516101fb9190613b9c565b60405180910390f35b34801561021057600080fd5b506102196106cc565b6040516102269190613bfc565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190613491565b61075e565b6040516102639190613b35565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e919061336c565b6107e3565b005b3480156102a157600080fd5b506102aa6108fb565b6040516102b79190613f9e565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e29190613256565b610908565b005b3480156102f557600080fd5b506102fe610968565b60405161030b9190613b9c565b60405180910390f35b34801561032057600080fd5b5061032961097b565b005b34801561033757600080fd5b50610352600480360381019061034d919061336c565b610a23565b60405161035f9190613f9e565b60405180910390f35b34801561037457600080fd5b5061037d610ac8565b005b34801561038b57600080fd5b506103a660048036038101906103a19190613256565b610b70565b005b3480156103b457600080fd5b506103cf60048036038101906103ca9190613491565b610b90565b6040516103dc9190613f9e565b60405180910390f35b3480156103f157600080fd5b5061040c60048036038101906104079190613491565b610c01565b6040516104199190613b35565b60405180910390f35b34801561042e57600080fd5b50610449600480360381019061044491906131e9565b610cb3565b6040516104569190613f9e565b60405180910390f35b34801561046b57600080fd5b50610474610d6b565b005b34801561048257600080fd5b5061048b610df3565b6040516104989190613b9c565b60405180910390f35b3480156104ad57600080fd5b506104b6610e06565b6040516104c39190613b35565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190613406565b610e30565b005b34801561050157600080fd5b5061050a610f49565b6040516105179190613bfc565b60405180910390f35b34801561052c57600080fd5b506105476004803603810190610542919061332c565b610fdb565b005b34801561055557600080fd5b50610570600480360381019061056b91906132a9565b610ff1565b005b61058c60048036038101906105879190613491565b611053565b005b34801561059a57600080fd5b506105b560048036038101906105b09190613491565b61128d565b6040516105c29190613bfc565b60405180910390f35b3480156105d757600080fd5b506105e0611394565b005b3480156105ee57600080fd5b5061060960048036038101906106049190613216565b61142d565b6040516106169190613b9c565b60405180910390f35b34801561062b57600080fd5b506106346114c1565b6040516106419190613b9c565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c91906131e9565b6114d4565b005b34801561067f57600080fd5b506106886115cc565b6040516106959190613f9e565b60405180910390f35b6106b860048036038101906106b391906134be565b6115d2565b005b60006106c5826118e7565b9050919050565b6060600080546106db9061427a565b80601f01602080910402602001604051908101604052809291908181526020018280546107079061427a565b80156107545780601f1061072957610100808354040283529160200191610754565b820191906000526020600020905b81548152906001019060200180831161073757829003601f168201915b5050505050905090565b600061076982611961565b6107a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079f90613e9e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ee82610c01565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085690613efe565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661087e6119cd565b73ffffffffffffffffffffffffffffffffffffffff1614806108ad57506108ac816108a76119cd565b61142d565b5b6108ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e390613dbe565b60405180910390fd5b6108f683836119d5565b505050565b6000600880549050905090565b6109196109136119cd565b82611a8e565b610958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094f90613f3e565b60405180910390fd5b610963838383611b6c565b505050565b600f60019054906101000a900460ff1681565b6109836119cd565b73ffffffffffffffffffffffffffffffffffffffff166109a1610e06565b73ffffffffffffffffffffffffffffffffffffffff16146109f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ee90613ebe565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b6000610a2e83610cb3565b8210610a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6690613c5e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ad06119cd565b73ffffffffffffffffffffffffffffffffffffffff16610aee610e06565b73ffffffffffffffffffffffffffffffffffffffff1614610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b90613ebe565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610b8b83838360405180602001604052806000815250610ff1565b505050565b6000610b9a6108fb565b8210610bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd290613f5e565b60405180910390fd5b60088281548110610bef57610bee614470565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190613dfe565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90613dde565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d736119cd565b73ffffffffffffffffffffffffffffffffffffffff16610d91610e06565b73ffffffffffffffffffffffffffffffffffffffff1614610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde90613ebe565b60405180910390fd5b610df16000611dd3565b565b600d60009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e386119cd565b73ffffffffffffffffffffffffffffffffffffffff16610e56610e06565b73ffffffffffffffffffffffffffffffffffffffff1614610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea390613ebe565b60405180910390fd5b600d60009054906101000a900460ff1615610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef390613e7e565b60405180910390fd5b81601260146101000a81548160ff02191690831515021790555082600b9080519060200190610f2c929190612ffd565b5080600c9080519060200190610f43929190612ffd565b50505050565b606060018054610f589061427a565b80601f0160208091040260200160405190810160405280929190818152602001828054610f849061427a565b8015610fd15780601f10610fa657610100808354040283529160200191610fd1565b820191906000526020600020905b815481529060010190602001808311610fb457829003601f168201915b5050505050905090565b610fed610fe66119cd565b8383611e99565b5050565b611002610ffc6119cd565b83611a8e565b611041576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103890613f3e565b60405180910390fd5b61104d84848484612006565b50505050565b600f60009054906101000a900460ff166110a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109990613d5e565b60405180910390fd5b6001601160006110b06119cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826110f69190614098565b1115611137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112e90613f1e565b60405180910390fd5b600e54816111436108fb565b61114d9190614098565b111561118e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118590613e1e565b60405180910390fd5b3481600061119c919061411f565b11156111dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d490613d3e565b60405180910390fd5b60005b818110156112895760006111f26108fb565b9050600e546111ff6108fb565b1015611275576112166112106119cd565b82612062565b6001601160006112246119cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461126d9190614098565b925050819055505b508080611281906142dd565b9150506111e0565b5050565b606061129882611961565b6112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90613ede565b60405180910390fd5b60006112e1612080565b9050601260149054906101000a900460ff161561134c5760008151116113165760405180602001604052806000815250611344565b8061132084612112565b600c60405160200161133493929190613ade565b6040516020818303038152906040525b91505061138f565b600081511161136a576040518060200160405280600081525061138b565b8060405160200161137b9190613ac7565b6040516020818303038152906040525b9150505b919050565b61139c6119cd565b73ffffffffffffffffffffffffffffffffffffffff166113ba610e06565b73ffffffffffffffffffffffffffffffffffffffff1614611410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140790613ebe565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b6114dc6119cd565b73ffffffffffffffffffffffffffffffffffffffff166114fa610e06565b73ffffffffffffffffffffffffffffffffffffffff1614611550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154790613ebe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b790613c9e565b60405180910390fd5b6115c981611dd3565b50565b600e5481565b600f60019054906101000a900460ff16611621576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161890613d5e565b60405180910390fd5b60016010600061162f6119cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836116759190614098565b11156116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad90613f1e565b60405180910390fd5b600e54826116c26108fb565b6116cc9190614098565b111561170d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170490613e1e565b60405180910390fd5b3482600061171b919061411f565b111561175c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175390613d3e565b60405180910390fd5b60006117946117696119cd565b6040516020016117799190613aac565b60405160208183030381529060405280519060200120612273565b905060006117a282846122a3565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613f7e565b60405180910390fd5b60005b848110156118e05760006118496108fb565b9050600e546118566108fb565b10156118cc5761186d6118676119cd565b82612062565b60016010600061187b6119cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118c49190614098565b925050819055505b5080806118d8906142dd565b915050611837565b5050505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061195a5750611959826122ca565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a4883610c01565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a9982611961565b611ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acf90613d9e565b60405180910390fd5b6000611ae383610c01565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b5257508373ffffffffffffffffffffffffffffffffffffffff16611b3a8461075e565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b635750611b62818561142d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b8c82610c01565b73ffffffffffffffffffffffffffffffffffffffff1614611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd990613cbe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4990613cfe565b60405180910390fd5b611c5d8383836123ac565b611c686000826119d5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cb89190614179565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d0f9190614098565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611dce8383836123bc565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eff90613d1e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ff99190613b9c565b60405180910390a3505050565b612011848484611b6c565b61201d848484846123c1565b61205c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205390613c7e565b60405180910390fd5b50505050565b61207c828260405180602001604052806000815250612558565b5050565b6060600b805461208f9061427a565b80601f01602080910402602001604051908101604052809291908181526020018280546120bb9061427a565b80156121085780601f106120dd57610100808354040283529160200191612108565b820191906000526020600020905b8154815290600101906020018083116120eb57829003601f168201915b5050505050905090565b6060600082141561215a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061226e565b600082905060005b6000821461218c578080612175906142dd565b915050600a8261218591906140ee565b9150612162565b60008167ffffffffffffffff8111156121a8576121a761449f565b5b6040519080825280601f01601f1916602001820160405280156121da5781602001600182028036833780820191505090505b5090505b60008514612267576001826121f39190614179565b9150600a856122029190614354565b603061220e9190614098565b60f81b81838151811061222457612223614470565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561226091906140ee565b94506121de565b8093505050505b919050565b6000816040516020016122869190613b0f565b604051602081830303815290604052805190602001209050919050565b60008060006122b285856125b3565b915091506122bf81612636565b819250505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061239557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123a557506123a48261280b565b5b9050919050565b6123b7838383612875565b505050565b505050565b60006123e28473ffffffffffffffffffffffffffffffffffffffff16612989565b1561254b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261240b6119cd565b8786866040518563ffffffff1660e01b815260040161242d9493929190613b50565b602060405180830381600087803b15801561244757600080fd5b505af192505050801561247857506040513d601f19601f8201168201806040525081019061247591906133d9565b60015b6124fb573d80600081146124a8576040519150601f19603f3d011682016040523d82523d6000602084013e6124ad565b606091505b506000815114156124f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ea90613c7e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612550565b600190505b949350505050565b61256283836129ac565b61256f60008484846123c1565b6125ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a590613c7e565b60405180910390fd5b505050565b6000806041835114156125f55760008060006020860151925060408601519150606086015160001a90506125e987828585612b86565b9450945050505061262f565b60408351141561262657600080602085015191506040850151905061261b868383612c93565b93509350505061262f565b60006002915091505b9250929050565b6000600481111561264a576126496143e3565b5b81600481111561265d5761265c6143e3565b5b141561266857612808565b6001600481111561267c5761267b6143e3565b5b81600481111561268f5761268e6143e3565b5b14156126d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c790613c1e565b60405180910390fd5b600260048111156126e4576126e36143e3565b5b8160048111156126f7576126f66143e3565b5b1415612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272f90613c3e565b60405180910390fd5b6003600481111561274c5761274b6143e3565b5b81600481111561275f5761275e6143e3565b5b14156127a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279790613d7e565b60405180910390fd5b6004808111156127b3576127b26143e3565b5b8160048111156127c6576127c56143e3565b5b1415612807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fe90613e3e565b60405180910390fd5b5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612880838383612cf2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128c3576128be81612cf7565b612902565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612901576129008382612d40565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129455761294081612ead565b612984565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612983576129828282612f7e565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1390613e5e565b60405180910390fd5b612a2581611961565b15612a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5c90613cde565b60405180910390fd5b612a71600083836123ac565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ac19190614098565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b82600083836123bc565b5050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612bc1576000600391509150612c8a565b601b8560ff1614158015612bd95750601c8560ff1614155b15612beb576000600491509150612c8a565b600060018787878760405160008152602001604052604051612c109493929190613bb7565b6020604051602081039080840390855afa158015612c32573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c8157600060019250925050612c8a565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c612cd69190614098565b9050612ce487828885612b86565b935093505050935093915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d4d84610cb3565b612d579190614179565b9050600060076000848152602001908152602001600020549050818114612e3c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ec19190614179565b9050600060096000848152602001908152602001600020549050600060088381548110612ef157612ef0614470565b5b906000526020600020015490508060088381548110612f1357612f12614470565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f6257612f61614441565b5b6001900381819060005260206000200160009055905550505050565b6000612f8983610cb3565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546130099061427a565b90600052602060002090601f01602090048101928261302b5760008555613072565b82601f1061304457805160ff1916838001178555613072565b82800160010185558215613072579182015b82811115613071578251825591602001919060010190613056565b5b50905061307f9190613083565b5090565b5b8082111561309c576000816000905550600101613084565b5090565b60006130b36130ae84613fde565b613fb9565b9050828152602081018484840111156130cf576130ce6144d3565b5b6130da848285614238565b509392505050565b60006130f56130f08461400f565b613fb9565b905082815260208101848484011115613111576131106144d3565b5b61311c848285614238565b509392505050565b60008135905061313381614c9d565b92915050565b60008135905061314881614cb4565b92915050565b60008135905061315d81614ccb565b92915050565b60008151905061317281614ccb565b92915050565b600082601f83011261318d5761318c6144ce565b5b813561319d8482602086016130a0565b91505092915050565b600082601f8301126131bb576131ba6144ce565b5b81356131cb8482602086016130e2565b91505092915050565b6000813590506131e381614ce2565b92915050565b6000602082840312156131ff576131fe6144dd565b5b600061320d84828501613124565b91505092915050565b6000806040838503121561322d5761322c6144dd565b5b600061323b85828601613124565b925050602061324c85828601613124565b9150509250929050565b60008060006060848603121561326f5761326e6144dd565b5b600061327d86828701613124565b935050602061328e86828701613124565b925050604061329f868287016131d4565b9150509250925092565b600080600080608085870312156132c3576132c26144dd565b5b60006132d187828801613124565b94505060206132e287828801613124565b93505060406132f3878288016131d4565b925050606085013567ffffffffffffffff811115613314576133136144d8565b5b61332087828801613178565b91505092959194509250565b60008060408385031215613343576133426144dd565b5b600061335185828601613124565b925050602061336285828601613139565b9150509250929050565b60008060408385031215613383576133826144dd565b5b600061339185828601613124565b92505060206133a2858286016131d4565b9150509250929050565b6000602082840312156133c2576133c16144dd565b5b60006133d08482850161314e565b91505092915050565b6000602082840312156133ef576133ee6144dd565b5b60006133fd84828501613163565b91505092915050565b60008060006060848603121561341f5761341e6144dd565b5b600084013567ffffffffffffffff81111561343d5761343c6144d8565b5b613449868287016131a6565b935050602061345a86828701613139565b925050604084013567ffffffffffffffff81111561347b5761347a6144d8565b5b613487868287016131a6565b9150509250925092565b6000602082840312156134a7576134a66144dd565b5b60006134b5848285016131d4565b91505092915050565b600080604083850312156134d5576134d46144dd565b5b60006134e3858286016131d4565b925050602083013567ffffffffffffffff811115613504576135036144d8565b5b61351085828601613178565b9150509250929050565b613523816141ad565b82525050565b61353a613535826141ad565b614326565b82525050565b613549816141bf565b82525050565b613558816141cb565b82525050565b61356f61356a826141cb565b614338565b82525050565b600061358082614055565b61358a818561406b565b935061359a818560208601614247565b6135a3816144e2565b840191505092915050565b60006135b982614060565b6135c3818561407c565b93506135d3818560208601614247565b6135dc816144e2565b840191505092915050565b60006135f282614060565b6135fc818561408d565b935061360c818560208601614247565b80840191505092915050565b600081546136258161427a565b61362f818661408d565b9450600182166000811461364a576001811461365b5761368e565b60ff1983168652818601935061368e565b61366485614040565b60005b8381101561368657815481890152600182019150602081019050613667565b838801955050505b50505092915050565b60006136a460188361407c565b91506136af82614500565b602082019050919050565b60006136c7601f8361407c565b91506136d282614529565b602082019050919050565b60006136ea601c8361408d565b91506136f582614552565b601c82019050919050565b600061370d602b8361407c565b91506137188261457b565b604082019050919050565b600061373060328361407c565b915061373b826145ca565b604082019050919050565b600061375360268361407c565b915061375e82614619565b604082019050919050565b600061377660258361407c565b915061378182614668565b604082019050919050565b6000613799601c8361407c565b91506137a4826146b7565b602082019050919050565b60006137bc60248361407c565b91506137c7826146e0565b604082019050919050565b60006137df60198361407c565b91506137ea8261472f565b602082019050919050565b6000613802601f8361407c565b915061380d82614758565b602082019050919050565b600061382560228361407c565b915061383082614781565b604082019050919050565b600061384860228361407c565b9150613853826147d0565b604082019050919050565b600061386b602c8361407c565b91506138768261481f565b604082019050919050565b600061388e60388361407c565b91506138998261486e565b604082019050919050565b60006138b1602a8361407c565b91506138bc826148bd565b604082019050919050565b60006138d460298361407c565b91506138df8261490c565b604082019050919050565b60006138f7602a8361407c565b91506139028261495b565b604082019050919050565b600061391a60228361407c565b9150613925826149aa565b604082019050919050565b600061393d60208361407c565b9150613948826149f9565b602082019050919050565b6000613960603d8361407c565b915061396b82614a22565b604082019050919050565b6000613983602c8361407c565b915061398e82614a71565b604082019050919050565b60006139a660208361407c565b91506139b182614ac0565b602082019050919050565b60006139c9602f8361407c565b91506139d482614ae9565b604082019050919050565b60006139ec60218361407c565b91506139f782614b38565b604082019050919050565b6000613a0f601b8361407c565b9150613a1a82614b87565b602082019050919050565b6000613a3260318361407c565b9150613a3d82614bb0565b604082019050919050565b6000613a55602c8361407c565b9150613a6082614bff565b604082019050919050565b6000613a78602a8361407c565b9150613a8382614c4e565b604082019050919050565b613a9781614221565b82525050565b613aa68161422b565b82525050565b6000613ab88284613529565b60148201915081905092915050565b6000613ad382846135e7565b915081905092915050565b6000613aea82866135e7565b9150613af682856135e7565b9150613b028284613618565b9150819050949350505050565b6000613b1a826136dd565b9150613b26828461355e565b60208201915081905092915050565b6000602082019050613b4a600083018461351a565b92915050565b6000608082019050613b65600083018761351a565b613b72602083018661351a565b613b7f6040830185613a8e565b8181036060830152613b918184613575565b905095945050505050565b6000602082019050613bb16000830184613540565b92915050565b6000608082019050613bcc600083018761354f565b613bd96020830186613a9d565b613be6604083018561354f565b613bf3606083018461354f565b95945050505050565b60006020820190508181036000830152613c1681846135ae565b905092915050565b60006020820190508181036000830152613c3781613697565b9050919050565b60006020820190508181036000830152613c57816136ba565b9050919050565b60006020820190508181036000830152613c7781613700565b9050919050565b60006020820190508181036000830152613c9781613723565b9050919050565b60006020820190508181036000830152613cb781613746565b9050919050565b60006020820190508181036000830152613cd781613769565b9050919050565b60006020820190508181036000830152613cf78161378c565b9050919050565b60006020820190508181036000830152613d17816137af565b9050919050565b60006020820190508181036000830152613d37816137d2565b9050919050565b60006020820190508181036000830152613d57816137f5565b9050919050565b60006020820190508181036000830152613d7781613818565b9050919050565b60006020820190508181036000830152613d978161383b565b9050919050565b60006020820190508181036000830152613db78161385e565b9050919050565b60006020820190508181036000830152613dd781613881565b9050919050565b60006020820190508181036000830152613df7816138a4565b9050919050565b60006020820190508181036000830152613e17816138c7565b9050919050565b60006020820190508181036000830152613e37816138ea565b9050919050565b60006020820190508181036000830152613e578161390d565b9050919050565b60006020820190508181036000830152613e7781613930565b9050919050565b60006020820190508181036000830152613e9781613953565b9050919050565b60006020820190508181036000830152613eb781613976565b9050919050565b60006020820190508181036000830152613ed781613999565b9050919050565b60006020820190508181036000830152613ef7816139bc565b9050919050565b60006020820190508181036000830152613f17816139df565b9050919050565b60006020820190508181036000830152613f3781613a02565b9050919050565b60006020820190508181036000830152613f5781613a25565b9050919050565b60006020820190508181036000830152613f7781613a48565b9050919050565b60006020820190508181036000830152613f9781613a6b565b9050919050565b6000602082019050613fb36000830184613a8e565b92915050565b6000613fc3613fd4565b9050613fcf82826142ac565b919050565b6000604051905090565b600067ffffffffffffffff821115613ff957613ff861449f565b5b614002826144e2565b9050602081019050919050565b600067ffffffffffffffff82111561402a5761402961449f565b5b614033826144e2565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006140a382614221565b91506140ae83614221565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140e3576140e2614385565b5b828201905092915050565b60006140f982614221565b915061410483614221565b925082614114576141136143b4565b5b828204905092915050565b600061412a82614221565b915061413583614221565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561416e5761416d614385565b5b828202905092915050565b600061418482614221565b915061418f83614221565b9250828210156141a2576141a1614385565b5b828203905092915050565b60006141b882614201565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561426557808201518184015260208101905061424a565b83811115614274576000848401525b50505050565b6000600282049050600182168061429257607f821691505b602082108114156142a6576142a5614412565b5b50919050565b6142b5826144e2565b810181811067ffffffffffffffff821117156142d4576142d361449f565b5b80604052505050565b60006142e882614221565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561431b5761431a614385565b5b600182019050919050565b600061433182614342565b9050919050565b6000819050919050565b600061434d826144f3565b9050919050565b600061435f82614221565b915061436a83614221565b92508261437a576143796143b4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420546f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f546865206d65746164617461205552492069732066726f7a656e2e20596f752060008201527f63616e206e6f206c6f6e67657220736574207468652062617365555249000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f546865207369676e617475726520666f722074686520677265656e6c6973742060008201527f697320696e76616c696400000000000000000000000000000000000000000000602082015250565b614ca6816141ad565b8114614cb157600080fd5b50565b614cbd816141bf565b8114614cc857600080fd5b50565b614cd4816141d5565b8114614cdf57600080fd5b50565b614ceb81614221565b8114614cf657600080fd5b5056fea264697066735822122069b67ae9204f1c8ba4c47ee59deef026c3ba2575400c99054f6050cacde5927d64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101c25760003560e01c8063715018a6116100f7578063c634d03211610095578063eb8d244411610064578063eb8d24441461061f578063f2fde38b1461064a578063f47c84c514610673578063f7f7bf7b1461069e576101c2565b8063c634d03214610572578063c87b56dd1461058e578063d111515d146105cb578063e985e9c5146105e2576101c2565b806393b15295116100d157806393b15295146104cc57806395d89b41146104f5578063a22cb46514610520578063b88d4fde14610549576101c2565b8063715018a61461045f5780638529ccad146104765780638da5cb5b146104a1576101c2565b80632da435f71161016457806342842e0e1161013e57806342842e0e1461037f5780634f6ccce7146103a85780636352211e146103e557806370a0823114610422576101c2565b80632da435f7146103145780632f745c591461032b57806334918dfd14610368576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c05780632541865c146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906133ac565b6106ba565b6040516101fb9190613b9c565b60405180910390f35b34801561021057600080fd5b506102196106cc565b6040516102269190613bfc565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190613491565b61075e565b6040516102639190613b35565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e919061336c565b6107e3565b005b3480156102a157600080fd5b506102aa6108fb565b6040516102b79190613f9e565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e29190613256565b610908565b005b3480156102f557600080fd5b506102fe610968565b60405161030b9190613b9c565b60405180910390f35b34801561032057600080fd5b5061032961097b565b005b34801561033757600080fd5b50610352600480360381019061034d919061336c565b610a23565b60405161035f9190613f9e565b60405180910390f35b34801561037457600080fd5b5061037d610ac8565b005b34801561038b57600080fd5b506103a660048036038101906103a19190613256565b610b70565b005b3480156103b457600080fd5b506103cf60048036038101906103ca9190613491565b610b90565b6040516103dc9190613f9e565b60405180910390f35b3480156103f157600080fd5b5061040c60048036038101906104079190613491565b610c01565b6040516104199190613b35565b60405180910390f35b34801561042e57600080fd5b50610449600480360381019061044491906131e9565b610cb3565b6040516104569190613f9e565b60405180910390f35b34801561046b57600080fd5b50610474610d6b565b005b34801561048257600080fd5b5061048b610df3565b6040516104989190613b9c565b60405180910390f35b3480156104ad57600080fd5b506104b6610e06565b6040516104c39190613b35565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190613406565b610e30565b005b34801561050157600080fd5b5061050a610f49565b6040516105179190613bfc565b60405180910390f35b34801561052c57600080fd5b506105476004803603810190610542919061332c565b610fdb565b005b34801561055557600080fd5b50610570600480360381019061056b91906132a9565b610ff1565b005b61058c60048036038101906105879190613491565b611053565b005b34801561059a57600080fd5b506105b560048036038101906105b09190613491565b61128d565b6040516105c29190613bfc565b60405180910390f35b3480156105d757600080fd5b506105e0611394565b005b3480156105ee57600080fd5b5061060960048036038101906106049190613216565b61142d565b6040516106169190613b9c565b60405180910390f35b34801561062b57600080fd5b506106346114c1565b6040516106419190613b9c565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c91906131e9565b6114d4565b005b34801561067f57600080fd5b506106886115cc565b6040516106959190613f9e565b60405180910390f35b6106b860048036038101906106b391906134be565b6115d2565b005b60006106c5826118e7565b9050919050565b6060600080546106db9061427a565b80601f01602080910402602001604051908101604052809291908181526020018280546107079061427a565b80156107545780601f1061072957610100808354040283529160200191610754565b820191906000526020600020905b81548152906001019060200180831161073757829003601f168201915b5050505050905090565b600061076982611961565b6107a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079f90613e9e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ee82610c01565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085690613efe565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661087e6119cd565b73ffffffffffffffffffffffffffffffffffffffff1614806108ad57506108ac816108a76119cd565b61142d565b5b6108ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e390613dbe565b60405180910390fd5b6108f683836119d5565b505050565b6000600880549050905090565b6109196109136119cd565b82611a8e565b610958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094f90613f3e565b60405180910390fd5b610963838383611b6c565b505050565b600f60019054906101000a900460ff1681565b6109836119cd565b73ffffffffffffffffffffffffffffffffffffffff166109a1610e06565b73ffffffffffffffffffffffffffffffffffffffff16146109f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ee90613ebe565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b6000610a2e83610cb3565b8210610a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6690613c5e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ad06119cd565b73ffffffffffffffffffffffffffffffffffffffff16610aee610e06565b73ffffffffffffffffffffffffffffffffffffffff1614610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b90613ebe565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610b8b83838360405180602001604052806000815250610ff1565b505050565b6000610b9a6108fb565b8210610bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd290613f5e565b60405180910390fd5b60088281548110610bef57610bee614470565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190613dfe565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90613dde565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d736119cd565b73ffffffffffffffffffffffffffffffffffffffff16610d91610e06565b73ffffffffffffffffffffffffffffffffffffffff1614610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde90613ebe565b60405180910390fd5b610df16000611dd3565b565b600d60009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e386119cd565b73ffffffffffffffffffffffffffffffffffffffff16610e56610e06565b73ffffffffffffffffffffffffffffffffffffffff1614610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea390613ebe565b60405180910390fd5b600d60009054906101000a900460ff1615610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef390613e7e565b60405180910390fd5b81601260146101000a81548160ff02191690831515021790555082600b9080519060200190610f2c929190612ffd565b5080600c9080519060200190610f43929190612ffd565b50505050565b606060018054610f589061427a565b80601f0160208091040260200160405190810160405280929190818152602001828054610f849061427a565b8015610fd15780601f10610fa657610100808354040283529160200191610fd1565b820191906000526020600020905b815481529060010190602001808311610fb457829003601f168201915b5050505050905090565b610fed610fe66119cd565b8383611e99565b5050565b611002610ffc6119cd565b83611a8e565b611041576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103890613f3e565b60405180910390fd5b61104d84848484612006565b50505050565b600f60009054906101000a900460ff166110a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109990613d5e565b60405180910390fd5b6001601160006110b06119cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826110f69190614098565b1115611137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112e90613f1e565b60405180910390fd5b600e54816111436108fb565b61114d9190614098565b111561118e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118590613e1e565b60405180910390fd5b3481600061119c919061411f565b11156111dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d490613d3e565b60405180910390fd5b60005b818110156112895760006111f26108fb565b9050600e546111ff6108fb565b1015611275576112166112106119cd565b82612062565b6001601160006112246119cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461126d9190614098565b925050819055505b508080611281906142dd565b9150506111e0565b5050565b606061129882611961565b6112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90613ede565b60405180910390fd5b60006112e1612080565b9050601260149054906101000a900460ff161561134c5760008151116113165760405180602001604052806000815250611344565b8061132084612112565b600c60405160200161133493929190613ade565b6040516020818303038152906040525b91505061138f565b600081511161136a576040518060200160405280600081525061138b565b8060405160200161137b9190613ac7565b6040516020818303038152906040525b9150505b919050565b61139c6119cd565b73ffffffffffffffffffffffffffffffffffffffff166113ba610e06565b73ffffffffffffffffffffffffffffffffffffffff1614611410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140790613ebe565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b6114dc6119cd565b73ffffffffffffffffffffffffffffffffffffffff166114fa610e06565b73ffffffffffffffffffffffffffffffffffffffff1614611550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154790613ebe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b790613c9e565b60405180910390fd5b6115c981611dd3565b50565b600e5481565b600f60019054906101000a900460ff16611621576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161890613d5e565b60405180910390fd5b60016010600061162f6119cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836116759190614098565b11156116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad90613f1e565b60405180910390fd5b600e54826116c26108fb565b6116cc9190614098565b111561170d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170490613e1e565b60405180910390fd5b3482600061171b919061411f565b111561175c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175390613d3e565b60405180910390fd5b60006117946117696119cd565b6040516020016117799190613aac565b60405160208183030381529060405280519060200120612273565b905060006117a282846122a3565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613f7e565b60405180910390fd5b60005b848110156118e05760006118496108fb565b9050600e546118566108fb565b10156118cc5761186d6118676119cd565b82612062565b60016010600061187b6119cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118c49190614098565b925050819055505b5080806118d8906142dd565b915050611837565b5050505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061195a5750611959826122ca565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a4883610c01565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a9982611961565b611ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acf90613d9e565b60405180910390fd5b6000611ae383610c01565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b5257508373ffffffffffffffffffffffffffffffffffffffff16611b3a8461075e565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b635750611b62818561142d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b8c82610c01565b73ffffffffffffffffffffffffffffffffffffffff1614611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd990613cbe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4990613cfe565b60405180910390fd5b611c5d8383836123ac565b611c686000826119d5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cb89190614179565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d0f9190614098565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611dce8383836123bc565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eff90613d1e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ff99190613b9c565b60405180910390a3505050565b612011848484611b6c565b61201d848484846123c1565b61205c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205390613c7e565b60405180910390fd5b50505050565b61207c828260405180602001604052806000815250612558565b5050565b6060600b805461208f9061427a565b80601f01602080910402602001604051908101604052809291908181526020018280546120bb9061427a565b80156121085780601f106120dd57610100808354040283529160200191612108565b820191906000526020600020905b8154815290600101906020018083116120eb57829003601f168201915b5050505050905090565b6060600082141561215a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061226e565b600082905060005b6000821461218c578080612175906142dd565b915050600a8261218591906140ee565b9150612162565b60008167ffffffffffffffff8111156121a8576121a761449f565b5b6040519080825280601f01601f1916602001820160405280156121da5781602001600182028036833780820191505090505b5090505b60008514612267576001826121f39190614179565b9150600a856122029190614354565b603061220e9190614098565b60f81b81838151811061222457612223614470565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561226091906140ee565b94506121de565b8093505050505b919050565b6000816040516020016122869190613b0f565b604051602081830303815290604052805190602001209050919050565b60008060006122b285856125b3565b915091506122bf81612636565b819250505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061239557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123a557506123a48261280b565b5b9050919050565b6123b7838383612875565b505050565b505050565b60006123e28473ffffffffffffffffffffffffffffffffffffffff16612989565b1561254b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261240b6119cd565b8786866040518563ffffffff1660e01b815260040161242d9493929190613b50565b602060405180830381600087803b15801561244757600080fd5b505af192505050801561247857506040513d601f19601f8201168201806040525081019061247591906133d9565b60015b6124fb573d80600081146124a8576040519150601f19603f3d011682016040523d82523d6000602084013e6124ad565b606091505b506000815114156124f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ea90613c7e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612550565b600190505b949350505050565b61256283836129ac565b61256f60008484846123c1565b6125ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a590613c7e565b60405180910390fd5b505050565b6000806041835114156125f55760008060006020860151925060408601519150606086015160001a90506125e987828585612b86565b9450945050505061262f565b60408351141561262657600080602085015191506040850151905061261b868383612c93565b93509350505061262f565b60006002915091505b9250929050565b6000600481111561264a576126496143e3565b5b81600481111561265d5761265c6143e3565b5b141561266857612808565b6001600481111561267c5761267b6143e3565b5b81600481111561268f5761268e6143e3565b5b14156126d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c790613c1e565b60405180910390fd5b600260048111156126e4576126e36143e3565b5b8160048111156126f7576126f66143e3565b5b1415612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272f90613c3e565b60405180910390fd5b6003600481111561274c5761274b6143e3565b5b81600481111561275f5761275e6143e3565b5b14156127a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279790613d7e565b60405180910390fd5b6004808111156127b3576127b26143e3565b5b8160048111156127c6576127c56143e3565b5b1415612807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fe90613e3e565b60405180910390fd5b5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612880838383612cf2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128c3576128be81612cf7565b612902565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612901576129008382612d40565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129455761294081612ead565b612984565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612983576129828282612f7e565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1390613e5e565b60405180910390fd5b612a2581611961565b15612a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5c90613cde565b60405180910390fd5b612a71600083836123ac565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ac19190614098565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b82600083836123bc565b5050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612bc1576000600391509150612c8a565b601b8560ff1614158015612bd95750601c8560ff1614155b15612beb576000600491509150612c8a565b600060018787878760405160008152602001604052604051612c109493929190613bb7565b6020604051602081039080840390855afa158015612c32573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c8157600060019250925050612c8a565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c612cd69190614098565b9050612ce487828885612b86565b935093505050935093915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d4d84610cb3565b612d579190614179565b9050600060076000848152602001908152602001600020549050818114612e3c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ec19190614179565b9050600060096000848152602001908152602001600020549050600060088381548110612ef157612ef0614470565b5b906000526020600020015490508060088381548110612f1357612f12614470565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f6257612f61614441565b5b6001900381819060005260206000200160009055905550505050565b6000612f8983610cb3565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546130099061427a565b90600052602060002090601f01602090048101928261302b5760008555613072565b82601f1061304457805160ff1916838001178555613072565b82800160010185558215613072579182015b82811115613071578251825591602001919060010190613056565b5b50905061307f9190613083565b5090565b5b8082111561309c576000816000905550600101613084565b5090565b60006130b36130ae84613fde565b613fb9565b9050828152602081018484840111156130cf576130ce6144d3565b5b6130da848285614238565b509392505050565b60006130f56130f08461400f565b613fb9565b905082815260208101848484011115613111576131106144d3565b5b61311c848285614238565b509392505050565b60008135905061313381614c9d565b92915050565b60008135905061314881614cb4565b92915050565b60008135905061315d81614ccb565b92915050565b60008151905061317281614ccb565b92915050565b600082601f83011261318d5761318c6144ce565b5b813561319d8482602086016130a0565b91505092915050565b600082601f8301126131bb576131ba6144ce565b5b81356131cb8482602086016130e2565b91505092915050565b6000813590506131e381614ce2565b92915050565b6000602082840312156131ff576131fe6144dd565b5b600061320d84828501613124565b91505092915050565b6000806040838503121561322d5761322c6144dd565b5b600061323b85828601613124565b925050602061324c85828601613124565b9150509250929050565b60008060006060848603121561326f5761326e6144dd565b5b600061327d86828701613124565b935050602061328e86828701613124565b925050604061329f868287016131d4565b9150509250925092565b600080600080608085870312156132c3576132c26144dd565b5b60006132d187828801613124565b94505060206132e287828801613124565b93505060406132f3878288016131d4565b925050606085013567ffffffffffffffff811115613314576133136144d8565b5b61332087828801613178565b91505092959194509250565b60008060408385031215613343576133426144dd565b5b600061335185828601613124565b925050602061336285828601613139565b9150509250929050565b60008060408385031215613383576133826144dd565b5b600061339185828601613124565b92505060206133a2858286016131d4565b9150509250929050565b6000602082840312156133c2576133c16144dd565b5b60006133d08482850161314e565b91505092915050565b6000602082840312156133ef576133ee6144dd565b5b60006133fd84828501613163565b91505092915050565b60008060006060848603121561341f5761341e6144dd565b5b600084013567ffffffffffffffff81111561343d5761343c6144d8565b5b613449868287016131a6565b935050602061345a86828701613139565b925050604084013567ffffffffffffffff81111561347b5761347a6144d8565b5b613487868287016131a6565b9150509250925092565b6000602082840312156134a7576134a66144dd565b5b60006134b5848285016131d4565b91505092915050565b600080604083850312156134d5576134d46144dd565b5b60006134e3858286016131d4565b925050602083013567ffffffffffffffff811115613504576135036144d8565b5b61351085828601613178565b9150509250929050565b613523816141ad565b82525050565b61353a613535826141ad565b614326565b82525050565b613549816141bf565b82525050565b613558816141cb565b82525050565b61356f61356a826141cb565b614338565b82525050565b600061358082614055565b61358a818561406b565b935061359a818560208601614247565b6135a3816144e2565b840191505092915050565b60006135b982614060565b6135c3818561407c565b93506135d3818560208601614247565b6135dc816144e2565b840191505092915050565b60006135f282614060565b6135fc818561408d565b935061360c818560208601614247565b80840191505092915050565b600081546136258161427a565b61362f818661408d565b9450600182166000811461364a576001811461365b5761368e565b60ff1983168652818601935061368e565b61366485614040565b60005b8381101561368657815481890152600182019150602081019050613667565b838801955050505b50505092915050565b60006136a460188361407c565b91506136af82614500565b602082019050919050565b60006136c7601f8361407c565b91506136d282614529565b602082019050919050565b60006136ea601c8361408d565b91506136f582614552565b601c82019050919050565b600061370d602b8361407c565b91506137188261457b565b604082019050919050565b600061373060328361407c565b915061373b826145ca565b604082019050919050565b600061375360268361407c565b915061375e82614619565b604082019050919050565b600061377660258361407c565b915061378182614668565b604082019050919050565b6000613799601c8361407c565b91506137a4826146b7565b602082019050919050565b60006137bc60248361407c565b91506137c7826146e0565b604082019050919050565b60006137df60198361407c565b91506137ea8261472f565b602082019050919050565b6000613802601f8361407c565b915061380d82614758565b602082019050919050565b600061382560228361407c565b915061383082614781565b604082019050919050565b600061384860228361407c565b9150613853826147d0565b604082019050919050565b600061386b602c8361407c565b91506138768261481f565b604082019050919050565b600061388e60388361407c565b91506138998261486e565b604082019050919050565b60006138b1602a8361407c565b91506138bc826148bd565b604082019050919050565b60006138d460298361407c565b91506138df8261490c565b604082019050919050565b60006138f7602a8361407c565b91506139028261495b565b604082019050919050565b600061391a60228361407c565b9150613925826149aa565b604082019050919050565b600061393d60208361407c565b9150613948826149f9565b602082019050919050565b6000613960603d8361407c565b915061396b82614a22565b604082019050919050565b6000613983602c8361407c565b915061398e82614a71565b604082019050919050565b60006139a660208361407c565b91506139b182614ac0565b602082019050919050565b60006139c9602f8361407c565b91506139d482614ae9565b604082019050919050565b60006139ec60218361407c565b91506139f782614b38565b604082019050919050565b6000613a0f601b8361407c565b9150613a1a82614b87565b602082019050919050565b6000613a3260318361407c565b9150613a3d82614bb0565b604082019050919050565b6000613a55602c8361407c565b9150613a6082614bff565b604082019050919050565b6000613a78602a8361407c565b9150613a8382614c4e565b604082019050919050565b613a9781614221565b82525050565b613aa68161422b565b82525050565b6000613ab88284613529565b60148201915081905092915050565b6000613ad382846135e7565b915081905092915050565b6000613aea82866135e7565b9150613af682856135e7565b9150613b028284613618565b9150819050949350505050565b6000613b1a826136dd565b9150613b26828461355e565b60208201915081905092915050565b6000602082019050613b4a600083018461351a565b92915050565b6000608082019050613b65600083018761351a565b613b72602083018661351a565b613b7f6040830185613a8e565b8181036060830152613b918184613575565b905095945050505050565b6000602082019050613bb16000830184613540565b92915050565b6000608082019050613bcc600083018761354f565b613bd96020830186613a9d565b613be6604083018561354f565b613bf3606083018461354f565b95945050505050565b60006020820190508181036000830152613c1681846135ae565b905092915050565b60006020820190508181036000830152613c3781613697565b9050919050565b60006020820190508181036000830152613c57816136ba565b9050919050565b60006020820190508181036000830152613c7781613700565b9050919050565b60006020820190508181036000830152613c9781613723565b9050919050565b60006020820190508181036000830152613cb781613746565b9050919050565b60006020820190508181036000830152613cd781613769565b9050919050565b60006020820190508181036000830152613cf78161378c565b9050919050565b60006020820190508181036000830152613d17816137af565b9050919050565b60006020820190508181036000830152613d37816137d2565b9050919050565b60006020820190508181036000830152613d57816137f5565b9050919050565b60006020820190508181036000830152613d7781613818565b9050919050565b60006020820190508181036000830152613d978161383b565b9050919050565b60006020820190508181036000830152613db78161385e565b9050919050565b60006020820190508181036000830152613dd781613881565b9050919050565b60006020820190508181036000830152613df7816138a4565b9050919050565b60006020820190508181036000830152613e17816138c7565b9050919050565b60006020820190508181036000830152613e37816138ea565b9050919050565b60006020820190508181036000830152613e578161390d565b9050919050565b60006020820190508181036000830152613e7781613930565b9050919050565b60006020820190508181036000830152613e9781613953565b9050919050565b60006020820190508181036000830152613eb781613976565b9050919050565b60006020820190508181036000830152613ed781613999565b9050919050565b60006020820190508181036000830152613ef7816139bc565b9050919050565b60006020820190508181036000830152613f17816139df565b9050919050565b60006020820190508181036000830152613f3781613a02565b9050919050565b60006020820190508181036000830152613f5781613a25565b9050919050565b60006020820190508181036000830152613f7781613a48565b9050919050565b60006020820190508181036000830152613f9781613a6b565b9050919050565b6000602082019050613fb36000830184613a8e565b92915050565b6000613fc3613fd4565b9050613fcf82826142ac565b919050565b6000604051905090565b600067ffffffffffffffff821115613ff957613ff861449f565b5b614002826144e2565b9050602081019050919050565b600067ffffffffffffffff82111561402a5761402961449f565b5b614033826144e2565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006140a382614221565b91506140ae83614221565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140e3576140e2614385565b5b828201905092915050565b60006140f982614221565b915061410483614221565b925082614114576141136143b4565b5b828204905092915050565b600061412a82614221565b915061413583614221565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561416e5761416d614385565b5b828202905092915050565b600061418482614221565b915061418f83614221565b9250828210156141a2576141a1614385565b5b828203905092915050565b60006141b882614201565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561426557808201518184015260208101905061424a565b83811115614274576000848401525b50505050565b6000600282049050600182168061429257607f821691505b602082108114156142a6576142a5614412565b5b50919050565b6142b5826144e2565b810181811067ffffffffffffffff821117156142d4576142d361449f565b5b80604052505050565b60006142e882614221565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561431b5761431a614385565b5b600182019050919050565b600061433182614342565b9050919050565b6000819050919050565b600061434d826144f3565b9050919050565b600061435f82614221565b915061436a83614221565b92508261437a576143796143b4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420546f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f546865206d65746164617461205552492069732066726f7a656e2e20596f752060008201527f63616e206e6f206c6f6e67657220736574207468652062617365555249000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f546865207369676e617475726520666f722074686520677265656e6c6973742060008201527f697320696e76616c696400000000000000000000000000000000000000000000602082015250565b614ca6816141ad565b8114614cb157600080fd5b50565b614cbd816141bf565b8114614cc857600080fd5b50565b614cd4816141d5565b8114614cdf57600080fd5b50565b614ceb81614221565b8114614cf657600080fd5b5056fea264697066735822122069b67ae9204f1c8ba4c47ee59deef026c3ba2575400c99054f6050cacde5927d64736f6c63430008070033

Deployed Bytecode Sourcemap

55222:4138:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56008: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;:::-;;55522:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56310:120;;;;;;;;;;;;;:::i;:::-;;39775:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56201:93;;;;;;;;;;;;;:::i;:::-;;25384:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40297:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22359:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22089:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36551:103;;;;;;;;;;;;;:::i;:::-;;55403:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35900:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56440:338;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22834:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24517:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25640:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57543:724;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57004:525;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56911:85;;;;;;;;;;;;;:::i;:::-;;24743:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55483:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36809:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55444:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58283:1058;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56008:179;56119:4;56143:36;56167:11;56143:23;:36::i;:::-;56136:43;;56008: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;55522:41::-;;;;;;;;;;;;;:::o;56310:120::-;36131:12;:10;:12::i;:::-;36120:23;;:7;:5;:7::i;:::-;:23;;;36112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56401:21:::1;;;;;;;;;;;56400:22;56376:21;;:46;;;;;;;;;;;;;;;;;;56310: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;56201:93::-;36131:12;:10;:12::i;:::-;36120:23;;:7;:5;:7::i;:::-;:23;;;36112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56274:12:::1;;;;;;;;;;;56273:13;56258:12;;:28;;;;;;;;;;;;;;;;;;56201: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;55403:34::-;;;;;;;;;;;;;:::o;35900:87::-;35946:7;35973:6;;;;;;;;;;;35966:13;;35900:87;:::o;56440:338::-;36131:12;:10;:12::i;:::-;36120:23;;:7;:5;:7::i;:::-;:23;;;36112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56568:14:::1;;;;;;;;;;;56567:15;56559:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;56684:14;56659:22;;:39;;;;;;;;;;;;;;;;;;56728:8;56709:16;:27;;;;;;;;;;;;:::i;:::-;;56764:6;56747:14;:23;;;;;;;;;;;;:::i;:::-;;56440:338:::0;;;:::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;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;57543:724::-;57617:12;;;;;;;;;;;57609:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;57743:1;57704:21;:35;57726:12;:10;:12::i;:::-;57704:35;;;;;;;;;;;;;;;;57687:14;:52;;;;:::i;:::-;:57;;57679:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;57831:10;;57813:14;57797:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;57789:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;57929:9;57911:14;57907:1;:18;;;;:::i;:::-;:31;;57899:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;57992:6;57987:273;58008:14;58004:1;:18;57987:273;;;58044:14;58061:13;:11;:13::i;:::-;58044:30;;58109:10;;58093:13;:11;:13::i;:::-;:26;58089:160;;;58140:34;58150:12;:10;:12::i;:::-;58164:9;58140;:34::i;:::-;58232:1;58193:21;:35;58215:12;:10;:12::i;:::-;58193:35;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;58089:160;58029:231;58024:3;;;;;:::i;:::-;;;;57987:273;;;;57543:724;:::o;57004:525::-;57077:13;57111:16;57119:7;57111;:16::i;:::-;57103:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;57192:21;57216:10;:8;:10::i;:::-;57192:34;;57241:22;;;;;;;;;;;57237:285;;;57311:1;57293:7;57287:21;:25;:109;;;;;;;;;;;;;;;;;57339:7;57348:25;57365:7;57348:16;:25::i;:::-;57375:14;57322:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57287:109;57280:116;;;;;57237:285;57468:1;57450:7;57444:21;:25;:66;;;;;;;;;;;;;;;;;57496:7;57479:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;57444:66;57437:73;;;57004:525;;;;:::o;56911:85::-;36131:12;:10;:12::i;:::-;36120:23;;:7;:5;:7::i;:::-;:23;;;36112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56984:4:::1;56967:14;;:21;;;;;;;;;;;;;;;;;;56911:85::o:0;24743:164::-;24840:4;24864:18;:25;24883:5;24864:25;;;;;;;;;;;;;;;:35;24890:8;24864:35;;;;;;;;;;;;;;;;;;;;;;;;;24857:42;;24743:164;;;;:::o;55483: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;55444:32::-;;;;:::o;58283:1058::-;58390:21;;;;;;;;;;;58382:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58534:1;58486:30;:44;58517:12;:10;:12::i;:::-;58486:44;;;;;;;;;;;;;;;;58469:14;:61;;;;:::i;:::-;:66;;58461:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;58620:10;;58602:14;58586:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;58578:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;58718:9;58700:14;58696:1;:18;;;;:::i;:::-;:31;;58688:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;58776:20;58799:71;58855:12;:10;:12::i;:::-;58838:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;58828:41;;;;;;58799:28;:71::i;:::-;58776:94;;58881:24;58908:38;58922:12;58936:9;58908:13;:38::i;:::-;58881:65;;58985:7;;;;;;;;;;;58965:27;;:16;:27;;;58957:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;59057:6;59052:282;59073:14;59069:1;:18;59052:282;;;59109:14;59126:13;:11;:13::i;:::-;59109:30;;59174:10;;59158:13;:11;:13::i;:::-;:26;59154:169;;;59205:34;59215:12;:10;:12::i;:::-;59229:9;59205;:34::i;:::-;59306:1;59258:30;:44;59289:12;:10;:12::i;:::-;59258:44;;;;;;;;;;;;;;;;:49;;;;;;;:::i;:::-;;;;;;;;59154:169;59094:240;59089:3;;;;;:::i;:::-;;;;59052:282;;;;58371:970;;58283: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;56786:117::-;56846:13;56879:16;56872:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56786: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;55819:181::-;55947:45;55974:4;55980:2;55984:7;55947:26;:45::i;:::-;55819: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:973::-;6402:6;6410;6418;6467:2;6455:9;6446:7;6442:23;6438:32;6435:119;;;6473:79;;:::i;:::-;6435:119;6621:1;6610:9;6606:17;6593:31;6651:18;6643:6;6640:30;6637:117;;;6673:79;;:::i;:::-;6637:117;6778:63;6833:7;6824:6;6813:9;6809:22;6778:63;:::i;:::-;6768:73;;6564:287;6890:2;6916:50;6958:7;6949:6;6938:9;6934:22;6916:50;:::i;:::-;6906:60;;6861:115;7043:2;7032:9;7028:18;7015:32;7074:18;7066:6;7063:30;7060:117;;;7096:79;;:::i;:::-;7060:117;7201:63;7256:7;7247:6;7236:9;7232:22;7201:63;:::i;:::-;7191:73;;6986:288;6308:973;;;;;:::o;7287:329::-;7346:6;7395:2;7383:9;7374:7;7370:23;7366:32;7363:119;;;7401:79;;:::i;:::-;7363:119;7521:1;7546:53;7591:7;7582:6;7571:9;7567:22;7546:53;:::i;:::-;7536:63;;7492:117;7287:329;;;;:::o;7622:652::-;7699:6;7707;7756:2;7744:9;7735:7;7731:23;7727:32;7724:119;;;7762:79;;:::i;:::-;7724:119;7882:1;7907:53;7952:7;7943:6;7932:9;7928:22;7907:53;:::i;:::-;7897:63;;7853:117;8037:2;8026:9;8022:18;8009:32;8068:18;8060:6;8057:30;8054:117;;;8090:79;;:::i;:::-;8054:117;8195:62;8249:7;8240:6;8229:9;8225:22;8195:62;:::i;:::-;8185:72;;7980:287;7622:652;;;;;:::o;8280:118::-;8367:24;8385:5;8367:24;:::i;:::-;8362:3;8355:37;8280:118;;:::o;8404:157::-;8509:45;8529:24;8547:5;8529:24;:::i;:::-;8509:45;:::i;:::-;8504:3;8497:58;8404:157;;:::o;8567:109::-;8648:21;8663:5;8648:21;:::i;:::-;8643:3;8636:34;8567:109;;:::o;8682:118::-;8769:24;8787:5;8769:24;:::i;:::-;8764:3;8757:37;8682:118;;:::o;8806:157::-;8911:45;8931:24;8949:5;8931:24;:::i;:::-;8911:45;:::i;:::-;8906:3;8899:58;8806:157;;:::o;8969:360::-;9055:3;9083:38;9115:5;9083:38;:::i;:::-;9137:70;9200:6;9195:3;9137:70;:::i;:::-;9130:77;;9216:52;9261:6;9256:3;9249:4;9242:5;9238:16;9216:52;:::i;:::-;9293:29;9315:6;9293:29;:::i;:::-;9288:3;9284:39;9277:46;;9059:270;8969:360;;;;:::o;9335:364::-;9423:3;9451:39;9484:5;9451:39;:::i;:::-;9506:71;9570:6;9565:3;9506:71;:::i;:::-;9499:78;;9586:52;9631:6;9626:3;9619:4;9612:5;9608:16;9586:52;:::i;:::-;9663:29;9685:6;9663:29;:::i;:::-;9658:3;9654:39;9647:46;;9427:272;9335:364;;;;:::o;9705:377::-;9811:3;9839:39;9872:5;9839:39;:::i;:::-;9894:89;9976:6;9971:3;9894:89;:::i;:::-;9887:96;;9992:52;10037:6;10032:3;10025:4;10018:5;10014:16;9992:52;:::i;:::-;10069:6;10064:3;10060:16;10053:23;;9815:267;9705:377;;;;:::o;10112:845::-;10215:3;10252:5;10246:12;10281:36;10307:9;10281:36;:::i;:::-;10333:89;10415:6;10410:3;10333:89;:::i;:::-;10326:96;;10453:1;10442:9;10438:17;10469:1;10464:137;;;;10615:1;10610:341;;;;10431:520;;10464:137;10548:4;10544:9;10533;10529:25;10524:3;10517:38;10584:6;10579:3;10575:16;10568:23;;10464:137;;10610:341;10677:38;10709:5;10677:38;:::i;:::-;10737:1;10751:154;10765:6;10762:1;10759:13;10751:154;;;10839:7;10833:14;10829:1;10824:3;10820:11;10813:35;10889:1;10880:7;10876:15;10865:26;;10787:4;10784:1;10780:12;10775:17;;10751:154;;;10934:6;10929:3;10925:16;10918:23;;10617:334;;10431:520;;10219:738;;10112:845;;;;:::o;10963:366::-;11105:3;11126:67;11190:2;11185:3;11126:67;:::i;:::-;11119:74;;11202:93;11291:3;11202:93;:::i;:::-;11320:2;11315:3;11311:12;11304:19;;10963:366;;;:::o;11335:::-;11477:3;11498:67;11562:2;11557:3;11498:67;:::i;:::-;11491:74;;11574:93;11663:3;11574:93;:::i;:::-;11692:2;11687:3;11683:12;11676:19;;11335:366;;;:::o;11707:402::-;11867:3;11888:85;11970:2;11965:3;11888:85;:::i;:::-;11881:92;;11982:93;12071:3;11982:93;:::i;:::-;12100:2;12095:3;12091:12;12084:19;;11707:402;;;:::o;12115:366::-;12257:3;12278:67;12342:2;12337:3;12278:67;:::i;:::-;12271:74;;12354:93;12443:3;12354:93;:::i;:::-;12472:2;12467:3;12463:12;12456:19;;12115:366;;;:::o;12487:::-;12629:3;12650:67;12714:2;12709:3;12650:67;:::i;:::-;12643:74;;12726:93;12815:3;12726:93;:::i;:::-;12844:2;12839:3;12835:12;12828:19;;12487:366;;;:::o;12859:::-;13001:3;13022:67;13086:2;13081:3;13022:67;:::i;:::-;13015:74;;13098:93;13187:3;13098:93;:::i;:::-;13216:2;13211:3;13207:12;13200:19;;12859:366;;;:::o;13231:::-;13373:3;13394:67;13458:2;13453:3;13394:67;:::i;:::-;13387:74;;13470:93;13559:3;13470:93;:::i;:::-;13588:2;13583:3;13579:12;13572:19;;13231:366;;;:::o;13603:::-;13745:3;13766:67;13830:2;13825:3;13766:67;:::i;:::-;13759:74;;13842:93;13931:3;13842:93;:::i;:::-;13960:2;13955:3;13951:12;13944:19;;13603:366;;;:::o;13975:::-;14117:3;14138:67;14202:2;14197:3;14138:67;:::i;:::-;14131:74;;14214:93;14303:3;14214:93;:::i;:::-;14332:2;14327:3;14323:12;14316:19;;13975:366;;;:::o;14347:::-;14489:3;14510:67;14574:2;14569:3;14510:67;:::i;:::-;14503:74;;14586:93;14675:3;14586:93;:::i;:::-;14704:2;14699:3;14695:12;14688:19;;14347:366;;;:::o;14719:::-;14861:3;14882:67;14946:2;14941:3;14882:67;:::i;:::-;14875:74;;14958:93;15047:3;14958:93;:::i;:::-;15076:2;15071:3;15067:12;15060:19;;14719:366;;;:::o;15091:::-;15233:3;15254:67;15318:2;15313:3;15254:67;:::i;:::-;15247:74;;15330:93;15419:3;15330:93;:::i;:::-;15448:2;15443:3;15439:12;15432:19;;15091:366;;;:::o;15463:::-;15605:3;15626:67;15690:2;15685:3;15626:67;:::i;:::-;15619:74;;15702:93;15791:3;15702:93;:::i;:::-;15820:2;15815:3;15811:12;15804:19;;15463:366;;;:::o;15835:::-;15977:3;15998:67;16062:2;16057:3;15998:67;:::i;:::-;15991:74;;16074:93;16163:3;16074:93;:::i;:::-;16192:2;16187:3;16183:12;16176:19;;15835:366;;;:::o;16207:::-;16349:3;16370:67;16434:2;16429:3;16370:67;:::i;:::-;16363:74;;16446:93;16535:3;16446:93;:::i;:::-;16564:2;16559:3;16555:12;16548:19;;16207:366;;;:::o;16579:::-;16721:3;16742:67;16806:2;16801:3;16742:67;:::i;:::-;16735:74;;16818:93;16907:3;16818:93;:::i;:::-;16936:2;16931:3;16927:12;16920:19;;16579:366;;;:::o;16951:::-;17093:3;17114:67;17178:2;17173:3;17114:67;:::i;:::-;17107:74;;17190:93;17279:3;17190:93;:::i;:::-;17308:2;17303:3;17299:12;17292:19;;16951:366;;;:::o;17323:::-;17465:3;17486:67;17550:2;17545:3;17486:67;:::i;:::-;17479:74;;17562:93;17651:3;17562:93;:::i;:::-;17680:2;17675:3;17671:12;17664:19;;17323:366;;;:::o;17695:::-;17837:3;17858:67;17922:2;17917:3;17858:67;:::i;:::-;17851:74;;17934:93;18023:3;17934:93;:::i;:::-;18052:2;18047:3;18043:12;18036:19;;17695:366;;;:::o;18067:::-;18209:3;18230:67;18294:2;18289:3;18230:67;:::i;:::-;18223:74;;18306:93;18395:3;18306:93;:::i;:::-;18424:2;18419:3;18415:12;18408:19;;18067:366;;;:::o;18439:::-;18581:3;18602:67;18666:2;18661:3;18602:67;:::i;:::-;18595:74;;18678:93;18767:3;18678:93;:::i;:::-;18796:2;18791:3;18787:12;18780:19;;18439:366;;;:::o;18811:::-;18953:3;18974:67;19038:2;19033:3;18974:67;:::i;:::-;18967:74;;19050:93;19139:3;19050:93;:::i;:::-;19168:2;19163:3;19159:12;19152:19;;18811:366;;;:::o;19183:::-;19325:3;19346:67;19410:2;19405:3;19346:67;:::i;:::-;19339:74;;19422:93;19511:3;19422:93;:::i;:::-;19540:2;19535:3;19531:12;19524:19;;19183:366;;;:::o;19555:::-;19697:3;19718:67;19782:2;19777:3;19718:67;:::i;:::-;19711:74;;19794:93;19883:3;19794:93;:::i;:::-;19912:2;19907:3;19903:12;19896:19;;19555:366;;;:::o;19927:::-;20069:3;20090:67;20154:2;20149:3;20090:67;:::i;:::-;20083:74;;20166:93;20255:3;20166:93;:::i;:::-;20284:2;20279:3;20275:12;20268:19;;19927:366;;;:::o;20299:::-;20441:3;20462:67;20526:2;20521:3;20462:67;:::i;:::-;20455:74;;20538:93;20627:3;20538:93;:::i;:::-;20656:2;20651:3;20647:12;20640:19;;20299:366;;;:::o;20671:::-;20813:3;20834:67;20898:2;20893:3;20834:67;:::i;:::-;20827:74;;20910:93;20999:3;20910:93;:::i;:::-;21028:2;21023:3;21019:12;21012:19;;20671:366;;;:::o;21043:::-;21185:3;21206:67;21270:2;21265:3;21206:67;:::i;:::-;21199:74;;21282:93;21371:3;21282:93;:::i;:::-;21400:2;21395:3;21391:12;21384:19;;21043:366;;;:::o;21415:::-;21557:3;21578:67;21642:2;21637:3;21578:67;:::i;:::-;21571:74;;21654:93;21743:3;21654:93;:::i;:::-;21772:2;21767:3;21763:12;21756:19;;21415:366;;;:::o;21787:118::-;21874:24;21892:5;21874:24;:::i;:::-;21869:3;21862:37;21787:118;;:::o;21911:112::-;21994:22;22010:5;21994:22;:::i;:::-;21989:3;21982:35;21911:112;;:::o;22029:256::-;22141:3;22156:75;22227:3;22218:6;22156:75;:::i;:::-;22256:2;22251:3;22247:12;22240:19;;22276:3;22269:10;;22029:256;;;;:::o;22291:275::-;22423:3;22445:95;22536:3;22527:6;22445:95;:::i;:::-;22438:102;;22557:3;22550:10;;22291:275;;;;:::o;22572:589::-;22797:3;22819:95;22910:3;22901:6;22819:95;:::i;:::-;22812:102;;22931:95;23022:3;23013:6;22931:95;:::i;:::-;22924:102;;23043:92;23131:3;23122:6;23043:92;:::i;:::-;23036:99;;23152:3;23145:10;;22572:589;;;;;;:::o;23167:522::-;23380:3;23402:148;23546:3;23402:148;:::i;:::-;23395:155;;23560:75;23631:3;23622:6;23560:75;:::i;:::-;23660:2;23655:3;23651:12;23644:19;;23680:3;23673:10;;23167:522;;;;:::o;23695:222::-;23788:4;23826:2;23815:9;23811:18;23803:26;;23839:71;23907:1;23896:9;23892:17;23883:6;23839:71;:::i;:::-;23695:222;;;;:::o;23923:640::-;24118:4;24156:3;24145:9;24141:19;24133:27;;24170:71;24238:1;24227:9;24223:17;24214:6;24170:71;:::i;:::-;24251:72;24319:2;24308:9;24304:18;24295:6;24251:72;:::i;:::-;24333;24401:2;24390:9;24386:18;24377:6;24333:72;:::i;:::-;24452:9;24446:4;24442:20;24437:2;24426:9;24422:18;24415:48;24480:76;24551:4;24542:6;24480:76;:::i;:::-;24472:84;;23923:640;;;;;;;:::o;24569:210::-;24656:4;24694:2;24683:9;24679:18;24671:26;;24707:65;24769:1;24758:9;24754:17;24745:6;24707:65;:::i;:::-;24569:210;;;;:::o;24785:545::-;24958:4;24996:3;24985:9;24981:19;24973:27;;25010:71;25078:1;25067:9;25063:17;25054:6;25010:71;:::i;:::-;25091:68;25155:2;25144:9;25140:18;25131:6;25091:68;:::i;:::-;25169:72;25237:2;25226:9;25222:18;25213:6;25169:72;:::i;:::-;25251;25319:2;25308:9;25304:18;25295:6;25251:72;:::i;:::-;24785:545;;;;;;;:::o;25336:313::-;25449:4;25487:2;25476:9;25472:18;25464:26;;25536:9;25530:4;25526:20;25522:1;25511:9;25507:17;25500:47;25564:78;25637:4;25628:6;25564:78;:::i;:::-;25556:86;;25336:313;;;;:::o;25655:419::-;25821:4;25859:2;25848:9;25844:18;25836:26;;25908:9;25902:4;25898:20;25894:1;25883:9;25879:17;25872:47;25936:131;26062:4;25936:131;:::i;:::-;25928:139;;25655:419;;;:::o;26080:::-;26246:4;26284:2;26273:9;26269:18;26261:26;;26333:9;26327:4;26323:20;26319:1;26308:9;26304:17;26297:47;26361:131;26487:4;26361:131;:::i;:::-;26353:139;;26080:419;;;:::o;26505:::-;26671:4;26709:2;26698:9;26694:18;26686:26;;26758:9;26752:4;26748:20;26744:1;26733:9;26729:17;26722:47;26786:131;26912:4;26786:131;:::i;:::-;26778:139;;26505:419;;;:::o;26930:::-;27096:4;27134:2;27123:9;27119:18;27111:26;;27183:9;27177:4;27173:20;27169:1;27158:9;27154:17;27147:47;27211:131;27337:4;27211:131;:::i;:::-;27203:139;;26930:419;;;:::o;27355:::-;27521:4;27559:2;27548:9;27544:18;27536:26;;27608:9;27602:4;27598:20;27594:1;27583:9;27579:17;27572:47;27636:131;27762:4;27636:131;:::i;:::-;27628:139;;27355:419;;;:::o;27780:::-;27946:4;27984:2;27973:9;27969:18;27961:26;;28033:9;28027:4;28023:20;28019:1;28008:9;28004:17;27997:47;28061:131;28187:4;28061:131;:::i;:::-;28053:139;;27780:419;;;:::o;28205:::-;28371:4;28409:2;28398:9;28394:18;28386:26;;28458:9;28452:4;28448:20;28444:1;28433:9;28429:17;28422:47;28486:131;28612:4;28486:131;:::i;:::-;28478:139;;28205:419;;;:::o;28630:::-;28796:4;28834:2;28823:9;28819:18;28811:26;;28883:9;28877:4;28873:20;28869:1;28858:9;28854:17;28847:47;28911:131;29037:4;28911:131;:::i;:::-;28903:139;;28630:419;;;:::o;29055:::-;29221:4;29259:2;29248:9;29244:18;29236:26;;29308:9;29302:4;29298:20;29294:1;29283:9;29279:17;29272:47;29336:131;29462:4;29336:131;:::i;:::-;29328:139;;29055:419;;;:::o;29480:::-;29646:4;29684:2;29673:9;29669:18;29661:26;;29733:9;29727:4;29723:20;29719:1;29708:9;29704:17;29697:47;29761:131;29887:4;29761:131;:::i;:::-;29753:139;;29480:419;;;:::o;29905:::-;30071:4;30109:2;30098:9;30094:18;30086:26;;30158:9;30152:4;30148:20;30144:1;30133:9;30129:17;30122:47;30186:131;30312:4;30186:131;:::i;:::-;30178:139;;29905:419;;;:::o;30330:::-;30496:4;30534:2;30523:9;30519:18;30511:26;;30583:9;30577:4;30573:20;30569:1;30558:9;30554:17;30547:47;30611:131;30737:4;30611:131;:::i;:::-;30603:139;;30330:419;;;:::o;30755:::-;30921:4;30959:2;30948:9;30944:18;30936:26;;31008:9;31002:4;30998:20;30994:1;30983:9;30979:17;30972:47;31036:131;31162:4;31036:131;:::i;:::-;31028:139;;30755:419;;;:::o;31180:::-;31346:4;31384:2;31373:9;31369:18;31361:26;;31433:9;31427:4;31423:20;31419:1;31408:9;31404:17;31397:47;31461:131;31587:4;31461:131;:::i;:::-;31453:139;;31180:419;;;:::o;31605:::-;31771:4;31809:2;31798:9;31794:18;31786:26;;31858:9;31852:4;31848:20;31844:1;31833:9;31829:17;31822:47;31886:131;32012:4;31886:131;:::i;:::-;31878:139;;31605:419;;;:::o;32030:::-;32196:4;32234:2;32223:9;32219:18;32211:26;;32283:9;32277:4;32273:20;32269:1;32258:9;32254:17;32247:47;32311:131;32437:4;32311:131;:::i;:::-;32303:139;;32030:419;;;:::o;32455:::-;32621:4;32659:2;32648:9;32644:18;32636:26;;32708:9;32702:4;32698:20;32694:1;32683:9;32679:17;32672:47;32736:131;32862:4;32736:131;:::i;:::-;32728:139;;32455:419;;;:::o;32880:::-;33046:4;33084:2;33073:9;33069:18;33061:26;;33133:9;33127:4;33123:20;33119:1;33108:9;33104:17;33097:47;33161:131;33287:4;33161:131;:::i;:::-;33153:139;;32880:419;;;:::o;33305:::-;33471:4;33509:2;33498:9;33494:18;33486:26;;33558:9;33552:4;33548:20;33544:1;33533:9;33529:17;33522:47;33586:131;33712:4;33586:131;:::i;:::-;33578:139;;33305:419;;;:::o;33730:::-;33896:4;33934:2;33923:9;33919:18;33911:26;;33983:9;33977:4;33973:20;33969:1;33958:9;33954:17;33947:47;34011:131;34137:4;34011:131;:::i;:::-;34003:139;;33730:419;;;:::o;34155:::-;34321:4;34359:2;34348:9;34344:18;34336:26;;34408:9;34402:4;34398:20;34394:1;34383:9;34379:17;34372:47;34436:131;34562:4;34436:131;:::i;:::-;34428:139;;34155:419;;;:::o;34580:::-;34746:4;34784:2;34773:9;34769:18;34761:26;;34833:9;34827:4;34823:20;34819:1;34808:9;34804:17;34797:47;34861:131;34987:4;34861:131;:::i;:::-;34853:139;;34580:419;;;:::o;35005:::-;35171:4;35209:2;35198:9;35194:18;35186:26;;35258:9;35252:4;35248:20;35244:1;35233:9;35229:17;35222:47;35286:131;35412:4;35286:131;:::i;:::-;35278:139;;35005:419;;;:::o;35430:::-;35596:4;35634:2;35623:9;35619:18;35611:26;;35683:9;35677:4;35673:20;35669:1;35658:9;35654:17;35647:47;35711:131;35837:4;35711:131;:::i;:::-;35703:139;;35430:419;;;:::o;35855:::-;36021:4;36059:2;36048:9;36044:18;36036:26;;36108:9;36102:4;36098:20;36094:1;36083:9;36079:17;36072:47;36136:131;36262:4;36136:131;:::i;:::-;36128:139;;35855:419;;;:::o;36280:::-;36446:4;36484:2;36473:9;36469:18;36461:26;;36533:9;36527:4;36523:20;36519:1;36508:9;36504:17;36497:47;36561:131;36687:4;36561:131;:::i;:::-;36553:139;;36280:419;;;:::o;36705:::-;36871:4;36909:2;36898:9;36894:18;36886:26;;36958:9;36952:4;36948:20;36944:1;36933:9;36929:17;36922:47;36986:131;37112:4;36986:131;:::i;:::-;36978:139;;36705:419;;;:::o;37130:::-;37296:4;37334:2;37323:9;37319:18;37311:26;;37383:9;37377:4;37373:20;37369:1;37358:9;37354:17;37347:47;37411:131;37537:4;37411:131;:::i;:::-;37403:139;;37130:419;;;:::o;37555:222::-;37648:4;37686:2;37675:9;37671:18;37663:26;;37699:71;37767:1;37756:9;37752:17;37743:6;37699:71;:::i;:::-;37555:222;;;;:::o;37783:129::-;37817:6;37844:20;;:::i;:::-;37834:30;;37873:33;37901:4;37893:6;37873:33;:::i;:::-;37783:129;;;:::o;37918:75::-;37951:6;37984:2;37978:9;37968:19;;37918:75;:::o;37999:307::-;38060:4;38150:18;38142:6;38139:30;38136:56;;;38172:18;;:::i;:::-;38136:56;38210:29;38232:6;38210:29;:::i;:::-;38202:37;;38294:4;38288;38284:15;38276:23;;37999:307;;;:::o;38312:308::-;38374:4;38464:18;38456:6;38453:30;38450:56;;;38486:18;;:::i;:::-;38450:56;38524:29;38546:6;38524:29;:::i;:::-;38516:37;;38608:4;38602;38598:15;38590:23;;38312:308;;;:::o;38626:141::-;38675:4;38698:3;38690:11;;38721:3;38718:1;38711:14;38755:4;38752:1;38742:18;38734:26;;38626:141;;;:::o;38773:98::-;38824:6;38858:5;38852:12;38842:22;;38773:98;;;:::o;38877:99::-;38929:6;38963:5;38957:12;38947:22;;38877:99;;;:::o;38982:168::-;39065:11;39099:6;39094:3;39087:19;39139:4;39134:3;39130:14;39115:29;;38982:168;;;;:::o;39156:169::-;39240:11;39274:6;39269:3;39262:19;39314:4;39309:3;39305:14;39290:29;;39156:169;;;;:::o;39331:148::-;39433:11;39470:3;39455:18;;39331:148;;;;:::o;39485:305::-;39525:3;39544:20;39562:1;39544:20;:::i;:::-;39539:25;;39578:20;39596:1;39578:20;:::i;:::-;39573:25;;39732:1;39664:66;39660:74;39657:1;39654:81;39651:107;;;39738:18;;:::i;:::-;39651:107;39782:1;39779;39775:9;39768:16;;39485:305;;;;:::o;39796:185::-;39836:1;39853:20;39871:1;39853:20;:::i;:::-;39848:25;;39887:20;39905:1;39887:20;:::i;:::-;39882:25;;39926:1;39916:35;;39931:18;;:::i;:::-;39916:35;39973:1;39970;39966:9;39961:14;;39796:185;;;;:::o;39987:348::-;40027:7;40050:20;40068:1;40050:20;:::i;:::-;40045:25;;40084:20;40102:1;40084:20;:::i;:::-;40079:25;;40272:1;40204:66;40200:74;40197:1;40194:81;40189:1;40182:9;40175:17;40171:105;40168:131;;;40279:18;;:::i;:::-;40168:131;40327:1;40324;40320:9;40309:20;;39987:348;;;;:::o;40341:191::-;40381:4;40401:20;40419:1;40401:20;:::i;:::-;40396:25;;40435:20;40453:1;40435:20;:::i;:::-;40430:25;;40474:1;40471;40468:8;40465:34;;;40479:18;;:::i;:::-;40465:34;40524:1;40521;40517:9;40509:17;;40341:191;;;;:::o;40538:96::-;40575:7;40604:24;40622:5;40604:24;:::i;:::-;40593:35;;40538:96;;;:::o;40640:90::-;40674:7;40717:5;40710:13;40703:21;40692:32;;40640:90;;;:::o;40736:77::-;40773:7;40802:5;40791:16;;40736:77;;;:::o;40819:149::-;40855:7;40895:66;40888:5;40884:78;40873:89;;40819:149;;;:::o;40974:126::-;41011:7;41051:42;41044:5;41040:54;41029:65;;40974:126;;;:::o;41106:77::-;41143:7;41172:5;41161:16;;41106:77;;;:::o;41189:86::-;41224:7;41264:4;41257:5;41253:16;41242:27;;41189:86;;;:::o;41281:154::-;41365:6;41360:3;41355;41342:30;41427:1;41418:6;41413:3;41409:16;41402:27;41281:154;;;:::o;41441:307::-;41509:1;41519:113;41533:6;41530:1;41527:13;41519:113;;;41618:1;41613:3;41609:11;41603:18;41599:1;41594:3;41590:11;41583:39;41555:2;41552:1;41548:10;41543:15;;41519:113;;;41650:6;41647:1;41644:13;41641:101;;;41730:1;41721:6;41716:3;41712:16;41705:27;41641:101;41490:258;41441:307;;;:::o;41754:320::-;41798:6;41835:1;41829:4;41825:12;41815:22;;41882:1;41876:4;41872:12;41903:18;41893:81;;41959:4;41951:6;41947:17;41937:27;;41893:81;42021:2;42013:6;42010:14;41990:18;41987:38;41984:84;;;42040:18;;:::i;:::-;41984:84;41805:269;41754:320;;;:::o;42080:281::-;42163:27;42185:4;42163:27;:::i;:::-;42155:6;42151:40;42293:6;42281:10;42278:22;42257:18;42245:10;42242:34;42239:62;42236:88;;;42304:18;;:::i;:::-;42236:88;42344:10;42340:2;42333:22;42123:238;42080:281;;:::o;42367:233::-;42406:3;42429:24;42447:5;42429:24;:::i;:::-;42420:33;;42475:66;42468:5;42465:77;42462:103;;;42545:18;;:::i;:::-;42462:103;42592:1;42585:5;42581:13;42574:20;;42367:233;;;:::o;42606:100::-;42645:7;42674:26;42694:5;42674:26;:::i;:::-;42663:37;;42606:100;;;:::o;42712:79::-;42751:7;42780:5;42769:16;;42712:79;;;:::o;42797:94::-;42836:7;42865:20;42879:5;42865:20;:::i;:::-;42854:31;;42797:94;;;:::o;42897:176::-;42929:1;42946:20;42964:1;42946:20;:::i;:::-;42941:25;;42980:20;42998:1;42980:20;:::i;:::-;42975:25;;43019:1;43009:35;;43024:18;;:::i;:::-;43009:35;43065:1;43062;43058:9;43053:14;;42897:176;;;;:::o;43079:180::-;43127:77;43124:1;43117:88;43224:4;43221:1;43214:15;43248:4;43245:1;43238:15;43265:180;43313:77;43310:1;43303:88;43410:4;43407:1;43400:15;43434:4;43431:1;43424:15;43451:180;43499:77;43496:1;43489:88;43596:4;43593:1;43586:15;43620:4;43617:1;43610:15;43637:180;43685:77;43682:1;43675:88;43782:4;43779:1;43772:15;43806:4;43803:1;43796:15;43823:180;43871:77;43868:1;43861:88;43968:4;43965:1;43958:15;43992:4;43989:1;43982:15;44009:180;44057:77;44054:1;44047:88;44154:4;44151:1;44144:15;44178:4;44175:1;44168:15;44195:180;44243:77;44240:1;44233:88;44340:4;44337:1;44330:15;44364:4;44361:1;44354:15;44381:117;44490:1;44487;44480:12;44504:117;44613:1;44610;44603:12;44627:117;44736:1;44733;44726:12;44750:117;44859:1;44856;44849:12;44873:102;44914:6;44965:2;44961:7;44956:2;44949:5;44945:14;44941:28;44931:38;;44873:102;;;:::o;44981:94::-;45014:8;45062:5;45058:2;45054:14;45033:35;;44981:94;;;:::o;45081:174::-;45221:26;45217:1;45209:6;45205:14;45198:50;45081:174;:::o;45261:181::-;45401:33;45397:1;45389:6;45385:14;45378:57;45261:181;:::o;45448:214::-;45588:66;45584:1;45576:6;45572:14;45565:90;45448:214;:::o;45668:230::-;45808:34;45804:1;45796:6;45792:14;45785:58;45877:13;45872:2;45864:6;45860:15;45853:38;45668:230;:::o;45904:237::-;46044:34;46040:1;46032:6;46028:14;46021:58;46113:20;46108:2;46100:6;46096:15;46089:45;45904:237;:::o;46147:225::-;46287:34;46283:1;46275:6;46271:14;46264:58;46356:8;46351:2;46343:6;46339:15;46332:33;46147:225;:::o;46378:224::-;46518:34;46514:1;46506:6;46502:14;46495:58;46587:7;46582:2;46574:6;46570:15;46563:32;46378:224;:::o;46608:178::-;46748:30;46744:1;46736:6;46732:14;46725:54;46608:178;:::o;46792:223::-;46932:34;46928:1;46920:6;46916:14;46909:58;47001:6;46996:2;46988:6;46984:15;46977:31;46792:223;:::o;47021:175::-;47161:27;47157:1;47149:6;47145:14;47138:51;47021:175;:::o;47202:181::-;47342:33;47338:1;47330:6;47326:14;47319:57;47202:181;:::o;47389:221::-;47529:34;47525:1;47517:6;47513:14;47506:58;47598:4;47593:2;47585:6;47581:15;47574:29;47389:221;:::o;47616:::-;47756:34;47752:1;47744:6;47740:14;47733:58;47825:4;47820:2;47812:6;47808:15;47801:29;47616:221;:::o;47843:231::-;47983:34;47979:1;47971:6;47967:14;47960:58;48052:14;48047:2;48039:6;48035:15;48028:39;47843:231;:::o;48080:243::-;48220:34;48216:1;48208:6;48204:14;48197:58;48289:26;48284:2;48276:6;48272:15;48265:51;48080:243;:::o;48329:229::-;48469:34;48465:1;48457:6;48453:14;48446:58;48538:12;48533:2;48525:6;48521:15;48514:37;48329:229;:::o;48564:228::-;48704:34;48700:1;48692:6;48688:14;48681:58;48773:11;48768:2;48760:6;48756:15;48749:36;48564:228;:::o;48798:229::-;48938:34;48934:1;48926:6;48922:14;48915:58;49007:12;49002:2;48994:6;48990:15;48983:37;48798:229;:::o;49033:221::-;49173:34;49169:1;49161:6;49157:14;49150:58;49242:4;49237:2;49229:6;49225:15;49218:29;49033:221;:::o;49260:182::-;49400:34;49396:1;49388:6;49384:14;49377:58;49260:182;:::o;49448:248::-;49588:34;49584:1;49576:6;49572:14;49565:58;49657:31;49652:2;49644:6;49640:15;49633:56;49448:248;:::o;49702:231::-;49842:34;49838:1;49830:6;49826:14;49819:58;49911:14;49906:2;49898:6;49894:15;49887:39;49702:231;:::o;49939:182::-;50079:34;50075:1;50067:6;50063:14;50056:58;49939:182;:::o;50127:234::-;50267:34;50263:1;50255:6;50251:14;50244:58;50336:17;50331:2;50323:6;50319:15;50312:42;50127:234;:::o;50367:220::-;50507:34;50503:1;50495:6;50491:14;50484:58;50576:3;50571:2;50563:6;50559:15;50552:28;50367:220;:::o;50593:177::-;50733:29;50729:1;50721:6;50717:14;50710:53;50593:177;:::o;50776:236::-;50916:34;50912:1;50904:6;50900:14;50893:58;50985:19;50980:2;50972:6;50968:15;50961:44;50776:236;:::o;51018:231::-;51158:34;51154:1;51146:6;51142:14;51135:58;51227:14;51222:2;51214:6;51210:15;51203:39;51018:231;:::o;51255:229::-;51395:34;51391:1;51383:6;51379:14;51372:58;51464:12;51459:2;51451:6;51447:15;51440:37;51255:229;:::o;51490:122::-;51563:24;51581:5;51563:24;:::i;:::-;51556:5;51553:35;51543:63;;51602:1;51599;51592:12;51543:63;51490:122;:::o;51618:116::-;51688:21;51703:5;51688:21;:::i;:::-;51681:5;51678:32;51668:60;;51724:1;51721;51714:12;51668:60;51618:116;:::o;51740:120::-;51812:23;51829:5;51812:23;:::i;:::-;51805:5;51802:34;51792:62;;51850:1;51847;51840:12;51792:62;51740:120;:::o;51866:122::-;51939:24;51957:5;51939:24;:::i;:::-;51932:5;51929:35;51919:63;;51978:1;51975;51968:12;51919:63;51866:122;:::o

Swarm Source

ipfs://69b67ae9204f1c8ba4c47ee59deef026c3ba2575400c99054f6050cacde5927d
[ 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.